@simon_he/vue-tui 0.0.7 → 1.0.0-rc.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 (207) hide show
  1. package/README.md +222 -444
  2. package/dist/TSelect-BmSkar0D.js +8697 -0
  3. package/dist/ansi-palette-Bv5Vqr4k.js +1499 -0
  4. package/dist/ansi-styles.d.ts +200 -0
  5. package/dist/cli/headless-renderer.d.ts +29 -0
  6. package/dist/cli/input.d.ts +49 -0
  7. package/dist/cli/node-file-writers.d.ts +12 -0
  8. package/dist/cli/node-module.d.ts +2 -0
  9. package/dist/cli/parse-kitty.d.ts +2 -0
  10. package/dist/cli/parse-mouse.d.ts +2 -0
  11. package/dist/cli/parse-utils.d.ts +14 -0
  12. package/dist/cli/parse-xterm.d.ts +2 -0
  13. package/dist/cli/path-provider-types.d.ts +1 -0
  14. package/dist/cli/path-provider.d.ts +4 -0
  15. package/dist/cli/path-suggest-core.d.ts +1 -0
  16. package/dist/cli/path-suggest.d.ts +15 -0
  17. package/dist/cli/recording.d.ts +4 -0
  18. package/dist/cli/stdin-buffer.d.ts +33 -0
  19. package/dist/cli.cjs +10664 -0
  20. package/dist/cli.d.cts +22 -0
  21. package/dist/cli.d.ts +22 -0
  22. package/dist/cli.js +9521 -0
  23. package/dist/core/ansi/capability.d.ts +20 -0
  24. package/dist/core/ansi/colors.d.ts +41 -0
  25. package/dist/core/ansi/sgr.d.ts +7 -0
  26. package/dist/core/ansi/theme.d.ts +6 -0
  27. package/dist/core/ansi-palette.d.ts +14 -0
  28. package/dist/core/buffer/buffer.d.ts +54 -0
  29. package/dist/core/buffer/width.d.ts +4 -0
  30. package/dist/core/debug-logger.d.ts +18 -0
  31. package/dist/core/hyperlink.d.ts +9 -0
  32. package/dist/core/index.d.ts +4 -0
  33. package/dist/core/path-provider-types.d.ts +24 -0
  34. package/dist/core/path-suggest.d.ts +35 -0
  35. package/dist/core/render-plane.d.ts +3 -0
  36. package/dist/core/terminal/create-terminal.d.ts +7 -0
  37. package/dist/core/terminal/emitter.d.ts +7 -0
  38. package/dist/core/types.d.ts +107 -0
  39. package/dist/core.cjs +3072 -0
  40. package/dist/core.d.cts +14 -0
  41. package/dist/core.d.ts +14 -0
  42. package/dist/core.js +422 -0
  43. package/dist/create-terminal-app.d.ts +34 -0
  44. package/dist/dom-renderer-CDVQIcIL.js +1172 -0
  45. package/dist/events/index.d.ts +6 -0
  46. package/dist/events/manager/cli-event-manager.d.ts +22 -0
  47. package/dist/events/manager/event-manager.d.ts +30 -0
  48. package/dist/events/manager/selection-suppression.d.ts +3 -0
  49. package/dist/events/manager/types.d.ts +108 -0
  50. package/dist/events/recording.d.ts +44 -0
  51. package/dist/experimental.cjs +9380 -0
  52. package/dist/experimental.d.cts +39 -0
  53. package/dist/experimental.d.ts +39 -0
  54. package/dist/experimental.js +7624 -0
  55. package/dist/frame-perf-C-w8mjJL.js +98 -0
  56. package/dist/hyperlink-B5PD7a3Q.js +331 -0
  57. package/dist/index.cjs +12037 -16507
  58. package/dist/index.d.cts +13 -0
  59. package/dist/index.d.ts +13 -1353
  60. package/dist/index.js +13 -18738
  61. package/dist/markdown.cjs +21929 -0
  62. package/dist/markdown.d.cts +10 -0
  63. package/dist/markdown.d.ts +10 -0
  64. package/dist/markdown.js +1649 -0
  65. package/dist/observability/cli-latency-node.d.ts +3 -0
  66. package/dist/observability/cli-latency-types.d.ts +41 -0
  67. package/dist/observability/cli-latency.d.ts +3 -0
  68. package/dist/observability/frame-perf-store.d.ts +13 -0
  69. package/dist/observability/frame-perf.d.ts +40 -0
  70. package/dist/observability/trace.d.ts +40 -0
  71. package/dist/observability/tui-profiler.d.ts +33 -0
  72. package/dist/observability.cjs +99 -0
  73. package/dist/observability.d.cts +6 -0
  74. package/dist/observability.d.ts +6 -0
  75. package/dist/observability.js +3 -0
  76. package/dist/path-DDiSCXrQ.js +99 -0
  77. package/dist/path-suggest-0Q2BDsuj.js +274 -0
  78. package/dist/path-suggest-Dk9TRLh5.js +3 -0
  79. package/dist/{path-suggest-CZQYJIIg.js → path-suggest-bvR9SY6Q.js} +86 -18
  80. package/dist/renderer/capabilities.d.ts +13 -0
  81. package/dist/renderer/cli/index.d.ts +2 -0
  82. package/dist/renderer/cli/stdout-metrics.d.ts +18 -0
  83. package/dist/renderer/cli/stdout-renderer.d.ts +48 -0
  84. package/dist/renderer/dom/dom-renderer.d.ts +157 -0
  85. package/dist/renderer/dom/index.d.ts +2 -0
  86. package/dist/renderer/index.d.ts +2 -0
  87. package/dist/renderer-dom.cjs +1511 -0
  88. package/dist/renderer-dom.d.cts +4 -0
  89. package/dist/renderer-dom.d.ts +4 -0
  90. package/dist/renderer-dom.js +6 -0
  91. package/dist/runtime/index.d.ts +36 -0
  92. package/dist/runtime/osc52.d.ts +9 -0
  93. package/dist/runtime-DtrcQidD.js +1197 -0
  94. package/dist/runtime.cjs +1697 -0
  95. package/dist/runtime.d.cts +9 -0
  96. package/dist/runtime.d.ts +9 -0
  97. package/dist/runtime.js +4 -0
  98. package/dist/selection/terminal-selection.d.ts +122 -0
  99. package/dist/sgr-DMK2AvuT.js +304 -0
  100. package/dist/style-cache-i0ZABZRq.js +178 -0
  101. package/dist/terminal-selection-BCOh9jsL.js +329 -0
  102. package/dist/utils/env.d.ts +3 -0
  103. package/dist/utils/newlines.d.ts +1 -0
  104. package/dist/utils/path.d.ts +7 -0
  105. package/dist/utils/url-safety.d.ts +2 -0
  106. package/dist/vue/components/TAnchor.d.ts +108 -0
  107. package/dist/vue/components/TBox.d.ts +144 -0
  108. package/dist/vue/components/TDebugOverlay.d.ts +43 -0
  109. package/dist/vue/components/TDialog.d.ts +256 -0
  110. package/dist/vue/components/TFlow.d.ts +85 -0
  111. package/dist/vue/components/TInput.d.ts +554 -0
  112. package/dist/vue/components/TInputBox.d.ts +158 -0
  113. package/dist/vue/components/TJsonEditor.d.ts +165 -0
  114. package/dist/vue/components/TList.d.ts +119 -0
  115. package/dist/vue/components/TLogLinksPanel.d.ts +238 -0
  116. package/dist/vue/components/TLogMinimap.d.ts +263 -0
  117. package/dist/vue/components/TLogScrollbar.d.ts +236 -0
  118. package/dist/vue/components/TLogSearchBar.d.ts +267 -0
  119. package/dist/vue/components/TLogSearchPager.d.ts +162 -0
  120. package/dist/vue/components/TLogSearchResults.d.ts +200 -0
  121. package/dist/vue/components/TLogView.d.ts +502 -0
  122. package/dist/vue/components/TLogVirtualLinksPanel.d.ts +141 -0
  123. package/dist/vue/components/TLogVirtualSearchResults.d.ts +146 -0
  124. package/dist/vue/components/TMarkdownText.d.ts +134 -0
  125. package/dist/vue/components/TMultilineModal.d.ts +62 -0
  126. package/dist/vue/components/TPathPicker.d.ts +213 -0
  127. package/dist/vue/components/TRenderLayer.d.ts +16 -0
  128. package/dist/vue/components/TRenderPlane.d.ts +17 -0
  129. package/dist/vue/components/TSelect.d.ts +215 -0
  130. package/dist/vue/components/TText.d.ts +116 -0
  131. package/dist/vue/components/TTransition.d.ts +83 -0
  132. package/dist/vue/components/TView.d.ts +127 -0
  133. package/dist/vue/components/TVirtualList.d.ts +182 -0
  134. package/dist/vue/components/TVirtualMarkdown.d.ts +168 -0
  135. package/dist/vue/components/TerminalProvider.d.ts +195 -0
  136. package/dist/vue/components/input/host.d.ts +17 -0
  137. package/dist/vue/components/input/plugins/hostPlugin.d.ts +7 -0
  138. package/dist/vue/components/input/plugins/hostPlugin.node.d.ts +15 -0
  139. package/dist/vue/components/input/plugins/mentionUtils.d.ts +17 -0
  140. package/dist/vue/components/input/plugins/nodeMentionPathProvider.d.ts +2 -0
  141. package/dist/vue/components/input/plugins/promptMentionPlugin.d.ts +8 -0
  142. package/dist/vue/components/input/plugins/promptMentionState.d.ts +98 -0
  143. package/dist/vue/components/input/plugins/restrictText.d.ts +27 -0
  144. package/dist/vue/components/input/plugins/types.d.ts +90 -0
  145. package/dist/vue/components/input/utils/inlineText.d.ts +57 -0
  146. package/dist/vue/components/input/utils/inlineTextTokens.d.ts +34 -0
  147. package/dist/vue/components/input/utils/primitives.d.ts +3 -0
  148. package/dist/vue/components/input/utils/wordNavigation.d.ts +6 -0
  149. package/dist/vue/components/list/list-geometry.d.ts +16 -0
  150. package/dist/vue/components/list/list-paint.d.ts +1 -0
  151. package/dist/vue/components/list/scroll-state.d.ts +25 -0
  152. package/dist/vue/components/list/selection-state.d.ts +6 -0
  153. package/dist/vue/components/terminal-provider/copy-toast.d.ts +6 -0
  154. package/dist/vue/components/terminal-provider/portals.d.ts +17 -0
  155. package/dist/vue/components/terminal-provider/scheduler.d.ts +29 -0
  156. package/dist/vue/components/terminal-provider/selection-config.d.ts +15 -0
  157. package/dist/vue/components/terminal-provider/utils.d.ts +5 -0
  158. package/dist/vue/composables/use-layout.d.ts +2 -0
  159. package/dist/vue/composables/use-render-node.d.ts +19 -0
  160. package/dist/vue/composables/use-render-stack.d.ts +3 -0
  161. package/dist/vue/composables/use-runtime.d.ts +5 -0
  162. package/dist/vue/composables/use-terminal-node.d.ts +14 -0
  163. package/dist/vue/composables/use-terminal.d.ts +2 -0
  164. package/dist/vue/composables/use-visibility.d.ts +12 -0
  165. package/dist/vue/context.d.ts +153 -0
  166. package/dist/vue/index.d.ts +39 -0
  167. package/dist/vue/injection-key.d.ts +2 -0
  168. package/dist/vue/log/append-only-log-store.d.ts +2 -0
  169. package/dist/vue/log/tlog-keymap.d.ts +28 -0
  170. package/dist/vue/log/tlog-plugins.d.ts +144 -0
  171. package/dist/vue/log/tlog-session.d.ts +81 -0
  172. package/dist/vue/log/tlog-theme.d.ts +68 -0
  173. package/dist/vue/log/types.d.ts +43 -0
  174. package/dist/vue/log/use-tlog-link-controller.d.ts +31 -0
  175. package/dist/vue/log/use-tlog-retained-index.d.ts +26 -0
  176. package/dist/vue/log/use-tlog-search-controller.d.ts +51 -0
  177. package/dist/vue/log/use-tlog-search-results-page.d.ts +31 -0
  178. package/dist/vue/log/use-tlog-virtual-search-results.d.ts +22 -0
  179. package/dist/vue/markdown/ast.d.ts +3 -0
  180. package/dist/vue/markdown/block-source.d.ts +22 -0
  181. package/dist/vue/markdown/document.d.ts +18 -0
  182. package/dist/vue/markdown/layout.d.ts +16 -0
  183. package/dist/vue/markdown/parser.d.ts +11 -0
  184. package/dist/vue/markdown/render.d.ts +10 -0
  185. package/dist/vue/markdown/theme.d.ts +186 -0
  186. package/dist/vue/markdown/types.d.ts +47 -0
  187. package/dist/vue/render/context.d.ts +3 -0
  188. package/dist/vue/render/render-manager.d.ts +94 -0
  189. package/dist/vue/router/RouterView.d.ts +25 -0
  190. package/dist/vue/router/composables.d.ts +4 -0
  191. package/dist/vue/router/context.d.ts +4 -0
  192. package/dist/vue/router/router.d.ts +7 -0
  193. package/dist/vue/router/types.d.ts +29 -0
  194. package/dist/vue/scheduler/frame-mailbox.d.ts +55 -0
  195. package/dist/vue/scheduler/frame-scheduler.d.ts +51 -0
  196. package/dist/vue/utils/frame-task.d.ts +6 -0
  197. package/dist/vue/utils/rect.d.ts +4 -0
  198. package/dist/vue/utils/style-cache.d.ts +3 -0
  199. package/dist/vue/utils/text.d.ts +26 -0
  200. package/dist/vue/utils/wheel-scroll.d.ts +18 -0
  201. package/dist/vue.cjs +18882 -0
  202. package/dist/vue.d.cts +3 -0
  203. package/dist/vue.d.ts +3 -0
  204. package/dist/vue.js +3066 -0
  205. package/dist/wheel-scroll-B-WlFuNB.js +819 -0
  206. package/package.json +226 -58
  207. package/dist/path-suggest-DIMby3r0.js +0 -3
