@vizejs/fresco 0.347.7 → 0.351.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 (33) hide show
  1. package/dist/app-DJImCkSW.d.mts +135 -0
  2. package/dist/app-DJImCkSW.d.mts.map +1 -0
  3. package/dist/{useInput-iUuaOefz.mjs → app-D_Ke7C8w.mjs} +2 -216
  4. package/dist/{useInput-iUuaOefz.mjs.map → app-D_Ke7C8w.mjs.map} +1 -1
  5. package/dist/components/index.d.mts +2 -2
  6. package/dist/components/index.mjs +1 -1
  7. package/dist/{components-rzllq5gt.mjs → components-3-vKPu1z.mjs} +2 -2
  8. package/dist/{components-rzllq5gt.mjs.map → components-3-vKPu1z.mjs.map} +1 -1
  9. package/dist/composables/index.d.mts +3 -2
  10. package/dist/composables/index.mjs +3 -2
  11. package/dist/{composables-Dh8YqmVY.mjs → composables-Da3c5pxz.mjs} +3 -2
  12. package/dist/{composables-Dh8YqmVY.mjs.map → composables-Da3c5pxz.mjs.map} +1 -1
  13. package/dist/{index-Dwx6lKP0.d.mts → index-DqGcW9sz.d.mts} +2 -85
  14. package/dist/index-DqGcW9sz.d.mts.map +1 -0
  15. package/dist/{index-CQHg8OjC.d.mts → index-xYdAuAvd.d.mts} +190 -384
  16. package/dist/index-xYdAuAvd.d.mts.map +1 -0
  17. package/dist/index.d.mts +7 -136
  18. package/dist/index.mjs +4 -3
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/renderer-DWG0G3g8.d.mts +198 -0
  21. package/dist/renderer-DWG0G3g8.d.mts.map +1 -0
  22. package/dist/testing/index.d.mts +124 -0
  23. package/dist/testing/index.d.mts.map +1 -0
  24. package/dist/testing/index.mjs +282 -0
  25. package/dist/testing/index.mjs.map +1 -0
  26. package/dist/useApp-CNjer3hJ.d.mts +86 -0
  27. package/dist/useApp-CNjer3hJ.d.mts.map +1 -0
  28. package/dist/useInput-BpH-JIU3.mjs +219 -0
  29. package/dist/useInput-BpH-JIU3.mjs.map +1 -0
  30. package/package.json +8 -4
  31. package/dist/index-CQHg8OjC.d.mts.map +0 -1
  32. package/dist/index-Dwx6lKP0.d.mts.map +0 -1
  33. package/dist/index.d.mts.map +0 -1
@@ -1,2 +1,3 @@
1
- import { A as usePaste, C as UseAppReturn, D as useFocus, E as UseFocusOptions, F as UseInputReturn, I as useInput, L as useKeyPress, M as Key, N as KeyHandler, O as useFocusManager, P as UseInputOptions, S as useIme, T as FocusManager, _ as useStderr, b as ImeManager, c as UseAnimationOptions, d as useCursor, f as WindowSize, g as UseStdoutReturn, h as UseStdinReturn, i as useBoxMetrics, j as InputHandler, k as UsePasteOptions, l as useAnimation, m as UseStderrReturn, n as BoxMetrics, p as useWindowSize, r as UseBoxMetricsResult, s as AnimationResult, t as useIsScreenReaderEnabled, u as CursorPosition, v as useStdin, w as useApp, x as UseImeOptions, y as useStdout } from "../index-Dwx6lKP0.mjs";
2
- export { AnimationResult, BoxMetrics, CursorPosition, FocusManager, ImeManager, InputHandler, Key, KeyHandler, UseAnimationOptions, UseAppReturn, UseBoxMetricsResult, UseFocusOptions, UseImeOptions, UseInputOptions, UseInputReturn, UsePasteOptions, UseStderrReturn, UseStdinReturn, UseStdoutReturn, WindowSize, useAnimation, useApp, useBoxMetrics, useCursor, useFocus, useFocusManager, useIme, useInput, useIsScreenReaderEnabled, useKeyPress, usePaste, useStderr, useStdin, useStdout, useWindowSize };
1
+ import { A as useInput, C as UsePasteOptions, D as KeyHandler, E as Key, O as UseInputOptions, S as useIme, T as InputHandler, _ as useStderr, b as ImeManager, c as UseAnimationOptions, d as useCursor, f as WindowSize, g as UseStdoutReturn, h as UseStdinReturn, i as useBoxMetrics, j as useKeyPress, k as UseInputReturn, l as useAnimation, m as UseStderrReturn, n as BoxMetrics, p as useWindowSize, r as UseBoxMetricsResult, s as AnimationResult, t as useIsScreenReaderEnabled, u as CursorPosition, v as useStdin, w as usePaste, x as UseImeOptions, y as useStdout } from "../index-DqGcW9sz.mjs";
2
+ import { a as useFocus, i as UseFocusOptions, n as useApp, o as useFocusManager, r as FocusManager, t as UseAppReturn } from "../useApp-CNjer3hJ.mjs";
3
+ export { type AnimationResult, type BoxMetrics, type CursorPosition, type FocusManager, type ImeManager, type InputHandler, type Key, type KeyHandler, type UseAnimationOptions, type UseAppReturn, type UseBoxMetricsResult, type UseFocusOptions, type UseImeOptions, type UseInputOptions, type UseInputReturn, type UsePasteOptions, type UseStderrReturn, type UseStdinReturn, type UseStdoutReturn, type WindowSize, useAnimation, useApp, useBoxMetrics, useCursor, useFocus, useFocusManager, useIme, useInput, useIsScreenReaderEnabled, useKeyPress, usePaste, useStderr, useStdin, useStdout, useWindowSize };
@@ -1,3 +1,4 @@
1
- import { C as useFocusManager, S as useFocus, b as useStdin, i as useIsScreenReaderEnabled, n as useKeyPress, r as usePaste, t as useInput, v as useCursor, w as useApp, x as useStdout, y as useStderr } from "../useInput-iUuaOefz.mjs";
2
- import { i as useIme, n as useAnimation, r as useWindowSize, t as useBoxMetrics } from "../composables-Dh8YqmVY.mjs";
1
+ import { E as useFocusManager, T as useFocus, b as useStdin, g as useCursor, k as useApp, x as useStdout, y as useStderr } from "../app-D_Ke7C8w.mjs";
2
+ import { i as useIsScreenReaderEnabled, n as useKeyPress, r as usePaste, t as useInput } from "../useInput-BpH-JIU3.mjs";
3
+ import { i as useIme, n as useAnimation, r as useWindowSize, t as useBoxMetrics } from "../composables-Da3c5pxz.mjs";
3
4
  export { useAnimation, useApp, useBoxMetrics, useCursor, useFocus, useFocusManager, useIme, useInput, useIsScreenReaderEnabled, useKeyPress, usePaste, useStderr, useStdin, useStdout, useWindowSize };
