@wendongfly/myhi 1.0.2 → 1.0.3

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 (135) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/lib/xterm/LICENSE +21 -0
  3. package/dist/lib/xterm/README.md +225 -0
  4. package/dist/lib/xterm/css/xterm.css +190 -0
  5. package/dist/lib/xterm/lib/xterm.js +2 -0
  6. package/dist/lib/xterm/lib/xterm.js.map +1 -0
  7. package/dist/lib/xterm/package.json +90 -0
  8. package/dist/lib/xterm/src/browser/AccessibilityManager.ts +301 -0
  9. package/dist/lib/xterm/src/browser/Clipboard.ts +99 -0
  10. package/dist/lib/xterm/src/browser/ColorContrastCache.ts +39 -0
  11. package/dist/lib/xterm/src/browser/ColorManager.ts +268 -0
  12. package/dist/lib/xterm/src/browser/Dom.ts +10 -0
  13. package/dist/lib/xterm/src/browser/Lifecycle.ts +30 -0
  14. package/dist/lib/xterm/src/browser/Linkifier.ts +356 -0
  15. package/dist/lib/xterm/src/browser/Linkifier2.ts +397 -0
  16. package/dist/lib/xterm/src/browser/LocalizableStrings.ts +10 -0
  17. package/dist/lib/xterm/src/browser/MouseZoneManager.ts +236 -0
  18. package/dist/lib/xterm/src/browser/RenderDebouncer.ts +82 -0
  19. package/dist/lib/xterm/src/browser/ScreenDprMonitor.ts +69 -0
  20. package/dist/lib/xterm/src/browser/Terminal.ts +1447 -0
  21. package/dist/lib/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
  22. package/dist/lib/xterm/src/browser/Types.d.ts +317 -0
  23. package/dist/lib/xterm/src/browser/Viewport.ts +276 -0
  24. package/dist/lib/xterm/src/browser/decorations/BufferDecorationRenderer.ts +131 -0
  25. package/dist/lib/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
  26. package/dist/lib/xterm/src/browser/decorations/OverviewRulerRenderer.ts +228 -0
  27. package/dist/lib/xterm/src/browser/input/CompositionHelper.ts +237 -0
  28. package/dist/lib/xterm/src/browser/input/Mouse.ts +64 -0
  29. package/dist/lib/xterm/src/browser/input/MoveToCell.ts +249 -0
  30. package/dist/lib/xterm/src/browser/public/Terminal.ts +298 -0
  31. package/dist/lib/xterm/src/browser/renderer/BaseRenderLayer.ts +582 -0
  32. package/dist/lib/xterm/src/browser/renderer/CursorRenderLayer.ts +378 -0
  33. package/dist/lib/xterm/src/browser/renderer/CustomGlyphs.ts +632 -0
  34. package/dist/lib/xterm/src/browser/renderer/GridCache.ts +33 -0
  35. package/dist/lib/xterm/src/browser/renderer/LinkRenderLayer.ts +84 -0
  36. package/dist/lib/xterm/src/browser/renderer/Renderer.ts +219 -0
  37. package/dist/lib/xterm/src/browser/renderer/RendererUtils.ts +26 -0
  38. package/dist/lib/xterm/src/browser/renderer/SelectionRenderLayer.ts +131 -0
  39. package/dist/lib/xterm/src/browser/renderer/TextRenderLayer.ts +344 -0
  40. package/dist/lib/xterm/src/browser/renderer/Types.d.ts +109 -0
  41. package/dist/lib/xterm/src/browser/renderer/atlas/BaseCharAtlas.ts +58 -0
  42. package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasCache.ts +95 -0
  43. package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasUtils.ts +54 -0
  44. package/dist/lib/xterm/src/browser/renderer/atlas/Constants.ts +15 -0
  45. package/dist/lib/xterm/src/browser/renderer/atlas/DynamicCharAtlas.ts +404 -0
  46. package/dist/lib/xterm/src/browser/renderer/atlas/LRUMap.ts +136 -0
  47. package/dist/lib/xterm/src/browser/renderer/atlas/Types.d.ts +29 -0
  48. package/dist/lib/xterm/src/browser/renderer/dom/DomRenderer.ts +403 -0
  49. package/dist/lib/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +344 -0
  50. package/dist/lib/xterm/src/browser/selection/SelectionModel.ts +144 -0
  51. package/dist/lib/xterm/src/browser/selection/Types.d.ts +15 -0
  52. package/dist/lib/xterm/src/browser/services/CharSizeService.ts +87 -0
  53. package/dist/lib/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
  54. package/dist/lib/xterm/src/browser/services/CoreBrowserService.ts +20 -0
  55. package/dist/lib/xterm/src/browser/services/MouseService.ts +36 -0
  56. package/dist/lib/xterm/src/browser/services/RenderService.ts +237 -0
  57. package/dist/lib/xterm/src/browser/services/SelectionService.ts +1027 -0
  58. package/dist/lib/xterm/src/browser/services/Services.ts +123 -0
  59. package/dist/lib/xterm/src/browser/services/SoundService.ts +63 -0
  60. package/dist/lib/xterm/src/common/CircularList.ts +239 -0
  61. package/dist/lib/xterm/src/common/Clone.ts +23 -0
  62. package/dist/lib/xterm/src/common/Color.ts +285 -0
  63. package/dist/lib/xterm/src/common/CoreTerminal.ts +300 -0
  64. package/dist/lib/xterm/src/common/EventEmitter.ts +69 -0
  65. package/dist/lib/xterm/src/common/InputHandler.ts +3230 -0
  66. package/dist/lib/xterm/src/common/Lifecycle.ts +68 -0
  67. package/dist/lib/xterm/src/common/Platform.ts +31 -0
  68. package/dist/lib/xterm/src/common/SortedList.ts +88 -0
  69. package/dist/lib/xterm/src/common/TypedArrayUtils.ts +50 -0
  70. package/dist/lib/xterm/src/common/Types.d.ts +489 -0
  71. package/dist/lib/xterm/src/common/WindowsMode.ts +27 -0
  72. package/dist/lib/xterm/src/common/buffer/AttributeData.ts +148 -0
  73. package/dist/lib/xterm/src/common/buffer/Buffer.ts +711 -0
  74. package/dist/lib/xterm/src/common/buffer/BufferLine.ts +441 -0
  75. package/dist/lib/xterm/src/common/buffer/BufferRange.ts +13 -0
  76. package/dist/lib/xterm/src/common/buffer/BufferReflow.ts +220 -0
  77. package/dist/lib/xterm/src/common/buffer/BufferSet.ts +131 -0
  78. package/dist/lib/xterm/src/common/buffer/CellData.ts +94 -0
  79. package/dist/lib/xterm/src/common/buffer/Constants.ts +139 -0
  80. package/dist/lib/xterm/src/common/buffer/Marker.ts +37 -0
  81. package/dist/lib/xterm/src/common/buffer/Types.d.ts +64 -0
  82. package/dist/lib/xterm/src/common/data/Charsets.ts +256 -0
  83. package/dist/lib/xterm/src/common/data/EscapeSequences.ts +153 -0
  84. package/dist/lib/xterm/src/common/input/Keyboard.ts +398 -0
  85. package/dist/lib/xterm/src/common/input/TextDecoder.ts +346 -0
  86. package/dist/lib/xterm/src/common/input/UnicodeV6.ts +133 -0
  87. package/dist/lib/xterm/src/common/input/WriteBuffer.ts +229 -0
  88. package/dist/lib/xterm/src/common/input/XParseColor.ts +80 -0
  89. package/dist/lib/xterm/src/common/parser/Constants.ts +58 -0
  90. package/dist/lib/xterm/src/common/parser/DcsParser.ts +192 -0
  91. package/dist/lib/xterm/src/common/parser/EscapeSequenceParser.ts +796 -0
  92. package/dist/lib/xterm/src/common/parser/OscParser.ts +238 -0
  93. package/dist/lib/xterm/src/common/parser/Params.ts +229 -0
  94. package/dist/lib/xterm/src/common/parser/Types.d.ts +274 -0
  95. package/dist/lib/xterm/src/common/public/AddonManager.ts +56 -0
  96. package/dist/lib/xterm/src/common/public/BufferApiView.ts +35 -0
  97. package/dist/lib/xterm/src/common/public/BufferLineApiView.ts +29 -0
  98. package/dist/lib/xterm/src/common/public/BufferNamespaceApi.ts +33 -0
  99. package/dist/lib/xterm/src/common/public/ParserApi.ts +37 -0
  100. package/dist/lib/xterm/src/common/public/UnicodeApi.ts +27 -0
  101. package/dist/lib/xterm/src/common/services/BufferService.ts +185 -0
  102. package/dist/lib/xterm/src/common/services/CharsetService.ts +34 -0
  103. package/dist/lib/xterm/src/common/services/CoreMouseService.ts +309 -0
  104. package/dist/lib/xterm/src/common/services/CoreService.ts +92 -0
  105. package/dist/lib/xterm/src/common/services/DecorationService.ts +139 -0
  106. package/dist/lib/xterm/src/common/services/DirtyRowService.ts +53 -0
  107. package/dist/lib/xterm/src/common/services/InstantiationService.ts +83 -0
  108. package/dist/lib/xterm/src/common/services/LogService.ts +88 -0
  109. package/dist/lib/xterm/src/common/services/OptionsService.ts +178 -0
  110. package/dist/lib/xterm/src/common/services/ServiceRegistry.ts +49 -0
  111. package/dist/lib/xterm/src/common/services/Services.ts +323 -0
  112. package/dist/lib/xterm/src/common/services/UnicodeService.ts +82 -0
  113. package/dist/lib/xterm/src/headless/Terminal.ts +170 -0
  114. package/dist/lib/xterm/src/headless/Types.d.ts +31 -0
  115. package/dist/lib/xterm/src/headless/public/Terminal.ts +216 -0
  116. package/dist/lib/xterm/typings/xterm.d.ts +1872 -0
  117. package/dist/lib/xterm-fit/LICENSE +19 -0
  118. package/dist/lib/xterm-fit/README.md +24 -0
  119. package/dist/lib/xterm-fit/lib/xterm-addon-fit.js +2 -0
  120. package/dist/lib/xterm-fit/lib/xterm-addon-fit.js.map +1 -0
  121. package/dist/lib/xterm-fit/out/FitAddon.js +58 -0
  122. package/dist/lib/xterm-fit/out/FitAddon.js.map +1 -0
  123. package/dist/lib/xterm-fit/out-test/FitAddon.api.js.map +1 -0
  124. package/dist/lib/xterm-fit/package.json +21 -0
  125. package/dist/lib/xterm-fit/src/FitAddon.ts +86 -0
  126. package/dist/lib/xterm-fit/typings/xterm-addon-fit.d.ts +55 -0
  127. package/dist/lib/xterm-links/LICENSE +19 -0
  128. package/dist/lib/xterm-links/README.md +21 -0
  129. package/dist/lib/xterm-links/lib/xterm-addon-web-links.js +2 -0
  130. package/dist/lib/xterm-links/lib/xterm-addon-web-links.js.map +1 -0
  131. package/dist/lib/xterm-links/package.json +26 -0
  132. package/dist/lib/xterm-links/src/WebLinkProvider.ts +145 -0
  133. package/dist/lib/xterm-links/src/WebLinksAddon.ts +77 -0
  134. package/dist/lib/xterm-links/typings/xterm-addon-web-links.d.ts +58 -0
  135. package/package.json +1 -1
