@svelterm/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +174 -0
- package/dist/src/components/spinner.d.ts +11 -0
- package/dist/src/components/spinner.js +19 -0
- package/dist/src/components/text-buffer.d.ts +21 -0
- package/dist/src/components/text-buffer.js +87 -0
- package/dist/src/css/animation-runner.d.ts +17 -0
- package/dist/src/css/animation-runner.js +72 -0
- package/dist/src/css/animation.d.ts +5 -0
- package/dist/src/css/animation.js +6 -0
- package/dist/src/css/calc.d.ts +5 -0
- package/dist/src/css/calc.js +130 -0
- package/dist/src/css/color.d.ts +1 -0
- package/dist/src/css/color.js +157 -0
- package/dist/src/css/compute.d.ts +63 -0
- package/dist/src/css/compute.js +606 -0
- package/dist/src/css/defaults.d.ts +8 -0
- package/dist/src/css/defaults.js +44 -0
- package/dist/src/css/incremental.d.ts +9 -0
- package/dist/src/css/incremental.js +46 -0
- package/dist/src/css/index.d.ts +5 -0
- package/dist/src/css/index.js +3 -0
- package/dist/src/css/media.d.ts +11 -0
- package/dist/src/css/media.js +59 -0
- package/dist/src/css/parser.d.ts +20 -0
- package/dist/src/css/parser.js +241 -0
- package/dist/src/css/selector.d.ts +17 -0
- package/dist/src/css/selector.js +272 -0
- package/dist/src/css/specificity.d.ts +7 -0
- package/dist/src/css/specificity.js +89 -0
- package/dist/src/css/values.d.ts +17 -0
- package/dist/src/css/values.js +58 -0
- package/dist/src/css/variables.d.ts +6 -0
- package/dist/src/css/variables.js +42 -0
- package/dist/src/debug/console.d.ts +16 -0
- package/dist/src/debug/console.js +65 -0
- package/dist/src/debug/server.d.ts +22 -0
- package/dist/src/debug/server.js +90 -0
- package/dist/src/headless.d.ts +21 -0
- package/dist/src/headless.js +26 -0
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.js +485 -0
- package/dist/src/input/dispatch.d.ts +18 -0
- package/dist/src/input/dispatch.js +70 -0
- package/dist/src/input/focus.d.ts +18 -0
- package/dist/src/input/focus.js +81 -0
- package/dist/src/input/hit.d.ts +3 -0
- package/dist/src/input/hit.js +29 -0
- package/dist/src/input/keyboard.d.ts +9 -0
- package/dist/src/input/keyboard.js +100 -0
- package/dist/src/input/mouse.d.ts +7 -0
- package/dist/src/input/mouse.js +35 -0
- package/dist/src/input/scroll.d.ts +2 -0
- package/dist/src/input/scroll.js +24 -0
- package/dist/src/layout/cache.d.ts +4 -0
- package/dist/src/layout/cache.js +8 -0
- package/dist/src/layout/engine.d.ts +9 -0
- package/dist/src/layout/engine.js +455 -0
- package/dist/src/layout/flex.d.ts +4 -0
- package/dist/src/layout/flex.js +30 -0
- package/dist/src/layout/incremental.d.ts +8 -0
- package/dist/src/layout/incremental.js +58 -0
- package/dist/src/layout/size.d.ts +2 -0
- package/dist/src/layout/size.js +25 -0
- package/dist/src/layout/text.d.ts +7 -0
- package/dist/src/layout/text.js +52 -0
- package/dist/src/render/ansi.d.ts +23 -0
- package/dist/src/render/ansi.js +108 -0
- package/dist/src/render/border.d.ts +4 -0
- package/dist/src/render/border.js +60 -0
- package/dist/src/render/buffer.d.ts +23 -0
- package/dist/src/render/buffer.js +70 -0
- package/dist/src/render/context.d.ts +19 -0
- package/dist/src/render/context.js +98 -0
- package/dist/src/render/diff.d.ts +2 -0
- package/dist/src/render/diff.js +53 -0
- package/dist/src/render/incremental-paint.d.ts +10 -0
- package/dist/src/render/incremental-paint.js +94 -0
- package/dist/src/render/paint-text.d.ts +29 -0
- package/dist/src/render/paint-text.js +120 -0
- package/dist/src/render/paint.d.ts +5 -0
- package/dist/src/render/paint.js +220 -0
- package/dist/src/render/queue.d.ts +24 -0
- package/dist/src/render/queue.js +54 -0
- package/dist/src/render/scrollbar.d.ts +3 -0
- package/dist/src/render/scrollbar.js +19 -0
- package/dist/src/render/snapshot.d.ts +18 -0
- package/dist/src/render/snapshot.js +126 -0
- package/dist/src/renderer/default.d.ts +3 -0
- package/dist/src/renderer/default.js +3 -0
- package/dist/src/renderer/index.d.ts +11 -0
- package/dist/src/renderer/index.js +116 -0
- package/dist/src/renderer/node.d.ts +44 -0
- package/dist/src/renderer/node.js +153 -0
- package/dist/src/terminal/screen.d.ts +10 -0
- package/dist/src/terminal/screen.js +31 -0
- package/dist/src/terminal/stdin-router.d.ts +31 -0
- package/dist/src/terminal/stdin-router.js +133 -0
- package/package.json +64 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
const ANSI_COLORS = {
|
|
2
|
+
black: 'black', red: 'red', green: 'green', yellow: 'yellow',
|
|
3
|
+
blue: 'blue', magenta: 'magenta', cyan: 'cyan', white: 'white',
|
|
4
|
+
};
|
|
5
|
+
const ANSI_RGB = {
|
|
6
|
+
black: [0, 0, 0], red: [255, 0, 0], green: [0, 255, 0], yellow: [255, 255, 0],
|
|
7
|
+
blue: [0, 0, 255], magenta: [255, 0, 255], cyan: [0, 255, 255], white: [255, 255, 255],
|
|
8
|
+
};
|
|
9
|
+
export function resolveColor(value) {
|
|
10
|
+
const lower = value.toLowerCase().trim();
|
|
11
|
+
// ANSI named colors (exact match, highest priority)
|
|
12
|
+
const ansiName = ANSI_COLORS[lower];
|
|
13
|
+
if (ansiName)
|
|
14
|
+
return ansiName;
|
|
15
|
+
// Hex colors
|
|
16
|
+
if (lower.startsWith('#')) {
|
|
17
|
+
const expanded = expandHex(lower);
|
|
18
|
+
return hexToNearestAnsi(expanded) ?? expanded;
|
|
19
|
+
}
|
|
20
|
+
// rgb() / rgba()
|
|
21
|
+
if (lower.startsWith('rgb')) {
|
|
22
|
+
return parseRgbFunc(lower);
|
|
23
|
+
}
|
|
24
|
+
// hsl() / hsla()
|
|
25
|
+
if (lower.startsWith('hsl')) {
|
|
26
|
+
return parseHslFunc(lower);
|
|
27
|
+
}
|
|
28
|
+
// CSS named colors
|
|
29
|
+
const named = CSS_NAMED_COLORS[lower];
|
|
30
|
+
if (named)
|
|
31
|
+
return named;
|
|
32
|
+
return 'default';
|
|
33
|
+
}
|
|
34
|
+
function expandHex(hex) {
|
|
35
|
+
const h = hex.slice(1);
|
|
36
|
+
if (h.length === 3)
|
|
37
|
+
return '#' + h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
|
|
38
|
+
return hex;
|
|
39
|
+
}
|
|
40
|
+
function hexToNearestAnsi(hex) {
|
|
41
|
+
const r = parseInt(hex.slice(1, 3), 16);
|
|
42
|
+
const g = parseInt(hex.slice(3, 5), 16);
|
|
43
|
+
const b = parseInt(hex.slice(5, 7), 16);
|
|
44
|
+
for (const [name, [cr, cg, cb]] of Object.entries(ANSI_RGB)) {
|
|
45
|
+
if (r === cr && g === cg && b === cb)
|
|
46
|
+
return name;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
function parseRgbFunc(value) {
|
|
51
|
+
const match = value.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);
|
|
52
|
+
if (!match)
|
|
53
|
+
return 'default';
|
|
54
|
+
const r = parseInt(match[1]);
|
|
55
|
+
const g = parseInt(match[2]);
|
|
56
|
+
const b = parseInt(match[3]);
|
|
57
|
+
return rgbToColor(r, g, b);
|
|
58
|
+
}
|
|
59
|
+
function parseHslFunc(value) {
|
|
60
|
+
const match = value.match(/hsla?\(\s*(\d+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%/);
|
|
61
|
+
if (!match)
|
|
62
|
+
return 'default';
|
|
63
|
+
const h = parseInt(match[1]);
|
|
64
|
+
const s = parseFloat(match[2]) / 100;
|
|
65
|
+
const l = parseFloat(match[3]) / 100;
|
|
66
|
+
const [r, g, b] = hslToRgb(h, s, l);
|
|
67
|
+
return rgbToColor(r, g, b);
|
|
68
|
+
}
|
|
69
|
+
function rgbToColor(r, g, b) {
|
|
70
|
+
const hex = '#' + toHex(r) + toHex(g) + toHex(b);
|
|
71
|
+
return hexToNearestAnsi(hex) ?? hex;
|
|
72
|
+
}
|
|
73
|
+
function toHex(n) {
|
|
74
|
+
return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0');
|
|
75
|
+
}
|
|
76
|
+
function hslToRgb(h, s, l) {
|
|
77
|
+
if (s === 0) {
|
|
78
|
+
const v = Math.round(l * 255);
|
|
79
|
+
return [v, v, v];
|
|
80
|
+
}
|
|
81
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
82
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
83
|
+
const m = l - c / 2;
|
|
84
|
+
let r = 0, g = 0, b = 0;
|
|
85
|
+
if (h < 60) {
|
|
86
|
+
r = c;
|
|
87
|
+
g = x;
|
|
88
|
+
}
|
|
89
|
+
else if (h < 120) {
|
|
90
|
+
r = x;
|
|
91
|
+
g = c;
|
|
92
|
+
}
|
|
93
|
+
else if (h < 180) {
|
|
94
|
+
g = c;
|
|
95
|
+
b = x;
|
|
96
|
+
}
|
|
97
|
+
else if (h < 240) {
|
|
98
|
+
g = x;
|
|
99
|
+
b = c;
|
|
100
|
+
}
|
|
101
|
+
else if (h < 300) {
|
|
102
|
+
r = x;
|
|
103
|
+
b = c;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
r = c;
|
|
107
|
+
b = x;
|
|
108
|
+
}
|
|
109
|
+
return [
|
|
110
|
+
Math.round((r + m) * 255),
|
|
111
|
+
Math.round((g + m) * 255),
|
|
112
|
+
Math.round((b + m) * 255),
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
// CSS Level 4 named colors (subset — most commonly used)
|
|
116
|
+
const CSS_NAMED_COLORS = {
|
|
117
|
+
aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#00ffff', aquamarine: '#7fffd4',
|
|
118
|
+
azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4', blanchedalmond: '#ffebcd',
|
|
119
|
+
blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0',
|
|
120
|
+
chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed',
|
|
121
|
+
cornsilk: '#fff8dc', crimson: '#dc143c', darkblue: '#00008b', darkcyan: '#008b8b',
|
|
122
|
+
darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', darkgreen: '#006400', darkgrey: '#a9a9a9',
|
|
123
|
+
darkkhaki: '#bdb76b', darkmagenta: '#8b008b', darkolivegreen: '#556b2f',
|
|
124
|
+
darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a',
|
|
125
|
+
darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f',
|
|
126
|
+
darkslategrey: '#2f4f4f', darkturquoise: '#00ced1', darkviolet: '#9400d3',
|
|
127
|
+
deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dimgrey: '#696969',
|
|
128
|
+
dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0',
|
|
129
|
+
forestgreen: '#228b22', fuchsia: '#ff00ff', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff',
|
|
130
|
+
gold: '#ffd700', goldenrod: '#daa520', gray: '#808080', grey: '#808080',
|
|
131
|
+
greenyellow: '#adff2f', honeydew: '#f0fff0', hotpink: '#ff69b4',
|
|
132
|
+
indianred: '#cd5c5c', indigo: '#4b0082', ivory: '#fffff0', khaki: '#f0e68c',
|
|
133
|
+
lavender: '#e6e6fa', lavenderblush: '#fff0f5', lawngreen: '#7cfc00',
|
|
134
|
+
lemonchiffon: '#fffacd', lightblue: '#add8e6', lightcoral: '#f08080',
|
|
135
|
+
lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3',
|
|
136
|
+
lightgreen: '#90ee90', lightgrey: '#d3d3d3', lightpink: '#ffb6c1',
|
|
137
|
+
lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa',
|
|
138
|
+
lightslategray: '#778899', lightslategrey: '#778899', lightsteelblue: '#b0c4de',
|
|
139
|
+
lightyellow: '#ffffe0', lime: '#00ff00', limegreen: '#32cd32', linen: '#faf0e6',
|
|
140
|
+
maroon: '#800000', mediumaquamarine: '#66cdaa', mediumblue: '#0000cd',
|
|
141
|
+
mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371',
|
|
142
|
+
mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc',
|
|
143
|
+
mediumvioletred: '#c71585', midnightblue: '#191970', mintcream: '#f5fffa',
|
|
144
|
+
mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080',
|
|
145
|
+
oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23', orange: '#ffa500',
|
|
146
|
+
orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa',
|
|
147
|
+
palegreen: '#98fb98', paleturquoise: '#afeeee', palevioletred: '#db7093',
|
|
148
|
+
papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb',
|
|
149
|
+
plum: '#dda0dd', powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399',
|
|
150
|
+
rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513',
|
|
151
|
+
salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee',
|
|
152
|
+
sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd',
|
|
153
|
+
slategray: '#708090', slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f',
|
|
154
|
+
steelblue: '#4682b4', tan: '#d2b48c', teal: '#008080', thistle: '#d8bfd8',
|
|
155
|
+
tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3',
|
|
156
|
+
whitesmoke: '#f5f5f5', yellowgreen: '#9acd32',
|
|
157
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { TermNode } from '../renderer/node.js';
|
|
2
|
+
import { CSSStyleSheet } from './parser.js';
|
|
3
|
+
import { type MediaContext } from './media.js';
|
|
4
|
+
export interface ResolvedStyle {
|
|
5
|
+
fg: string;
|
|
6
|
+
bg: string;
|
|
7
|
+
bold: boolean;
|
|
8
|
+
italic: boolean;
|
|
9
|
+
underline: boolean;
|
|
10
|
+
strikethrough: boolean;
|
|
11
|
+
dim: boolean;
|
|
12
|
+
display: 'block' | 'inline' | 'inline-block' | 'flex' | 'grid' | 'table' | 'table-row' | 'table-cell' | 'none' | 'contents';
|
|
13
|
+
flexDirection: 'row' | 'column' | 'row-reverse' | 'column-reverse';
|
|
14
|
+
justifyContent: 'start' | 'end' | 'center' | 'space-between' | 'space-around' | 'space-evenly';
|
|
15
|
+
alignItems: 'start' | 'end' | 'center' | 'stretch';
|
|
16
|
+
alignSelf: 'auto' | 'start' | 'end' | 'center' | 'stretch';
|
|
17
|
+
gap: number;
|
|
18
|
+
paddingTop: number | string;
|
|
19
|
+
paddingRight: number | string;
|
|
20
|
+
paddingBottom: number | string;
|
|
21
|
+
paddingLeft: number | string;
|
|
22
|
+
width: number | string | null;
|
|
23
|
+
height: number | string | null;
|
|
24
|
+
minWidth: number | null;
|
|
25
|
+
minHeight: number | null;
|
|
26
|
+
maxWidth: number | null;
|
|
27
|
+
maxHeight: number | null;
|
|
28
|
+
marginTop: number | string;
|
|
29
|
+
marginRight: number | string;
|
|
30
|
+
marginBottom: number | string;
|
|
31
|
+
marginLeft: number | string;
|
|
32
|
+
flexGrow: number;
|
|
33
|
+
flexShrink: number;
|
|
34
|
+
flexBasis: number | 'auto';
|
|
35
|
+
flexWrap: 'nowrap' | 'wrap';
|
|
36
|
+
order: number;
|
|
37
|
+
gridTemplateColumns: string | null;
|
|
38
|
+
gridTemplateRows: string | null;
|
|
39
|
+
animationName: string | null;
|
|
40
|
+
animationDuration: number;
|
|
41
|
+
animationIterationCount: number;
|
|
42
|
+
borderStyle: 'none' | 'single' | 'double' | 'rounded' | 'heavy';
|
|
43
|
+
borderColor: string;
|
|
44
|
+
borderTop: boolean;
|
|
45
|
+
borderRight: boolean;
|
|
46
|
+
borderBottom: boolean;
|
|
47
|
+
borderLeft: boolean;
|
|
48
|
+
overflow: 'visible' | 'hidden' | 'scroll' | 'auto';
|
|
49
|
+
textOverflow: 'clip' | 'ellipsis' | 'ellipsis-middle';
|
|
50
|
+
whiteSpace: 'normal' | 'nowrap' | 'pre';
|
|
51
|
+
textAlign: 'left' | 'center' | 'right';
|
|
52
|
+
position: 'static' | 'relative' | 'absolute' | 'fixed';
|
|
53
|
+
top: number | null;
|
|
54
|
+
right: number | null;
|
|
55
|
+
bottom: number | null;
|
|
56
|
+
left: number | null;
|
|
57
|
+
zIndex: number;
|
|
58
|
+
visibility: 'visible' | 'hidden';
|
|
59
|
+
}
|
|
60
|
+
export declare function defaultStyle(tag?: string): ResolvedStyle;
|
|
61
|
+
export declare function resolveStyles(root: TermNode, stylesheet: CSSStyleSheet, media?: MediaContext, availWidth?: number, availHeight?: number): Map<number, ResolvedStyle>;
|
|
62
|
+
export declare function filterByMedia(stylesheet: CSSStyleSheet, context: MediaContext): CSSStyleSheet;
|
|
63
|
+
export declare function resolveNode(node: TermNode, stylesheet: CSSStyleSheet, styles: Map<number, ResolvedStyle>, variables: Map<number, Map<string, string>>): void;
|