silvery 0.18.2 → 0.19.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.
- package/dist/{animation-DhINOJk8.mjs → animation-Cn64yepo.mjs} +1 -1
- package/dist/{animation-DhINOJk8.mjs.map → animation-Cn64yepo.mjs.map} +1 -1
- package/dist/{ansi-C6Qs1Wn2.mjs → ansi-CLOitHKx.mjs} +1 -1
- package/dist/ansi-CLOitHKx.mjs.map +1 -0
- package/dist/{ansi-CsjnZtAw.d.mts → ansi-Cc33mW54.d.mts} +1 -1
- package/dist/{ansi-CsjnZtAw.d.mts.map → ansi-Cc33mW54.d.mts.map} +1 -1
- package/dist/{chunk-BSw8zbkd.mjs → chunk-Vs_PY4HZ.mjs} +1 -1
- package/dist/cli-BKp0YtBD.mjs +4 -0
- package/dist/{context-BjWgrikx.mjs → context-BU5LkkIy.mjs} +8 -7
- package/dist/context-BU5LkkIy.mjs.map +1 -0
- package/dist/devtools-9QY4teqI.mjs +2 -0
- package/dist/{devtools-CeO9X_uv.mjs → devtools-DxkSLXDA.mjs} +4 -5
- package/dist/devtools-DxkSLXDA.mjs.map +1 -0
- package/dist/{eta-BnQSZcWf.mjs → eta-Bb3RH3wh.mjs} +1 -1
- package/dist/{eta-BnQSZcWf.mjs.map → eta-Bb3RH3wh.mjs.map} +1 -1
- package/dist/{flexily-zero-adapter-BOM0cl8R.mjs → flexily-zero-adapter-BlQa46nr.mjs} +21 -64
- package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +1 -0
- package/dist/{flexily-zero-adapter-V8R3HQtK.mjs → flexily-zero-adapter-CMxXhdOL.mjs} +1 -1
- package/dist/{image-B0zMbVUr.mjs → image-CTII5QWI.mjs} +3 -3
- package/dist/image-CTII5QWI.mjs.map +1 -0
- package/dist/{index-Bh3U1K09.d.mts → index-BXslOebb.d.mts} +547 -137
- package/dist/index-BXslOebb.d.mts.map +1 -0
- package/dist/{index-C4vrhbud.d.mts → index-BnA7mNpo.d.mts} +1 -1
- package/dist/{index-C4vrhbud.d.mts.map → index-BnA7mNpo.d.mts.map} +1 -1
- package/dist/index-D3saHouR.d.mts +1392 -0
- package/dist/index-D3saHouR.d.mts.map +1 -0
- package/dist/index.d.mts +5 -33
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +13 -13
- package/dist/{layout-engine--drvrWjD.mjs → layout-engine-B6Cdz1yZ.mjs} +1 -1
- package/dist/{layout-engine-Dr3cY5U4.mjs → layout-engine-ClUgv6jB.mjs} +3 -3
- package/dist/{layout-engine-Dr3cY5U4.mjs.map → layout-engine-ClUgv6jB.mjs.map} +1 -1
- package/dist/{multi-progress-CcdqJFlf.mjs → multi-progress-Bq9Oi_WI.mjs} +3 -3
- package/dist/{multi-progress-CcdqJFlf.mjs.map → multi-progress-Bq9Oi_WI.mjs.map} +1 -1
- package/dist/{multi-progress-DQ-uUzLf.d.mts → multi-progress-DAQC7eap.d.mts} +2 -2
- package/dist/{multi-progress-DQ-uUzLf.d.mts.map → multi-progress-DAQC7eap.d.mts.map} +1 -1
- package/dist/{node-CP5WChgr.mjs → node-BeWlnCPY.mjs} +4 -4
- package/dist/node-BeWlnCPY.mjs.map +1 -0
- package/dist/{progress-bar-IrUjkLfU.mjs → progress-bar-CXE5Qfkd.mjs} +4 -4
- package/dist/progress-bar-CXE5Qfkd.mjs.map +1 -0
- package/dist/reconciler-Cwgm8hRR.mjs +8459 -0
- package/dist/reconciler-Cwgm8hRR.mjs.map +1 -0
- package/dist/{render-string-DVfgc8xr.mjs → render-string-Cbuf63Ya.mjs} +936 -136
- package/dist/render-string-Cbuf63Ya.mjs.map +1 -0
- package/dist/{render-string-BwLG7rIX.mjs → render-string-Tv-jqM16.mjs} +1 -1
- package/dist/runtime.d.mts +2 -2
- package/dist/runtime.mjs +3 -3
- package/dist/{spinner-BRkaJI0N.d.mts → spinner-CGo34vyR.d.mts} +2 -2
- package/dist/{spinner-BRkaJI0N.d.mts.map → spinner-CGo34vyR.d.mts.map} +1 -1
- package/dist/{spinner-BmldKx0M.mjs → spinner-CeOmcuw_.mjs} +3 -3
- package/dist/spinner-CeOmcuw_.mjs.map +1 -0
- package/dist/src-B5GjfG7g.mjs +4305 -0
- package/dist/src-B5GjfG7g.mjs.map +1 -0
- package/dist/{src-CJPXf3fC.mjs → src-C2uvC-r0.mjs} +7535 -6467
- package/dist/src-C2uvC-r0.mjs.map +1 -0
- package/dist/{src-D8kLrQBT.mjs → src-CChwjk0Z.mjs} +8 -86
- package/dist/src-CChwjk0Z.mjs.map +1 -0
- package/dist/{src-D_BS-as7.mjs → src-NCKb8kE5.mjs} +777 -776
- package/dist/src-NCKb8kE5.mjs.map +1 -0
- package/dist/theme.d.mts +2 -130
- package/dist/theme.mjs +3 -8
- package/dist/{types-B4A8Ebba.d.mts → types-BH_v3iMT.d.mts} +1 -1
- package/dist/{types-B4A8Ebba.d.mts.map → types-BH_v3iMT.d.mts.map} +1 -1
- package/dist/{types-e4dpfbSa.mjs → types-Bk2yw9Qj.mjs} +3 -3
- package/dist/types-Bk2yw9Qj.mjs.map +1 -0
- package/dist/ui/animation.d.mts +1 -1
- package/dist/ui/animation.mjs +1 -1
- package/dist/ui/ansi.d.mts +1 -1
- package/dist/ui/ansi.mjs +1 -1
- package/dist/ui/cli.d.mts +3 -3
- package/dist/ui/cli.mjs +5 -5
- package/dist/ui/display.d.mts +1 -1
- package/dist/ui/display.mjs.map +1 -1
- package/dist/ui/image.d.mts +1 -1
- package/dist/ui/image.mjs +1 -1
- package/dist/ui/input.d.mts +1 -1
- package/dist/ui/input.d.mts.map +1 -1
- package/dist/ui/input.mjs +2 -4
- package/dist/ui/input.mjs.map +1 -1
- package/dist/ui/progress.d.mts +3 -3
- package/dist/ui/progress.d.mts.map +1 -1
- package/dist/ui/progress.mjs +3 -3
- package/dist/ui/progress.mjs.map +1 -1
- package/dist/ui/react.d.mts +1 -1
- package/dist/ui/react.d.mts.map +1 -1
- package/dist/ui/react.mjs +2 -2
- package/dist/ui/react.mjs.map +1 -1
- package/dist/ui/utils.mjs +1 -1
- package/dist/ui/wrappers.d.mts +2 -2
- package/dist/ui/wrappers.mjs +1 -1
- package/dist/ui.d.mts +5 -5
- package/dist/ui.mjs +6 -6
- package/dist/{useLatest-6xqnGIU6.d.mts → useLatest-Bg2x4bfP.d.mts} +1 -1
- package/dist/{useLatest-6xqnGIU6.d.mts.map → useLatest-Bg2x4bfP.d.mts.map} +1 -1
- package/dist/{with-text-input-lUh9gYAG.d.mts → with-text-input-CRfoiFFG.d.mts} +3 -3
- package/dist/with-text-input-CRfoiFFG.d.mts.map +1 -0
- package/dist/{wrappers-JrEYTuKA.mjs → wrappers-UTADQkSY.mjs} +4 -4
- package/dist/wrappers-UTADQkSY.mjs.map +1 -0
- package/dist/{yoga-adapter-Bc8XT9cN.mjs → yoga-adapter-8oRGRw8V.mjs} +2 -2
- package/dist/{yoga-adapter-Bc8XT9cN.mjs.map → yoga-adapter-8oRGRw8V.mjs.map} +1 -1
- package/dist/yoga-adapter-D_CcxSt5.mjs +2 -0
- package/package.json +54 -45
- package/dist/UPNG-DvKjM6wE.mjs +0 -5076
- package/dist/UPNG-DvKjM6wE.mjs.map +0 -1
- package/dist/__vite-browser-external-2447137e-DPKHHqQK.mjs +0 -6
- package/dist/__vite-browser-external-2447137e-DPKHHqQK.mjs.map +0 -1
- package/dist/ansi-C6Qs1Wn2.mjs.map +0 -1
- package/dist/apng-CvSlLBtc.mjs +0 -3
- package/dist/apng-DFFVOItr.mjs +0 -70
- package/dist/apng-DFFVOItr.mjs.map +0 -1
- package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
- package/dist/backend-DU0Y938U.mjs +0 -13396
- package/dist/backend-DU0Y938U.mjs.map +0 -1
- package/dist/backends-BihMKFY_.mjs +0 -1181
- package/dist/backends-BihMKFY_.mjs.map +0 -1
- package/dist/backends-Dk_5G_gC.mjs +0 -3
- package/dist/cli-GwJ0S2In.mjs +0 -4
- package/dist/context-BjWgrikx.mjs.map +0 -1
- package/dist/derive-O_Kb1Bk_.d.mts +0 -28
- package/dist/derive-O_Kb1Bk_.d.mts.map +0 -1
- package/dist/devtools-CeO9X_uv.mjs.map +0 -1
- package/dist/devtools-nX4tj6OH.mjs +0 -2
- package/dist/flexily-zero-adapter-BOM0cl8R.mjs.map +0 -1
- package/dist/gif-B9Uq4qZA.mjs +0 -73
- package/dist/gif-B9Uq4qZA.mjs.map +0 -1
- package/dist/gif-BdrLRBmM.mjs +0 -3
- package/dist/gifenc-DfhOb4xr.mjs +0 -730
- package/dist/gifenc-DfhOb4xr.mjs.map +0 -1
- package/dist/image-B0zMbVUr.mjs.map +0 -1
- package/dist/index-Bh3U1K09.d.mts.map +0 -1
- package/dist/index-dehZ18K-.d.mts +0 -679
- package/dist/index-dehZ18K-.d.mts.map +0 -1
- package/dist/key-mapping-7k2ufK2b.mjs +0 -3
- package/dist/key-mapping-WLUmxjx1.mjs +0 -132
- package/dist/key-mapping-WLUmxjx1.mjs.map +0 -1
- package/dist/node-CP5WChgr.mjs.map +0 -1
- package/dist/progress-bar-IrUjkLfU.mjs.map +0 -1
- package/dist/reconciler-B8uxQxaU.mjs +0 -16482
- package/dist/reconciler-B8uxQxaU.mjs.map +0 -1
- package/dist/render-string-DVfgc8xr.mjs.map +0 -1
- package/dist/resvg-js-Cwipz-_J.mjs +0 -203
- package/dist/resvg-js-Cwipz-_J.mjs.map +0 -1
- package/dist/spinner-BmldKx0M.mjs.map +0 -1
- package/dist/src-C0sOQW-t.mjs +0 -3866
- package/dist/src-C0sOQW-t.mjs.map +0 -1
- package/dist/src-CJPXf3fC.mjs.map +0 -1
- package/dist/src-D8kLrQBT.mjs.map +0 -1
- package/dist/src-D_BS-as7.mjs.map +0 -1
- package/dist/theme.d.mts.map +0 -1
- package/dist/theme.mjs.map +0 -1
- package/dist/types-e4dpfbSa.mjs.map +0 -1
- package/dist/with-text-input-lUh9gYAG.d.mts.map +0 -1
- package/dist/wrapper-CE6GQ27z.mjs +0 -3527
- package/dist/wrapper-CE6GQ27z.mjs.map +0 -1
- package/dist/wrappers-JrEYTuKA.mjs.map +0 -1
- package/dist/yoga-adapter-B8LZpQcE.mjs +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers-UTADQkSY.mjs","names":[],"sources":["../packages/ag-react/src/ui/wrappers/with-spinner.ts","../packages/ag-react/src/ui/wrappers/with-progress.ts","../packages/ag-react/src/ui/wrappers/wrap-generator.ts","../packages/ag-react/src/ui/wrappers/wrap-emitter.ts","../packages/ag-react/src/ui/wrappers/with-select.ts","../packages/ag-react/src/ui/wrappers/with-text-input.ts"],"sourcesContent":["/**\n * withSpinner - Wrap promises with an animated spinner\n */\n\nimport type { WithSpinnerOptions } from \"../types.js\"\nimport { Spinner } from \"../cli/spinner\"\n\n/**\n * Wrap a promise with an animated spinner\n *\n * @example\n * ```ts\n * // Simple usage\n * const data = await withSpinner(fetchData(), \"Loading data...\");\n *\n * // With options\n * const result = await withSpinner(\n * processFiles(),\n * \"Processing...\",\n * { style: \"arc\", clearOnComplete: true }\n * );\n *\n * // With dynamic text\n * const result = await withSpinner(\n * longOperation(),\n * (elapsed) => `Processing... (${elapsed}s)`\n * );\n * ```\n */\nexport async function withSpinner<T>(\n promise: Promise<T> | (() => T | Promise<T>),\n text: string | ((elapsedSeconds: number) => string),\n options: WithSpinnerOptions = {},\n): Promise<T> {\n const spinner = new Spinner({\n text: typeof text === \"string\" ? text : text(0),\n style: options.style,\n color: options.color,\n })\n\n let timer: ReturnType<typeof setInterval> | null = null\n const startTime = Date.now()\n\n spinner.start()\n\n // Update text if dynamic\n if (typeof text === \"function\") {\n timer = setInterval(() => {\n const elapsed = Math.floor((Date.now() - startTime) / 1000)\n spinner.currentText = text(elapsed)\n }, 1000)\n }\n\n try {\n const result = await (typeof promise === \"function\" ? promise() : promise)\n\n if (timer) clearInterval(timer)\n\n if (options.clearOnComplete) {\n spinner.stop()\n } else {\n spinner.succeed()\n }\n\n return result\n } catch (error) {\n if (timer) clearInterval(timer)\n spinner.fail(error instanceof Error ? error.message : \"Failed\")\n throw error\n }\n}\n\n/**\n * Attach a spinner to a promise for manual control\n * Returns [result, spinner] tuple for custom control\n *\n * @example\n * ```ts\n * const [promise, spinner] = attachSpinner(fetchData(), \"Loading...\");\n * spinner.text = \"Still loading...\";\n * const result = await promise;\n * spinner.succeed(\"Loaded!\");\n * ```\n */\nexport function attachSpinner<T>(\n promise: Promise<T>,\n text: string,\n options: WithSpinnerOptions = {},\n): [Promise<T>, Spinner] {\n const spinner = new Spinner({\n text,\n style: options.style,\n color: options.color,\n })\n\n spinner.start()\n\n async function wrapPromise(): Promise<T> {\n try {\n return await promise\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : \"Failed\")\n throw error\n }\n }\n\n return [wrapPromise(), spinner]\n}\n","/**\n * withProgress - Wrap callback-based progress functions\n *\n * @deprecated Use `steps()` from `@silvery/ag-react/ui/progress` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * import { withProgress } from \"./index\";\n * const result = await withProgress(\n * (onProgress) => manager.syncFromFs(onProgress),\n * { phases: SYNC_PHASES }\n * );\n *\n * // NEW:\n * import { steps } from \"../progress/index\";\n * const results = await steps({ syncFiles: () => manager.syncFromFs() }).run();\n * ```\n */\n\nimport type { ProgressInfo, ProgressCallback, WithProgressOptions } from \"../types.js\"\nimport { ProgressBar } from \"../cli/progress-bar\"\nimport { Spinner } from \"../cli/spinner\"\nimport { CURSOR_HIDE, CURSOR_SHOW, write, isTTY } from \"../cli/ansi\"\n\n// Declare timer globals (not exposed by bun-types)\ndeclare function setTimeout(callback: () => void, ms: number): unknown\ndeclare function clearTimeout(id: unknown): void\n\n// Timer type - opaque handle, we only store and clear it\ntype TimerId = unknown\n\n/**\n * Wrap a function that takes a progress callback\n *\n * @example\n * ```ts\n * // Wrap existing km sync API\n * const result = await withProgress(\n * (onProgress) => manager.syncFromFs(onProgress),\n * {\n * phases: {\n * scanning: \"Scanning files\",\n * reconciling: \"Reconciling changes\",\n * rules: \"Evaluating rules\"\n * }\n * }\n * );\n *\n * // Simple usage without phases\n * await withProgress((onProgress) => rebuildState(onProgress));\n *\n * // With custom format\n * await withProgress(\n * (p) => processFiles(p),\n * { format: \":phase :bar :percent\" }\n * );\n *\n * // Show loading immediately (showAfter: 0) or after delay\n * await withProgress(\n * (p) => slowOperation(p),\n * { showAfter: 1000, initialMessage: \"Loading...\" }\n * );\n * ```\n */\nexport async function withProgress<T>(\n fn: (onProgress: ProgressCallback) => T | Promise<T>,\n options: WithProgressOptions = {},\n): Promise<T> {\n const stream = process.stdout\n const isTty = isTTY(stream)\n\n // Determine format\n const format =\n options.format ??\n (options.phases ? \":phase [:bar] :current/:total\" : \"[:bar] :current/:total :percent\")\n\n const bar = new ProgressBar({\n format,\n phases: options.phases ?? {},\n hideCursor: true,\n })\n\n let lastPhase: string | null = null\n let started = false\n\n // Initial spinner (shown before progress starts)\n const showAfter = options.showAfter ?? 1000\n const initialMessage = options.initialMessage ?? \"Loading...\"\n let spinner: Spinner | null = null\n let spinnerTimerId: TimerId | null = null\n\n // Hide cursor\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n // Schedule initial spinner if configured\n if (isTty && showAfter >= 0) {\n spinnerTimerId = setTimeout(() => {\n if (!started) {\n spinner = new Spinner({ text: initialMessage })\n spinner.start()\n }\n }, showAfter)\n }\n\n const onProgress: ProgressCallback = (info: ProgressInfo) => {\n // Stop initial spinner if it was shown\n if (spinner) {\n spinner.stop()\n spinner = null\n }\n if (spinnerTimerId !== null) {\n clearTimeout(spinnerTimerId)\n spinnerTimerId = null\n }\n\n // Handle phase transitions\n if (info.phase && info.phase !== lastPhase) {\n if (lastPhase !== null && isTty) {\n // Print newline before switching phases\n write(\"\\n\", stream)\n }\n lastPhase = info.phase\n\n // Start or update bar with new phase\n if (!started) {\n bar.start(info.current, info.total)\n started = true\n }\n bar.setPhase(info.phase, { current: info.current, total: info.total })\n } else {\n if (!started) {\n bar.start(info.current, info.total)\n started = true\n }\n bar.update(info.current)\n }\n }\n\n try {\n const result = await fn(onProgress)\n\n // Clean up spinner if still pending\n if (spinnerTimerId !== null) {\n clearTimeout(spinnerTimerId)\n }\n // Note: spinner may be set by setTimeout callback - TS can't track this\n const pendingSpinner = spinner as unknown as Spinner | null\n if (pendingSpinner) {\n pendingSpinner.stop()\n }\n\n // Stop and show cursor\n if (started) {\n bar.stop(options.clearOnComplete)\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n\n return result\n } catch (error) {\n // Clean up spinner\n if (spinnerTimerId !== null) {\n clearTimeout(spinnerTimerId)\n }\n // Note: spinner may be set by setTimeout callback - TS can't track this\n const errorSpinner = spinner as unknown as Spinner | null\n if (errorSpinner) {\n errorSpinner.stop()\n }\n\n // Restore cursor on error\n if (started) {\n bar.stop()\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n throw error\n }\n}\n\n/**\n * Create a progress callback that can be passed to existing APIs\n * Returns [callback, complete] tuple\n *\n * @example\n * ```ts\n * const [onProgress, complete] = createProgressCallback({\n * phases: { scanning: \"Scanning\", reconciling: \"Reconciling\" }\n * });\n *\n * const result = await manager.syncFromFs(onProgress);\n * complete();\n * ```\n */\nexport function createProgressCallback(\n options: WithProgressOptions = {},\n): [ProgressCallback, () => void] {\n const stream = process.stdout\n const isTty = isTTY(stream)\n\n const format =\n options.format ??\n (options.phases ? \":phase [:bar] :current/:total\" : \"[:bar] :current/:total :percent\")\n\n const bar = new ProgressBar({\n format,\n phases: options.phases ?? {},\n hideCursor: true,\n })\n\n let lastPhase: string | null = null\n let started = false\n\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n const callback: ProgressCallback = (info: ProgressInfo) => {\n if (info.phase && info.phase !== lastPhase) {\n if (lastPhase !== null && isTty) {\n write(\"\\n\", stream)\n }\n lastPhase = info.phase\n\n if (!started) {\n bar.start(info.current, info.total)\n started = true\n }\n bar.setPhase(info.phase, { current: info.current, total: info.total })\n } else {\n if (!started) {\n bar.start(info.current, info.total)\n started = true\n }\n bar.update(info.current)\n }\n }\n\n const complete = () => {\n if (started) {\n bar.stop(options.clearOnComplete)\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n }\n\n return [callback, complete]\n}\n","/**\n * wrapGenerator - Consume a generator while showing progress\n */\n\nimport type { ProgressGenerator } from \"../types.js\"\nimport { ProgressBar } from \"../cli/progress-bar\"\nimport { CURSOR_HIDE, CURSOR_SHOW, write, isTTY } from \"../cli/ansi\"\n\n/**\n * Consume a progress generator while displaying progress\n *\n * @example\n * ```ts\n * // Wrap existing generator (like evaluateAllRules())\n * await wrapGenerator(evaluateAllRules(), \"Evaluating rules\");\n *\n * // With custom format\n * await wrapGenerator(\n * processItems(),\n * ({ current, total }) => `Processing: ${current}/${total}`\n * );\n *\n * // Get the generator's return value\n * const result = await wrapGenerator(generatorWithReturn(), \"Processing\");\n * ```\n */\nexport async function wrapGenerator<T>(\n generator: ProgressGenerator<T>,\n textOrFormat: string | ((progress: { current: number; total: number }) => string),\n options: { clearOnComplete?: boolean } = {},\n): Promise<T> {\n const stream = process.stdout\n const isTty = isTTY(stream)\n\n const isCustomFormat = typeof textOrFormat === \"function\"\n const label = isCustomFormat ? \"\" : textOrFormat\n\n const bar = new ProgressBar({\n format: label ? `${label} [:bar] :current/:total :percent` : \":bar :current/:total :percent\",\n hideCursor: true,\n })\n\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n let started = false\n let result: IteratorResult<{ current: number; total: number }, T>\n\n try {\n // Consume the generator\n while (true) {\n result = generator.next()\n\n if (result.done) {\n break\n }\n\n const { current, total } = result.value\n\n if (!started) {\n bar.start(current, total)\n started = true\n } else {\n bar.update(current)\n }\n }\n\n // Stop bar\n if (started) {\n bar.stop(options.clearOnComplete)\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n\n return result.value\n } catch (error) {\n if (started) {\n bar.stop()\n }\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n throw error\n }\n}\n\n/**\n * Create an async iterable wrapper that shows progress\n *\n * @example\n * ```ts\n * const items = [1, 2, 3, 4, 5];\n * for await (const item of withIterableProgress(items, \"Processing\")) {\n * await processItem(item);\n * }\n * ```\n */\nexport async function* withIterableProgress<T>(\n iterable: Iterable<T> | AsyncIterable<T>,\n label: string,\n options: { clearOnComplete?: boolean } = {},\n): AsyncGenerator<T, void, unknown> {\n const stream = process.stdout\n const isTty = isTTY(stream)\n\n // Try to get length if array\n const items = Array.isArray(iterable) ? iterable : null\n const total = items?.length ?? 0\n\n const bar = new ProgressBar({\n format: `${label} [:bar] :current/:total :percent`,\n total,\n hideCursor: true,\n })\n\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n let current = 0\n bar.start(0, total)\n\n try {\n for await (const item of iterable as AsyncIterable<T>) {\n yield item\n current++\n bar.update(current)\n }\n\n bar.stop(options.clearOnComplete)\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n } catch (error) {\n bar.stop()\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n throw error\n }\n}\n","/**\n * wrapEmitter - Track EventEmitter state changes with progress indicators\n */\n\nimport type { EventEmitter } from \"events\"\nimport { Spinner } from \"../cli/spinner\"\n\n/** Event handler configuration */\ninterface EventConfig {\n /** Display text for this event */\n text?: string\n /** Dynamic text based on event data */\n getText?: (data: unknown) => string\n /** Mark spinner as succeeded */\n succeed?: boolean\n /** Mark spinner as failed */\n fail?: boolean\n /** Stop tracking */\n stop?: boolean\n}\n\n/** Configuration for wrapEmitter */\ninterface WrapEmitterConfig {\n /** Event handlers */\n events: Record<string, EventConfig>\n /** Initial text */\n initialText?: string\n}\n\n/**\n * Track EventEmitter state changes with a spinner\n *\n * @example\n * ```ts\n * const stop = wrapEmitter(syncManager, {\n * initialText: \"Starting sync...\",\n * events: {\n * 'ready': { text: \"Watcher ready\", succeed: true },\n * 'state-change': { getText: (s) => `State: ${s}` },\n * 'error': { fail: true },\n * 'idle': { stop: true }\n * }\n * });\n *\n * // Later, to stop manually\n * stop();\n * ```\n */\nexport function wrapEmitter(emitter: EventEmitter, config: WrapEmitterConfig): () => void {\n const spinner = new Spinner(config.initialText ?? \"\")\n const handlers: Map<string, (...args: unknown[]) => void> = new Map()\n\n spinner.start()\n\n // Set up event handlers\n for (const [eventName, eventConfig] of Object.entries(config.events)) {\n const handler = (data: unknown) => {\n // Update text\n if (eventConfig.getText) {\n spinner.currentText = eventConfig.getText(data)\n } else if (eventConfig.text) {\n spinner.currentText = eventConfig.text\n }\n\n // Handle terminal states\n if (eventConfig.succeed) {\n spinner.succeed()\n cleanup()\n } else if (eventConfig.fail) {\n const message = data instanceof Error ? data.message : String(data ?? \"Failed\")\n spinner.fail(message)\n cleanup()\n } else if (eventConfig.stop) {\n spinner.stop()\n cleanup()\n }\n }\n\n handlers.set(eventName, handler)\n emitter.on(eventName, handler)\n }\n\n // Cleanup function\n function cleanup() {\n for (const [eventName, handler] of handlers) {\n emitter.off(eventName, handler)\n }\n handlers.clear()\n }\n\n // Return stop function\n return () => {\n spinner.stop()\n cleanup()\n }\n}\n\n/**\n * Wait for an EventEmitter to emit a specific event\n * Shows a spinner while waiting\n *\n * @example\n * ```ts\n * await waitForEvent(syncManager, \"ready\", \"Waiting for watcher...\");\n * ```\n */\nexport async function waitForEvent(\n emitter: EventEmitter,\n eventName: string,\n text: string,\n options: {\n errorEvent?: string\n timeout?: number\n } = {},\n): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const spinner = new Spinner(text)\n spinner.start()\n\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const cleanup = () => {\n emitter.off(eventName, successHandler)\n if (options.errorEvent) {\n emitter.off(options.errorEvent, errorHandler)\n }\n if (timer) {\n clearTimeout(timer)\n }\n }\n\n const successHandler = (data: unknown) => {\n cleanup()\n spinner.succeed()\n resolve(data)\n }\n\n const errorHandler = (error: unknown) => {\n cleanup()\n spinner.fail(error instanceof Error ? error.message : \"Error\")\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n\n emitter.once(eventName, successHandler)\n\n if (options.errorEvent) {\n emitter.once(options.errorEvent, errorHandler)\n }\n\n if (options.timeout) {\n timer = setTimeout(() => {\n cleanup()\n spinner.fail(\"Timeout\")\n reject(new Error(`Timeout waiting for ${eventName}`))\n }, options.timeout)\n }\n })\n}\n","/**\n * withSelect - Interactive CLI selection list\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { SelectOption, WithSelectOptions } from \"../types.js\"\nimport {\n CURSOR_HIDE,\n CURSOR_SHOW,\n CURSOR_TO_START,\n CLEAR_LINE_END,\n cursorUp,\n write,\n isTTY,\n} from \"../cli/ansi\"\n\n/**\n * Display an interactive selection list in the terminal\n *\n * @example\n * ```ts\n * // Simple usage\n * const color = await withSelect(\"Choose a color:\", [\n * { label: \"Red\", value: \"red\" },\n * { label: \"Green\", value: \"green\" },\n * { label: \"Blue\", value: \"blue\" },\n * ]);\n *\n * // With options\n * const result = await withSelect(\n * \"Select item:\",\n * options,\n * { initial: 2, maxVisible: 5 }\n * );\n * ```\n */\nexport async function withSelect<T>(\n prompt: string,\n options: SelectOption<T>[],\n selectOptions: WithSelectOptions = {},\n): Promise<T> {\n const { initial = 0, maxVisible = 10 } = selectOptions\n const stream = process.stdout\n const stdin = process.stdin\n\n if (!isTTY(stream) || !stdin.isTTY) {\n // Non-interactive mode: return first option or initial\n return options[initial]?.value ?? options[0]!.value\n }\n\n return new Promise((resolve, reject) => {\n let highlightIndex = Math.min(Math.max(0, initial), options.length - 1)\n let linesRendered = 0\n\n // Enable raw mode for character-by-character input\n stdin.setRawMode(true)\n stdin.resume()\n stdin.setEncoding(\"utf8\")\n\n // Hide cursor\n write(CURSOR_HIDE, stream)\n\n function render() {\n // Clear previously rendered lines\n if (linesRendered > 0) {\n write(cursorUp(linesRendered), stream)\n }\n\n // Calculate scroll window\n const scrollOffset = Math.max(\n 0,\n Math.min(highlightIndex - Math.floor(maxVisible / 2), options.length - maxVisible),\n )\n const visibleCount = Math.min(maxVisible, options.length)\n const visibleOptions = options.slice(scrollOffset, scrollOffset + visibleCount)\n const hasMoreAbove = scrollOffset > 0\n const hasMoreBelow = scrollOffset + visibleCount < options.length\n\n // Render prompt\n write(`${CURSOR_TO_START}${chalk.bold(prompt)}${CLEAR_LINE_END}\\n`, stream)\n\n let lines = 1\n\n // Render scroll indicator (above)\n if (hasMoreAbove) {\n write(`${CURSOR_TO_START} ${chalk.dim(\"...\")}${CLEAR_LINE_END}\\n`, stream)\n lines++\n }\n\n // Render options\n for (let i = 0; i < visibleOptions.length; i++) {\n const option = visibleOptions[i]\n const actualIndex = scrollOffset + i\n const isHighlighted = actualIndex === highlightIndex\n\n const indicator = isHighlighted ? chalk.cyan(\">\") : \" \"\n const label = isHighlighted ? chalk.cyan(option!.label) : option!.label\n\n write(`${CURSOR_TO_START}${indicator} ${label}${CLEAR_LINE_END}\\n`, stream)\n lines++\n }\n\n // Render scroll indicator (below)\n if (hasMoreBelow) {\n write(`${CURSOR_TO_START} ${chalk.dim(\"...\")}${CLEAR_LINE_END}\\n`, stream)\n lines++\n }\n\n linesRendered = lines\n }\n\n function cleanup() {\n stdin.setRawMode(false)\n stdin.pause()\n stdin.removeListener(\"data\", onKeypress)\n write(CURSOR_SHOW, stream)\n }\n\n function onKeypress(key: string) {\n // Handle key sequences\n const keyCode = key.charCodeAt(0)\n\n // Ctrl+C\n if (key === \"\\x03\") {\n cleanup()\n reject(new Error(\"User cancelled\"))\n return\n }\n\n // Enter/Return\n if (key === \"\\r\" || key === \"\\n\") {\n cleanup()\n resolve(options[highlightIndex]!.value)\n return\n }\n\n // Escape\n if (key === \"\\x1b\" && key.length === 1) {\n cleanup()\n reject(new Error(\"User cancelled\"))\n return\n }\n\n // Arrow keys (escape sequences)\n if (key.startsWith(\"\\x1b[\")) {\n const code = key.slice(2)\n if (code === \"A\") {\n // Up arrow\n highlightIndex = Math.max(0, highlightIndex - 1)\n render()\n } else if (code === \"B\") {\n // Down arrow\n highlightIndex = Math.min(options.length - 1, highlightIndex + 1)\n render()\n }\n return\n }\n\n // j/k vim keys\n if (key === \"j\" || key === \"J\") {\n highlightIndex = Math.min(options.length - 1, highlightIndex + 1)\n render()\n return\n }\n if (key === \"k\" || key === \"K\") {\n highlightIndex = Math.max(0, highlightIndex - 1)\n render()\n return\n }\n\n // Space to select (optional alternative to Enter)\n if (key === \" \") {\n cleanup()\n resolve(options[highlightIndex]!.value)\n return\n }\n }\n\n stdin.on(\"data\", onKeypress)\n render()\n })\n}\n\n/**\n * Create a reusable select instance for multiple selections\n *\n * @example\n * ```ts\n * const select = createSelect({\n * maxVisible: 5,\n * });\n *\n * const first = await select(\"Choose first:\", options1);\n * const second = await select(\"Choose second:\", options2);\n * ```\n */\nexport function createSelect(\n defaultOptions: WithSelectOptions = {},\n): <T>(prompt: string, options: SelectOption<T>[], overrides?: WithSelectOptions) => Promise<T> {\n return <T>(prompt: string, options: SelectOption<T>[], overrides: WithSelectOptions = {}) =>\n withSelect(prompt, options, { ...defaultOptions, ...overrides })\n}\n","/**\n * withTextInput - CLI wrapper for text input prompts\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { TextInputOptions } from \"../types.js\"\nimport {\n CURSOR_HIDE,\n CURSOR_SHOW,\n CURSOR_TO_START,\n CLEAR_LINE_END,\n write,\n isTTY,\n} from \"../cli/ansi\"\n\n/**\n * Prompt for text input in the terminal\n *\n * @example\n * ```ts\n * // Simple usage\n * const name = await withTextInput(\"What is your name?\");\n *\n * // With options\n * const password = await withTextInput(\"Password:\", { mask: \"*\" });\n *\n * // With validation\n * const email = await withTextInput(\"Email:\", {\n * validate: (v) => v.includes(\"@\") ? undefined : \"Invalid email\"\n * });\n *\n * // With autocomplete\n * const fruit = await withTextInput(\"Pick a fruit:\", {\n * autocomplete: [\"apple\", \"banana\", \"cherry\"]\n * });\n * ```\n */\nexport async function withTextInput(\n prompt: string,\n options: TextInputOptions = {},\n): Promise<string> {\n const stream = options.stream ?? process.stdout\n const inputStream = options.inputStream ?? process.stdin\n const isTty = isTTY(stream)\n\n // Initialize state\n let value = options.defaultValue ?? \"\"\n let cursorPosition = value.length\n let errorMessage: string | undefined\n\n // Setup raw mode for character-by-character input\n if (inputStream.isTTY) {\n inputStream.setRawMode(true)\n }\n inputStream.resume()\n\n // Render the current state\n const render = () => {\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n const suggestionSuffix = suggestion ? chalk.dim(suggestion.slice(value.length)) : \"\"\n\n // Build cursor display\n const beforeCursor = displayValue.slice(0, cursorPosition)\n const cursorChar = displayValue[cursorPosition] ?? \" \"\n const afterCursor = displayValue.slice(cursorPosition + 1)\n\n // Placeholder when empty\n const showPlaceholder = !value && options.placeholder\n const inputDisplay = showPlaceholder\n ? chalk.dim(options.placeholder) + chalk.inverse(\" \")\n : beforeCursor + chalk.inverse(cursorChar) + afterCursor + suggestionSuffix\n\n // Error message\n const errorDisplay = errorMessage ? chalk.red(` (${errorMessage})`) : \"\"\n\n const line = `${chalk.cyan(\"?\")} ${chalk.bold(prompt)} ${inputDisplay}${errorDisplay}`\n\n if (isTty) {\n write(`${CURSOR_TO_START}${line}${CLEAR_LINE_END}`, stream)\n }\n }\n\n // Hide cursor during input (we show our own)\n if (isTty) {\n write(CURSOR_HIDE, stream)\n }\n\n render()\n\n return new Promise<string>((resolve, reject) => {\n const cleanup = () => {\n inputStream.removeListener(\"data\", onData)\n inputStream.removeListener(\"error\", onError)\n if (inputStream.isTTY) {\n inputStream.setRawMode(false)\n }\n inputStream.pause()\n if (isTty) {\n write(CURSOR_SHOW, stream)\n }\n }\n\n const submit = () => {\n // Validate before accepting\n if (options.validate) {\n const error = options.validate(value)\n if (error) {\n errorMessage = error\n render()\n return\n }\n }\n\n cleanup()\n\n // Show final value\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n write(\n `${CURSOR_TO_START}${chalk.green(\"✔\")} ${chalk.bold(prompt)} ${chalk.dim(displayValue)}${CLEAR_LINE_END}\\n`,\n stream,\n )\n\n resolve(value)\n }\n\n const onError = (err: Error) => {\n cleanup()\n reject(err)\n }\n\n const onData = (data: Buffer) => {\n const input = data.toString()\n errorMessage = undefined // Clear error on any input\n\n // Handle special keys\n for (let i = 0; i < input.length; i++) {\n const char = input[i]!\n const code = char.charCodeAt(0)\n\n // Enter (CR or LF)\n if (code === 13 || code === 10) {\n submit()\n return\n }\n\n // Ctrl+C - abort\n if (code === 3) {\n cleanup()\n write(\"\\n\", stream)\n reject(new Error(\"User aborted\"))\n return\n }\n\n // Escape - clear or abort\n if (code === 27) {\n // Check for arrow key sequences\n if (input[i + 1] === \"[\") {\n const arrowCode = input[i + 2]\n if (arrowCode === \"D\") {\n // Left arrow\n cursorPosition = Math.max(0, cursorPosition - 1)\n i += 2\n continue\n }\n if (arrowCode === \"C\") {\n // Right arrow\n cursorPosition = Math.min(value.length, cursorPosition + 1)\n i += 2\n continue\n }\n if (arrowCode === \"H\") {\n // Home\n cursorPosition = 0\n i += 2\n continue\n }\n if (arrowCode === \"F\") {\n // End\n cursorPosition = value.length\n i += 2\n continue\n }\n // Skip other escape sequences\n i += 2\n continue\n }\n // Plain escape - clear input\n value = \"\"\n cursorPosition = 0\n continue\n }\n\n // Backspace (127 or 8)\n if (code === 127 || code === 8) {\n if (cursorPosition > 0) {\n value = value.slice(0, cursorPosition - 1) + value.slice(cursorPosition)\n cursorPosition--\n }\n continue\n }\n\n // Delete (escape sequence handled above)\n if (code === 4) {\n // Ctrl+D acts as delete\n if (cursorPosition < value.length) {\n value = value.slice(0, cursorPosition) + value.slice(cursorPosition + 1)\n }\n continue\n }\n\n // Tab - accept autocomplete suggestion\n if (code === 9) {\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n if (suggestion) {\n value = suggestion\n cursorPosition = value.length\n }\n continue\n }\n\n // Ctrl+A - beginning of line\n if (code === 1) {\n cursorPosition = 0\n continue\n }\n\n // Ctrl+E - end of line\n if (code === 5) {\n cursorPosition = value.length\n continue\n }\n\n // Ctrl+U - clear to beginning\n if (code === 21) {\n value = value.slice(cursorPosition)\n cursorPosition = 0\n continue\n }\n\n // Ctrl+K - clear to end\n if (code === 11) {\n value = value.slice(0, cursorPosition)\n continue\n }\n\n // Ctrl+W - delete word backward\n if (code === 23) {\n const before = value.slice(0, cursorPosition)\n const after = value.slice(cursorPosition)\n const trimmed = before.trimEnd()\n const lastSpace = trimmed.lastIndexOf(\" \")\n const newBefore = lastSpace === -1 ? \"\" : trimmed.slice(0, lastSpace + 1)\n value = newBefore + after\n cursorPosition = newBefore.length\n continue\n }\n\n // Regular printable character\n if (code >= 32 && code < 127) {\n value = value.slice(0, cursorPosition) + char + value.slice(cursorPosition)\n cursorPosition++\n continue\n }\n\n // Handle UTF-8 characters (multi-byte)\n if (code > 127) {\n value = value.slice(0, cursorPosition) + char + value.slice(cursorPosition)\n cursorPosition++\n continue\n }\n }\n\n render()\n }\n\n inputStream.on(\"data\", onData)\n inputStream.on(\"error\", onError)\n })\n}\n\n/**\n * Create a text input instance for manual control\n *\n * @example\n * ```ts\n * const input = createTextInput(\"Name:\", { placeholder: \"Enter name\" });\n * input.render();\n *\n * // Later, get the value\n * const value = await input.waitForSubmit();\n * ```\n */\nexport function createTextInput(prompt: string, options: TextInputOptions = {}): TextInputInstance {\n const stream = options.stream ?? process.stdout\n const isTty = isTTY(stream)\n\n let value = options.defaultValue ?? \"\"\n let cursorPosition = value.length\n\n const render = () => {\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n const suggestionSuffix = suggestion ? chalk.dim(suggestion.slice(value.length)) : \"\"\n\n const beforeCursor = displayValue.slice(0, cursorPosition)\n const cursorChar = displayValue[cursorPosition] ?? \" \"\n const afterCursor = displayValue.slice(cursorPosition + 1)\n\n const showPlaceholder = !value && options.placeholder\n const inputDisplay = showPlaceholder\n ? chalk.dim(options.placeholder) + chalk.inverse(\" \")\n : beforeCursor + chalk.inverse(cursorChar) + afterCursor + suggestionSuffix\n\n const line = `${chalk.cyan(\"?\")} ${chalk.bold(prompt)} ${inputDisplay}`\n\n if (isTty) {\n write(`${CURSOR_TO_START}${line}${CLEAR_LINE_END}`, stream)\n }\n }\n\n return {\n get value() {\n return value\n },\n set value(v: string) {\n value = v\n cursorPosition = Math.min(cursorPosition, v.length)\n },\n get cursorPosition() {\n return cursorPosition\n },\n set cursorPosition(pos: number) {\n cursorPosition = Math.max(0, Math.min(value.length, pos))\n },\n render,\n insert(char: string) {\n value = value.slice(0, cursorPosition) + char + value.slice(cursorPosition)\n cursorPosition += char.length\n },\n backspace() {\n if (cursorPosition > 0) {\n value = value.slice(0, cursorPosition - 1) + value.slice(cursorPosition)\n cursorPosition--\n }\n },\n delete() {\n if (cursorPosition < value.length) {\n value = value.slice(0, cursorPosition) + value.slice(cursorPosition + 1)\n }\n },\n clear() {\n value = \"\"\n cursorPosition = 0\n },\n acceptSuggestion() {\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n if (suggestion) {\n value = suggestion\n cursorPosition = value.length\n }\n },\n }\n}\n\n/** Instance returned by createTextInput for manual control */\nexport interface TextInputInstance {\n /** Current input value */\n value: string\n /** Current cursor position */\n cursorPosition: number\n /** Render the current state */\n render(): void\n /** Insert text at cursor */\n insert(char: string): void\n /** Delete character before cursor */\n backspace(): void\n /** Delete character at cursor */\n delete(): void\n /** Clear all input */\n clear(): void\n /** Accept autocomplete suggestion */\n acceptSuggestion(): void\n}\n\n/**\n * Find a matching autocomplete suggestion for the current input\n */\nfunction getAutocompleteSuggestion(value: string, autocomplete?: string[]): string | undefined {\n if (!value || !autocomplete?.length) {\n return undefined\n }\n\n const lowerValue = value.toLowerCase()\n return autocomplete.find(\n (item) => item.toLowerCase().startsWith(lowerValue) && item.length > value.length,\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,YACpB,SACA,MACA,UAA8B,EAAE,EACpB;CACZ,MAAM,UAAU,IAAI,QAAQ;EAC1B,MAAM,OAAO,SAAS,WAAW,OAAO,KAAK,EAAE;EAC/C,OAAO,QAAQ;EACf,OAAO,QAAQ;EAChB,CAAC;CAEF,IAAI,QAA+C;CACnD,MAAM,YAAY,KAAK,KAAK;AAE5B,SAAQ,OAAO;AAGf,KAAI,OAAO,SAAS,WAClB,SAAQ,kBAAkB;AAExB,UAAQ,cAAc,KADN,KAAK,OAAO,KAAK,KAAK,GAAG,aAAa,IAAK,CACxB;IAClC,IAAK;AAGV,KAAI;EACF,MAAM,SAAS,OAAO,OAAO,YAAY,aAAa,SAAS,GAAG;AAElE,MAAI,MAAO,eAAc,MAAM;AAE/B,MAAI,QAAQ,gBACV,SAAQ,MAAM;MAEd,SAAQ,SAAS;AAGnB,SAAO;UACA,OAAO;AACd,MAAI,MAAO,eAAc,MAAM;AAC/B,UAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,SAAS;AAC/D,QAAM;;;;;;;;;;;;;;;AAgBV,SAAgB,cACd,SACA,MACA,UAA8B,EAAE,EACT;CACvB,MAAM,UAAU,IAAI,QAAQ;EAC1B;EACA,OAAO,QAAQ;EACf,OAAO,QAAQ;EAChB,CAAC;AAEF,SAAQ,OAAO;CAEf,eAAe,cAA0B;AACvC,MAAI;AACF,UAAO,MAAM;WACN,OAAO;AACd,WAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,SAAS;AAC/D,SAAM;;;AAIV,QAAO,CAAC,aAAa,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzCjC,eAAsB,aACpB,IACA,UAA+B,EAAE,EACrB;CACZ,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,MAAM,OAAO;CAO3B,MAAM,MAAM,IAAI,YAAY;EAC1B,QAJA,QAAQ,WACP,QAAQ,SAAS,kCAAkC;EAIpD,QAAQ,QAAQ,UAAU,EAAE;EAC5B,YAAY;EACb,CAAC;CAEF,IAAI,YAA2B;CAC/B,IAAI,UAAU;CAGd,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,iBAAiB,QAAQ,kBAAkB;CACjD,IAAI,UAA0B;CAC9B,IAAI,iBAAiC;AAGrC,KAAI,MACF,OAAM,aAAa,OAAO;AAI5B,KAAI,SAAS,aAAa,EACxB,kBAAiB,iBAAiB;AAChC,MAAI,CAAC,SAAS;AACZ,aAAU,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,WAAQ,OAAO;;IAEhB,UAAU;CAGf,MAAM,cAAgC,SAAuB;AAE3D,MAAI,SAAS;AACX,WAAQ,MAAM;AACd,aAAU;;AAEZ,MAAI,mBAAmB,MAAM;AAC3B,gBAAa,eAAe;AAC5B,oBAAiB;;AAInB,MAAI,KAAK,SAAS,KAAK,UAAU,WAAW;AAC1C,OAAI,cAAc,QAAQ,MAExB,OAAM,MAAM,OAAO;AAErB,eAAY,KAAK;AAGjB,OAAI,CAAC,SAAS;AACZ,QAAI,MAAM,KAAK,SAAS,KAAK,MAAM;AACnC,cAAU;;AAEZ,OAAI,SAAS,KAAK,OAAO;IAAE,SAAS,KAAK;IAAS,OAAO,KAAK;IAAO,CAAC;SACjE;AACL,OAAI,CAAC,SAAS;AACZ,QAAI,MAAM,KAAK,SAAS,KAAK,MAAM;AACnC,cAAU;;AAEZ,OAAI,OAAO,KAAK,QAAQ;;;AAI5B,KAAI;EACF,MAAM,SAAS,MAAM,GAAG,WAAW;AAGnC,MAAI,mBAAmB,KACrB,cAAa,eAAe;EAG9B,MAAM,iBAAiB;AACvB,MAAI,eACF,gBAAe,MAAM;AAIvB,MAAI,QACF,KAAI,KAAK,QAAQ,gBAAgB;AAEnC,MAAI,MACF,OAAM,aAAa,OAAO;AAG5B,SAAO;UACA,OAAO;AAEd,MAAI,mBAAmB,KACrB,cAAa,eAAe;EAG9B,MAAM,eAAe;AACrB,MAAI,aACF,cAAa,MAAM;AAIrB,MAAI,QACF,KAAI,MAAM;AAEZ,MAAI,MACF,OAAM,aAAa,OAAO;AAE5B,QAAM;;;;;;;;;;;;;;;;;AAkBV,SAAgB,uBACd,UAA+B,EAAE,EACD;CAChC,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,MAAM,OAAO;CAM3B,MAAM,MAAM,IAAI,YAAY;EAC1B,QAJA,QAAQ,WACP,QAAQ,SAAS,kCAAkC;EAIpD,QAAQ,QAAQ,UAAU,EAAE;EAC5B,YAAY;EACb,CAAC;CAEF,IAAI,YAA2B;CAC/B,IAAI,UAAU;AAEd,KAAI,MACF,OAAM,aAAa,OAAO;CAG5B,MAAM,YAA8B,SAAuB;AACzD,MAAI,KAAK,SAAS,KAAK,UAAU,WAAW;AAC1C,OAAI,cAAc,QAAQ,MACxB,OAAM,MAAM,OAAO;AAErB,eAAY,KAAK;AAEjB,OAAI,CAAC,SAAS;AACZ,QAAI,MAAM,KAAK,SAAS,KAAK,MAAM;AACnC,cAAU;;AAEZ,OAAI,SAAS,KAAK,OAAO;IAAE,SAAS,KAAK;IAAS,OAAO,KAAK;IAAO,CAAC;SACjE;AACL,OAAI,CAAC,SAAS;AACZ,QAAI,MAAM,KAAK,SAAS,KAAK,MAAM;AACnC,cAAU;;AAEZ,OAAI,OAAO,KAAK,QAAQ;;;CAI5B,MAAM,iBAAiB;AACrB,MAAI,QACF,KAAI,KAAK,QAAQ,gBAAgB;AAEnC,MAAI,MACF,OAAM,aAAa,OAAO;;AAI9B,QAAO,CAAC,UAAU,SAAS;;;;;;;;;;;;;;;;;;;;;;AClO7B,eAAsB,cACpB,WACA,cACA,UAAyC,EAAE,EAC/B;CACZ,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,MAAM,OAAO;CAG3B,MAAM,QADiB,OAAO,iBAAiB,aAChB,KAAK;CAEpC,MAAM,MAAM,IAAI,YAAY;EAC1B,QAAQ,QAAQ,GAAG,MAAM,oCAAoC;EAC7D,YAAY;EACb,CAAC;AAEF,KAAI,MACF,OAAM,aAAa,OAAO;CAG5B,IAAI,UAAU;CACd,IAAI;AAEJ,KAAI;AAEF,SAAO,MAAM;AACX,YAAS,UAAU,MAAM;AAEzB,OAAI,OAAO,KACT;GAGF,MAAM,EAAE,SAAS,UAAU,OAAO;AAElC,OAAI,CAAC,SAAS;AACZ,QAAI,MAAM,SAAS,MAAM;AACzB,cAAU;SAEV,KAAI,OAAO,QAAQ;;AAKvB,MAAI,QACF,KAAI,KAAK,QAAQ,gBAAgB;AAEnC,MAAI,MACF,OAAM,aAAa,OAAO;AAG5B,SAAO,OAAO;UACP,OAAO;AACd,MAAI,QACF,KAAI,MAAM;AAEZ,MAAI,MACF,OAAM,aAAa,OAAO;AAE5B,QAAM;;;;;;;;;;;;;;AAeV,gBAAuB,qBACrB,UACA,OACA,UAAyC,EAAE,EACT;CAClC,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,MAAM,OAAO;CAI3B,MAAM,SADQ,MAAM,QAAQ,SAAS,GAAG,WAAW,OAC9B,UAAU;CAE/B,MAAM,MAAM,IAAI,YAAY;EAC1B,QAAQ,GAAG,MAAM;EACjB;EACA,YAAY;EACb,CAAC;AAEF,KAAI,MACF,OAAM,aAAa,OAAO;CAG5B,IAAI,UAAU;AACd,KAAI,MAAM,GAAG,MAAM;AAEnB,KAAI;AACF,aAAW,MAAM,QAAQ,UAA8B;AACrD,SAAM;AACN;AACA,OAAI,OAAO,QAAQ;;AAGrB,MAAI,KAAK,QAAQ,gBAAgB;AACjC,MAAI,MACF,OAAM,aAAa,OAAO;UAErB,OAAO;AACd,MAAI,MAAM;AACV,MAAI,MACF,OAAM,aAAa,OAAO;AAE5B,QAAM;;;;;;;;;;;;;;;;;;;;;;;;AC5FV,SAAgB,YAAY,SAAuB,QAAuC;CACxF,MAAM,UAAU,IAAI,QAAQ,OAAO,eAAe,GAAG;CACrD,MAAM,2BAAsD,IAAI,KAAK;AAErE,SAAQ,OAAO;AAGf,MAAK,MAAM,CAAC,WAAW,gBAAgB,OAAO,QAAQ,OAAO,OAAO,EAAE;EACpE,MAAM,WAAW,SAAkB;AAEjC,OAAI,YAAY,QACd,SAAQ,cAAc,YAAY,QAAQ,KAAK;YACtC,YAAY,KACrB,SAAQ,cAAc,YAAY;AAIpC,OAAI,YAAY,SAAS;AACvB,YAAQ,SAAS;AACjB,aAAS;cACA,YAAY,MAAM;IAC3B,MAAM,UAAU,gBAAgB,QAAQ,KAAK,UAAU,OAAO,QAAQ,SAAS;AAC/E,YAAQ,KAAK,QAAQ;AACrB,aAAS;cACA,YAAY,MAAM;AAC3B,YAAQ,MAAM;AACd,aAAS;;;AAIb,WAAS,IAAI,WAAW,QAAQ;AAChC,UAAQ,GAAG,WAAW,QAAQ;;CAIhC,SAAS,UAAU;AACjB,OAAK,MAAM,CAAC,WAAW,YAAY,SACjC,SAAQ,IAAI,WAAW,QAAQ;AAEjC,WAAS,OAAO;;AAIlB,cAAa;AACX,UAAQ,MAAM;AACd,WAAS;;;;;;;;;;;;AAab,eAAsB,aACpB,SACA,WACA,MACA,UAGI,EAAE,EACY;AAClB,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,UAAU,IAAI,QAAQ,KAAK;AACjC,UAAQ,OAAO;EAEf,IAAI,QAA8C;EAElD,MAAM,gBAAgB;AACpB,WAAQ,IAAI,WAAW,eAAe;AACtC,OAAI,QAAQ,WACV,SAAQ,IAAI,QAAQ,YAAY,aAAa;AAE/C,OAAI,MACF,cAAa,MAAM;;EAIvB,MAAM,kBAAkB,SAAkB;AACxC,YAAS;AACT,WAAQ,SAAS;AACjB,WAAQ,KAAK;;EAGf,MAAM,gBAAgB,UAAmB;AACvC,YAAS;AACT,WAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,QAAQ;AAC9D,UAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;AAGnE,UAAQ,KAAK,WAAW,eAAe;AAEvC,MAAI,QAAQ,WACV,SAAQ,KAAK,QAAQ,YAAY,aAAa;AAGhD,MAAI,QAAQ,QACV,SAAQ,iBAAiB;AACvB,YAAS;AACT,WAAQ,KAAK,UAAU;AACvB,0BAAO,IAAI,MAAM,uBAAuB,YAAY,CAAC;KACpD,QAAQ,QAAQ;GAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxHJ,eAAsB,WACpB,QACA,SACA,gBAAmC,EAAE,EACzB;CACZ,MAAM,EAAE,UAAU,GAAG,aAAa,OAAO;CACzC,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,QAAQ;AAEtB,KAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,MAE3B,QAAO,QAAQ,UAAU,SAAS,QAAQ,GAAI;AAGhD,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,iBAAiB,KAAK,IAAI,KAAK,IAAI,GAAG,QAAQ,EAAE,QAAQ,SAAS,EAAE;EACvE,IAAI,gBAAgB;AAGpB,QAAM,WAAW,KAAK;AACtB,QAAM,QAAQ;AACd,QAAM,YAAY,OAAO;AAGzB,QAAM,aAAa,OAAO;EAE1B,SAAS,SAAS;AAEhB,OAAI,gBAAgB,EAClB,OAAM,SAAS,cAAc,EAAE,OAAO;GAIxC,MAAM,eAAe,KAAK,IACxB,GACA,KAAK,IAAI,iBAAiB,KAAK,MAAM,aAAa,EAAE,EAAE,QAAQ,SAAS,WAAW,CACnF;GACD,MAAM,eAAe,KAAK,IAAI,YAAY,QAAQ,OAAO;GACzD,MAAM,iBAAiB,QAAQ,MAAM,cAAc,eAAe,aAAa;GAC/E,MAAM,eAAe,eAAe;GACpC,MAAM,eAAe,eAAe,eAAe,QAAQ;AAG3D,SAAM;EAAqB,MAAM,KAAK,OAAO,SAAuB,OAAO;GAE3E,IAAI,QAAQ;AAGZ,OAAI,cAAc;AAChB,UAAM;IAAuB,MAAM,IAAI,MAAM,SAAuB,OAAO;AAC3E;;AAIF,QAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;IAC9C,MAAM,SAAS,eAAe;IAE9B,MAAM,gBADc,eAAe,MACG;AAKtC,UAAM;EAHY,gBAAgB,MAAM,KAAK,IAAI,GAAG,IAGf,GAFvB,gBAAgB,MAAM,KAAK,OAAQ,MAAM,GAAG,OAAQ,cAEE,OAAO;AAC3E;;AAIF,OAAI,cAAc;AAChB,UAAM;IAAuB,MAAM,IAAI,MAAM,SAAuB,OAAO;AAC3E;;AAGF,mBAAgB;;EAGlB,SAAS,UAAU;AACjB,SAAM,WAAW,MAAM;AACvB,SAAM,OAAO;AACb,SAAM,eAAe,QAAQ,WAAW;AACxC,SAAM,aAAa,OAAO;;EAG5B,SAAS,WAAW,KAAa;AAEf,OAAI,WAAW,EAAE;AAGjC,OAAI,QAAQ,KAAQ;AAClB,aAAS;AACT,2BAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC;;AAIF,OAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,aAAS;AACT,YAAQ,QAAQ,gBAAiB,MAAM;AACvC;;AAIF,OAAI,QAAQ,UAAU,IAAI,WAAW,GAAG;AACtC,aAAS;AACT,2BAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC;;AAIF,OAAI,IAAI,WAAW,QAAQ,EAAE;IAC3B,MAAM,OAAO,IAAI,MAAM,EAAE;AACzB,QAAI,SAAS,KAAK;AAEhB,sBAAiB,KAAK,IAAI,GAAG,iBAAiB,EAAE;AAChD,aAAQ;eACC,SAAS,KAAK;AAEvB,sBAAiB,KAAK,IAAI,QAAQ,SAAS,GAAG,iBAAiB,EAAE;AACjE,aAAQ;;AAEV;;AAIF,OAAI,QAAQ,OAAO,QAAQ,KAAK;AAC9B,qBAAiB,KAAK,IAAI,QAAQ,SAAS,GAAG,iBAAiB,EAAE;AACjE,YAAQ;AACR;;AAEF,OAAI,QAAQ,OAAO,QAAQ,KAAK;AAC9B,qBAAiB,KAAK,IAAI,GAAG,iBAAiB,EAAE;AAChD,YAAQ;AACR;;AAIF,OAAI,QAAQ,KAAK;AACf,aAAS;AACT,YAAQ,QAAQ,gBAAiB,MAAM;AACvC;;;AAIJ,QAAM,GAAG,QAAQ,WAAW;AAC5B,UAAQ;GACR;;;;;;;;;;;;;;;AAgBJ,SAAgB,aACd,iBAAoC,EAAE,EACwD;AAC9F,SAAW,QAAgB,SAA4B,YAA+B,EAAE,KACtF,WAAW,QAAQ,SAAS;EAAE,GAAG;EAAgB,GAAG;EAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnKpE,eAAsB,cACpB,QACA,UAA4B,EAAE,EACb;CACjB,MAAM,SAAS,QAAQ,UAAU,QAAQ;CACzC,MAAM,cAAc,QAAQ,eAAe,QAAQ;CACnD,MAAM,QAAQ,MAAM,OAAO;CAG3B,IAAI,QAAQ,QAAQ,gBAAgB;CACpC,IAAI,iBAAiB,MAAM;CAC3B,IAAI;AAGJ,KAAI,YAAY,MACd,aAAY,WAAW,KAAK;AAE9B,aAAY,QAAQ;CAGpB,MAAM,eAAe;EACnB,MAAM,eAAe,QAAQ,OAAO,QAAQ,KAAK,OAAO,MAAM,OAAO,GAAG;EAExE,MAAM,aAAa,0BAA0B,OAAO,QAAQ,aAAa;EACzE,MAAM,mBAAmB,aAAa,MAAM,IAAI,WAAW,MAAM,MAAM,OAAO,CAAC,GAAG;EAGlF,MAAM,eAAe,aAAa,MAAM,GAAG,eAAe;EAC1D,MAAM,aAAa,aAAa,mBAAmB;EACnD,MAAM,cAAc,aAAa,MAAM,iBAAiB,EAAE;EAI1D,MAAM,eADkB,CAAC,SAAS,QAAQ,cAEtC,MAAM,IAAI,QAAQ,YAAY,GAAG,MAAM,QAAQ,IAAI,GACnD,eAAe,MAAM,QAAQ,WAAW,GAAG,cAAc;EAG7D,MAAM,eAAe,eAAe,MAAM,IAAI,KAAK,aAAa,GAAG,GAAG;EAEtE,MAAM,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,GAAG,eAAe;AAExE,MAAI,MACF,OAAM;EAAqB,WAAyB,OAAO;;AAK/D,KAAI,MACF,OAAM,aAAa,OAAO;AAG5B,SAAQ;AAER,QAAO,IAAI,SAAiB,SAAS,WAAW;EAC9C,MAAM,gBAAgB;AACpB,eAAY,eAAe,QAAQ,OAAO;AAC1C,eAAY,eAAe,SAAS,QAAQ;AAC5C,OAAI,YAAY,MACd,aAAY,WAAW,MAAM;AAE/B,eAAY,OAAO;AACnB,OAAI,MACF,OAAM,aAAa,OAAO;;EAI9B,MAAM,eAAe;AAEnB,OAAI,QAAQ,UAAU;IACpB,MAAM,QAAQ,QAAQ,SAAS,MAAM;AACrC,QAAI,OAAO;AACT,oBAAe;AACf,aAAQ;AACR;;;AAIJ,YAAS;GAGT,MAAM,eAAe,QAAQ,OAAO,QAAQ,KAAK,OAAO,MAAM,OAAO,GAAG;AACxE,SACE;EAAqB,MAAM,MAAM,IAAI,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,aAAa,SACtF,OACD;AAED,WAAQ,MAAM;;EAGhB,MAAM,WAAW,QAAe;AAC9B,YAAS;AACT,UAAO,IAAI;;EAGb,MAAM,UAAU,SAAiB;GAC/B,MAAM,QAAQ,KAAK,UAAU;AAC7B,kBAAe,KAAA;AAGf,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,OAAO,MAAM;IACnB,MAAM,OAAO,KAAK,WAAW,EAAE;AAG/B,QAAI,SAAS,MAAM,SAAS,IAAI;AAC9B,aAAQ;AACR;;AAIF,QAAI,SAAS,GAAG;AACd,cAAS;AACT,WAAM,MAAM,OAAO;AACnB,4BAAO,IAAI,MAAM,eAAe,CAAC;AACjC;;AAIF,QAAI,SAAS,IAAI;AAEf,SAAI,MAAM,IAAI,OAAO,KAAK;MACxB,MAAM,YAAY,MAAM,IAAI;AAC5B,UAAI,cAAc,KAAK;AAErB,wBAAiB,KAAK,IAAI,GAAG,iBAAiB,EAAE;AAChD,YAAK;AACL;;AAEF,UAAI,cAAc,KAAK;AAErB,wBAAiB,KAAK,IAAI,MAAM,QAAQ,iBAAiB,EAAE;AAC3D,YAAK;AACL;;AAEF,UAAI,cAAc,KAAK;AAErB,wBAAiB;AACjB,YAAK;AACL;;AAEF,UAAI,cAAc,KAAK;AAErB,wBAAiB,MAAM;AACvB,YAAK;AACL;;AAGF,WAAK;AACL;;AAGF,aAAQ;AACR,sBAAiB;AACjB;;AAIF,QAAI,SAAS,OAAO,SAAS,GAAG;AAC9B,SAAI,iBAAiB,GAAG;AACtB,cAAQ,MAAM,MAAM,GAAG,iBAAiB,EAAE,GAAG,MAAM,MAAM,eAAe;AACxE;;AAEF;;AAIF,QAAI,SAAS,GAAG;AAEd,SAAI,iBAAiB,MAAM,OACzB,SAAQ,MAAM,MAAM,GAAG,eAAe,GAAG,MAAM,MAAM,iBAAiB,EAAE;AAE1E;;AAIF,QAAI,SAAS,GAAG;KACd,MAAM,aAAa,0BAA0B,OAAO,QAAQ,aAAa;AACzE,SAAI,YAAY;AACd,cAAQ;AACR,uBAAiB,MAAM;;AAEzB;;AAIF,QAAI,SAAS,GAAG;AACd,sBAAiB;AACjB;;AAIF,QAAI,SAAS,GAAG;AACd,sBAAiB,MAAM;AACvB;;AAIF,QAAI,SAAS,IAAI;AACf,aAAQ,MAAM,MAAM,eAAe;AACnC,sBAAiB;AACjB;;AAIF,QAAI,SAAS,IAAI;AACf,aAAQ,MAAM,MAAM,GAAG,eAAe;AACtC;;AAIF,QAAI,SAAS,IAAI;KACf,MAAM,SAAS,MAAM,MAAM,GAAG,eAAe;KAC7C,MAAM,QAAQ,MAAM,MAAM,eAAe;KACzC,MAAM,UAAU,OAAO,SAAS;KAChC,MAAM,YAAY,QAAQ,YAAY,IAAI;KAC1C,MAAM,YAAY,cAAc,KAAK,KAAK,QAAQ,MAAM,GAAG,YAAY,EAAE;AACzE,aAAQ,YAAY;AACpB,sBAAiB,UAAU;AAC3B;;AAIF,QAAI,QAAQ,MAAM,OAAO,KAAK;AAC5B,aAAQ,MAAM,MAAM,GAAG,eAAe,GAAG,OAAO,MAAM,MAAM,eAAe;AAC3E;AACA;;AAIF,QAAI,OAAO,KAAK;AACd,aAAQ,MAAM,MAAM,GAAG,eAAe,GAAG,OAAO,MAAM,MAAM,eAAe;AAC3E;AACA;;;AAIJ,WAAQ;;AAGV,cAAY,GAAG,QAAQ,OAAO;AAC9B,cAAY,GAAG,SAAS,QAAQ;GAChC;;;;;;;;;;;;;;AAeJ,SAAgB,gBAAgB,QAAgB,UAA4B,EAAE,EAAqB;CACjG,MAAM,SAAS,QAAQ,UAAU,QAAQ;CACzC,MAAM,QAAQ,MAAM,OAAO;CAE3B,IAAI,QAAQ,QAAQ,gBAAgB;CACpC,IAAI,iBAAiB,MAAM;CAE3B,MAAM,eAAe;EACnB,MAAM,eAAe,QAAQ,OAAO,QAAQ,KAAK,OAAO,MAAM,OAAO,GAAG;EAExE,MAAM,aAAa,0BAA0B,OAAO,QAAQ,aAAa;EACzE,MAAM,mBAAmB,aAAa,MAAM,IAAI,WAAW,MAAM,MAAM,OAAO,CAAC,GAAG;EAElF,MAAM,eAAe,aAAa,MAAM,GAAG,eAAe;EAC1D,MAAM,aAAa,aAAa,mBAAmB;EACnD,MAAM,cAAc,aAAa,MAAM,iBAAiB,EAAE;EAG1D,MAAM,eADkB,CAAC,SAAS,QAAQ,cAEtC,MAAM,IAAI,QAAQ,YAAY,GAAG,MAAM,QAAQ,IAAI,GACnD,eAAe,MAAM,QAAQ,WAAW,GAAG,cAAc;EAE7D,MAAM,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,GAAG;AAEzD,MAAI,MACF,OAAM;EAAqB,WAAyB,OAAO;;AAI/D,QAAO;EACL,IAAI,QAAQ;AACV,UAAO;;EAET,IAAI,MAAM,GAAW;AACnB,WAAQ;AACR,oBAAiB,KAAK,IAAI,gBAAgB,EAAE,OAAO;;EAErD,IAAI,iBAAiB;AACnB,UAAO;;EAET,IAAI,eAAe,KAAa;AAC9B,oBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC;;EAE3D;EACA,OAAO,MAAc;AACnB,WAAQ,MAAM,MAAM,GAAG,eAAe,GAAG,OAAO,MAAM,MAAM,eAAe;AAC3E,qBAAkB,KAAK;;EAEzB,YAAY;AACV,OAAI,iBAAiB,GAAG;AACtB,YAAQ,MAAM,MAAM,GAAG,iBAAiB,EAAE,GAAG,MAAM,MAAM,eAAe;AACxE;;;EAGJ,SAAS;AACP,OAAI,iBAAiB,MAAM,OACzB,SAAQ,MAAM,MAAM,GAAG,eAAe,GAAG,MAAM,MAAM,iBAAiB,EAAE;;EAG5E,QAAQ;AACN,WAAQ;AACR,oBAAiB;;EAEnB,mBAAmB;GACjB,MAAM,aAAa,0BAA0B,OAAO,QAAQ,aAAa;AACzE,OAAI,YAAY;AACd,YAAQ;AACR,qBAAiB,MAAM;;;EAG5B;;;;;AA0BH,SAAS,0BAA0B,OAAe,cAA6C;AAC7F,KAAI,CAAC,SAAS,CAAC,cAAc,OAC3B;CAGF,MAAM,aAAa,MAAM,aAAa;AACtC,QAAO,aAAa,MACjB,SAAS,KAAK,aAAa,CAAC,WAAW,WAAW,IAAI,KAAK,SAAS,MAAM,OAC5E"}
|
|
@@ -245,10 +245,10 @@ function createYogaEngine(yoga) {
|
|
|
245
245
|
* Uses yoga-wasm-web/auto which automatically selects the right implementation.
|
|
246
246
|
*/
|
|
247
247
|
async function initYogaEngine() {
|
|
248
|
-
const { default: yoga } = await import("./node-
|
|
248
|
+
const { default: yoga } = await import("./node-BeWlnCPY.mjs");
|
|
249
249
|
return new YogaLayoutEngine(yoga);
|
|
250
250
|
}
|
|
251
251
|
//#endregion
|
|
252
252
|
export { createYogaEngine as n, initYogaEngine as r, YogaLayoutEngine as t };
|
|
253
253
|
|
|
254
|
-
//# sourceMappingURL=yoga-adapter-
|
|
254
|
+
//# sourceMappingURL=yoga-adapter-8oRGRw8V.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yoga-adapter-Bc8XT9cN.mjs","names":[],"sources":["../packages/ag-term/src/adapters/yoga-adapter.ts"],"sourcesContent":["/**\n * Yoga Layout Engine Adapter\n *\n * Wraps yoga-wasm-web to implement the LayoutEngine interface.\n */\n\nimport type {\n Align,\n Direction,\n Display,\n Edge,\n FlexDirection,\n Gutter,\n Justify,\n Overflow,\n PositionType,\n Wrap,\n Yoga,\n Node as YogaNode,\n} from \"yoga-wasm-web\"\nimport type { LayoutNode, MeasureFunc, MeasureMode } from \"@silvery/ag/layout-types\"\nimport type {\n AlignValue,\n DirectionValue,\n DisplayValue,\n EdgeValue,\n FlexDirectionValue,\n GutterValue,\n JustifyValue,\n LayoutConstants,\n LayoutEngine,\n MeasureModeValue,\n OverflowValue,\n PositionTypeValue,\n WrapValue,\n} from \"../layout-engine\"\n\n// ============================================================================\n// Yoga Node Adapter\n// ============================================================================\n\n/**\n * Wraps a Yoga node to implement LayoutNode interface.\n */\nclass YogaNodeAdapter implements LayoutNode {\n private node: YogaNode\n private yoga: Yoga\n private hasMeasureFunc = false\n\n constructor(node: YogaNode, yoga: Yoga) {\n this.node = node\n this.yoga = yoga\n }\n\n /** Get the underlying Yoga node (for tree operations) */\n getYogaNode(): YogaNode {\n return this.node\n }\n\n // Tree operations\n insertChild(child: LayoutNode, index: number): void {\n const yogaChild = (child as YogaNodeAdapter).getYogaNode()\n this.node.insertChild(yogaChild, index)\n }\n\n removeChild(child: LayoutNode): void {\n const yogaChild = (child as YogaNodeAdapter).getYogaNode()\n this.node.removeChild(yogaChild)\n }\n\n free(): void {\n this.node.free()\n }\n\n // Measure function\n setMeasureFunc(measureFunc: MeasureFunc): void {\n this.hasMeasureFunc = true\n this.node.setMeasureFunc((width, widthMode, height, heightMode) => {\n const widthModeStr = this.measureModeToString(widthMode)\n const heightModeStr = this.measureModeToString(heightMode)\n return measureFunc(width, widthModeStr, height, heightModeStr)\n })\n }\n\n // Dirty tracking - forces layout recalculation\n // Yoga only allows markDirty() on leaf nodes with measure functions\n markDirty(): void {\n if (this.hasMeasureFunc) {\n this.node.markDirty()\n }\n }\n isDirty(): boolean {\n return this.node.isDirty()\n }\n\n private measureModeToString(mode: number): MeasureMode {\n if (mode === this.yoga.MEASURE_MODE_EXACTLY) return \"exactly\"\n if (mode === this.yoga.MEASURE_MODE_AT_MOST) return \"at-most\"\n return \"undefined\"\n }\n\n // Dimension setters\n setWidth(value: number): void {\n this.node.setWidth(value)\n }\n setWidthPercent(value: number): void {\n this.node.setWidthPercent(value)\n }\n setWidthAuto(): void {\n this.node.setWidthAuto()\n }\n setWidthFitContent(): void {\n // Yoga doesn't support fit-content natively — fall back to auto\n this.node.setWidthAuto()\n }\n setWidthSnugContent(): void {\n // Yoga doesn't support snug-content natively — fall back to auto\n this.node.setWidthAuto()\n }\n setHeight(value: number): void {\n this.node.setHeight(value)\n }\n setHeightPercent(value: number): void {\n this.node.setHeightPercent(value)\n }\n setHeightAuto(): void {\n this.node.setHeightAuto()\n }\n setMinWidth(value: number): void {\n this.node.setMinWidth(value)\n }\n setMinWidthPercent(value: number): void {\n this.node.setMinWidthPercent(value)\n }\n setMinHeight(value: number): void {\n this.node.setMinHeight(value)\n }\n setMinHeightPercent(value: number): void {\n this.node.setMinHeightPercent(value)\n }\n setMaxWidth(value: number): void {\n this.node.setMaxWidth(value)\n }\n setMaxWidthPercent(value: number): void {\n this.node.setMaxWidthPercent(value)\n }\n setMaxHeight(value: number): void {\n this.node.setMaxHeight(value)\n }\n setMaxHeightPercent(value: number): void {\n this.node.setMaxHeightPercent(value)\n }\n\n // Flex properties\n setFlexGrow(value: number): void {\n this.node.setFlexGrow(value)\n }\n setFlexShrink(value: number): void {\n this.node.setFlexShrink(value)\n }\n setFlexBasis(value: number): void {\n this.node.setFlexBasis(value)\n }\n setFlexBasisPercent(value: number): void {\n this.node.setFlexBasisPercent(value)\n }\n setFlexBasisAuto(): void {\n this.node.setFlexBasisAuto()\n }\n setFlexDirection(direction: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded FlexDirection type\n this.node.setFlexDirection(direction as FlexDirection)\n }\n setFlexWrap(wrap: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Wrap type\n this.node.setFlexWrap(wrap as Wrap)\n }\n\n // Alignment\n setAlignItems(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignItems(align as Align)\n }\n setAlignSelf(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignSelf(align as Align)\n }\n setAlignContent(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignContent(align as Align)\n }\n setJustifyContent(justify: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Justify type\n this.node.setJustifyContent(justify as Justify)\n }\n\n // Spacing\n setPadding(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPadding(edge as Edge, value)\n }\n setMargin(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setMargin(edge as Edge, value)\n }\n setBorder(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setBorder(edge as Edge, value)\n }\n setGap(gutter: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Gutter type\n this.node.setGap(gutter as Gutter, value)\n }\n\n // Display & Position\n setDisplay(display: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Display type\n this.node.setDisplay(display as Display)\n }\n setPositionType(positionType: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded PositionType type\n this.node.setPositionType(positionType as PositionType)\n }\n setPosition(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPosition(edge as Edge, value)\n }\n setPositionPercent(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPositionPercent(edge as Edge, value)\n }\n setOverflow(overflow: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Overflow type\n this.node.setOverflow(overflow as Overflow)\n }\n\n // Aspect Ratio\n setAspectRatio(value: number): void {\n this.node.setAspectRatio(value)\n }\n\n // Layout calculation\n calculateLayout(width: number, height: number, direction?: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Direction type\n this.node.calculateLayout(width, height, (direction ?? this.yoga.DIRECTION_LTR) as Direction)\n }\n\n // Layout results\n getComputedLeft(): number {\n return this.node.getComputedLeft()\n }\n getComputedTop(): number {\n return this.node.getComputedTop()\n }\n getComputedWidth(): number {\n return this.node.getComputedWidth()\n }\n getComputedHeight(): number {\n return this.node.getComputedHeight()\n }\n}\n\n// ============================================================================\n// Yoga Layout Engine\n// ============================================================================\n\n/**\n * Layout engine implementation using Yoga (WASM).\n */\nexport class YogaLayoutEngine implements LayoutEngine {\n private yoga: Yoga\n private _constants: LayoutConstants\n\n constructor(yoga: Yoga) {\n this.yoga = yoga\n // Cast Yoga's branded types to our LayoutEngine branded types at the adapter boundary\n this._constants = {\n // Flex Direction\n FLEX_DIRECTION_COLUMN: yoga.FLEX_DIRECTION_COLUMN as unknown as FlexDirectionValue,\n FLEX_DIRECTION_COLUMN_REVERSE: yoga.FLEX_DIRECTION_COLUMN_REVERSE as unknown as FlexDirectionValue,\n FLEX_DIRECTION_ROW: yoga.FLEX_DIRECTION_ROW as unknown as FlexDirectionValue,\n FLEX_DIRECTION_ROW_REVERSE: yoga.FLEX_DIRECTION_ROW_REVERSE as unknown as FlexDirectionValue,\n\n // Wrap\n WRAP_NO_WRAP: yoga.WRAP_NO_WRAP as unknown as WrapValue,\n WRAP_WRAP: yoga.WRAP_WRAP as unknown as WrapValue,\n WRAP_WRAP_REVERSE: yoga.WRAP_WRAP_REVERSE as unknown as WrapValue,\n\n // Align\n ALIGN_AUTO: yoga.ALIGN_AUTO as unknown as AlignValue,\n ALIGN_FLEX_START: yoga.ALIGN_FLEX_START as unknown as AlignValue,\n ALIGN_CENTER: yoga.ALIGN_CENTER as unknown as AlignValue,\n ALIGN_FLEX_END: yoga.ALIGN_FLEX_END as unknown as AlignValue,\n ALIGN_STRETCH: yoga.ALIGN_STRETCH as unknown as AlignValue,\n ALIGN_BASELINE: yoga.ALIGN_BASELINE as unknown as AlignValue,\n ALIGN_SPACE_BETWEEN: yoga.ALIGN_SPACE_BETWEEN as unknown as AlignValue,\n ALIGN_SPACE_AROUND: yoga.ALIGN_SPACE_AROUND as unknown as AlignValue,\n ALIGN_SPACE_EVENLY: (yoga as any).ALIGN_SPACE_EVENLY as unknown as AlignValue,\n\n // Justify\n JUSTIFY_FLEX_START: yoga.JUSTIFY_FLEX_START as unknown as JustifyValue,\n JUSTIFY_CENTER: yoga.JUSTIFY_CENTER as unknown as JustifyValue,\n JUSTIFY_FLEX_END: yoga.JUSTIFY_FLEX_END as unknown as JustifyValue,\n JUSTIFY_SPACE_BETWEEN: yoga.JUSTIFY_SPACE_BETWEEN as unknown as JustifyValue,\n JUSTIFY_SPACE_AROUND: yoga.JUSTIFY_SPACE_AROUND as unknown as JustifyValue,\n JUSTIFY_SPACE_EVENLY: yoga.JUSTIFY_SPACE_EVENLY as unknown as JustifyValue,\n\n // Edge\n EDGE_LEFT: yoga.EDGE_LEFT as unknown as EdgeValue,\n EDGE_TOP: yoga.EDGE_TOP as unknown as EdgeValue,\n EDGE_RIGHT: yoga.EDGE_RIGHT as unknown as EdgeValue,\n EDGE_BOTTOM: yoga.EDGE_BOTTOM as unknown as EdgeValue,\n EDGE_HORIZONTAL: yoga.EDGE_HORIZONTAL as unknown as EdgeValue,\n EDGE_VERTICAL: yoga.EDGE_VERTICAL as unknown as EdgeValue,\n EDGE_ALL: yoga.EDGE_ALL as unknown as EdgeValue,\n\n // Gutter\n GUTTER_COLUMN: yoga.GUTTER_COLUMN as unknown as GutterValue,\n GUTTER_ROW: yoga.GUTTER_ROW as unknown as GutterValue,\n GUTTER_ALL: yoga.GUTTER_ALL as unknown as GutterValue,\n\n // Display\n DISPLAY_FLEX: yoga.DISPLAY_FLEX as unknown as DisplayValue,\n DISPLAY_NONE: yoga.DISPLAY_NONE as unknown as DisplayValue,\n\n // Position Type\n POSITION_TYPE_STATIC: yoga.POSITION_TYPE_STATIC as unknown as PositionTypeValue,\n POSITION_TYPE_RELATIVE: yoga.POSITION_TYPE_RELATIVE as unknown as PositionTypeValue,\n POSITION_TYPE_ABSOLUTE: yoga.POSITION_TYPE_ABSOLUTE as unknown as PositionTypeValue,\n\n // Overflow\n OVERFLOW_VISIBLE: yoga.OVERFLOW_VISIBLE as unknown as OverflowValue,\n OVERFLOW_HIDDEN: yoga.OVERFLOW_HIDDEN as unknown as OverflowValue,\n OVERFLOW_SCROLL: yoga.OVERFLOW_SCROLL as unknown as OverflowValue,\n\n // Direction\n DIRECTION_LTR: yoga.DIRECTION_LTR as unknown as DirectionValue,\n\n // Measure Mode\n MEASURE_MODE_UNDEFINED: yoga.MEASURE_MODE_UNDEFINED as unknown as MeasureModeValue,\n MEASURE_MODE_EXACTLY: yoga.MEASURE_MODE_EXACTLY as unknown as MeasureModeValue,\n MEASURE_MODE_AT_MOST: yoga.MEASURE_MODE_AT_MOST as unknown as MeasureModeValue,\n }\n }\n\n createNode(): LayoutNode {\n return new YogaNodeAdapter(this.yoga.Node.create(), this.yoga)\n }\n\n get constants(): LayoutConstants {\n return this._constants\n }\n\n get name(): string {\n return \"yoga\"\n }\n}\n\n// ============================================================================\n// Initialization Helper\n// ============================================================================\n\n/**\n * Create a Yoga layout engine from an initialized Yoga instance.\n */\nexport function createYogaEngine(yoga: Yoga): YogaLayoutEngine {\n return new YogaLayoutEngine(yoga)\n}\n\n/**\n * Initialize Yoga and create a layout engine.\n * Uses yoga-wasm-web/auto which automatically selects the right implementation.\n */\nexport async function initYogaEngine(): Promise<YogaLayoutEngine> {\n const { default: yoga } = (await import(\"yoga-wasm-web/auto\")) as {\n default: Yoga\n }\n return new YogaLayoutEngine(yoga)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yoga-adapter-8oRGRw8V.mjs","names":[],"sources":["../packages/ag-term/src/adapters/yoga-adapter.ts"],"sourcesContent":["/**\n * Yoga Layout Engine Adapter\n *\n * Wraps yoga-wasm-web to implement the LayoutEngine interface.\n */\n\nimport type {\n Align,\n Direction,\n Display,\n Edge,\n FlexDirection,\n Gutter,\n Justify,\n Overflow,\n PositionType,\n Wrap,\n Yoga,\n Node as YogaNode,\n} from \"yoga-wasm-web\"\nimport type { LayoutNode, MeasureFunc, MeasureMode } from \"@silvery/ag/layout-types\"\nimport type {\n AlignValue,\n DirectionValue,\n DisplayValue,\n EdgeValue,\n FlexDirectionValue,\n GutterValue,\n JustifyValue,\n LayoutConstants,\n LayoutEngine,\n MeasureModeValue,\n OverflowValue,\n PositionTypeValue,\n WrapValue,\n} from \"../layout-engine\"\n\n// ============================================================================\n// Yoga Node Adapter\n// ============================================================================\n\n/**\n * Wraps a Yoga node to implement LayoutNode interface.\n */\nclass YogaNodeAdapter implements LayoutNode {\n private node: YogaNode\n private yoga: Yoga\n private hasMeasureFunc = false\n\n constructor(node: YogaNode, yoga: Yoga) {\n this.node = node\n this.yoga = yoga\n }\n\n /** Get the underlying Yoga node (for tree operations) */\n getYogaNode(): YogaNode {\n return this.node\n }\n\n // Tree operations\n insertChild(child: LayoutNode, index: number): void {\n const yogaChild = (child as YogaNodeAdapter).getYogaNode()\n this.node.insertChild(yogaChild, index)\n }\n\n removeChild(child: LayoutNode): void {\n const yogaChild = (child as YogaNodeAdapter).getYogaNode()\n this.node.removeChild(yogaChild)\n }\n\n free(): void {\n this.node.free()\n }\n\n // Measure function\n setMeasureFunc(measureFunc: MeasureFunc): void {\n this.hasMeasureFunc = true\n this.node.setMeasureFunc((width, widthMode, height, heightMode) => {\n const widthModeStr = this.measureModeToString(widthMode)\n const heightModeStr = this.measureModeToString(heightMode)\n return measureFunc(width, widthModeStr, height, heightModeStr)\n })\n }\n\n // Dirty tracking - forces layout recalculation\n // Yoga only allows markDirty() on leaf nodes with measure functions\n markDirty(): void {\n if (this.hasMeasureFunc) {\n this.node.markDirty()\n }\n }\n isDirty(): boolean {\n return this.node.isDirty()\n }\n\n private measureModeToString(mode: number): MeasureMode {\n if (mode === this.yoga.MEASURE_MODE_EXACTLY) return \"exactly\"\n if (mode === this.yoga.MEASURE_MODE_AT_MOST) return \"at-most\"\n return \"undefined\"\n }\n\n // Dimension setters\n setWidth(value: number): void {\n this.node.setWidth(value)\n }\n setWidthPercent(value: number): void {\n this.node.setWidthPercent(value)\n }\n setWidthAuto(): void {\n this.node.setWidthAuto()\n }\n setWidthFitContent(): void {\n // Yoga doesn't support fit-content natively — fall back to auto\n this.node.setWidthAuto()\n }\n setWidthSnugContent(): void {\n // Yoga doesn't support snug-content natively — fall back to auto\n this.node.setWidthAuto()\n }\n setHeight(value: number): void {\n this.node.setHeight(value)\n }\n setHeightPercent(value: number): void {\n this.node.setHeightPercent(value)\n }\n setHeightAuto(): void {\n this.node.setHeightAuto()\n }\n setMinWidth(value: number): void {\n this.node.setMinWidth(value)\n }\n setMinWidthPercent(value: number): void {\n this.node.setMinWidthPercent(value)\n }\n setMinHeight(value: number): void {\n this.node.setMinHeight(value)\n }\n setMinHeightPercent(value: number): void {\n this.node.setMinHeightPercent(value)\n }\n setMaxWidth(value: number): void {\n this.node.setMaxWidth(value)\n }\n setMaxWidthPercent(value: number): void {\n this.node.setMaxWidthPercent(value)\n }\n setMaxHeight(value: number): void {\n this.node.setMaxHeight(value)\n }\n setMaxHeightPercent(value: number): void {\n this.node.setMaxHeightPercent(value)\n }\n\n // Flex properties\n setFlexGrow(value: number): void {\n this.node.setFlexGrow(value)\n }\n setFlexShrink(value: number): void {\n this.node.setFlexShrink(value)\n }\n setFlexBasis(value: number): void {\n this.node.setFlexBasis(value)\n }\n setFlexBasisPercent(value: number): void {\n this.node.setFlexBasisPercent(value)\n }\n setFlexBasisAuto(): void {\n this.node.setFlexBasisAuto()\n }\n setFlexDirection(direction: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded FlexDirection type\n this.node.setFlexDirection(direction as FlexDirection)\n }\n setFlexWrap(wrap: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Wrap type\n this.node.setFlexWrap(wrap as Wrap)\n }\n\n // Alignment\n setAlignItems(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignItems(align as Align)\n }\n setAlignSelf(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignSelf(align as Align)\n }\n setAlignContent(align: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Align type\n this.node.setAlignContent(align as Align)\n }\n setJustifyContent(justify: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Justify type\n this.node.setJustifyContent(justify as Justify)\n }\n\n // Spacing\n setPadding(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPadding(edge as Edge, value)\n }\n setMargin(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setMargin(edge as Edge, value)\n }\n setBorder(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setBorder(edge as Edge, value)\n }\n setGap(gutter: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Gutter type\n this.node.setGap(gutter as Gutter, value)\n }\n\n // Display & Position\n setDisplay(display: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Display type\n this.node.setDisplay(display as Display)\n }\n setPositionType(positionType: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded PositionType type\n this.node.setPositionType(positionType as PositionType)\n }\n setPosition(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPosition(edge as Edge, value)\n }\n setPositionPercent(edge: number, value: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Edge type\n this.node.setPositionPercent(edge as Edge, value)\n }\n setOverflow(overflow: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Overflow type\n this.node.setOverflow(overflow as Overflow)\n }\n\n // Aspect Ratio\n setAspectRatio(value: number): void {\n this.node.setAspectRatio(value)\n }\n\n // Layout calculation\n calculateLayout(width: number, height: number, direction?: number): void {\n // LayoutEngine uses plain numbers; Yoga uses branded Direction type\n this.node.calculateLayout(width, height, (direction ?? this.yoga.DIRECTION_LTR) as Direction)\n }\n\n // Layout results\n getComputedLeft(): number {\n return this.node.getComputedLeft()\n }\n getComputedTop(): number {\n return this.node.getComputedTop()\n }\n getComputedWidth(): number {\n return this.node.getComputedWidth()\n }\n getComputedHeight(): number {\n return this.node.getComputedHeight()\n }\n}\n\n// ============================================================================\n// Yoga Layout Engine\n// ============================================================================\n\n/**\n * Layout engine implementation using Yoga (WASM).\n */\nexport class YogaLayoutEngine implements LayoutEngine {\n private yoga: Yoga\n private _constants: LayoutConstants\n\n constructor(yoga: Yoga) {\n this.yoga = yoga\n // Cast Yoga's branded types to our LayoutEngine branded types at the adapter boundary\n this._constants = {\n // Flex Direction\n FLEX_DIRECTION_COLUMN: yoga.FLEX_DIRECTION_COLUMN as unknown as FlexDirectionValue,\n FLEX_DIRECTION_COLUMN_REVERSE:\n yoga.FLEX_DIRECTION_COLUMN_REVERSE as unknown as FlexDirectionValue,\n FLEX_DIRECTION_ROW: yoga.FLEX_DIRECTION_ROW as unknown as FlexDirectionValue,\n FLEX_DIRECTION_ROW_REVERSE: yoga.FLEX_DIRECTION_ROW_REVERSE as unknown as FlexDirectionValue,\n\n // Wrap\n WRAP_NO_WRAP: yoga.WRAP_NO_WRAP as unknown as WrapValue,\n WRAP_WRAP: yoga.WRAP_WRAP as unknown as WrapValue,\n WRAP_WRAP_REVERSE: yoga.WRAP_WRAP_REVERSE as unknown as WrapValue,\n\n // Align\n ALIGN_AUTO: yoga.ALIGN_AUTO as unknown as AlignValue,\n ALIGN_FLEX_START: yoga.ALIGN_FLEX_START as unknown as AlignValue,\n ALIGN_CENTER: yoga.ALIGN_CENTER as unknown as AlignValue,\n ALIGN_FLEX_END: yoga.ALIGN_FLEX_END as unknown as AlignValue,\n ALIGN_STRETCH: yoga.ALIGN_STRETCH as unknown as AlignValue,\n ALIGN_BASELINE: yoga.ALIGN_BASELINE as unknown as AlignValue,\n ALIGN_SPACE_BETWEEN: yoga.ALIGN_SPACE_BETWEEN as unknown as AlignValue,\n ALIGN_SPACE_AROUND: yoga.ALIGN_SPACE_AROUND as unknown as AlignValue,\n ALIGN_SPACE_EVENLY: (yoga as any).ALIGN_SPACE_EVENLY as unknown as AlignValue,\n\n // Justify\n JUSTIFY_FLEX_START: yoga.JUSTIFY_FLEX_START as unknown as JustifyValue,\n JUSTIFY_CENTER: yoga.JUSTIFY_CENTER as unknown as JustifyValue,\n JUSTIFY_FLEX_END: yoga.JUSTIFY_FLEX_END as unknown as JustifyValue,\n JUSTIFY_SPACE_BETWEEN: yoga.JUSTIFY_SPACE_BETWEEN as unknown as JustifyValue,\n JUSTIFY_SPACE_AROUND: yoga.JUSTIFY_SPACE_AROUND as unknown as JustifyValue,\n JUSTIFY_SPACE_EVENLY: yoga.JUSTIFY_SPACE_EVENLY as unknown as JustifyValue,\n\n // Edge\n EDGE_LEFT: yoga.EDGE_LEFT as unknown as EdgeValue,\n EDGE_TOP: yoga.EDGE_TOP as unknown as EdgeValue,\n EDGE_RIGHT: yoga.EDGE_RIGHT as unknown as EdgeValue,\n EDGE_BOTTOM: yoga.EDGE_BOTTOM as unknown as EdgeValue,\n EDGE_HORIZONTAL: yoga.EDGE_HORIZONTAL as unknown as EdgeValue,\n EDGE_VERTICAL: yoga.EDGE_VERTICAL as unknown as EdgeValue,\n EDGE_ALL: yoga.EDGE_ALL as unknown as EdgeValue,\n\n // Gutter\n GUTTER_COLUMN: yoga.GUTTER_COLUMN as unknown as GutterValue,\n GUTTER_ROW: yoga.GUTTER_ROW as unknown as GutterValue,\n GUTTER_ALL: yoga.GUTTER_ALL as unknown as GutterValue,\n\n // Display\n DISPLAY_FLEX: yoga.DISPLAY_FLEX as unknown as DisplayValue,\n DISPLAY_NONE: yoga.DISPLAY_NONE as unknown as DisplayValue,\n\n // Position Type\n POSITION_TYPE_STATIC: yoga.POSITION_TYPE_STATIC as unknown as PositionTypeValue,\n POSITION_TYPE_RELATIVE: yoga.POSITION_TYPE_RELATIVE as unknown as PositionTypeValue,\n POSITION_TYPE_ABSOLUTE: yoga.POSITION_TYPE_ABSOLUTE as unknown as PositionTypeValue,\n\n // Overflow\n OVERFLOW_VISIBLE: yoga.OVERFLOW_VISIBLE as unknown as OverflowValue,\n OVERFLOW_HIDDEN: yoga.OVERFLOW_HIDDEN as unknown as OverflowValue,\n OVERFLOW_SCROLL: yoga.OVERFLOW_SCROLL as unknown as OverflowValue,\n\n // Direction\n DIRECTION_LTR: yoga.DIRECTION_LTR as unknown as DirectionValue,\n\n // Measure Mode\n MEASURE_MODE_UNDEFINED: yoga.MEASURE_MODE_UNDEFINED as unknown as MeasureModeValue,\n MEASURE_MODE_EXACTLY: yoga.MEASURE_MODE_EXACTLY as unknown as MeasureModeValue,\n MEASURE_MODE_AT_MOST: yoga.MEASURE_MODE_AT_MOST as unknown as MeasureModeValue,\n }\n }\n\n createNode(): LayoutNode {\n return new YogaNodeAdapter(this.yoga.Node.create(), this.yoga)\n }\n\n get constants(): LayoutConstants {\n return this._constants\n }\n\n get name(): string {\n return \"yoga\"\n }\n}\n\n// ============================================================================\n// Initialization Helper\n// ============================================================================\n\n/**\n * Create a Yoga layout engine from an initialized Yoga instance.\n */\nexport function createYogaEngine(yoga: Yoga): YogaLayoutEngine {\n return new YogaLayoutEngine(yoga)\n}\n\n/**\n * Initialize Yoga and create a layout engine.\n * Uses yoga-wasm-web/auto which automatically selects the right implementation.\n */\nexport async function initYogaEngine(): Promise<YogaLayoutEngine> {\n const { default: yoga } = (await import(\"yoga-wasm-web/auto\")) as {\n default: Yoga\n }\n return new YogaLayoutEngine(yoga)\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "silvery",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "React for modern terminal apps — powerful apps, polished UIs, proudly terminal",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ansi",
|
|
@@ -40,34 +40,63 @@
|
|
|
40
40
|
],
|
|
41
41
|
"type": "module",
|
|
42
42
|
"exports": {
|
|
43
|
-
".":
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"./
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
},
|
|
51
|
-
"./theme": {
|
|
52
|
-
"types": "./dist/theme.d.mts",
|
|
53
|
-
"import": "./dist/theme.mjs"
|
|
54
|
-
},
|
|
55
|
-
"./ui": {
|
|
56
|
-
"types": "./dist/ui.d.mts",
|
|
57
|
-
"import": "./dist/ui.mjs"
|
|
58
|
-
},
|
|
59
|
-
"./ui/*": {
|
|
60
|
-
"types": "./dist/ui/*.d.mts",
|
|
61
|
-
"import": "./dist/ui/*.mjs"
|
|
62
|
-
}
|
|
43
|
+
".": "./src/index.ts",
|
|
44
|
+
"./runtime": "./src/runtime.ts",
|
|
45
|
+
"./theme": "./src/theme.ts",
|
|
46
|
+
"./ui": "./src/ui.ts",
|
|
47
|
+
"./ui/*": "./src/ui/*.ts",
|
|
48
|
+
"./ink": "@silvery/ink",
|
|
49
|
+
"./chalk": "@silvery/ink/chalk"
|
|
63
50
|
},
|
|
64
51
|
"publishConfig": {
|
|
65
|
-
"access": "public"
|
|
52
|
+
"access": "public",
|
|
53
|
+
"exports": {
|
|
54
|
+
".": {
|
|
55
|
+
"types": "./dist/index.d.mts",
|
|
56
|
+
"import": "./dist/index.mjs"
|
|
57
|
+
},
|
|
58
|
+
"./runtime": {
|
|
59
|
+
"types": "./dist/runtime.d.mts",
|
|
60
|
+
"import": "./dist/runtime.mjs"
|
|
61
|
+
},
|
|
62
|
+
"./theme": {
|
|
63
|
+
"types": "./dist/theme.d.mts",
|
|
64
|
+
"import": "./dist/theme.mjs"
|
|
65
|
+
},
|
|
66
|
+
"./ui": {
|
|
67
|
+
"types": "./dist/ui.d.mts",
|
|
68
|
+
"import": "./dist/ui.mjs"
|
|
69
|
+
},
|
|
70
|
+
"./ui/*": {
|
|
71
|
+
"types": "./dist/ui/*.d.mts",
|
|
72
|
+
"import": "./dist/ui/*.mjs"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"scripts": {
|
|
77
|
+
"build": "tsdown",
|
|
78
|
+
"build:all": "tsdown && tsdown -W -F '@silvery/*'",
|
|
79
|
+
"test": "bunx --bun vitest run",
|
|
80
|
+
"test:fast": "bunx --bun vitest run --reporter=dot",
|
|
81
|
+
"typecheck": "tsc --noEmit",
|
|
82
|
+
"lint": "oxlint . && oxfmt --check .",
|
|
83
|
+
"fix": "oxlint --fix . && oxfmt --write .",
|
|
84
|
+
"docs:dev": "vitepress dev docs",
|
|
85
|
+
"docs:build": "vitepress build docs",
|
|
86
|
+
"docs:preview": "vitepress preview docs",
|
|
87
|
+
"theme": "bun packages/theme/src/cli.ts",
|
|
88
|
+
"demo": "bun examples/bin/cli.ts",
|
|
89
|
+
"example:storybook": "bun examples/apps/storybook/index.tsx",
|
|
90
|
+
"compat": "bun packages/ink/scripts/compat-check.ts",
|
|
91
|
+
"compat:ink": "bun packages/ink/scripts/compat-check.ts ink",
|
|
92
|
+
"compat:chalk": "bun packages/ink/scripts/compat-check.ts chalk",
|
|
93
|
+
"bench": "cd benchmarks && bun run bench",
|
|
94
|
+
"bench:compare": "cd benchmarks && bun run bench:compare"
|
|
66
95
|
},
|
|
67
96
|
"dependencies": {
|
|
68
97
|
"@chenglou/pretext": "^0.0.3",
|
|
69
|
-
"@silvery/color": "0.
|
|
70
|
-
"@silvery/commander": "0.
|
|
98
|
+
"@silvery/color": "0.19.0",
|
|
99
|
+
"@silvery/commander": "0.19.0",
|
|
71
100
|
"css-select": "^7.0.0",
|
|
72
101
|
"css-what": "^8.0.0",
|
|
73
102
|
"loggily": "0.6.0",
|
|
@@ -126,25 +155,5 @@
|
|
|
126
155
|
"engines": {
|
|
127
156
|
"bun": ">=1.0",
|
|
128
157
|
"node": ">=18.0.0"
|
|
129
|
-
},
|
|
130
|
-
"scripts": {
|
|
131
|
-
"build": "tsdown",
|
|
132
|
-
"build:all": "tsdown && tsdown -W -F '@silvery/*'",
|
|
133
|
-
"test": "bunx --bun vitest run",
|
|
134
|
-
"test:fast": "bunx --bun vitest run --reporter=dot",
|
|
135
|
-
"typecheck": "tsc --noEmit",
|
|
136
|
-
"lint": "oxlint . && oxfmt --check .",
|
|
137
|
-
"fix": "oxlint --fix . && oxfmt --write .",
|
|
138
|
-
"docs:dev": "vitepress dev docs",
|
|
139
|
-
"docs:build": "vitepress build docs",
|
|
140
|
-
"docs:preview": "vitepress preview docs",
|
|
141
|
-
"theme": "bun packages/theme/src/cli.ts",
|
|
142
|
-
"demo": "bun examples/bin/cli.ts",
|
|
143
|
-
"example:storybook": "bun examples/apps/storybook/index.tsx",
|
|
144
|
-
"compat": "bun packages/ink/scripts/compat-check.ts",
|
|
145
|
-
"compat:ink": "bun packages/ink/scripts/compat-check.ts ink",
|
|
146
|
-
"compat:chalk": "bun packages/ink/scripts/compat-check.ts chalk",
|
|
147
|
-
"bench": "cd benchmarks && bun run bench",
|
|
148
|
-
"bench:compare": "cd benchmarks && bun run bench:compare"
|
|
149
158
|
}
|
|
150
|
-
}
|
|
159
|
+
}
|