@@ -0,0 +1,403 @@
1
+ /**
2
+ * Copyright (c) 2018 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ */
5
+
6
+ import { IRenderer, IRenderDimensions, IRequestRedrawEvent } from 'browser/renderer/Types';
7
+ import { BOLD_CLASS, ITALIC_CLASS, CURSOR_CLASS, CURSOR_STYLE_BLOCK_CLASS, CURSOR_BLINK_CLASS, CURSOR_STYLE_BAR_CLASS, CURSOR_STYLE_UNDERLINE_CLASS, DomRendererRowFactory } from 'browser/renderer/dom/DomRendererRowFactory';
8
+ import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';
9
+ import { Disposable } from 'common/Lifecycle';
10
+ import { IColorSet, ILinkifierEvent, ILinkifier, ILinkifier2 } from 'browser/Types';
11
+ import { ICharSizeService } from 'browser/services/Services';
12
+ import { IOptionsService, IBufferService, IInstantiationService, IDecorationService } from 'common/services/Services';
13
+ import { EventEmitter, IEvent } from 'common/EventEmitter';
14
+ import { color } from 'common/Color';
15
+ import { removeElementFromParent } from 'browser/Dom';
16
+
17
+ const TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';
18
+ const ROW_CONTAINER_CLASS = 'xterm-rows';
19
+ const FG_CLASS_PREFIX = 'xterm-fg-';
20
+ const BG_CLASS_PREFIX = 'xterm-bg-';
21
+ const FOCUS_CLASS = 'xterm-focus';
22
+ const SELECTION_CLASS = 'xterm-selection';
23
+
24
+ let nextTerminalId = 1;
25
+
26
+ /**
27
+ * A fallback renderer for when canvas is slow. This is not meant to be
28
+ * particularly fast or feature complete, more just stable and usable for when
29
+ * canvas is not an option.
30
+ */
31
+ export class DomRenderer extends Disposable implements IRenderer {
32
+ private _rowFactory: DomRendererRowFactory;
33
+ private _terminalClass: number = nextTerminalId++;
34
+
35
+ private _themeStyleElement!: HTMLStyleElement;
36
+ private _dimensionsStyleElement!: HTMLStyleElement;
37
+ private _rowContainer: HTMLElement;
38
+ private _rowElements: HTMLElement[] = [];
39
+ private _selectionContainer: HTMLElement;
40
+
41
+ public dimensions: IRenderDimensions;
42
+
43
+ public get onRequestRedraw(): IEvent<IRequestRedrawEvent> { return new EventEmitter<IRequestRedrawEvent>().event; }
44
+
45
+ constructor(
46
+ private _colors: IColorSet,
47
+ private readonly _element: HTMLElement,
48
+ private readonly _screenElement: HTMLElement,
49
+ private readonly _viewportElement: HTMLElement,
50
+ private readonly _linkifier: ILinkifier,
51
+ private readonly _linkifier2: ILinkifier2,
52
+ @IInstantiationService instantiationService: IInstantiationService,
53
+ @ICharSizeService private readonly _charSizeService: ICharSizeService,
54
+ @IOptionsService private readonly _optionsService: IOptionsService,
55
+ @IBufferService private readonly _bufferService: IBufferService
56
+ ) {
57
+ super();
58
+ this._rowContainer = document.createElement('div');
59
+ this._rowContainer.classList.add(ROW_CONTAINER_CLASS);
60
+ this._rowContainer.style.lineHeight = 'normal';
61
+ this._rowContainer.setAttribute('aria-hidden', 'true');
62
+ this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);
63
+ this._selectionContainer = document.createElement('div');
64
+ this._selectionContainer.classList.add(SELECTION_CLASS);
65
+ this._selectionContainer.setAttribute('aria-hidden', 'true');
66
+
67
+ this.dimensions = {
68
+ scaledCharWidth: 0,
69
+ scaledCharHeight: 0,
70
+ scaledCellWidth: 0,
71
+ scaledCellHeight: 0,
72
+ scaledCharLeft: 0,
73
+ scaledCharTop: 0,
74
+ scaledCanvasWidth: 0,
75
+ scaledCanvasHeight: 0,
76
+ canvasWidth: 0,
77
+ canvasHeight: 0,
78
+ actualCellWidth: 0,
79
+ actualCellHeight: 0
80
+ };
81
+ this._updateDimensions();
82
+ this._injectCss();
83
+
84
+ this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document, this._colors);
85
+
86
+ this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);
87
+ this._screenElement.appendChild(this._rowContainer);
88
+ this._screenElement.appendChild(this._selectionContainer);
89
+
90
+ this.register(this._linkifier.onShowLinkUnderline(e => this._onLinkHover(e)));
91
+ this.register(this._linkifier.onHideLinkUnderline(e => this._onLinkLeave(e)));
92
+
93
+ this.register(this._linkifier2.onShowLinkUnderline(e => this._onLinkHover(e)));
94
+ this.register(this._linkifier2.onHideLinkUnderline(e => this._onLinkLeave(e)));
95
+ }
96
+
97
+ public dispose(): void {
98
+ this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);
99
+
100
+ // Outside influences such as React unmounts may manipulate the DOM before our disposal.
101
+ // https://github.com/xtermjs/xterm.js/issues/2960
102
+ removeElementFromParent(this._rowContainer, this._selectionContainer, this._themeStyleElement, this._dimensionsStyleElement);
103
+
104
+ super.dispose();
105
+ }
106
+
107
+ private _updateDimensions(): void {
108
+ this.dimensions.scaledCharWidth = this._charSizeService.width * window.devicePixelRatio;
109
+ this.dimensions.scaledCharHeight = Math.ceil(this._charSizeService.height * window.devicePixelRatio);
110
+ this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._optionsService.rawOptions.letterSpacing);
111
+ this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._optionsService.rawOptions.lineHeight);
112
+ this.dimensions.scaledCharLeft = 0;
113
+ this.dimensions.scaledCharTop = 0;
114
+ this.dimensions.scaledCanvasWidth = this.dimensions.scaledCellWidth * this._bufferService.cols;
115
+ this.dimensions.scaledCanvasHeight = this.dimensions.scaledCellHeight * this._bufferService.rows;
116
+ this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / window.devicePixelRatio);
117
+ this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / window.devicePixelRatio);
118
+ this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._bufferService.cols;
119
+ this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._bufferService.rows;
120
+
121
+ for (const element of this._rowElements) {
122
+ element.style.width = `${this.dimensions.canvasWidth}px`;
123
+ element.style.height = `${this.dimensions.actualCellHeight}px`;
124
+ element.style.lineHeight = `${this.dimensions.actualCellHeight}px`;
125
+ // Make sure rows don't overflow onto following row
126
+ element.style.overflow = 'hidden';
127
+ }
128
+
129
+ if (!this._dimensionsStyleElement) {
130
+ this._dimensionsStyleElement = document.createElement('style');
131
+ this._screenElement.appendChild(this._dimensionsStyleElement);
132
+ }
133
+
134
+ const styles =
135
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +
136
+ ` display: inline-block;` +
137
+ ` height: 100%;` +
138
+ ` vertical-align: top;` +
139
+ ` width: ${this.dimensions.actualCellWidth}px` +
140
+ `}`;
141
+
142
+ this._dimensionsStyleElement.textContent = styles;
143
+
144
+ this._selectionContainer.style.height = this._viewportElement.style.height;
145
+ this._screenElement.style.width = `${this.dimensions.canvasWidth}px`;
146
+ this._screenElement.style.height = `${this.dimensions.canvasHeight}px`;
147
+ }
148
+
149
+ public setColors(colors: IColorSet): void {
150
+ this._colors = colors;
151
+ this._injectCss();
152
+ }
153
+
154
+ private _injectCss(): void {
155
+ if (!this._themeStyleElement) {
156
+ this._themeStyleElement = document.createElement('style');
157
+ this._screenElement.appendChild(this._themeStyleElement);
158
+ }
159
+
160
+ // Base CSS
161
+ let styles =
162
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +
163
+ ` color: ${this._colors.foreground.css};` +
164
+ ` font-family: ${this._optionsService.rawOptions.fontFamily};` +
165
+ ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +
166
+ `}`;
167
+ // Text styles
168
+ styles +=
169
+ `${this._terminalSelector} span:not(.${BOLD_CLASS}) {` +
170
+ ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +
171
+ `}` +
172
+ `${this._terminalSelector} span.${BOLD_CLASS} {` +
173
+ ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +
174
+ `}` +
175
+ `${this._terminalSelector} span.${ITALIC_CLASS} {` +
176
+ ` font-style: italic;` +
177
+ `}`;
178
+ // Blink animation
179
+ styles +=
180
+ `@keyframes blink_box_shadow` + `_` + this._terminalClass + ` {` +
181
+ ` 50% {` +
182
+ ` box-shadow: none;` +
183
+ ` }` +
184
+ `}`;
185
+ styles +=
186
+ `@keyframes blink_block` + `_` + this._terminalClass + ` {` +
187
+ ` 0% {` +
188
+ ` background-color: ${this._colors.cursor.css};` +
189
+ ` color: ${this._colors.cursorAccent.css};` +
190
+ ` }` +
191
+ ` 50% {` +
192
+ ` background-color: ${this._colors.cursorAccent.css};` +
193
+ ` color: ${this._colors.cursor.css};` +
194
+ ` }` +
195
+ `}`;
196
+ // Cursor
197
+ styles +=
198
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS}:not(.${FOCUS_CLASS}) .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +
199
+ ` outline: 1px solid ${this._colors.cursor.css};` +
200
+ ` outline-offset: -1px;` +
201
+ `}` +
202
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}:not(.${CURSOR_STYLE_BLOCK_CLASS}) {` +
203
+ ` animation: blink_box_shadow` + `_` + this._terminalClass + ` 1s step-end infinite;` +
204
+ `}` +
205
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +
206
+ ` animation: blink_block` + `_` + this._terminalClass + ` 1s step-end infinite;` +
207
+ `}` +
208
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +
209
+ ` background-color: ${this._colors.cursor.css};` +
210
+ ` color: ${this._colors.cursorAccent.css};` +
211
+ `}` +
212
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BAR_CLASS} {` +
213
+ ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${this._colors.cursor.css} inset;` +
214
+ `}` +
215
+ `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_UNDERLINE_CLASS} {` +
216
+ ` box-shadow: 0 -1px 0 ${this._colors.cursor.css} inset;` +
217
+ `}`;
218
+ // Selection
219
+ styles +=
220
+ `${this._terminalSelector} .${SELECTION_CLASS} {` +
221
+ ` position: absolute;` +
222
+ ` top: 0;` +
223
+ ` left: 0;` +
224
+ ` z-index: 1;` +
225
+ ` pointer-events: none;` +
226
+ `}` +
227
+ `${this._terminalSelector} .${SELECTION_CLASS} div {` +
228
+ ` position: absolute;` +
229
+ ` background-color: ${this._colors.selectionOpaque.css};` +
230
+ `}`;
231
+ // Colors
232
+ this._colors.ansi.forEach((c, i) => {
233
+ styles +=
234
+ `${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +
235
+ `${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;
236
+ });
237
+ styles +=
238
+ `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(this._colors.background).css}; }` +
239
+ `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${this._colors.foreground.css}; }`;
240
+
241
+ this._themeStyleElement.textContent = styles;
242
+ }
243
+
244
+ public onDevicePixelRatioChange(): void {
245
+ this._updateDimensions();
246
+ }
247
+
248
+ private _refreshRowElements(cols: number, rows: number): void {
249
+ // Add missing elements
250
+ for (let i = this._rowElements.length; i <= rows; i++) {
251
+ const row = document.createElement('div');
252
+ this._rowContainer.appendChild(row);
253
+ this._rowElements.push(row);
254
+ }
255
+ // Remove excess elements
256
+ while (this._rowElements.length > rows) {
257
+ this._rowContainer.removeChild(this._rowElements.pop()!);
258
+ }
259
+ }
260
+
261
+ public onResize(cols: number, rows: number): void {
262
+ this._refreshRowElements(cols, rows);
263
+ this._updateDimensions();
264
+ }
265
+
266
+ public onCharSizeChanged(): void {
267
+ this._updateDimensions();
268
+ }
269
+
270
+ public onBlur(): void {
271
+ this._rowContainer.classList.remove(FOCUS_CLASS);
272
+ }
273
+
274
+ public onFocus(): void {
275
+ this._rowContainer.classList.add(FOCUS_CLASS);
276
+ }
277
+
278
+ public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
279
+ // Remove all selections
280
+ while (this._selectionContainer.children.length) {
281
+ this._selectionContainer.removeChild(this._selectionContainer.children[0]);
282
+ }
283
+
284
+ this._rowFactory.onSelectionChanged(start, end, columnSelectMode);
285
+ this.renderRows(0, this._bufferService.rows - 1);
286
+
287
+ // Selection does not exist
288
+ if (!start || !end) {
289
+ return;
290
+ }
291
+
292
+ // Translate from buffer position to viewport position
293
+ const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;
294
+ const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;
295
+ const viewportCappedStartRow = Math.max(viewportStartRow, 0);
296
+ const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);
297
+
298
+ // No need to draw the selection
299
+ if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {
300
+ return;
301
+ }
302
+
303
+ // Create the selections
304
+ const documentFragment = document.createDocumentFragment();
305
+
306
+ if (columnSelectMode) {
307
+ const isXFlipped = start[0] > end[0];
308
+ documentFragment.appendChild(
309
+ this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)
310
+ );
311
+ } else {
312
+ // Draw first row
313
+ const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;
314
+ const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;
315
+ documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));
316
+ // Draw middle rows
317
+ const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;
318
+ documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));
319
+ // Draw final row
320
+ if (viewportCappedStartRow !== viewportCappedEndRow) {
321
+ // Only draw viewportEndRow if it's not the same as viewporttartRow
322
+ const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;
323
+ documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol));
324
+ }
325
+ }
326
+ this._selectionContainer.appendChild(documentFragment);
327
+ }
328
+
329
+ /**
330
+ * Creates a selection element at the specified position.
331
+ * @param row The row of the selection.
332
+ * @param colStart The start column.
333
+ * @param colEnd The end columns.
334
+ */
335
+ private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {
336
+ const element = document.createElement('div');
337
+ element.style.height = `${rowCount * this.dimensions.actualCellHeight}px`;
338
+ element.style.top = `${row * this.dimensions.actualCellHeight}px`;
339
+ element.style.left = `${colStart * this.dimensions.actualCellWidth}px`;
340
+ element.style.width = `${this.dimensions.actualCellWidth * (colEnd - colStart)}px`;
341
+ return element;
342
+ }
343
+
344
+ public onCursorMove(): void {
345
+ // No-op, the cursor is drawn when rows are drawn
346
+ }
347
+
348
+ public onOptionsChanged(): void {
349
+ // Force a refresh
350
+ this._updateDimensions();
351
+ this._injectCss();
352
+ }
353
+
354
+ public clear(): void {
355
+ for (const e of this._rowElements) {
356
+ e.innerText = '';
357
+ }
358
+ }
359
+
360
+ public renderRows(start: number, end: number): void {
361
+ const cursorAbsoluteY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;
362
+ const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);
363
+ const cursorBlink = this._optionsService.rawOptions.cursorBlink;
364
+
365
+ for (let y = start; y <= end; y++) {
366
+ const rowElement = this._rowElements[y];
367
+ rowElement.innerText = '';
368
+ const row = y + this._bufferService.buffer.ydisp;
369
+ const lineData = this._bufferService.buffer.lines.get(row);
370
+ const cursorStyle = this._optionsService.rawOptions.cursorStyle;
371
+ rowElement.appendChild(this._rowFactory.createRow(lineData!, row, row === cursorAbsoluteY, cursorStyle, cursorX, cursorBlink, this.dimensions.actualCellWidth, this._bufferService.cols));
372
+ }
373
+ }
374
+
375
+ private get _terminalSelector(): string {
376
+ return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;
377
+ }
378
+
379
+ private _onLinkHover(e: ILinkifierEvent): void {
380
+ this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);
381
+ }
382
+
383
+ private _onLinkLeave(e: ILinkifierEvent): void {
384
+ this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);
385
+ }
386
+
387
+ private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {
388
+ while (x !== x2 || y !== y2) {
389
+ const row = this._rowElements[y];
390
+ if (!row) {
391
+ return;
392
+ }
393
+ const span = row.children[x] as HTMLElement;
394
+ if (span) {
395
+ span.style.textDecoration = enabled ? 'underline' : 'none';
396
+ }
397
+ if (++x >= cols) {
398
+ x = 0;
399
+ y++;
400
+ }
401
+ }
402
+ }
403
+ }