@@ -1,4 +1,5 @@
1
- import { _ as updateLastRenderLayouts, h as getLastRenderLayout, w as useApp } from "./useInput-iUuaOefz.mjs";
1
+ import { d as getLastRenderLayout, k as useApp, p as updateLastRenderLayouts } from "./app-D_Ke7C8w.mjs";
2
+ import "./useInput-BpH-JIU3.mjs";
2
3
  import { computed, onMounted, onUnmounted, reactive, ref, watch } from "@vue/runtime-core";
3
4
  //#region src/composables/useIme.ts
4
5
  /**
@@ -315,4 +316,4 @@ function useBoxMetrics(ref) {
315
316
  //#endregion
316
317
  export { useIme as i, useAnimation as n, useWindowSize as r, useBoxMetrics as t };
317
318
 
318
- //# sourceMappingURL=composables-Dh8YqmVY.mjs.map
319
+ //# sourceMappingURL=composables-Da3c5pxz.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"composables-Dh8YqmVY.mjs","names":[],"sources":["../src/composables/useIme.ts","../src/composables/useWindowSize.ts","../src/composables/useAnimation.ts","../src/composables/useBoxMetrics.ts"],"sourcesContent":["/**\n * useIme - IME (Input Method Editor) composable\n */\n\nimport { ref, computed, type Ref } from \"@vue/runtime-core\";\n\nexport interface UseImeOptions {\n /** Initial IME mode */\n mode?: ImeMode;\n /** Called when IME mode changes */\n onModeChange?: (mode: ImeMode) => void;\n /** Called when composition updates */\n onCompositionUpdate?: (text: string, cursor: number) => void;\n /** Called when text is committed */\n onCommit?: (text: string) => void;\n}\n\nexport type ImeMode =\n | \"direct\"\n | \"hiragana\"\n | \"katakana\"\n | \"half-katakana\"\n | \"full-alpha\"\n | \"pinyin\"\n | \"hangul\";\n\nexport interface ImeManager {\n /** Whether IME is active */\n isActive: Ref<boolean>;\n /** Current input mode */\n mode: Ref<ImeMode>;\n /** Whether currently composing */\n isComposing: Ref<boolean>;\n /** Preedit text */\n preedit: Ref<string>;\n /** Cursor position in preedit */\n preeditCursor: Ref<number>;\n /** Candidate list */\n candidates: Ref<string[]>;\n /** Selected candidate index */\n selectedCandidate: Ref<number>;\n /** Mode display name */\n modeDisplay: Ref<string>;\n /** Enable IME */\n enable: () => void;\n /** Disable IME */\n disable: () => void;\n /** Set input mode */\n setMode: (mode: ImeMode) => void;\n /** Handle key event for IME */\n handleKey: (key: string, modifiers: { ctrl: boolean; alt: boolean }) => boolean;\n /** Commit current composition */\n commit: () => void;\n /** Cancel current composition */\n cancel: () => void;\n /** Select next candidate */\n nextCandidate: () => void;\n /** Select previous candidate */\n prevCandidate: () => void;\n /** Select candidate by number (1-9) */\n selectCandidate: (num: number) => void;\n}\n\nconst MODE_DISPLAY: Record<ImeMode, string> = {\n direct: \"A\",\n hiragana: \"あ\",\n katakana: \"ア\",\n \"half-katakana\": \"ア\",\n \"full-alpha\": \"A\",\n pinyin: \"拼\",\n hangul: \"한\",\n};\n\nexport function useIme(options: UseImeOptions = {}): ImeManager {\n const { mode: initialMode = \"direct\", onModeChange, onCompositionUpdate, onCommit } = options;\n\n const isActive = ref(false);\n const mode = ref<ImeMode>(initialMode);\n const isComposing = ref(false);\n const preedit = ref(\"\");\n const preeditCursor = ref(0);\n const candidates = ref<string[]>([]);\n const selectedCandidate = ref(0);\n\n const modeDisplay = computed(() => MODE_DISPLAY[mode.value] ?? \"A\");\n\n const enable = () => {\n isActive.value = true;\n };\n\n const disable = () => {\n isActive.value = false;\n cancel();\n };\n\n const setMode = (newMode: ImeMode) => {\n if (mode.value !== newMode) {\n cancel();\n mode.value = newMode;\n onModeChange?.(newMode);\n }\n };\n\n const handleKey = (key: string, modifiers: { ctrl: boolean; alt: boolean }): boolean => {\n if (!isActive.value || mode.value === \"direct\") {\n return false;\n }\n\n // IME mode toggle (usually Ctrl+Space or similar)\n // If we're here, mode is not 'direct' (filtered above), so toggle to 'direct'\n if (modifiers.ctrl && key === \" \") {\n setMode(\"direct\");\n return true;\n }\n\n // Handle composition\n if (isComposing.value) {\n switch (key) {\n case \"enter\":\n commit();\n return true;\n case \"escape\":\n cancel();\n return true;\n case \"backspace\":\n if (preedit.value.length > 0) {\n preedit.value = preedit.value.slice(0, -1);\n preeditCursor.value = Math.min(preeditCursor.value, preedit.value.length);\n onCompositionUpdate?.(preedit.value, preeditCursor.value);\n return true;\n }\n break;\n case \"space\":\n // Convert / select candidate\n if (candidates.value.length > 0) {\n nextCandidate();\n return true;\n }\n break;\n }\n\n // Number for candidate selection\n if (/^[1-9]$/.test(key)) {\n selectCandidate(parseInt(key, 10));\n return true;\n }\n }\n\n // Start/continue composition for printable characters\n if (key.length === 1 && !modifiers.ctrl && !modifiers.alt) {\n if (!isComposing.value) {\n isComposing.value = true;\n }\n preedit.value += key;\n preeditCursor.value = preedit.value.length;\n onCompositionUpdate?.(preedit.value, preeditCursor.value);\n return true;\n }\n\n return false;\n };\n\n const commit = () => {\n if (preedit.value) {\n const text = candidates.value[selectedCandidate.value] ?? preedit.value;\n onCommit?.(text);\n }\n preedit.value = \"\";\n preeditCursor.value = 0;\n candidates.value = [];\n selectedCandidate.value = 0;\n isComposing.value = false;\n };\n\n const cancel = () => {\n preedit.value = \"\";\n preeditCursor.value = 0;\n candidates.value = [];\n selectedCandidate.value = 0;\n isComposing.value = false;\n };\n\n const nextCandidate = () => {\n if (candidates.value.length > 0) {\n selectedCandidate.value = (selectedCandidate.value + 1) % candidates.value.length;\n }\n };\n\n const prevCandidate = () => {\n if (candidates.value.length > 0) {\n selectedCandidate.value =\n (selectedCandidate.value - 1 + candidates.value.length) % candidates.value.length;\n }\n };\n\n const selectCandidate = (num: number) => {\n if (num >= 1 && num <= candidates.value.length) {\n selectedCandidate.value = num - 1;\n commit();\n }\n };\n\n return {\n isActive,\n mode,\n isComposing,\n preedit,\n preeditCursor,\n candidates,\n selectedCandidate,\n modeDisplay,\n enable,\n disable,\n setMode,\n handleKey,\n commit,\n cancel,\n nextCandidate,\n prevCandidate,\n selectCandidate,\n };\n}\n","/**\n * useWindowSize - terminal dimensions.\n */\n\nimport { reactive } from \"@vue/runtime-core\";\nimport { useApp } from \"./useApp.js\";\n\nexport interface WindowSize {\n columns: number;\n rows: number;\n}\n\nexport function useWindowSize() {\n const { width, height } = useApp();\n\n return reactive({\n get columns() {\n return width.value;\n },\n get rows() {\n return height.value;\n },\n }) as WindowSize;\n}\n","/**\n * useAnimation - Ink-compatible shared animation state.\n */\n\nimport { computed, onMounted, onUnmounted, reactive, watch } from \"@vue/runtime-core\";\n\nexport interface UseAnimationOptions {\n /** Time between ticks in milliseconds */\n interval?: number;\n /** Whether the animation is running */\n isActive?: boolean;\n}\n\nexport interface AnimationResult {\n frame: number;\n time: number;\n delta: number;\n reset: () => void;\n}\n\nconst defaultAnimationInterval = 100;\nconst maximumTimerInterval = 2_147_483_647;\n\ntype AnimationCallback = (currentTime: number) => void;\n\ninterface AnimationSubscriber {\n callback: AnimationCallback;\n interval: number;\n startTime: number;\n nextDueTime: number;\n}\n\nconst animationSubscribers = new Map<AnimationCallback, AnimationSubscriber>();\nlet animationTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction currentTime(): number {\n return performance.now();\n}\n\nfunction normalizeAnimationInterval(interval: number): number {\n if (!Number.isFinite(interval)) {\n return defaultAnimationInterval;\n }\n\n return Math.min(maximumTimerInterval, Math.max(1, interval));\n}\n\nfunction clearAnimationTimer() {\n if (!animationTimer) return;\n clearTimeout(animationTimer);\n animationTimer = null;\n}\n\nfunction scheduleAnimationTick() {\n clearAnimationTimer();\n if (animationSubscribers.size === 0) return;\n\n let nextDueTime = Number.POSITIVE_INFINITY;\n for (const subscriber of animationSubscribers.values()) {\n nextDueTime = Math.min(nextDueTime, subscriber.nextDueTime);\n }\n\n animationTimer = setTimeout(\n () => {\n animationTimer = null;\n const now = currentTime();\n\n for (const subscriber of animationSubscribers.values()) {\n if (now < subscriber.nextDueTime) continue;\n\n subscriber.callback(now);\n\n const elapsedTime = now - subscriber.startTime;\n const elapsedFrames = Math.floor(elapsedTime / subscriber.interval) + 1;\n subscriber.nextDueTime = subscriber.startTime + elapsedFrames * subscriber.interval;\n }\n\n scheduleAnimationTick();\n },\n Math.max(0, nextDueTime - currentTime()),\n );\n}\n\nfunction subscribeToAnimation(callback: AnimationCallback, interval: number) {\n const startTime = currentTime();\n animationSubscribers.set(callback, {\n callback,\n interval,\n startTime,\n nextDueTime: startTime + interval,\n });\n scheduleAnimationTick();\n\n return {\n startTime,\n unsubscribe() {\n animationSubscribers.delete(callback);\n scheduleAnimationTick();\n },\n };\n}\n\nexport function useAnimation(options: UseAnimationOptions = {}): AnimationResult {\n const safeInterval = computed(() =>\n normalizeAnimationInterval(options.interval ?? defaultAnimationInterval),\n );\n const active = computed(() => options.isActive ?? true);\n let unsubscribe: (() => void) | null = null;\n let startedAt = currentTime();\n let previousTick = startedAt;\n\n const state = reactive<AnimationResult>({\n frame: 0,\n time: 0,\n delta: 0,\n reset: () => {\n if (active.value) {\n start();\n } else {\n resetState(currentTime());\n }\n },\n });\n\n const resetState = (now: number) => {\n startedAt = now;\n previousTick = now;\n state.frame = 0;\n state.time = 0;\n state.delta = 0;\n };\n\n const tick = (now: number) => {\n const elapsed = now - startedAt;\n state.frame = Math.floor(elapsed / safeInterval.value);\n state.time = elapsed;\n state.delta = now - previousTick;\n previousTick = now;\n };\n\n const stop = () => {\n unsubscribe?.();\n unsubscribe = null;\n };\n\n const start = () => {\n stop();\n resetState(currentTime());\n const subscription = subscribeToAnimation(tick, safeInterval.value);\n startedAt = subscription.startTime;\n previousTick = subscription.startTime;\n unsubscribe = () => subscription.unsubscribe();\n };\n\n onMounted(() => {\n if (active.value) {\n start();\n }\n });\n\n watch([active, safeInterval], ([isActive]) => {\n if (isActive) {\n start();\n } else {\n stop();\n }\n });\n\n onUnmounted(stop);\n\n return state;\n}\n","/**\n * useBoxMetrics - best-effort layout metrics for a rendered Fresco node.\n */\n\nimport { onMounted, onUnmounted, reactive, type Ref } from \"@vue/runtime-core\";\nimport { getLastRenderLayout, updateLastRenderLayouts, type DOMElement } from \"../layoutMetrics.js\";\n\nexport interface BoxMetrics {\n width: number;\n height: number;\n left: number;\n top: number;\n}\n\nexport interface UseBoxMetricsResult extends BoxMetrics {\n hasMeasured: boolean;\n}\n\nexport type MetricTarget = DOMElement;\n\nasync function loadNative() {\n return import(\"@vizejs/fresco-native\");\n}\n\nfunction targetId(target: MetricTarget | null | undefined): number | undefined {\n return target?.id ?? target?.$el?.id;\n}\n\nexport function useBoxMetrics(ref: Ref<MetricTarget | null>): UseBoxMetricsResult {\n const metrics = reactive<UseBoxMetricsResult>({\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n hasMeasured: false,\n });\n\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const refresh = () => {\n const id = targetId(ref.value);\n if (id === undefined) {\n metrics.width = 0;\n metrics.height = 0;\n metrics.left = 0;\n metrics.top = 0;\n metrics.hasMeasured = false;\n return;\n }\n\n void loadNative()\n .then((native) => {\n const layouts = \"getLastRenderLayouts\" in native ? native.getLastRenderLayouts() : [];\n updateLastRenderLayouts(layouts);\n const layout = layouts.find((item: { id: number }) => item.id === id);\n if (!layout) return;\n\n metrics.width = layout.width;\n metrics.height = layout.height;\n metrics.left = layout.x;\n metrics.top = layout.y;\n metrics.hasMeasured = true;\n })\n .catch(() => {});\n };\n\n onMounted(() => {\n const layout = getLastRenderLayout(ref.value);\n if (layout) {\n metrics.width = layout.width;\n metrics.height = layout.height;\n metrics.left = layout.x;\n metrics.top = layout.y;\n metrics.hasMeasured = true;\n }\n\n refresh();\n timer = setInterval(refresh, 100);\n });\n\n onUnmounted(() => {\n if (timer) clearInterval(timer);\n });\n\n return metrics;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"composables-Da3c5pxz.mjs","names":[],"sources":["../src/composables/useIme.ts","../src/composables/useWindowSize.ts","../src/composables/useAnimation.ts","../src/composables/useBoxMetrics.ts"],"sourcesContent":["/**\n * useIme - IME (Input Method Editor) composable\n */\n\nimport { ref, computed, type Ref } from \"@vue/runtime-core\";\n\nexport interface UseImeOptions {\n /** Initial IME mode */\n mode?: ImeMode;\n /** Called when IME mode changes */\n onModeChange?: (mode: ImeMode) => void;\n /** Called when composition updates */\n onCompositionUpdate?: (text: string, cursor: number) => void;\n /** Called when text is committed */\n onCommit?: (text: string) => void;\n}\n\nexport type ImeMode =\n | \"direct\"\n | \"hiragana\"\n | \"katakana\"\n | \"half-katakana\"\n | \"full-alpha\"\n | \"pinyin\"\n | \"hangul\";\n\nexport interface ImeManager {\n /** Whether IME is active */\n isActive: Ref<boolean>;\n /** Current input mode */\n mode: Ref<ImeMode>;\n /** Whether currently composing */\n isComposing: Ref<boolean>;\n /** Preedit text */\n preedit: Ref<string>;\n /** Cursor position in preedit */\n preeditCursor: Ref<number>;\n /** Candidate list */\n candidates: Ref<string[]>;\n /** Selected candidate index */\n selectedCandidate: Ref<number>;\n /** Mode display name */\n modeDisplay: Ref<string>;\n /** Enable IME */\n enable: () => void;\n /** Disable IME */\n disable: () => void;\n /** Set input mode */\n setMode: (mode: ImeMode) => void;\n /** Handle key event for IME */\n handleKey: (key: string, modifiers: { ctrl: boolean; alt: boolean }) => boolean;\n /** Commit current composition */\n commit: () => void;\n /** Cancel current composition */\n cancel: () => void;\n /** Select next candidate */\n nextCandidate: () => void;\n /** Select previous candidate */\n prevCandidate: () => void;\n /** Select candidate by number (1-9) */\n selectCandidate: (num: number) => void;\n}\n\nconst MODE_DISPLAY: Record<ImeMode, string> = {\n direct: \"A\",\n hiragana: \"あ\",\n katakana: \"ア\",\n \"half-katakana\": \"ア\",\n \"full-alpha\": \"A\",\n pinyin: \"拼\",\n hangul: \"한\",\n};\n\nexport function useIme(options: UseImeOptions = {}): ImeManager {\n const { mode: initialMode = \"direct\", onModeChange, onCompositionUpdate, onCommit } = options;\n\n const isActive = ref(false);\n const mode = ref<ImeMode>(initialMode);\n const isComposing = ref(false);\n const preedit = ref(\"\");\n const preeditCursor = ref(0);\n const candidates = ref<string[]>([]);\n const selectedCandidate = ref(0);\n\n const modeDisplay = computed(() => MODE_DISPLAY[mode.value] ?? \"A\");\n\n const enable = () => {\n isActive.value = true;\n };\n\n const disable = () => {\n isActive.value = false;\n cancel();\n };\n\n const setMode = (newMode: ImeMode) => {\n if (mode.value !== newMode) {\n cancel();\n mode.value = newMode;\n onModeChange?.(newMode);\n }\n };\n\n const handleKey = (key: string, modifiers: { ctrl: boolean; alt: boolean }): boolean => {\n if (!isActive.value || mode.value === \"direct\") {\n return false;\n }\n\n // IME mode toggle (usually Ctrl+Space or similar)\n // If we're here, mode is not 'direct' (filtered above), so toggle to 'direct'\n if (modifiers.ctrl && key === \" \") {\n setMode(\"direct\");\n return true;\n }\n\n // Handle composition\n if (isComposing.value) {\n switch (key) {\n case \"enter\":\n commit();\n return true;\n case \"escape\":\n cancel();\n return true;\n case \"backspace\":\n if (preedit.value.length > 0) {\n preedit.value = preedit.value.slice(0, -1);\n preeditCursor.value = Math.min(preeditCursor.value, preedit.value.length);\n onCompositionUpdate?.(preedit.value, preeditCursor.value);\n return true;\n }\n break;\n case \"space\":\n // Convert / select candidate\n if (candidates.value.length > 0) {\n nextCandidate();\n return true;\n }\n break;\n }\n\n // Number for candidate selection\n if (/^[1-9]$/.test(key)) {\n selectCandidate(parseInt(key, 10));\n return true;\n }\n }\n\n // Start/continue composition for printable characters\n if (key.length === 1 && !modifiers.ctrl && !modifiers.alt) {\n if (!isComposing.value) {\n isComposing.value = true;\n }\n preedit.value += key;\n preeditCursor.value = preedit.value.length;\n onCompositionUpdate?.(preedit.value, preeditCursor.value);\n return true;\n }\n\n return false;\n };\n\n const commit = () => {\n if (preedit.value) {\n const text = candidates.value[selectedCandidate.value] ?? preedit.value;\n onCommit?.(text);\n }\n preedit.value = \"\";\n preeditCursor.value = 0;\n candidates.value = [];\n selectedCandidate.value = 0;\n isComposing.value = false;\n };\n\n const cancel = () => {\n preedit.value = \"\";\n preeditCursor.value = 0;\n candidates.value = [];\n selectedCandidate.value = 0;\n isComposing.value = false;\n };\n\n const nextCandidate = () => {\n if (candidates.value.length > 0) {\n selectedCandidate.value = (selectedCandidate.value + 1) % candidates.value.length;\n }\n };\n\n const prevCandidate = () => {\n if (candidates.value.length > 0) {\n selectedCandidate.value =\n (selectedCandidate.value - 1 + candidates.value.length) % candidates.value.length;\n }\n };\n\n const selectCandidate = (num: number) => {\n if (num >= 1 && num <= candidates.value.length) {\n selectedCandidate.value = num - 1;\n commit();\n }\n };\n\n return {\n isActive,\n mode,\n isComposing,\n preedit,\n preeditCursor,\n candidates,\n selectedCandidate,\n modeDisplay,\n enable,\n disable,\n setMode,\n handleKey,\n commit,\n cancel,\n nextCandidate,\n prevCandidate,\n selectCandidate,\n };\n}\n","/**\n * useWindowSize - terminal dimensions.\n */\n\nimport { reactive } from \"@vue/runtime-core\";\nimport { useApp } from \"./useApp.js\";\n\nexport interface WindowSize {\n columns: number;\n rows: number;\n}\n\nexport function useWindowSize() {\n const { width, height } = useApp();\n\n return reactive({\n get columns() {\n return width.value;\n },\n get rows() {\n return height.value;\n },\n }) as WindowSize;\n}\n","/**\n * useAnimation - Ink-compatible shared animation state.\n */\n\nimport { computed, onMounted, onUnmounted, reactive, watch } from \"@vue/runtime-core\";\n\nexport interface UseAnimationOptions {\n /** Time between ticks in milliseconds */\n interval?: number;\n /** Whether the animation is running */\n isActive?: boolean;\n}\n\nexport interface AnimationResult {\n frame: number;\n time: number;\n delta: number;\n reset: () => void;\n}\n\nconst defaultAnimationInterval = 100;\nconst maximumTimerInterval = 2_147_483_647;\n\ntype AnimationCallback = (currentTime: number) => void;\n\ninterface AnimationSubscriber {\n callback: AnimationCallback;\n interval: number;\n startTime: number;\n nextDueTime: number;\n}\n\nconst animationSubscribers = new Map<AnimationCallback, AnimationSubscriber>();\nlet animationTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction currentTime(): number {\n return performance.now();\n}\n\nfunction normalizeAnimationInterval(interval: number): number {\n if (!Number.isFinite(interval)) {\n return defaultAnimationInterval;\n }\n\n return Math.min(maximumTimerInterval, Math.max(1, interval));\n}\n\nfunction clearAnimationTimer() {\n if (!animationTimer) return;\n clearTimeout(animationTimer);\n animationTimer = null;\n}\n\nfunction scheduleAnimationTick() {\n clearAnimationTimer();\n if (animationSubscribers.size === 0) return;\n\n let nextDueTime = Number.POSITIVE_INFINITY;\n for (const subscriber of animationSubscribers.values()) {\n nextDueTime = Math.min(nextDueTime, subscriber.nextDueTime);\n }\n\n animationTimer = setTimeout(\n () => {\n animationTimer = null;\n const now = currentTime();\n\n for (const subscriber of animationSubscribers.values()) {\n if (now < subscriber.nextDueTime) continue;\n\n subscriber.callback(now);\n\n const elapsedTime = now - subscriber.startTime;\n const elapsedFrames = Math.floor(elapsedTime / subscriber.interval) + 1;\n subscriber.nextDueTime = subscriber.startTime + elapsedFrames * subscriber.interval;\n }\n\n scheduleAnimationTick();\n },\n Math.max(0, nextDueTime - currentTime()),\n );\n}\n\nfunction subscribeToAnimation(callback: AnimationCallback, interval: number) {\n const startTime = currentTime();\n animationSubscribers.set(callback, {\n callback,\n interval,\n startTime,\n nextDueTime: startTime + interval,\n });\n scheduleAnimationTick();\n\n return {\n startTime,\n unsubscribe() {\n animationSubscribers.delete(callback);\n scheduleAnimationTick();\n },\n };\n}\n\nexport function useAnimation(options: UseAnimationOptions = {}): AnimationResult {\n const safeInterval = computed(() =>\n normalizeAnimationInterval(options.interval ?? defaultAnimationInterval),\n );\n const active = computed(() => options.isActive ?? true);\n let unsubscribe: (() => void) | null = null;\n let startedAt = currentTime();\n let previousTick = startedAt;\n\n const state = reactive<AnimationResult>({\n frame: 0,\n time: 0,\n delta: 0,\n reset: () => {\n if (active.value) {\n start();\n } else {\n resetState(currentTime());\n }\n },\n });\n\n const resetState = (now: number) => {\n startedAt = now;\n previousTick = now;\n state.frame = 0;\n state.time = 0;\n state.delta = 0;\n };\n\n const tick = (now: number) => {\n const elapsed = now - startedAt;\n state.frame = Math.floor(elapsed / safeInterval.value);\n state.time = elapsed;\n state.delta = now - previousTick;\n previousTick = now;\n };\n\n const stop = () => {\n unsubscribe?.();\n unsubscribe = null;\n };\n\n const start = () => {\n stop();\n resetState(currentTime());\n const subscription = subscribeToAnimation(tick, safeInterval.value);\n startedAt = subscription.startTime;\n previousTick = subscription.startTime;\n unsubscribe = () => subscription.unsubscribe();\n };\n\n onMounted(() => {\n if (active.value) {\n start();\n }\n });\n\n watch([active, safeInterval], ([isActive]) => {\n if (isActive) {\n start();\n } else {\n stop();\n }\n });\n\n onUnmounted(stop);\n\n return state;\n}\n","/**\n * useBoxMetrics - best-effort layout metrics for a rendered Fresco node.\n */\n\nimport { onMounted, onUnmounted, reactive, type Ref } from \"@vue/runtime-core\";\nimport { getLastRenderLayout, updateLastRenderLayouts, type DOMElement } from \"../layoutMetrics.js\";\n\nexport interface BoxMetrics {\n width: number;\n height: number;\n left: number;\n top: number;\n}\n\nexport interface UseBoxMetricsResult extends BoxMetrics {\n hasMeasured: boolean;\n}\n\nexport type MetricTarget = DOMElement;\n\nasync function loadNative() {\n return import(\"@vizejs/fresco-native\");\n}\n\nfunction targetId(target: MetricTarget | null | undefined): number | undefined {\n return target?.id ?? target?.$el?.id;\n}\n\nexport function useBoxMetrics(ref: Ref<MetricTarget | null>): UseBoxMetricsResult {\n const metrics = reactive<UseBoxMetricsResult>({\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n hasMeasured: false,\n });\n\n let timer: ReturnType<typeof setInterval> | null = null;\n\n const refresh = () => {\n const id = targetId(ref.value);\n if (id === undefined) {\n metrics.width = 0;\n metrics.height = 0;\n metrics.left = 0;\n metrics.top = 0;\n metrics.hasMeasured = false;\n return;\n }\n\n void loadNative()\n .then((native) => {\n const layouts = \"getLastRenderLayouts\" in native ? native.getLastRenderLayouts() : [];\n updateLastRenderLayouts(layouts);\n const layout = layouts.find((item: { id: number }) => item.id === id);\n if (!layout) return;\n\n metrics.width = layout.width;\n metrics.height = layout.height;\n metrics.left = layout.x;\n metrics.top = layout.y;\n metrics.hasMeasured = true;\n })\n .catch(() => {});\n };\n\n onMounted(() => {\n const layout = getLastRenderLayout(ref.value);\n if (layout) {\n metrics.width = layout.width;\n metrics.height = layout.height;\n metrics.left = layout.x;\n metrics.top = layout.y;\n metrics.hasMeasured = true;\n }\n\n refresh();\n timer = setInterval(refresh, 100);\n });\n\n onUnmounted(() => {\n if (timer) clearInterval(timer);\n });\n\n return metrics;\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { Ref } from "@vue/runtime-core";
2
- import * as _$_vue_reactivity0 from "@vue/reactivity";
3
2
  //#region src/composables/useInput.d.ts
