@svelterm/core 0.1.0 → 0.21.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 (164) hide show
  1. package/CHANGELOG.md +425 -0
  2. package/README.md +42 -29
  3. package/dist/src/cli/build.d.ts +13 -0
  4. package/dist/src/cli/build.js +119 -0
  5. package/dist/src/cli/bundle.d.ts +25 -0
  6. package/dist/src/cli/bundle.js +61 -0
  7. package/dist/src/cli/dev.d.ts +10 -0
  8. package/dist/src/cli/dev.js +152 -0
  9. package/dist/src/cli/devtools.d.ts +9 -0
  10. package/dist/src/cli/devtools.js +47 -0
  11. package/dist/src/cli/init.d.ts +8 -0
  12. package/dist/src/cli/init.js +153 -0
  13. package/dist/src/cli/main.d.ts +9 -0
  14. package/dist/src/cli/main.js +52 -0
  15. package/dist/src/cli/svt-bin.d.ts +2 -0
  16. package/dist/src/cli/svt-bin.js +6 -0
  17. package/dist/src/cli/svt.d.ts +14 -0
  18. package/dist/src/cli/svt.js +76 -0
  19. package/dist/src/components/text-buffer.js +8 -5
  20. package/dist/src/css/animation-runner.d.ts +15 -6
  21. package/dist/src/css/animation-runner.js +80 -29
  22. package/dist/src/css/animation.d.ts +12 -0
  23. package/dist/src/css/animation.js +21 -0
  24. package/dist/src/css/calc.js +4 -3
  25. package/dist/src/css/color.d.ts +19 -0
  26. package/dist/src/css/color.js +371 -62
  27. package/dist/src/css/compute.d.ts +30 -3
  28. package/dist/src/css/compute.js +272 -33
  29. package/dist/src/css/defaults.d.ts +1 -1
  30. package/dist/src/css/defaults.js +9 -0
  31. package/dist/src/css/easing.d.ts +9 -0
  32. package/dist/src/css/easing.js +95 -0
  33. package/dist/src/css/incremental.d.ts +1 -1
  34. package/dist/src/css/incremental.js +2 -2
  35. package/dist/src/css/interpolate.d.ts +13 -0
  36. package/dist/src/css/interpolate.js +41 -0
  37. package/dist/src/css/parser.js +59 -3
  38. package/dist/src/css/pseudo-elements.d.ts +9 -0
  39. package/dist/src/css/pseudo-elements.js +97 -0
  40. package/dist/src/css/selector.d.ts +17 -2
  41. package/dist/src/css/selector.js +128 -13
  42. package/dist/src/css/specificity.js +17 -6
  43. package/dist/src/css/values.d.ts +6 -1
  44. package/dist/src/css/values.js +13 -6
  45. package/dist/src/debug/context.d.ts +13 -0
  46. package/dist/src/debug/context.js +11 -0
  47. package/dist/src/debug/css.d.ts +12 -0
  48. package/dist/src/debug/css.js +28 -0
  49. package/dist/src/debug/dom.d.ts +17 -0
  50. package/dist/src/debug/dom.js +92 -0
  51. package/dist/src/devtools/DevTools.compiled.js +327 -0
  52. package/dist/src/devtools/DevTools.css.js +1 -0
  53. package/dist/src/devtools/client.d.ts +36 -0
  54. package/dist/src/devtools/client.js +76 -0
  55. package/dist/src/framelog.d.ts +54 -0
  56. package/dist/src/framelog.js +99 -0
  57. package/dist/src/headless.js +12 -4
  58. package/dist/src/index.d.ts +65 -3
  59. package/dist/src/index.js +609 -81
  60. package/dist/src/input/checkable.d.ts +8 -0
  61. package/dist/src/input/checkable.js +66 -0
  62. package/dist/src/input/details.d.ts +6 -0
  63. package/dist/src/input/details.js +34 -0
  64. package/dist/src/input/focus.d.ts +6 -0
  65. package/dist/src/input/focus.js +27 -9
  66. package/dist/src/input/keyboard.d.ts +2 -2
  67. package/dist/src/input/keyboard.js +32 -5
  68. package/dist/src/input/label.d.ts +8 -0
  69. package/dist/src/input/label.js +53 -0
  70. package/dist/src/input/modal.d.ts +9 -0
  71. package/dist/src/input/modal.js +28 -0
  72. package/dist/src/input/mouse.d.ts +2 -2
  73. package/dist/src/input/mouse.js +15 -2
  74. package/dist/src/input/select.d.ts +12 -0
  75. package/dist/src/input/select.js +63 -0
  76. package/dist/src/input/selection.d.ts +48 -0
  77. package/dist/src/input/selection.js +150 -0
  78. package/dist/src/layout/engine.d.ts +2 -0
  79. package/dist/src/layout/engine.js +1084 -142
  80. package/dist/src/layout/flex.js +4 -4
  81. package/dist/src/layout/size.js +3 -2
  82. package/dist/src/layout/text.d.ts +3 -2
  83. package/dist/src/layout/text.js +96 -17
  84. package/dist/src/layout/unicode.d.ts +20 -0
  85. package/dist/src/layout/unicode.js +121 -0
  86. package/dist/src/render/animation-clock.d.ts +51 -0
  87. package/dist/src/render/animation-clock.js +213 -0
  88. package/dist/src/render/ansi-text.d.ts +26 -0
  89. package/dist/src/render/ansi-text.js +131 -0
  90. package/dist/src/render/ansi.d.ts +18 -0
  91. package/dist/src/render/ansi.js +64 -19
  92. package/dist/src/render/border.js +166 -17
  93. package/dist/src/render/buffer.d.ts +1 -0
  94. package/dist/src/render/buffer.js +5 -2
  95. package/dist/src/render/color-depth.d.ts +8 -0
  96. package/dist/src/render/color-depth.js +59 -0
  97. package/dist/src/render/context.d.ts +1 -0
  98. package/dist/src/render/context.js +17 -21
  99. package/dist/src/render/cursor-emit.d.ts +18 -0
  100. package/dist/src/render/cursor-emit.js +50 -0
  101. package/dist/src/render/diff.d.ts +12 -0
  102. package/dist/src/render/diff.js +120 -0
  103. package/dist/src/render/generation.d.ts +9 -0
  104. package/dist/src/render/generation.js +14 -0
  105. package/dist/src/render/graphics-layer.d.ts +27 -0
  106. package/dist/src/render/graphics-layer.js +86 -0
  107. package/dist/src/render/image.d.ts +27 -0
  108. package/dist/src/render/image.js +113 -0
  109. package/dist/src/render/incremental-paint.d.ts +7 -3
  110. package/dist/src/render/incremental-paint.js +52 -79
  111. package/dist/src/render/inline.d.ts +59 -0
  112. package/dist/src/render/inline.js +219 -0
  113. package/dist/src/render/kitty-graphics.d.ts +24 -0
  114. package/dist/src/render/kitty-graphics.js +58 -0
  115. package/dist/src/render/paint-text.js +68 -22
  116. package/dist/src/render/paint.d.ts +8 -1
  117. package/dist/src/render/paint.js +328 -30
  118. package/dist/src/render/png.d.ts +13 -0
  119. package/dist/src/render/png.js +145 -0
  120. package/dist/src/render/scrollbar.d.ts +8 -2
  121. package/dist/src/render/scrollbar.js +71 -14
  122. package/dist/src/render/snapshot.js +3 -1
  123. package/dist/src/renderer/default.d.ts +7 -0
  124. package/dist/src/renderer/default.js +11 -0
  125. package/dist/src/renderer/index.d.ts +8 -2
  126. package/dist/src/renderer/index.js +4 -2
  127. package/dist/src/renderer/node.d.ts +109 -0
  128. package/dist/src/renderer/node.js +165 -1
  129. package/dist/src/terminal/capabilities.d.ts +33 -0
  130. package/dist/src/terminal/capabilities.js +66 -0
  131. package/dist/src/terminal/clipboard.d.ts +9 -0
  132. package/dist/src/terminal/clipboard.js +39 -0
  133. package/dist/src/terminal/io.d.ts +82 -0
  134. package/dist/src/terminal/io.js +155 -0
  135. package/dist/src/terminal/screen.d.ts +3 -10
  136. package/dist/src/terminal/screen.js +5 -28
  137. package/dist/src/terminal/stdin-router.d.ts +8 -5
  138. package/dist/src/terminal/stdin-router.js +22 -11
  139. package/dist/src/utils/node-map.d.ts +24 -0
  140. package/dist/src/utils/node-map.js +75 -0
  141. package/dist/src/vite/config.d.ts +62 -0
  142. package/dist/src/vite/config.js +191 -0
  143. package/docs/compatibility.md +67 -0
  144. package/docs/debug/devtools.md +40 -0
  145. package/docs/debug/svt.md +50 -0
  146. package/docs/distribution.md +106 -0
  147. package/docs/elements.md +120 -0
  148. package/docs/getting-started.md +177 -0
  149. package/docs/guide/css.md +187 -0
  150. package/docs/guide/input.md +143 -0
  151. package/docs/guide/layout.md +171 -0
  152. package/docs/guide/theming.md +94 -0
  153. package/docs/how-it-works.md +115 -0
  154. package/docs/inline-mode.md +77 -0
  155. package/docs/layout.md +106 -0
  156. package/docs/motion.md +91 -0
  157. package/docs/reference/README.md +65 -0
  158. package/docs/reference/css/properties/border-corner.md +82 -0
  159. package/docs/reference/css/properties/border-style.md +168 -0
  160. package/docs/reference.md +226 -0
  161. package/docs/selectors.md +80 -0
  162. package/docs/terminal-css.md +149 -0
  163. package/docs/terminals.md +83 -0
  164. package/package.json +28 -7
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Terminal-style text selection over the painted cell grid. Mouse
3
+ * reporting means the terminal's native selection is off, so svelterm
4
+ * provides its own: drag selects a row-major range, double-click a word,
5
+ * triple-click a line. Selected cells paint inverted; releasing returns
6
+ * the selected text for the clipboard.
7
+ */
8
+ const MULTI_CLICK_MS = 400;
9
+ /** Row-major ordering: earlier row first, then earlier column. */
10
+ function before(a, b) {
11
+ return a.row < b.row || (a.row === b.row && a.col <= b.col);
12
+ }
13
+ export class SelectionController {
14
+ getBuffer;
15
+ now;
16
+ anchor = null;
17
+ point = null;
18
+ dragging = false;
19
+ pressed = false;
20
+ lastClick = null;
21
+ constructor(getBuffer, now = Date.now) {
22
+ this.getBuffer = getBuffer;
23
+ this.now = now;
24
+ }
25
+ /** The selected range in row-major order, or null when nothing is selected. */
26
+ range() {
27
+ if (!this.anchor || !this.point)
28
+ return null;
29
+ return before(this.anchor, this.point)
30
+ ? { start: this.anchor, end: this.point }
31
+ : { start: this.point, end: this.anchor };
32
+ }
33
+ /**
34
+ * Left button pressed. Counts multi-clicks: the second quick click on
35
+ * the same cell selects the word, the third the line.
36
+ */
37
+ onPress(col, row) {
38
+ this.pressed = true;
39
+ const pos = { col, row };
40
+ const previous = this.lastClick;
41
+ const isMulti = previous
42
+ && previous.pos.col === col && previous.pos.row === row
43
+ && this.now() - previous.time <= MULTI_CLICK_MS;
44
+ const count = isMulti ? previous.count + 1 : 1;
45
+ this.lastClick = { pos, time: this.now(), count };
46
+ if (count === 2) {
47
+ this.selectWord(pos);
48
+ }
49
+ else if (count >= 3) {
50
+ this.selectLine(pos);
51
+ }
52
+ else {
53
+ // A fresh press clears any old selection; dragging re-creates one
54
+ this.anchor = pos;
55
+ this.point = null;
56
+ this.dragging = false;
57
+ }
58
+ }
59
+ /** Pointer moved with the left button held: extend the selection. */
60
+ onMotion(col, row) {
61
+ if (!this.pressed || !this.anchor)
62
+ return false;
63
+ if (!this.dragging && this.anchor.col === col && this.anchor.row === row)
64
+ return false;
65
+ this.dragging = true;
66
+ const moved = this.point?.col !== col || this.point?.row !== row;
67
+ this.point = { col, row };
68
+ return moved;
69
+ }
70
+ /**
71
+ * Left button released. Returns the selected text (for the clipboard)
72
+ * when a selection exists; the highlight stays until the next press.
73
+ */
74
+ onRelease() {
75
+ this.pressed = false;
76
+ this.dragging = false;
77
+ const range = this.range();
78
+ if (!range)
79
+ return null;
80
+ return this.extractText(range);
81
+ }
82
+ /** Drop the selection; returns whether anything was cleared. */
83
+ clear() {
84
+ const had = this.anchor !== null && this.point !== null;
85
+ this.anchor = null;
86
+ this.point = null;
87
+ this.dragging = false;
88
+ return had;
89
+ }
90
+ selectWord(pos) {
91
+ const text = this.rowText(pos.row);
92
+ if (pos.col >= text.length || /\s/.test(text[pos.col] ?? ' '))
93
+ return;
94
+ let start = pos.col;
95
+ let end = pos.col;
96
+ while (start > 0 && !/\s/.test(text[start - 1]))
97
+ start--;
98
+ while (end < text.length - 1 && !/\s/.test(text[end + 1]))
99
+ end++;
100
+ this.anchor = { col: start, row: pos.row };
101
+ this.point = { col: end, row: pos.row };
102
+ }
103
+ selectLine(pos) {
104
+ const buffer = this.getBuffer();
105
+ const width = buffer?.width ?? 0;
106
+ this.anchor = { col: 0, row: pos.row };
107
+ this.point = { col: Math.max(0, width - 1), row: pos.row };
108
+ }
109
+ rowText(row) {
110
+ const buffer = this.getBuffer();
111
+ if (!buffer)
112
+ return '';
113
+ let text = '';
114
+ for (let col = 0;; col++) {
115
+ const cell = buffer.getCell(col, row);
116
+ if (!cell)
117
+ break;
118
+ text += cell.char || ' ';
119
+ }
120
+ return text;
121
+ }
122
+ extractText(range) {
123
+ const lines = [];
124
+ for (let row = range.start.row; row <= range.end.row; row++) {
125
+ const text = this.rowText(row);
126
+ const from = row === range.start.row ? range.start.col : 0;
127
+ const to = row === range.end.row ? range.end.col : text.length - 1;
128
+ lines.push(text.slice(from, to + 1).replace(/\s+$/, ''));
129
+ }
130
+ return lines.join('\n');
131
+ }
132
+ }
133
+ /** Invert the cells covered by the selection so it reads as highlighted. */
134
+ export function applySelectionOverlay(buffer, range) {
135
+ if (!range)
136
+ return;
137
+ for (let row = range.start.row; row <= range.end.row; row++) {
138
+ const from = row === range.start.row ? range.start.col : 0;
139
+ let col = from;
140
+ while (true) {
141
+ const cell = buffer.getCell(col, row);
142
+ if (!cell)
143
+ break;
144
+ if (row === range.end.row && col > range.end.col)
145
+ break;
146
+ buffer.setCell(col, row, { inverse: !cell.inverse });
147
+ col++;
148
+ }
149
+ }
150
+ }
@@ -1,5 +1,7 @@
1
1
  import { TermNode } from '../renderer/node.js';
2
2
  import { ResolvedStyle } from '../css/compute.js';
3
+ import { NodeMap } from '../utils/node-map.js';
4
+ export type LayoutMap = NodeMap<LayoutBox>;
3
5
  export interface LayoutBox {
4
6
  x: number;
5
7
  y: number;