@@ -0,0 +1,9 @@
1
+ export type { Rect, TerminalBaseEvent, TerminalDebugNode, TerminalEventHandlerMap, TerminalEventType, TerminalInputEvent, TerminalKeyboardEvent, TerminalNode, TerminalPointerEvent, } from "./events/manager/types.js";
2
+ export type { EventManager } from "./events/manager/event-manager.js";
3
+ export { createEventManager } from "./events/manager/event-manager.js";
4
+ export type { TerminalEventRecord } from "./events/recording.js";
5
+ export type { ClipboardApi, RafApi, Runtime, RuntimeEnv, RuntimeOptions, TimerApi, } from "./runtime/index.js";
6
+ export { createRuntime } from "./runtime/index.js";
7
+ export type { CreateTerminalSelectionControllerOptions, SelectionTextProvider, TerminalSelectionConfig, TerminalSelectionController, TerminalSelectionCopyPayload, TerminalSelectionOptions, TerminalSelectionPoint, TerminalSelectionRange, TerminalSelectionRefreshOptions, TerminalSelectionState, } from "./selection/terminal-selection.js";
8
+ export type { SelectedRowSpan } from "./selection/terminal-selection.js";
9
+ export { createTerminalSelectionController, terminalSelectionRowSpans, terminalSelectionVisibleRowSpans, } from "./selection/terminal-selection.js";
@@ -0,0 +1,9 @@
1
+ export type { Rect, TerminalBaseEvent, TerminalDebugNode, TerminalEventHandlerMap, TerminalEventType, TerminalInputEvent, TerminalKeyboardEvent, TerminalNode, TerminalPointerEvent, } from "./events/manager/types.js";
2
+ export type { EventManager } from "./events/manager/event-manager.js";
3
+ export { createEventManager } from "./events/manager/event-manager.js";
4
+ export type { TerminalEventRecord } from "./events/recording.js";
5
+ export type { ClipboardApi, RafApi, Runtime, RuntimeEnv, RuntimeOptions, TimerApi, } from "./runtime/index.js";
6
+ export { createRuntime } from "./runtime/index.js";
7
+ export type { CreateTerminalSelectionControllerOptions, SelectionTextProvider, TerminalSelectionConfig, TerminalSelectionController, TerminalSelectionCopyPayload, TerminalSelectionOptions, TerminalSelectionPoint, TerminalSelectionRange, TerminalSelectionRefreshOptions, TerminalSelectionState, } from "./selection/terminal-selection.js";
8
+ export type { SelectedRowSpan } from "./selection/terminal-selection.js";
9
+ export { createTerminalSelectionController, terminalSelectionRowSpans, terminalSelectionVisibleRowSpans, } from "./selection/terminal-selection.js";
@@ -0,0 +1,4 @@
1
+ import { createEventManager, createRuntime } from "./runtime-DtrcQidD.js";
2
+ import { createTerminalSelectionController, terminalSelectionRowSpans, terminalSelectionVisibleRowSpans } from "./terminal-selection-BCOh9jsL.js";
3
+
4
+ export { createEventManager, createRuntime, createTerminalSelectionController, terminalSelectionRowSpans, terminalSelectionVisibleRowSpans };
@@ -0,0 +1,122 @@
1
+ import type { Ref } from "vue";
2
+ import type { Rect } from "../events/manager/types.js";
3
+ import type { ClipboardApi } from "../runtime/index.js";
4
+ import type { Style, Terminal } from "../core/types.js";
5
+ export type TerminalSelectionPoint = Readonly<{
6
+ x: number;
7
+ y: number;
8
+ }>;
9
+ export type TerminalSelectionRange = Readonly<{
10
+ anchor: TerminalSelectionPoint;
11
+ focus: TerminalSelectionPoint;
12
+ mode: "linear" | "block";
13
+ }>;
14
+ export type TerminalSelectionState = Readonly<{
15
+ active: boolean;
16
+ anchor: TerminalSelectionPoint | null;
17
+ focus: TerminalSelectionPoint | null;
18
+ text: string;
19
+ hasRange: boolean;
20
+ }>;
21
+ export type TerminalSelectionCopyPayload = Readonly<{
22
+ text: string;
23
+ rows: number;
24
+ chars: number;
25
+ ok: boolean;
26
+ error?: unknown;
27
+ }>;
28
+ export type TerminalSelectionOptions = Readonly<{
29
+ autoCopy?: boolean;
30
+ copyOnMouseUp?: boolean;
31
+ style?: Style;
32
+ }>;
33
+ export type TerminalSelectionConfig = boolean | TerminalSelectionOptions;
34
+ /**
35
+ * A visible overlay span in terminal screen coordinates.
36
+ * Provider-space spans must be translated to screen coordinates before
37
+ * returning from `getVisibleSpans()`.
38
+ */
39
+ export type SelectedRowSpan = Readonly<{
40
+ /** Terminal screen row y */
41
+ y: number;
42
+ /** Terminal screen column x inclusive */
43
+ x0: number;
44
+ /** Terminal screen column x exclusive */
45
+ x1: number;
46
+ }>;
47
+ export type SelectionTextProvider = Readonly<{
48
+ id: string;
49
+ /**
50
+ * Current provider viewport rect in terminal screen coordinates.
51
+ */
52
+ rect: Rect;
53
+ /**
54
+ * Receives a terminal screen-space range. Return true when this provider
55
+ * can resolve the range without relying on the terminal buffer fallback.
56
+ */
57
+ canHandle: (screenRange: TerminalSelectionRange) => boolean;
58
+ /**
59
+ * Maps a terminal screen-space point to provider-space point.
60
+ */
61
+ pointForCell?: (screenPoint: TerminalSelectionPoint) => TerminalSelectionPoint | null;
62
+ /**
63
+ * Receives a provider-space range (i.e. after `pointForCell` mapping).
64
+ */
65
+ getText: (providerRange: TerminalSelectionRange) => string;
66
+ /**
67
+ * Return overlay highlight spans for the portion of the selection that is
68
+ * currently visible in the viewport. Coordinates are terminal screen cells.
69
+ *
70
+ * When a virtual-scrolling provider scrolls during a drag-selection, the
71
+ * selection range may span content that has already scrolled out of view.
72
+ * The default `terminalSelectionRowSpans()` uses screen coordinates and
73
+ * cannot account for this, so the highlight becomes stale after each scroll
74
+ * tick. Providers that support cross-viewport selection should implement
75
+ * this method to return only the spans that intersect the current viewport,
76
+ * mapped back to screen cell coordinates.
77
+ *
78
+ * @param providerRange - The selection range in provider-space coordinates
79
+ * (i.e. after `pointForCell` mapping).
80
+ * @param screenRange - The same selection range in terminal screen
81
+ * coordinates (before `pointForCell` mapping).
82
+ */
83
+ getVisibleSpans?: (providerRange: TerminalSelectionRange, screenRange: TerminalSelectionRange) => readonly SelectedRowSpan[];
84
+ }>;
85
+ export type TerminalSelectionRefreshOptions = Readonly<{
86
+ /**
87
+ * Re-map the current screen-space focus point through the active provider.
88
+ * Use this for selection-driven auto-scroll after the viewport has moved.
89
+ */
90
+ remapFocus?: boolean;
91
+ }>;
92
+ export type TerminalSelectionController = Readonly<{
93
+ state: Ref<TerminalSelectionState>;
94
+ start: (point: TerminalSelectionPoint, options?: {
95
+ extend?: boolean;
96
+ }) => void;
97
+ update: (point: TerminalSelectionPoint) => void;
98
+ finish: () => Promise<void>;
99
+ clear: () => void;
100
+ copy: () => Promise<boolean>;
101
+ paint: (dirtyRows?: readonly number[]) => void;
102
+ refresh: (options?: TerminalSelectionRefreshOptions) => void;
103
+ clearProvider: (providerId: string) => void;
104
+ }>;
105
+ type ResolvedSelectionOptions = Readonly<{
106
+ autoCopy: boolean;
107
+ copyOnMouseUp: boolean;
108
+ style: Style;
109
+ }>;
110
+ export type CreateTerminalSelectionControllerOptions = Readonly<{
111
+ terminal: Terminal;
112
+ overlayTerminal: Terminal;
113
+ clipboard: ClipboardApi;
114
+ getOptions?: () => Partial<ResolvedSelectionOptions>;
115
+ getTextProviders?: () => readonly SelectionTextProvider[];
116
+ onDirtyRows?: (rows: readonly number[]) => void;
117
+ onCopy?: (payload: TerminalSelectionCopyPayload) => void;
118
+ }>;
119
+ export declare function terminalSelectionRowSpans(range: TerminalSelectionRange, cols: number, rows: number): SelectedRowSpan[];
120
+ export declare function terminalSelectionVisibleRowSpans(range: TerminalSelectionRange, cols: number, rows: number, visibleStartY: number, visibleEndY: number): SelectedRowSpan[];
121
+ export declare function createTerminalSelectionController(options: CreateTerminalSelectionControllerOptions): TerminalSelectionController;
122
+ export {};
@@ -0,0 +1,304 @@
1
+ //#region src/core/ansi/sgr.ts
2
+ const ESC = "\x1B";
3
+ function ansi16ToColorName(code) {
4
+ switch (code) {
5
+ case 30: return "black";
6
+ case 31: return "red";
7
+ case 32: return "green";
8
+ case 33: return "yellow";
9
+ case 34: return "blue";
10
+ case 35: return "magenta";
11
+ case 36: return "cyan";
12
+ case 37: return "white";
13
+ case 90: return "blackBright";
14
+ case 91: return "redBright";
15
+ case 92: return "greenBright";
16
+ case 93: return "yellowBright";
17
+ case 94: return "blueBright";
18
+ case 95: return "magentaBright";
19
+ case 96: return "cyanBright";
20
+ case 97: return "whiteBright";
21
+ default: return void 0;
22
+ }
23
+ }
24
+ function ansi16BgToColorName(code) {
25
+ const fgCode = code >= 40 && code <= 47 ? code - 10 : code >= 100 && code <= 107 ? code - 10 : null;
26
+ if (fgCode == null) return void 0;
27
+ return ansi16ToColorName(fgCode);
28
+ }
29
+ const ANSI16_RGB = {
30
+ black: {
31
+ r: 0,
32
+ g: 0,
33
+ b: 0
34
+ },
35
+ red: {
36
+ r: 201,
37
+ g: 27,
38
+ b: 0
39
+ },
40
+ green: {
41
+ r: 0,
42
+ g: 194,
43
+ b: 0
44
+ },
45
+ yellow: {
46
+ r: 199,
47
+ g: 196,
48
+ b: 0
49
+ },
50
+ blue: {
51
+ r: 2,
52
+ g: 37,
53
+ b: 199
54
+ },
55
+ magenta: {
56
+ r: 201,
57
+ g: 48,
58
+ b: 199
59
+ },
60
+ cyan: {
61
+ r: 0,
62
+ g: 197,
63
+ b: 199
64
+ },
65
+ white: {
66
+ r: 199,
67
+ g: 199,
68
+ b: 199
69
+ },
70
+ blackBright: {
71
+ r: 104,
72
+ g: 104,
73
+ b: 104
74
+ },
75
+ redBright: {
76
+ r: 255,
77
+ g: 110,
78
+ b: 103
79
+ },
80
+ greenBright: {
81
+ r: 95,
82
+ g: 250,
83
+ b: 104
84
+ },
85
+ yellowBright: {
86
+ r: 255,
87
+ g: 252,
88
+ b: 103
89
+ },
90
+ blueBright: {
91
+ r: 104,
92
+ g: 113,
93
+ b: 255
94
+ },
95
+ magentaBright: {
96
+ r: 255,
97
+ g: 118,
98
+ b: 255
99
+ },
100
+ cyanBright: {
101
+ r: 95,
102
+ g: 253,
103
+ b: 255
104
+ },
105
+ whiteBright: {
106
+ r: 255,
107
+ g: 255,
108
+ b: 255
109
+ }
110
+ };
111
+ function nearestAnsi16(r, g, b) {
112
+ let best = "white";
113
+ let bestDist = Number.POSITIVE_INFINITY;
114
+ for (const [name, rgb] of Object.entries(ANSI16_RGB)) {
115
+ const dr = r - rgb.r;
116
+ const dg = g - rgb.g;
117
+ const db = b - rgb.b;
118
+ const d = dr * dr + dg * dg + db * db;
119
+ if (d < bestDist) {
120
+ bestDist = d;
121
+ best = name;
122
+ }
123
+ }
124
+ return best;
125
+ }
126
+ function ansi256ToRgb(index) {
127
+ const n = Math.max(0, Math.min(255, Math.trunc(index)));
128
+ if (n < 16) {
129
+ const map = [
130
+ "black",
131
+ "red",
132
+ "green",
133
+ "yellow",
134
+ "blue",
135
+ "magenta",
136
+ "cyan",
137
+ "white",
138
+ "blackBright",
139
+ "redBright",
140
+ "greenBright",
141
+ "yellowBright",
142
+ "blueBright",
143
+ "magentaBright",
144
+ "cyanBright",
145
+ "whiteBright"
146
+ ];
147
+ const name = map[n] ?? "white";
148
+ return ANSI16_RGB[name];
149
+ }
150
+ if (n >= 232) {
151
+ const c = 8 + (n - 232) * 10;
152
+ return {
153
+ r: c,
154
+ g: c,
155
+ b: c
156
+ };
157
+ }
158
+ const i = n - 16;
159
+ const rr = Math.floor(i / 36);
160
+ const gg = Math.floor(i % 36 / 6);
161
+ const bb = i % 6;
162
+ const toComponent = (v) => v === 0 ? 0 : 55 + v * 40;
163
+ return {
164
+ r: toComponent(rr),
165
+ g: toComponent(gg),
166
+ b: toComponent(bb)
167
+ };
168
+ }
169
+ function applyAnsiSgrStyle(current, codes) {
170
+ let next = { ...current };
171
+ for (let i = 0; i < codes.length; i++) {
172
+ const code = codes[i];
173
+ if (code === 0) {
174
+ next = {};
175
+ continue;
176
+ }
177
+ if (code === 1) next = {
178
+ ...next,
179
+ bold: true
180
+ };
181
+ else if (code === 2) next = {
182
+ ...next,
183
+ dim: true
184
+ };
185
+ else if (code === 3) next = {
186
+ ...next,
187
+ italic: true
188
+ };
189
+ else if (code === 4) next = {
190
+ ...next,
191
+ underline: true
192
+ };
193
+ else if (code === 7) next = {
194
+ ...next,
195
+ inverse: true
196
+ };
197
+ else if (code === 22) next = {
198
+ ...next,
199
+ bold: false,
200
+ dim: false
201
+ };
202
+ else if (code === 23) next = {
203
+ ...next,
204
+ italic: false
205
+ };
206
+ else if (code === 24) next = {
207
+ ...next,
208
+ underline: false
209
+ };
210
+ else if (code === 27) next = {
211
+ ...next,
212
+ inverse: false
213
+ };
214
+ else if (code === 39) next = {
215
+ ...next,
216
+ fg: void 0
217
+ };
218
+ else if (code === 49) next = {
219
+ ...next,
220
+ bg: void 0
221
+ };
222
+ else if (code >= 30 && code <= 37 || code >= 90 && code <= 97) {
223
+ const fg = ansi16ToColorName(code);
224
+ next = {
225
+ ...next,
226
+ fg: fg ?? next.fg
227
+ };
228
+ } else if (code >= 40 && code <= 47 || code >= 100 && code <= 107) {
229
+ const bg = ansi16BgToColorName(code);
230
+ next = {
231
+ ...next,
232
+ bg: bg ?? next.bg
233
+ };
234
+ } else if (code === 38 || code === 48) {
235
+ const mode = codes[i + 1];
236
+ if (mode === 5) {
237
+ const idx = codes[i + 2];
238
+ if (idx != null) {
239
+ const { r, g, b } = ansi256ToRgb(idx);
240
+ const name = nearestAnsi16(r, g, b);
241
+ next = code === 38 ? {
242
+ ...next,
243
+ fg: name
244
+ } : {
245
+ ...next,
246
+ bg: name
247
+ };
248
+ }
249
+ i += 2;
250
+ } else if (mode === 2) {
251
+ const r = codes[i + 2];
252
+ const g = codes[i + 3];
253
+ const b = codes[i + 4];
254
+ if (r != null && g != null && b != null) {
255
+ const name = nearestAnsi16(r, g, b);
256
+ next = code === 38 ? {
257
+ ...next,
258
+ fg: name
259
+ } : {
260
+ ...next,
261
+ bg: name
262
+ };
263
+ }
264
+ i += 4;
265
+ }
266
+ }
267
+ }
268
+ return next;
269
+ }
270
+ function parseAnsiSgr(input, baseStyle = {}) {
271
+ const segments = [];
272
+ let style = { ...baseStyle };
273
+ let lastIndex = 0;
274
+ for (let i = 0; i < input.length; i++) {
275
+ if (input[i] !== ESC || input[i + 1] !== "[") continue;
276
+ let j = i + 2;
277
+ while (j < input.length) {
278
+ const c = input.charCodeAt(j);
279
+ if (c >= 48 && c <= 57 || c === 59) {
280
+ j++;
281
+ continue;
282
+ }
283
+ break;
284
+ }
285
+ if (j >= input.length || input[j] !== "m") continue;
286
+ if (i > lastIndex) segments.push({
287
+ text: input.slice(lastIndex, i),
288
+ style
289
+ });
290
+ const body = input.slice(i + 2, j);
291
+ const codes = body.split(";").filter(Boolean).map((n) => Number.parseInt(n, 10)).filter((n) => Number.isFinite(n));
292
+ style = applyAnsiSgrStyle(style, codes.length ? codes : [0]);
293
+ lastIndex = j + 1;
294
+ i = j;
295
+ }
296
+ if (lastIndex < input.length) segments.push({
297
+ text: input.slice(lastIndex),
298
+ style
299
+ });
300
+ return segments;
301
+ }
302
+
303
+ //#endregion
304
+ export { applyAnsiSgrStyle, parseAnsiSgr };
@@ -0,0 +1,178 @@
1
+ //#region src/vue/scheduler/frame-mailbox.ts
2
+ const EMPTY = Symbol("frame-mailbox-empty");
3
+ /**
4
+ * Coalesces many producer updates into a single scheduler frame task.
5
+ *
6
+ * This helper is currently internal to vue-tui. It is used by library
7
+ * components and internal tests, but it is not exported from the package root.
8
+ *
9
+ * Default behavior keeps only the latest queued value. If `merge` is provided,
10
+ * the pending value is updated with `merge(prev, next)`.
11
+ *
12
+ * Only the first queue() call in a pending cycle schedules a frame task.
13
+ * Later queue() calls update the pending payload and are reported as dropped
14
+ * producer updates when the frame task runs.
15
+ *
16
+ * droppedUpdates are reported after apply() succeeds. They only appear in
17
+ * framePerf when apply() also invalidates and produces a rendered frame sample.
18
+ * If apply() throws, scheduler error stats include mailbox queued/dropped
19
+ * metadata for the failed delivery attempt. The pending payload has already
20
+ * been cleared; mailbox delivery is fail-fast and does not retry stale payloads
21
+ * on later frames.
22
+ *
23
+ * cancel() is best-effort at scheduler level. The run callback still guards
24
+ * `disposed || !hasPending`, because a scheduler may already have taken a
25
+ * snapshot of tasks for the current frame.
26
+ *
27
+ * queue() returns false only when the scheduler explicitly rejects the task.
28
+ * Legacy void-returning schedulers are treated as accepted for compatibility.
29
+ * Owners should call dispose() before the component/scope that owns the
30
+ * mailbox is destroyed.
31
+ *
32
+ * id is scheduler-global. Components should include instance id and producer
33
+ * name, for example `TList:${uid}:wheel`.
34
+ */
35
+ function createFrameMailbox(options) {
36
+ let disposed = false;
37
+ let hasPending = false;
38
+ let pending = EMPTY;
39
+ let queued = 0;
40
+ let pendingTaskId = null;
41
+ function clearPending() {
42
+ hasPending = false;
43
+ pending = EMPTY;
44
+ queued = 0;
45
+ pendingTaskId = null;
46
+ }
47
+ function currentTaskId() {
48
+ if (pendingTaskId) return pendingTaskId;
49
+ const id = typeof options.id === "function" ? options.id() : options.id;
50
+ if (!id) throw new Error("createFrameMailbox requires a non-empty task id");
51
+ pendingTaskId = id;
52
+ return pendingTaskId;
53
+ }
54
+ function queue(value) {
55
+ if (disposed) return false;
56
+ const wasPending = hasPending;
57
+ const taskId = wasPending ? pendingTaskId : currentTaskId();
58
+ let nextPending;
59
+ try {
60
+ nextPending = hasPending && options.merge ? options.merge(pending, value) : value;
61
+ } catch (error) {
62
+ clearPending();
63
+ if (wasPending) options.scheduler.cancelFrameTask?.(taskId);
64
+ throw error;
65
+ }
66
+ pending = nextPending;
67
+ hasPending = true;
68
+ queued++;
69
+ if (wasPending) return true;
70
+ let accepted;
71
+ try {
72
+ accepted = options.scheduler.queueFrameTask({
73
+ id: taskId,
74
+ reason: options.reason,
75
+ priority: options.priority,
76
+ sync: options.sync,
77
+ run(ctx) {
78
+ if (disposed || !hasPending) return;
79
+ const value$1 = pending;
80
+ const count = queued;
81
+ const dropped = Math.max(0, count - 1);
82
+ clearPending();
83
+ ctx.reportMailboxDeliveryAttempt?.({
84
+ id: taskId,
85
+ queued: count,
86
+ dropped
87
+ });
88
+ options.apply(value$1, ctx, {
89
+ queued: count,
90
+ dropped
91
+ });
92
+ ctx.reportDroppedUpdates?.(dropped);
93
+ }
94
+ });
95
+ } catch (error) {
96
+ clearPending();
97
+ throw error;
98
+ }
99
+ if (accepted === false) {
100
+ clearPending();
101
+ return false;
102
+ }
103
+ return true;
104
+ }
105
+ function replacePending(value) {
106
+ if (disposed) return false;
107
+ if (!hasPending) return queue(value);
108
+ pending = value;
109
+ return true;
110
+ }
111
+ function cancel() {
112
+ const taskId = pendingTaskId;
113
+ clearPending();
114
+ if (taskId) options.scheduler.cancelFrameTask?.(taskId);
115
+ }
116
+ function dispose() {
117
+ cancel();
118
+ disposed = true;
119
+ }
120
+ return {
121
+ queue,
122
+ replacePending,
123
+ cancel,
124
+ dispose,
125
+ hasPending: () => hasPending,
126
+ peek: () => hasPending ? pending : void 0
127
+ };
128
+ }
129
+
130
+ //#endregion
131
+ //#region src/vue/utils/style-cache.ts
132
+ const EMPTY_STYLE = Object.freeze({});
133
+ const inverseStyleCache = new WeakMap();
134
+ const dimStyleCache = new WeakMap();
135
+ function cacheBase(base) {
136
+ for (const key in base) if (Object.prototype.hasOwnProperty.call(base, key)) return base;
137
+ return EMPTY_STYLE;
138
+ }
139
+ function cacheable(base) {
140
+ return Object.isFrozen(base);
141
+ }
142
+ function defaultActiveStyle(base) {
143
+ if (base.inverse) return base;
144
+ base = cacheBase(base);
145
+ if (!cacheable(base)) return {
146
+ ...base,
147
+ inverse: true
148
+ };
149
+ let cached = inverseStyleCache.get(base);
150
+ if (!cached) {
151
+ cached = Object.freeze({
152
+ ...base,
153
+ inverse: true
154
+ });
155
+ inverseStyleCache.set(base, cached);
156
+ }
157
+ return cached;
158
+ }
159
+ function defaultDimStyle(base) {
160
+ if (base.dim) return base;
161
+ base = cacheBase(base);
162
+ if (!cacheable(base)) return {
163
+ ...base,
164
+ dim: true
165
+ };
166
+ let cached = dimStyleCache.get(base);
167
+ if (!cached) {
168
+ cached = Object.freeze({
169
+ ...base,
170
+ dim: true
171
+ });
172
+ dimStyleCache.set(base, cached);
173
+ }
174
+ return cached;
175
+ }
176
+
177
+ //#endregion
178
+ export { createFrameMailbox, defaultActiveStyle, defaultDimStyle };