4
3
  interface Key {
5
4
  upArrow: boolean;
@@ -89,88 +88,6 @@ declare function usePaste(handler: (text: string) => void, options?: UsePasteOpt
89
88
  disable: () => void;
90
89
  };
91
90
  //#endregion
92
- //#region src/composables/useFocus.d.ts
93
- interface UseFocusOptions {
94
- /** Enable or disable this focus target while keeping its logical identity */
95
- isActive?: boolean | Ref<boolean>;
96
- /** Auto-focus this component when nothing else is focused */
97
- autoFocus?: boolean;
98
- /** Focus ID for this element */
99
- id?: string;
100
- }
101
- interface FocusManager {
102
- /** Currently focused element ID */
103
- focusedId: Ref<string | null>;
104
- /** Ink-compatible currently focused ID alias */
105
- activeId: Readonly<Ref<string | undefined>>;
106
- /** All active focusable element IDs */
107
- focusableIds: Readonly<Ref<string[]>>;
108
- /** Whether focus management is enabled */
109
- isEnabled: Ref<boolean>;
110
- /** Enable focus management */
111
- enableFocus: () => void;
112
- /** Disable focus management */
113
- disableFocus: () => void;
114
- /** Focus a specific element */
115
- focus: (id: string) => void;
116
- /** Focus next element */
117
- focusNext: () => void;
118
- /** Focus previous element */
119
- focusPrevious: () => void;
120
- /** Register a focusable element */
121
- register: (id: string, options?: {
122
- isActive?: boolean;
123
- autoFocus?: boolean;
124
- }) => void;
125
- /** Unregister a focusable element */
126
- unregister: (id: string) => void;
127
- /** Activate or deactivate a focusable element while keeping its order */
128
- setActive: (id: string, isActive: boolean) => void;
129
- }
130
- /**
131
- * Use focus management
132
- */
133
- declare function useFocus(options?: UseFocusOptions): {
134
- id: string;
135
- isFocused: _$_vue_reactivity0.ComputedRef<boolean>;
136
- focus: (targetId?: string) => void;
137
- blur: () => void;
138
- };
139
- /**
140
- * Use global focus manager controls.
141
- */
142
- declare function useFocusManager(): {
143
- enableFocus: () => void;
144
- disableFocus: () => void;
145
- focusNext: () => void;
146
- focusPrevious: () => void;
147
- focus: (id: string) => void;
148
- activeId: Readonly<Ref<string | undefined, string | undefined>>;
149
- focusableIds: Readonly<Ref<string[], string[]>>;
150
- };
151
- //#endregion
152
- //#region src/composables/useApp.d.ts
153
- interface UseAppReturn {
154
- /** Terminal width */
155
- width: Ref<number>;
156
- /** Terminal height */
157
- height: Ref<number>;
158
- /** Whether app is running */
159
- isRunning: Ref<boolean>;
160
- /** Exit the app */
161
- exit: (errorOrResult?: unknown) => void;
162
- /** Force re-render */
163
- render: () => void;
164
- /** Clear the screen */
165
- clear: () => void;
166
- /** Wait until pending render output has flushed */
167
- waitUntilRenderFlush: () => Promise<void>;
168
- }
169
- /**
170
- * Use app context
171
- */
172
- declare function useApp(): UseAppReturn;
173
- //#endregion
174
91
  //#region src/composables/useIme.d.ts
175
92
  interface UseImeOptions {
176
93
  /** Initial IME mode */
@@ -311,5 +228,5 @@ declare function useBoxMetrics(ref: Ref<MetricTarget | null>): UseBoxMetricsResu
311
228
  */
312
229
  declare function useIsScreenReaderEnabled(): boolean;
313
230
  //#endregion
314
- export { usePaste as A, UseAppReturn as C, useFocus as D, UseFocusOptions as E, UseInputReturn as F, useInput as I, useKeyPress as L, Key as M, KeyHandler as N, useFocusManager as O, UseInputOptions as P, useIme as S, FocusManager as T, useStderr as _, DOMElement as a, ImeManager as b, UseAnimationOptions as c, useCursor as d, WindowSize as f, UseStdoutReturn as g, UseStdinReturn as h, useBoxMetrics as i, InputHandler as j, UsePasteOptions as k, useAnimation as l, UseStderrReturn as m, BoxMetrics as n, measureElement as o, useWindowSize as p, UseBoxMetricsResult as r, AnimationResult as s, useIsScreenReaderEnabled as t, CursorPosition as u, useStdin as v, useApp as w, UseImeOptions as x, useStdout as y };
315
- //# sourceMappingURL=index-Dwx6lKP0.d.mts.map
231
+ export { useInput as A, UsePasteOptions as C, KeyHandler as D, Key as E, UseInputOptions as O, useIme as S, InputHandler as T, useStderr as _, DOMElement as a, ImeManager as b, UseAnimationOptions as c, useCursor as d, WindowSize as f, UseStdoutReturn as g, UseStdinReturn as h, useBoxMetrics as i, useKeyPress as j, UseInputReturn as k, useAnimation as l, UseStderrReturn as m, BoxMetrics as n, measureElement as o, useWindowSize as p, UseBoxMetricsResult as r, AnimationResult as s, useIsScreenReaderEnabled as t, CursorPosition as u, useStdin as v, usePaste as w, UseImeOptions as x, useStdout as y };
232
+ //# sourceMappingURL=index-DqGcW9sz.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DqGcW9sz.d.mts","names":[],"sources":["../src/composables/useInput.ts","../src/composables/usePaste.ts","../src/composables/useIme.ts","../src/composables/useStreams.ts","../src/composables/useWindowSize.ts","../src/composables/useCursor.ts","../src/composables/useAnimation.ts","../src/layoutMetrics.ts","../src/composables/useBoxMetrics.ts","../src/composables/useIsScreenReaderEnabled.ts"],"mappings":"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"}