@wendongfly/zihi 1.0.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 (145) hide show
  1. package/bin/daemon.js +23 -0
  2. package/bin/zihi.js +603 -0
  3. package/dist/admin.html +297 -0
  4. package/dist/attach.js +2 -0
  5. package/dist/chat.html +2254 -0
  6. package/dist/client-dist/socket.io.esm.min.js +7 -0
  7. package/dist/client-dist/socket.io.js +4955 -0
  8. package/dist/client-dist/socket.io.min.js +7 -0
  9. package/dist/client-dist/socket.io.msgpack.min.js +7 -0
  10. package/dist/files.html +722 -0
  11. package/dist/icon.png +0 -0
  12. package/dist/icon.svg +4 -0
  13. package/dist/index.html +976 -0
  14. package/dist/index.js +485 -0
  15. package/dist/lib/ansi_up.js +431 -0
  16. package/dist/lib/xterm/LICENSE +21 -0
  17. package/dist/lib/xterm/README.md +230 -0
  18. package/dist/lib/xterm/css/xterm.css +209 -0
  19. package/dist/lib/xterm/lib/xterm.js +2 -0
  20. package/dist/lib/xterm/lib/xterm.js.map +1 -0
  21. package/dist/lib/xterm/package.json +100 -0
  22. package/dist/lib/xterm/src/browser/AccessibilityManager.ts +300 -0
  23. package/dist/lib/xterm/src/browser/Clipboard.ts +93 -0
  24. package/dist/lib/xterm/src/browser/ColorContrastCache.ts +34 -0
  25. package/dist/lib/xterm/src/browser/Lifecycle.ts +33 -0
  26. package/dist/lib/xterm/src/browser/Linkifier2.ts +416 -0
  27. package/dist/lib/xterm/src/browser/LocalizableStrings.ts +12 -0
  28. package/dist/lib/xterm/src/browser/OscLinkProvider.ts +128 -0
  29. package/dist/lib/xterm/src/browser/RenderDebouncer.ts +83 -0
  30. package/dist/lib/xterm/src/browser/ScreenDprMonitor.ts +72 -0
  31. package/dist/lib/xterm/src/browser/Terminal.ts +1305 -0
  32. package/dist/lib/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
  33. package/dist/lib/xterm/src/browser/Types.d.ts +181 -0
  34. package/dist/lib/xterm/src/browser/Viewport.ts +401 -0
  35. package/dist/lib/xterm/src/browser/decorations/BufferDecorationRenderer.ts +134 -0
  36. package/dist/lib/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
  37. package/dist/lib/xterm/src/browser/decorations/OverviewRulerRenderer.ts +219 -0
  38. package/dist/lib/xterm/src/browser/input/CompositionHelper.ts +246 -0
  39. package/dist/lib/xterm/src/browser/input/Mouse.ts +54 -0
  40. package/dist/lib/xterm/src/browser/input/MoveToCell.ts +249 -0
  41. package/dist/lib/xterm/src/browser/public/Terminal.ts +260 -0
  42. package/dist/lib/xterm/src/browser/renderer/dom/DomRenderer.ts +506 -0
  43. package/dist/lib/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +522 -0
  44. package/dist/lib/xterm/src/browser/renderer/dom/WidthCache.ts +157 -0
  45. package/dist/lib/xterm/src/browser/renderer/shared/CellColorResolver.ts +137 -0
  46. package/dist/lib/xterm/src/browser/renderer/shared/CharAtlasCache.ts +96 -0
  47. package/dist/lib/xterm/src/browser/renderer/shared/CharAtlasUtils.ts +75 -0
  48. package/dist/lib/xterm/src/browser/renderer/shared/Constants.ts +14 -0
  49. package/dist/lib/xterm/src/browser/renderer/shared/CursorBlinkStateManager.ts +146 -0
  50. package/dist/lib/xterm/src/browser/renderer/shared/CustomGlyphs.ts +687 -0
  51. package/dist/lib/xterm/src/browser/renderer/shared/DevicePixelObserver.ts +41 -0
  52. package/dist/lib/xterm/src/browser/renderer/shared/README.md +1 -0
  53. package/dist/lib/xterm/src/browser/renderer/shared/RendererUtils.ts +58 -0
  54. package/dist/lib/xterm/src/browser/renderer/shared/SelectionRenderModel.ts +91 -0
  55. package/dist/lib/xterm/src/browser/renderer/shared/TextureAtlas.ts +1082 -0
  56. package/dist/lib/xterm/src/browser/renderer/shared/Types.d.ts +173 -0
  57. package/dist/lib/xterm/src/browser/selection/SelectionModel.ts +144 -0
  58. package/dist/lib/xterm/src/browser/selection/Types.d.ts +15 -0
  59. package/dist/lib/xterm/src/browser/services/CharSizeService.ts +102 -0
  60. package/dist/lib/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
  61. package/dist/lib/xterm/src/browser/services/CoreBrowserService.ts +33 -0
  62. package/dist/lib/xterm/src/browser/services/MouseService.ts +46 -0
  63. package/dist/lib/xterm/src/browser/services/RenderService.ts +284 -0
  64. package/dist/lib/xterm/src/browser/services/SelectionService.ts +1029 -0
  65. package/dist/lib/xterm/src/browser/services/Services.ts +138 -0
  66. package/dist/lib/xterm/src/browser/services/ThemeService.ts +237 -0
  67. package/dist/lib/xterm/src/common/CircularList.ts +241 -0
  68. package/dist/lib/xterm/src/common/Clone.ts +23 -0
  69. package/dist/lib/xterm/src/common/Color.ts +356 -0
  70. package/dist/lib/xterm/src/common/CoreTerminal.ts +284 -0
  71. package/dist/lib/xterm/src/common/EventEmitter.ts +73 -0
  72. package/dist/lib/xterm/src/common/InputHandler.ts +3443 -0
  73. package/dist/lib/xterm/src/common/Lifecycle.ts +108 -0
  74. package/dist/lib/xterm/src/common/MultiKeyMap.ts +42 -0
  75. package/dist/lib/xterm/src/common/Platform.ts +43 -0
  76. package/dist/lib/xterm/src/common/SortedList.ts +118 -0
  77. package/dist/lib/xterm/src/common/TaskQueue.ts +166 -0
  78. package/dist/lib/xterm/src/common/TypedArrayUtils.ts +17 -0
  79. package/dist/lib/xterm/src/common/Types.d.ts +553 -0
  80. package/dist/lib/xterm/src/common/WindowsMode.ts +27 -0
  81. package/dist/lib/xterm/src/common/buffer/AttributeData.ts +196 -0
  82. package/dist/lib/xterm/src/common/buffer/Buffer.ts +654 -0
  83. package/dist/lib/xterm/src/common/buffer/BufferLine.ts +520 -0
  84. package/dist/lib/xterm/src/common/buffer/BufferRange.ts +13 -0
  85. package/dist/lib/xterm/src/common/buffer/BufferReflow.ts +223 -0
  86. package/dist/lib/xterm/src/common/buffer/BufferSet.ts +134 -0
  87. package/dist/lib/xterm/src/common/buffer/CellData.ts +94 -0
  88. package/dist/lib/xterm/src/common/buffer/Constants.ts +149 -0
  89. package/dist/lib/xterm/src/common/buffer/Marker.ts +43 -0
  90. package/dist/lib/xterm/src/common/buffer/Types.d.ts +52 -0
  91. package/dist/lib/xterm/src/common/data/Charsets.ts +256 -0
  92. package/dist/lib/xterm/src/common/data/EscapeSequences.ts +153 -0
  93. package/dist/lib/xterm/src/common/input/Keyboard.ts +398 -0
  94. package/dist/lib/xterm/src/common/input/TextDecoder.ts +346 -0
  95. package/dist/lib/xterm/src/common/input/UnicodeV6.ts +132 -0
  96. package/dist/lib/xterm/src/common/input/WriteBuffer.ts +246 -0
  97. package/dist/lib/xterm/src/common/input/XParseColor.ts +80 -0
  98. package/dist/lib/xterm/src/common/parser/Constants.ts +58 -0
  99. package/dist/lib/xterm/src/common/parser/DcsParser.ts +192 -0
  100. package/dist/lib/xterm/src/common/parser/EscapeSequenceParser.ts +792 -0
  101. package/dist/lib/xterm/src/common/parser/OscParser.ts +238 -0
  102. package/dist/lib/xterm/src/common/parser/Params.ts +229 -0
  103. package/dist/lib/xterm/src/common/parser/Types.d.ts +274 -0
  104. package/dist/lib/xterm/src/common/public/AddonManager.ts +53 -0
  105. package/dist/lib/xterm/src/common/public/BufferApiView.ts +35 -0
  106. package/dist/lib/xterm/src/common/public/BufferLineApiView.ts +29 -0
  107. package/dist/lib/xterm/src/common/public/BufferNamespaceApi.ts +36 -0
  108. package/dist/lib/xterm/src/common/public/ParserApi.ts +37 -0
  109. package/dist/lib/xterm/src/common/public/UnicodeApi.ts +27 -0
  110. package/dist/lib/xterm/src/common/services/BufferService.ts +151 -0
  111. package/dist/lib/xterm/src/common/services/CharsetService.ts +34 -0
  112. package/dist/lib/xterm/src/common/services/CoreMouseService.ts +318 -0
  113. package/dist/lib/xterm/src/common/services/CoreService.ts +87 -0
  114. package/dist/lib/xterm/src/common/services/DecorationService.ts +140 -0
  115. package/dist/lib/xterm/src/common/services/InstantiationService.ts +85 -0
  116. package/dist/lib/xterm/src/common/services/LogService.ts +124 -0
  117. package/dist/lib/xterm/src/common/services/OptionsService.ts +201 -0
  118. package/dist/lib/xterm/src/common/services/OscLinkService.ts +115 -0
  119. package/dist/lib/xterm/src/common/services/ServiceRegistry.ts +49 -0
  120. package/dist/lib/xterm/src/common/services/Services.ts +342 -0
  121. package/dist/lib/xterm/src/common/services/UnicodeService.ts +86 -0
  122. package/dist/lib/xterm/src/headless/Terminal.ts +136 -0
  123. package/dist/lib/xterm/src/headless/public/Terminal.ts +195 -0
  124. package/dist/lib/xterm/typings/xterm.d.ts +1844 -0
  125. package/dist/lib/xterm-fit/LICENSE +19 -0
  126. package/dist/lib/xterm-fit/README.md +24 -0
  127. package/dist/lib/xterm-fit/lib/xterm-addon-fit.js +2 -0
  128. package/dist/lib/xterm-fit/lib/xterm-addon-fit.js.map +1 -0
  129. package/dist/lib/xterm-fit/package.json +26 -0
  130. package/dist/lib/xterm-fit/src/FitAddon.ts +89 -0
  131. package/dist/lib/xterm-fit/typings/xterm-addon-fit.d.ts +55 -0
  132. package/dist/lib/xterm-links/LICENSE +19 -0
  133. package/dist/lib/xterm-links/README.md +21 -0
  134. package/dist/lib/xterm-links/lib/xterm-addon-web-links.js +2 -0
  135. package/dist/lib/xterm-links/lib/xterm-addon-web-links.js.map +1 -0
  136. package/dist/lib/xterm-links/package.json +26 -0
  137. package/dist/lib/xterm-links/src/WebLinkProvider.ts +198 -0
  138. package/dist/lib/xterm-links/src/WebLinksAddon.ts +57 -0
  139. package/dist/lib/xterm-links/typings/xterm-addon-web-links.d.ts +53 -0
  140. package/dist/login.html +163 -0
  141. package/dist/manifest.json +12 -0
  142. package/dist/package.json +1 -0
  143. package/dist/sw.js +127 -0
  144. package/dist/sync.html +816 -0
  145. package/package.json +47 -0
