@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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/src/components/spinner.d.ts +11 -0
  4. package/dist/src/components/spinner.js +19 -0
  5. package/dist/src/components/text-buffer.d.ts +21 -0
  6. package/dist/src/components/text-buffer.js +87 -0
  7. package/dist/src/css/animation-runner.d.ts +17 -0
  8. package/dist/src/css/animation-runner.js +72 -0
  9. package/dist/src/css/animation.d.ts +5 -0
  10. package/dist/src/css/animation.js +6 -0
  11. package/dist/src/css/calc.d.ts +5 -0
  12. package/dist/src/css/calc.js +130 -0
  13. package/dist/src/css/color.d.ts +1 -0
  14. package/dist/src/css/color.js +157 -0
  15. package/dist/src/css/compute.d.ts +63 -0
  16. package/dist/src/css/compute.js +606 -0
  17. package/dist/src/css/defaults.d.ts +8 -0
  18. package/dist/src/css/defaults.js +44 -0
  19. package/dist/src/css/incremental.d.ts +9 -0
  20. package/dist/src/css/incremental.js +46 -0
  21. package/dist/src/css/index.d.ts +5 -0
  22. package/dist/src/css/index.js +3 -0
  23. package/dist/src/css/media.d.ts +11 -0
  24. package/dist/src/css/media.js +59 -0
  25. package/dist/src/css/parser.d.ts +20 -0
  26. package/dist/src/css/parser.js +241 -0
  27. package/dist/src/css/selector.d.ts +17 -0
  28. package/dist/src/css/selector.js +272 -0
  29. package/dist/src/css/specificity.d.ts +7 -0
  30. package/dist/src/css/specificity.js +89 -0
  31. package/dist/src/css/values.d.ts +17 -0
  32. package/dist/src/css/values.js +58 -0
  33. package/dist/src/css/variables.d.ts +6 -0
  34. package/dist/src/css/variables.js +42 -0
  35. package/dist/src/debug/console.d.ts +16 -0
  36. package/dist/src/debug/console.js +65 -0
  37. package/dist/src/debug/server.d.ts +22 -0
  38. package/dist/src/debug/server.js +90 -0
  39. package/dist/src/headless.d.ts +21 -0
  40. package/dist/src/headless.js +26 -0
  41. package/dist/src/index.d.ts +18 -0
  42. package/dist/src/index.js +485 -0
  43. package/dist/src/input/dispatch.d.ts +18 -0
  44. package/dist/src/input/dispatch.js +70 -0
  45. package/dist/src/input/focus.d.ts +18 -0
  46. package/dist/src/input/focus.js +81 -0
  47. package/dist/src/input/hit.d.ts +3 -0
  48. package/dist/src/input/hit.js +29 -0
  49. package/dist/src/input/keyboard.d.ts +9 -0
  50. package/dist/src/input/keyboard.js +100 -0
  51. package/dist/src/input/mouse.d.ts +7 -0
  52. package/dist/src/input/mouse.js +35 -0
  53. package/dist/src/input/scroll.d.ts +2 -0
  54. package/dist/src/input/scroll.js +24 -0
  55. package/dist/src/layout/cache.d.ts +4 -0
  56. package/dist/src/layout/cache.js +8 -0
  57. package/dist/src/layout/engine.d.ts +9 -0
  58. package/dist/src/layout/engine.js +455 -0
  59. package/dist/src/layout/flex.d.ts +4 -0
  60. package/dist/src/layout/flex.js +30 -0
  61. package/dist/src/layout/incremental.d.ts +8 -0
  62. package/dist/src/layout/incremental.js +58 -0
  63. package/dist/src/layout/size.d.ts +2 -0
  64. package/dist/src/layout/size.js +25 -0
  65. package/dist/src/layout/text.d.ts +7 -0
  66. package/dist/src/layout/text.js +52 -0
  67. package/dist/src/render/ansi.d.ts +23 -0
  68. package/dist/src/render/ansi.js +108 -0
  69. package/dist/src/render/border.d.ts +4 -0
  70. package/dist/src/render/border.js +60 -0
  71. package/dist/src/render/buffer.d.ts +23 -0
  72. package/dist/src/render/buffer.js +70 -0
  73. package/dist/src/render/context.d.ts +19 -0
  74. package/dist/src/render/context.js +98 -0
  75. package/dist/src/render/diff.d.ts +2 -0
  76. package/dist/src/render/diff.js +53 -0
  77. package/dist/src/render/incremental-paint.d.ts +10 -0
  78. package/dist/src/render/incremental-paint.js +94 -0
  79. package/dist/src/render/paint-text.d.ts +29 -0
  80. package/dist/src/render/paint-text.js +120 -0
  81. package/dist/src/render/paint.d.ts +5 -0
  82. package/dist/src/render/paint.js +220 -0
  83. package/dist/src/render/queue.d.ts +24 -0
  84. package/dist/src/render/queue.js +54 -0
  85. package/dist/src/render/scrollbar.d.ts +3 -0
  86. package/dist/src/render/scrollbar.js +19 -0
  87. package/dist/src/render/snapshot.d.ts +18 -0
  88. package/dist/src/render/snapshot.js +126 -0
  89. package/dist/src/renderer/default.d.ts +3 -0
  90. package/dist/src/renderer/default.js +3 -0
  91. package/dist/src/renderer/index.d.ts +11 -0
  92. package/dist/src/renderer/index.js +116 -0
  93. package/dist/src/renderer/node.d.ts +44 -0
  94. package/dist/src/renderer/node.js +153 -0
  95. package/dist/src/terminal/screen.d.ts +10 -0
  96. package/dist/src/terminal/screen.js +31 -0
  97. package/dist/src/terminal/stdin-router.d.ts +31 -0
  98. package/dist/src/terminal/stdin-router.js +133 -0
  99. 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;