@@ -0,0 +1,506 @@
1
+ /**
2
+ * Copyright (c) 2018 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ */
5
+
6
+ import { DomRendererRowFactory, RowCss } from 'browser/renderer/dom/DomRendererRowFactory';
7
+ import { WidthCache } from 'browser/renderer/dom/WidthCache';
8
+ import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';
9
+ import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';
10
+ import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';
11
+ import { ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services';
12
+ import { ILinkifier2, ILinkifierEvent, ReadonlyColorSet } from 'browser/Types';
13
+ import { color } from 'common/Color';
14
+ import { EventEmitter } from 'common/EventEmitter';
15
+ import { Disposable, toDisposable } from 'common/Lifecycle';
16
+ import { IBufferService, IInstantiationService, IOptionsService } from 'common/services/Services';
17
+
18
+
19
+ const TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';
20
+ const ROW_CONTAINER_CLASS = 'xterm-rows';
21
+ const FG_CLASS_PREFIX = 'xterm-fg-';
22
+ const BG_CLASS_PREFIX = 'xterm-bg-';
23
+ const FOCUS_CLASS = 'xterm-focus';
24
+ const SELECTION_CLASS = 'xterm-selection';
25
+
26
+ let nextTerminalId = 1;
27
+
28
+
29
+ /**
30
+ * A fallback renderer for when canvas is slow. This is not meant to be
31
+ * particularly fast or feature complete, more just stable and usable for when
32
+ * canvas is not an option.
33
+ */
34
+ export class DomRenderer extends Disposable implements IRenderer {
35
+ private _rowFactory: DomRendererRowFactory;
36
+ private _terminalClass: number = nextTerminalId++;
37
+
38
+ private _themeStyleElement!: HTMLStyleElement;
39
+ private _dimensionsStyleElement!: HTMLStyleElement;
40
+ private _rowContainer: HTMLElement;
41
+ private _rowElements: HTMLElement[] = [];
42
+ private _selectionContainer: HTMLElement;
43
+ private _widthCache: WidthCache;
44
+
45
+ public dimensions: IRenderDimensions;
46
+
47
+ public readonly onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>()).event;
48
+
49
+ constructor(
50
+ private readonly _element: HTMLElement,
51
+ private readonly _screenElement: HTMLElement,
52
+ private readonly _viewportElement: HTMLElement,
53
+ private readonly _linkifier2: ILinkifier2,
54
+ @IInstantiationService instantiationService: IInstantiationService,
55
+ @ICharSizeService private readonly _charSizeService: ICharSizeService,
56
+ @IOptionsService private readonly _optionsService: IOptionsService,
57
+ @IBufferService private readonly _bufferService: IBufferService,
58
+ @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,
59
+ @IThemeService private readonly _themeService: IThemeService
60
+ ) {
61
+ super();
62
+ this._rowContainer = document.createElement('div');
63
+ this._rowContainer.classList.add(ROW_CONTAINER_CLASS);
64
+ this._rowContainer.style.lineHeight = 'normal';
65
+ this._rowContainer.setAttribute('aria-hidden', 'true');
66
+ this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);
67
+ this._selectionContainer = document.createElement('div');
68
+ this._selectionContainer.classList.add(SELECTION_CLASS);
69
+ this._selectionContainer.setAttribute('aria-hidden', 'true');
70
+
71
+ this.dimensions = createRenderDimensions();
72
+ this._updateDimensions();
73
+ this.register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));
74
+
75
+ this.register(this._themeService.onChangeColors(e => this._injectCss(e)));
76
+ this._injectCss(this._themeService.colors);
77
+
78
+ this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);
79
+
80
+ this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);
81
+ this._screenElement.appendChild(this._rowContainer);
82
+ this._screenElement.appendChild(this._selectionContainer);
83
+
84
+ this.register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));
85
+ this.register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));
86
+
87
+ this.register(toDisposable(() => {
88
+ this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);
89
+
90
+ // Outside influences such as React unmounts may manipulate the DOM before our disposal.
91
+ // https://github.com/xtermjs/xterm.js/issues/2960
92
+ this._rowContainer.remove();
93
+ this._selectionContainer.remove();
94
+ this._widthCache.dispose();
95
+ this._themeStyleElement.remove();
96
+ this._dimensionsStyleElement.remove();
97
+ }));
98
+
99
+ this._widthCache = new WidthCache(document);
100
+ this._widthCache.setFont(
101
+ this._optionsService.rawOptions.fontFamily,
102
+ this._optionsService.rawOptions.fontSize,
103
+ this._optionsService.rawOptions.fontWeight,
104
+ this._optionsService.rawOptions.fontWeightBold
105
+ );
106
+ this._setDefaultSpacing();
107
+ }
108
+
109
+ private _updateDimensions(): void {
110
+ const dpr = this._coreBrowserService.dpr;
111
+ this.dimensions.device.char.width = this._charSizeService.width * dpr;
112
+ this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);
113
+ this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);
114
+ this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);
115
+ this.dimensions.device.char.left = 0;
116
+ this.dimensions.device.char.top = 0;
117
+ this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;
118
+ this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;
119
+ this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);
120
+ this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);
121
+ this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;
122
+ this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;
123
+
124
+ for (const element of this._rowElements) {
125
+ element.style.width = `${this.dimensions.css.canvas.width}px`;
126
+ element.style.height = `${this.dimensions.css.cell.height}px`;
127
+ element.style.lineHeight = `${this.dimensions.css.cell.height}px`;
128
+ // Make sure rows don't overflow onto following row
129
+ element.style.overflow = 'hidden';
130
+ }
131
+
132
+ if (!this._dimensionsStyleElement) {
133
+ this._dimensionsStyleElement = document.createElement('style');
134
+ this._screenElement.appendChild(this._dimensionsStyleElement);
135
+ }
136
+
137
+ const styles =
138
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +
139
+ ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)
140
+ ` height: 100%;` +
141
+ ` vertical-align: top;` +
142
+ `}`;
143
+
144
+ this._dimensionsStyleElement.textContent = styles;
145
+
146
+ this._selectionContainer.style.height = this._viewportElement.style.height;
147
+ this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;
148
+ this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;
149
+ }
150
+
151
+ private _injectCss(colors: ReadonlyColorSet): void {
152
+ if (!this._themeStyleElement) {
153
+ this._themeStyleElement = document.createElement('style');
154
+ this._screenElement.appendChild(this._themeStyleElement);
155
+ }
156
+
157
+ // Base CSS
158
+ let styles =
159
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +
160
+ ` color: ${colors.foreground.css};` +
161
+ ` font-family: ${this._optionsService.rawOptions.fontFamily};` +
162
+ ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +
163
+ ` font-kerning: none;` +
164
+ ` white-space: pre` +
165
+ `}`;
166
+ styles +=
167
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .xterm-dim {` +
168
+ ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +
169
+ `}`;
170
+ // Text styles
171
+ styles +=
172
+ `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +
173
+ ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +
174
+ `}` +
175
+ `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +
176
+ ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +
177
+ `}` +
178
+ `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +
179
+ ` font-style: italic;` +
180
+ `}`;
181
+ // Blink animation
182
+ styles +=
183
+ `@keyframes blink_box_shadow` + `_` + this._terminalClass + ` {` +
184
+ ` 50% {` +
185
+ ` border-bottom-style: hidden;` +
186
+ ` }` +
187
+ `}`;
188
+ styles +=
189
+ `@keyframes blink_block` + `_` + this._terminalClass + ` {` +
190
+ ` 0% {` +
191
+ ` background-color: ${colors.cursor.css};` +
192
+ ` color: ${colors.cursorAccent.css};` +
193
+ ` }` +
194
+ ` 50% {` +
195
+ ` background-color: inherit;` +
196
+ ` color: ${colors.cursor.css};` +
197
+ ` }` +
198
+ `}`;
199
+ // Cursor
200
+ styles +=
201
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}:not(.${RowCss.CURSOR_STYLE_BLOCK_CLASS}) {` +
202
+ ` animation: blink_box_shadow` + `_` + this._terminalClass + ` 1s step-end infinite;` +
203
+ `}` +
204
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +
205
+ ` animation: blink_block` + `_` + this._terminalClass + ` 1s step-end infinite;` +
206
+ `}` +
207
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +
208
+ ` background-color: ${colors.cursor.css};` +
209
+ ` color: ${colors.cursorAccent.css};` +
210
+ `}` +
211
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +
212
+ ` outline: 1px solid ${colors.cursor.css};` +
213
+ ` outline-offset: -1px;` +
214
+ `}` +
215
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +
216
+ ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +
217
+ `}` +
218
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +
219
+ ` border-bottom: 1px ${colors.cursor.css};` +
220
+ ` border-bottom-style: solid;` +
221
+ ` height: calc(100% - 1px);` +
222
+ `}`;
223
+ // Selection
224
+ styles +=
225
+ `${this._terminalSelector} .${SELECTION_CLASS} {` +
226
+ ` position: absolute;` +
227
+ ` top: 0;` +
228
+ ` left: 0;` +
229
+ ` z-index: 1;` +
230
+ ` pointer-events: none;` +
231
+ `}` +
232
+ `${this._terminalSelector}.focus .${SELECTION_CLASS} div {` +
233
+ ` position: absolute;` +
234
+ ` background-color: ${colors.selectionBackgroundOpaque.css};` +
235
+ `}` +
236
+ `${this._terminalSelector} .${SELECTION_CLASS} div {` +
237
+ ` position: absolute;` +
238
+ ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +
239
+ `}`;
240
+ // Colors
241
+ for (const [i, c] of colors.ansi.entries()) {
242
+ styles +=
243
+ `${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +
244
+ `${this._terminalSelector} .${FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +
245
+ `${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;
246
+ }
247
+ styles +=
248
+ `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +
249
+ `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +
250
+ `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;
251
+
252
+ this._themeStyleElement.textContent = styles;
253
+ }
254
+
255
+ /**
256
+ * default letter spacing
257
+ * Due to rounding issues in dimensions dpr calc glyph might render
258
+ * slightly too wide or too narrow. The method corrects the stacking offsets
259
+ * by applying a default letter-spacing for all chars.
260
+ * The value gets passed to the row factory to avoid setting this value again
261
+ * (render speedup is roughly 10%).
262
+ */
263
+ private _setDefaultSpacing(): void {
264
+ // measure same char as in CharSizeService to get the base deviation
265
+ const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);
266
+ this._rowContainer.style.letterSpacing = `${spacing}px`;
267
+ this._rowFactory.defaultSpacing = spacing;
268
+ }
269
+
270
+ public handleDevicePixelRatioChange(): void {
271
+ this._updateDimensions();
272
+ this._widthCache.clear();
273
+ this._setDefaultSpacing();
274
+ }
275
+
276
+ private _refreshRowElements(cols: number, rows: number): void {
277
+ // Add missing elements
278
+ for (let i = this._rowElements.length; i <= rows; i++) {
279
+ const row = document.createElement('div');
280
+ this._rowContainer.appendChild(row);
281
+ this._rowElements.push(row);
282
+ }
283
+ // Remove excess elements
284
+ while (this._rowElements.length > rows) {
285
+ this._rowContainer.removeChild(this._rowElements.pop()!);
286
+ }
287
+ }
288
+
289
+ public handleResize(cols: number, rows: number): void {
290
+ this._refreshRowElements(cols, rows);
291
+ this._updateDimensions();
292
+ }
293
+
294
+ public handleCharSizeChanged(): void {
295
+ this._updateDimensions();
296
+ this._widthCache.clear();
297
+ this._setDefaultSpacing();
298
+ }
299
+
300
+ public handleBlur(): void {
301
+ this._rowContainer.classList.remove(FOCUS_CLASS);
302
+ }
303
+
304
+ public handleFocus(): void {
305
+ this._rowContainer.classList.add(FOCUS_CLASS);
306
+ this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);
307
+ }
308
+
309
+ public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
310
+ // Remove all selections
311
+ this._selectionContainer.replaceChildren();
312
+ this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);
313
+ this.renderRows(0, this._bufferService.rows - 1);
314
+
315
+ // Selection does not exist
316
+ if (!start || !end) {
317
+ return;
318
+ }
319
+
320
+ // Translate from buffer position to viewport position
321
+ const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;
322
+ const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;
323
+ const viewportCappedStartRow = Math.max(viewportStartRow, 0);
324
+ const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);
325
+
326
+ // No need to draw the selection
327
+ if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {
328
+ return;
329
+ }
330
+
331
+ // Create the selections
332
+ const documentFragment = document.createDocumentFragment();
333
+
334
+ if (columnSelectMode) {
335
+ const isXFlipped = start[0] > end[0];
336
+ documentFragment.appendChild(
337
+ this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)
338
+ );
339
+ } else {
340
+ // Draw first row
341
+ const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;
342
+ const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;
343
+ documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));
344
+ // Draw middle rows
345
+ const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;
346
+ documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));
347
+ // Draw final row
348
+ if (viewportCappedStartRow !== viewportCappedEndRow) {
349
+ // Only draw viewportEndRow if it's not the same as viewporttartRow
350
+ const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;
351
+ documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol));
352
+ }
353
+ }
354
+ this._selectionContainer.appendChild(documentFragment);
355
+ }
356
+
357
+ /**
358
+ * Creates a selection element at the specified position.
359
+ * @param row The row of the selection.
360
+ * @param colStart The start column.
361
+ * @param colEnd The end columns.
362
+ */
363
+ private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {
364
+ const element = document.createElement('div');
365
+ element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;
366
+ element.style.top = `${row * this.dimensions.css.cell.height}px`;
367
+ element.style.left = `${colStart * this.dimensions.css.cell.width}px`;
368
+ element.style.width = `${this.dimensions.css.cell.width * (colEnd - colStart)}px`;
369
+ return element;
370
+ }
371
+
372
+ public handleCursorMove(): void {
373
+ // No-op, the cursor is drawn when rows are drawn
374
+ }
375
+
376
+ private _handleOptionsChanged(): void {
377
+ // Force a refresh
378
+ this._updateDimensions();
379
+ // Refresh CSS
380
+ this._injectCss(this._themeService.colors);
381
+ // update spacing cache
382
+ this._widthCache.setFont(
383
+ this._optionsService.rawOptions.fontFamily,
384
+ this._optionsService.rawOptions.fontSize,
385
+ this._optionsService.rawOptions.fontWeight,
386
+ this._optionsService.rawOptions.fontWeightBold
387
+ );
388
+ this._setDefaultSpacing();
389
+ }
390
+
391
+ public clear(): void {
392
+ for (const e of this._rowElements) {
393
+ /**
394
+ * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and
395
+ * `@testing-library/react`
396
+ *
397
+ * references:
398
+ * - https://github.com/testing-library/react-testing-library/issues/1146
399
+ * - https://github.com/jsdom/jsdom/issues/1245
400
+ */
401
+ e.replaceChildren();
402
+ }
403
+ }
404
+
405
+ public renderRows(start: number, end: number): void {
406
+ const buffer = this._bufferService.buffer;
407
+ const cursorAbsoluteY = buffer.ybase + buffer.y;
408
+ const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);
409
+ const cursorBlink = this._optionsService.rawOptions.cursorBlink;
410
+ const cursorStyle = this._optionsService.rawOptions.cursorStyle;
411
+ const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;
412
+
413
+ for (let y = start; y <= end; y++) {
414
+ const row = y + buffer.ydisp;
415
+ const rowElement = this._rowElements[y];
416
+ const lineData = buffer.lines.get(row);
417
+ if (!rowElement || !lineData) {
418
+ break;
419
+ }
420
+ rowElement.replaceChildren(
421
+ ...this._rowFactory.createRow(
422
+ lineData,
423
+ row,
424
+ row === cursorAbsoluteY,
425
+ cursorStyle,
426
+ cursorInactiveStyle,
427
+ cursorX,
428
+ cursorBlink,
429
+ this.dimensions.css.cell.width,
430
+ this._widthCache,
431
+ -1,
432
+ -1
433
+ )
434
+ );
435
+ }
436
+ }
437
+
438
+ private get _terminalSelector(): string {
439
+ return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;
440
+ }
441
+
442
+ private _handleLinkHover(e: ILinkifierEvent): void {
443
+ this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);
444
+ }
445
+
446
+ private _handleLinkLeave(e: ILinkifierEvent): void {
447
+ this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);
448
+ }
449
+
450
+ private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {
451
+ /**
452
+ * NOTE: The linkifier may send out of viewport y-values if:
453
+ * - negative y-value: the link started at a higher line
454
+ * - y-value >= maxY: the link ends at a line below viewport
455
+ *
456
+ * For negative y-values we can simply adjust x = 0,
457
+ * as higher up link start means, that everything from
458
+ * (0,0) is a link under top-down-left-right char progression
459
+ *
460
+ * Additionally there might be a small chance of out-of-sync x|y-values
461
+ * from a race condition of render updates vs. link event handler execution:
462
+ * - (sync) resize: chances terminal buffer in sync, schedules render update async
463
+ * - (async) link handler race condition: new buffer metrics, but still on old render state
464
+ * - (async) render update: brings term metrics and render state back in sync
465
+ */
466
+ // clip coords into viewport
467
+ if (y < 0) x = 0;
468
+ if (y2 < 0) x2 = 0;
469
+ const maxY = this._bufferService.rows - 1;
470
+ y = Math.max(Math.min(y, maxY), 0);
471
+ y2 = Math.max(Math.min(y2, maxY), 0);
472
+
473
+ cols = Math.min(cols, this._bufferService.cols);
474
+ const buffer = this._bufferService.buffer;
475
+ const cursorAbsoluteY = buffer.ybase + buffer.y;
476
+ const cursorX = Math.min(buffer.x, cols - 1);
477
+ const cursorBlink = this._optionsService.rawOptions.cursorBlink;
478
+ const cursorStyle = this._optionsService.rawOptions.cursorStyle;
479
+ const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;
480
+
481
+ // refresh rows within link range
482
+ for (let i = y; i <= y2; ++i) {
483
+ const row = i + buffer.ydisp;
484
+ const rowElement = this._rowElements[i];
485
+ const bufferline = buffer.lines.get(row);
486
+ if (!rowElement || !bufferline) {
487
+ break;
488
+ }
489
+ rowElement.replaceChildren(
490
+ ...this._rowFactory.createRow(
491
+ bufferline,
492
+ row,
493
+ row === cursorAbsoluteY,
494
+ cursorStyle,
495
+ cursorInactiveStyle,
496
+ cursorX,
497
+ cursorBlink,
498
+ this.dimensions.css.cell.width,
499
+ this._widthCache,
500
+ enabled ? (i === y ? x : 0) : -1,
501
+ enabled ? ((i === y2 ? x2 : cols) - 1) : -1
502
+ )
503
+ );
504
+ }
505
+ }
506
+ }