shellfie 1.3.7 → 2.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.
- package/LICENSE +1 -1
- package/README.md +221 -165
- package/dist/fonts/index.d.ts +21 -0
- package/dist/fonts/index.d.ts.map +1 -0
- package/dist/fonts/index.js +92 -0
- package/dist/fonts/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +124 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/index.d.ts +6 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +189 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/types.d.ts +17 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +3 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/renderer/colors.d.ts +9 -0
- package/dist/renderer/colors.d.ts.map +1 -0
- package/dist/renderer/colors.js +100 -0
- package/dist/renderer/colors.js.map +1 -0
- package/dist/renderer/customGlyphs.d.ts +17 -0
- package/dist/renderer/customGlyphs.d.ts.map +1 -0
- package/dist/renderer/customGlyphs.js +730 -0
- package/dist/renderer/customGlyphs.js.map +1 -0
- package/dist/renderer/index.d.ts +10 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +231 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/text.d.ts +13 -0
- package/dist/renderer/text.d.ts.map +1 -0
- package/dist/renderer/text.js +128 -0
- package/dist/renderer/text.js.map +1 -0
- package/dist/templates/base.d.ts +5 -0
- package/dist/templates/base.d.ts.map +1 -0
- package/dist/templates/base.js +37 -0
- package/dist/templates/base.js.map +1 -0
- package/dist/templates/index.d.ts +13 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +34 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/macos.d.ts +12 -0
- package/dist/templates/macos.d.ts.map +1 -0
- package/dist/templates/macos.js +34 -0
- package/dist/templates/macos.js.map +1 -0
- package/dist/templates/minimal.d.ts +13 -0
- package/dist/templates/minimal.d.ts.map +1 -0
- package/dist/templates/minimal.js +27 -0
- package/dist/templates/minimal.js.map +1 -0
- package/dist/templates/windows.d.ts +12 -0
- package/dist/templates/windows.d.ts.map +1 -0
- package/dist/templates/windows.js +34 -0
- package/dist/templates/windows.js.map +1 -0
- package/dist/themes/catppuccin-mocha.d.ts +3 -0
- package/dist/themes/catppuccin-mocha.d.ts.map +1 -0
- package/dist/themes/catppuccin-mocha.js +27 -0
- package/dist/themes/catppuccin-mocha.js.map +1 -0
- package/dist/themes/dracula.d.ts +3 -0
- package/dist/themes/dracula.d.ts.map +1 -0
- package/dist/themes/dracula.js +27 -0
- package/dist/themes/dracula.js.map +1 -0
- package/dist/themes/github-dark.d.ts +3 -0
- package/dist/themes/github-dark.d.ts.map +1 -0
- package/dist/themes/github-dark.js +27 -0
- package/dist/themes/github-dark.js.map +1 -0
- package/dist/themes/github-light.d.ts +3 -0
- package/dist/themes/github-light.d.ts.map +1 -0
- package/dist/themes/github-light.js +27 -0
- package/dist/themes/github-light.js.map +1 -0
- package/dist/themes/gruvbox-dark.d.ts +3 -0
- package/dist/themes/gruvbox-dark.d.ts.map +1 -0
- package/dist/themes/gruvbox-dark.js +27 -0
- package/dist/themes/gruvbox-dark.js.map +1 -0
- package/dist/themes/gruvbox-light.d.ts +3 -0
- package/dist/themes/gruvbox-light.d.ts.map +1 -0
- package/dist/themes/gruvbox-light.js +27 -0
- package/dist/themes/gruvbox-light.js.map +1 -0
- package/dist/themes/index.d.ts +27 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +54 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/monokai.d.ts +3 -0
- package/dist/themes/monokai.d.ts.map +1 -0
- package/dist/themes/monokai.js +27 -0
- package/dist/themes/monokai.js.map +1 -0
- package/dist/themes/nord.d.ts +3 -0
- package/dist/themes/nord.d.ts.map +1 -0
- package/dist/themes/nord.js +27 -0
- package/dist/themes/nord.js.map +1 -0
- package/dist/themes/one-dark.d.ts +3 -0
- package/dist/themes/one-dark.d.ts.map +1 -0
- package/dist/themes/one-dark.js +27 -0
- package/dist/themes/one-dark.js.map +1 -0
- package/dist/themes/solarized-dark.d.ts +3 -0
- package/dist/themes/solarized-dark.d.ts.map +1 -0
- package/dist/themes/solarized-dark.js +27 -0
- package/dist/themes/solarized-dark.js.map +1 -0
- package/dist/themes/solarized-light.d.ts +3 -0
- package/dist/themes/solarized-light.d.ts.map +1 -0
- package/dist/themes/solarized-light.js +27 -0
- package/dist/themes/solarized-light.js.map +1 -0
- package/dist/themes/tokyo-night.d.ts +3 -0
- package/dist/themes/tokyo-night.d.ts.map +1 -0
- package/dist/themes/tokyo-night.js +27 -0
- package/dist/themes/tokyo-night.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -21
- package/shellfie.d.ts +0 -29
- package/shellfie.js +0 -114
- package/template/template.css +0 -58
- package/template/template.html +0 -21
- package/utils/config.js +0 -41
- package/utils/styles.js +0 -32
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,178 +1,234 @@
|
|
|
1
|
-
# shellfie
|
|
1
|
+
# shellfie
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Take a shell selfie.
|
|
4
|
+
Your terminal output deserves better than a blurry screenshot.
|
|
5
|
+
|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
| Feature | shellfie | carbon-now-cli | svg-term | termtosvg |
|
|
9
|
+
| ------------------- | -------- | -------------- | -------- | --------- |
|
|
10
|
+
| Zero dependencies | ✅ | ❌ | ❌ | ❌ |
|
|
11
|
+
| No native bindings | ✅ | ❌ | ❌ | ❌ |
|
|
12
|
+
| No headless browser | ✅ | ❌ | ✅ | ✅ |
|
|
13
|
+
| Full ANSI support | ✅ | ✅ | ✅ | ✅ |
|
|
14
|
+
| 24-bit true color | ✅ | ✅ | ❌ | ✅ |
|
|
15
|
+
| Runs in browser | ✅ | ❌ | ❌ | ❌ |
|
|
16
|
+
| Synchronous API | ✅ | ❌ | ❌ | ❌ |
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { execSync } from "child_process";
|
|
20
|
+
import shellfie from 'shellfie'
|
|
21
|
+
|
|
22
|
+
const log = execSync("git log --oneline --graph --color=always").toString();
|
|
23
|
+
const svg = shellfie(log, { title: "git log" });
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+

|
|
27
|
+
|
|
28
|
+
## Why SVG?
|
|
29
|
+
|
|
30
|
+
✅ **Infinitely scalable** — pixel-perfect at any zoom level, retina-ready by default.
|
|
31
|
+
✅ **Selectable text** — copy code directly from the image.
|
|
32
|
+
✅ **Embeddable everywhere** — high quality embedding in READMEs, docs, blogs, everywhere.
|
|
33
|
+
✅ **Tiny files** — 2-10KB vs blurry 500KB+ PNGs.
|
|
34
|
+
✅ **No rendering pipeline** — runs anywhere JavaScript runs.
|
|
35
|
+
|
|
36
|
+
## Install
|
|
4
37
|
|
|
5
|
-
# install
|
|
6
38
|
```bash
|
|
7
39
|
npm install shellfie
|
|
8
40
|
```
|
|
9
41
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
'\x1b[105mSHELLFIE\\x1b[0m🤳',
|
|
20
|
-
'\x1b[38;5;225mthe easiest way',
|
|
21
|
-
'\x1b[38;5;213mto create beautiful',
|
|
22
|
-
'\x1b[38;5;14mCLI screenshots 📸',
|
|
23
|
-
'\x1b[38;5;199mprogrammatically 🚀'
|
|
24
|
-
];
|
|
25
|
-
const options = {
|
|
26
|
-
name: 'shellfie',
|
|
27
|
-
style: {
|
|
28
|
-
fontSize: 15,
|
|
29
|
-
fontWeight: 'bold',
|
|
30
|
-
fontFamily: 'Fira Code'
|
|
31
|
-
},
|
|
32
|
-
viewport: {
|
|
33
|
-
width: 400,
|
|
34
|
-
height: 300
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
await shellfie(data, options);
|
|
42
|
+
## Usage
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
import shellfie from "shellfie";
|
|
46
|
+
|
|
47
|
+
const svg = shellfie(terminalOutput, {
|
|
48
|
+
template: "macos",
|
|
49
|
+
title: "npm test",
|
|
50
|
+
});
|
|
38
51
|
```
|
|
39
52
|
|
|
40
|
-
|
|
41
|
-
<img src="./shellfies/shellfie.png" />
|
|
53
|
+
## Browser
|
|
42
54
|
|
|
55
|
+
```html
|
|
56
|
+
<script type="module">
|
|
57
|
+
import shellfie from "https://esm.sh/shellfie";
|
|
43
58
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
- #### `height`
|
|
102
|
-
**type**: `number`
|
|
103
|
-
**description**: viewport height
|
|
104
|
-
|
|
105
|
-
# examples
|
|
106
|
-
```javascript
|
|
107
|
-
await shellfie(["\x1b[32mGreen line", "\x1b[31;1mRED bold"], { name: 'small', viewport: { width: 200, height: 200 } });
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
<img src="./shellfies/small.png" />
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
```javascript
|
|
114
|
-
const testResults = [
|
|
115
|
-
"[2K[1G[1myarn run v1.22.5[22m",
|
|
116
|
-
"[2K[1G[2m$ mocha --no-timeouts tests/ --colors[22m",
|
|
117
|
-
"",
|
|
118
|
-
"[0m[0m",
|
|
119
|
-
"[0m shellfie[0m",
|
|
120
|
-
" [32m ✓[0m[90m should support array of string and output a png file[0m[31m (1106ms)[0m",
|
|
121
|
-
" [32m ✓[0m[90m should show into img[0m[31m (983ms)[0m",
|
|
122
|
-
" [32m ✓[0m[90m should support custom viewport[0m[31m (982ms)[0m",
|
|
123
|
-
" [32m ✓[0m[90m should support long raw output[0m[31m (2287ms)[0m",
|
|
124
|
-
" [32m ✓[0m[90m should support raw string[0m[31m (1087ms)[0m",
|
|
125
|
-
" [32m ✓[0m[90m should support complex string[0m[31m (1079ms)[0m",
|
|
126
|
-
" [32m ✓[0m[90m should support different font family[0m[31m (5541ms)[0m",
|
|
127
|
-
" [32m ✓[0m[90m should support chartscii fancy example[0m[31m (1123ms)[0m",
|
|
128
|
-
" [32m ✓[0m[90m should support fancy unsplitted[0m[31m (1082ms)[0m",
|
|
129
|
-
" [32m ✓[0m[90m should support string output[0m[31m (947ms)[0m",
|
|
130
|
-
" [32m ✓[0m[90m should magically work with magic numbers[0m[31m (1945ms)[0m",
|
|
131
|
-
" [32m ✓[0m[90m should work with lolcat[0m[31m (1102ms)[0m",
|
|
132
|
-
"",
|
|
133
|
-
"",
|
|
134
|
-
"[92m [0m[32m 12 passing[0m[90m (19s)[0m",
|
|
135
|
-
"",
|
|
136
|
-
"[2K[1GDone in 19.60s.",
|
|
137
|
-
];
|
|
138
|
-
await shellfie(testResults, { name: 'fira', style: { fontFamily: 'Fira Code', fontWeight: 'bold' } });
|
|
139
|
-
await shellfie(testResults, { name: 'monospace', style: { fontFamily: 'monospace' } });
|
|
140
|
-
await shellfie(testResults, { name: 'monaco', style: { fontFamily: 'Monaco' } });
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
<img src="./shellfies/fira.png" />
|
|
144
|
-
<img src="./shellfies/monospace.png" />
|
|
145
|
-
<img src="./shellfies/monaco.png" />
|
|
146
|
-
|
|
147
|
-
### raw mode
|
|
148
|
-
```javascript
|
|
149
|
-
const string = `
|
|
150
|
-
cristal [38;2;189;255;243m■[39m[38;2;187;254;241m■[39m[38;2;184;252;239m■[39m[38;2;182;251;237m■[39m[38;2;179;250;235m■[39m[38;2;177;249;234m■[39m[38;2;174;247;232m■[39m[38;2;172;246;230m■[39m[38;2;169;245;228m■[39m[38;2;167;243;226m■[39m[38;2;165;242;224m■[39m[38;2;162;241;222m■[39m[38;2;160;239;220m■[39m[38;2;157;238;218m■[39m[38;2;155;237;216m■[39m[38;2;152;236;215m■[39m[38;2;150;234;213m■[39m[38;2;147;233;211m■[39m[38;2;145;232;209m■[39m[38;2;143;230;207m■[39m[38;2;140;229;205m■[39m[38;2;138;228;203m■[39m[38;2;135;226;201m■[39m[38;2;133;225;199m■[39m[38;2;130;224;198m■[39m[38;2;128;223;196m■[39m[38;2;125;221;194m■[39m[38;2;123;220;192m■[39m[38;2;120;219;190m■[39m[38;2;118;217;188m■[39m[38;2;116;216;186m■[39m[38;2;113;215;184m■[39m[38;2;111;213;182m■[39m[38;2;108;212;181m■[39m[38;2;106;211;179m■[39m[38;2;103;210;177m■[39m[38;2;101;208;175m■[39m[38;2;98;207;173m■[39m[38;2;96;206;171m■[39m[38;2;94;204;169m■[39m[38;2;91;203;167m■[39m[38;2;89;202;165m■[39m[38;2;86;200;163m■[39m[38;2;84;199;162m■[39m[38;2;81;198;160m■[39m[38;2;79;197;158m■[39m[38;2;76;195;156m■[39m[38;2;74;194;154m■[39m
|
|
151
|
-
teen [38;2;119;161;211m■[39m[38;2;119;163;211m■[39m[38;2;119;165;210m■[39m[38;2;119;166;210m■[39m[38;2;119;168;209m■[39m[38;2;119;170;209m■[39m[38;2;120;172;209m■[39m[38;2;120;174;208m■[39m[38;2;120;176;208m■[39m[38;2;120;177;207m■[39m[38;2;120;179;207m■[39m[38;2;120;181;207m■[39m[38;2;120;183;206m■[39m[38;2;120;185;206m■[39m[38;2;120;187;206m■[39m[38;2;120;188;205m■[39m[38;2;120;190;205m■[39m[38;2;120;192;204m■[39m[38;2;121;194;204m■[39m[38;2;121;196;204m■[39m[38;2;121;198;203m■[39m[38;2;121;199;203m■[39m[38;2;121;201;202m■[39m[38;2;121;203;202m■[39m[38;2;126;200;201m■[39m[38;2;130;197;200m■[39m[38;2;135;194;199m■[39m[38;2;139;191;197m■[39m[38;2;144;188;196m■[39m[38;2;148;185;195m■[39m[38;2;153;182;194m■[39m[38;2;157;179;193m■[39m[38;2;162;176;192m■[39m[38;2;166;173;190m■[39m[38;2;171;170;189m■[39m[38;2;176;168;188m■[39m[38;2;180;165;187m■[39m[38;2;185;162;186m■[39m[38;2;189;159;185m■[39m[38;2;194;156;183m■[39m[38;2;198;153;182m■[39m[38;2;203;150;181m■[39m[38;2;207;147;180m■[39m[38;2;212;144;179m■[39m[38;2;216;141;178m■[39m[38;2;221;138;176m■[39m[38;2;225;135;175m■[39m[38;2;230;132;174m■[39m
|
|
152
|
-
mind [38;2;71;59;123m■[39m[38;2;70;62;125m■[39m[38;2;69;65;127m■[39m[38;2;69;69;129m■[39m[38;2;68;72;131m■[39m[38;2;67;75;133m■[39m[38;2;66;78;134m■[39m[38;2;66;81;136m■[39m[38;2;65;84;138m■[39m[38;2;64;88;140m■[39m[38;2;63;91;142m■[39m[38;2;62;94;144m■[39m[38;2;62;97;146m■[39m[38;2;61;100;148m■[39m[38;2;60;103;150m■[39m[38;2;59;107;152m■[39m[38;2;58;110;154m■[39m[38;2;58;113;156m■[39m[38;2;57;116;157m■[39m[38;2;56;119;159m■[39m[38;2;55;122;161m■[39m[38;2;55;126;163m■[39m[38;2;54;129;165m■[39m[38;2;53;132;167m■[39m[38;2;53;135;168m■[39m[38;2;53;139;169m■[39m[38;2;52;142;170m■[39m[38;2;52;145;171m■[39m[38;2;52;148;172m■[39m[38;2;52;152;173m■[39m[38;2;52;155;174m■[39m[38;2;51;158;175m■[39m[38;2;51;161;176m■[39m[38;2;51;165;177m■[39m[38;2;51;168;178m■[39m[38;2;51;171;179m■[39m[38;2;50;174;179m■[39m[38;2;50;178;180m■[39m[38;2;50;181;181m■[39m[38;2;50;184;182m■[39m[38;2;49;187;183m■[39m[38;2;49;191;184m■[39m[38;2;49;194;185m■[39m[38;2;49;197;186m■[39m[38;2;49;200;187m■[39m[38;2;48;204;188m■[39m[38;2;48;207;189m■[39m[38;2;48;210;190m■[39m
|
|
153
|
-
morning [38;2;255;95;109m■[39m[38;2;255;95;107m■[39m[38;2;255;96;105m■[39m[38;2;255;96;103m■[39m[38;2;255;97;101m■[39m[38;2;255;97;100m■[39m[38;2;255;97;98m■[39m[38;2;255;100;98m■[39m[38;2;255;102;98m■[39m[38;2;255;105;98m■[39m[38;2;255;107;99m■[39m[38;2;255;110;99m■[39m[38;2;255;112;100m■[39m[38;2;255;115;100m■[39m[38;2;255;117;100m■[39m[38;2;255;120;101m■[39m[38;2;255;123;101m■[39m[38;2;255;125;102m■[39m[38;2;255;127;102m■[39m[38;2;255;130;102m■[39m[38;2;255;132;103m■[39m[38;2;255;135;103m■[39m[38;2;255;137;103m■[39m[38;2;255;140;104m■[39m[38;2;255;142;104m■[39m[38;2;255;145;105m■[39m[38;2;255;147;105m■[39m[38;2;255;149;105m■[39m[38;2;255;152;106m■[39m[38;2;255;154;106m■[39m[38;2;255;157;107m■[39m[38;2;255;159;107m■[39m[38;2;255;161;107m■[39m[38;2;255;164;108m■[39m[38;2;255;166;108m■[39m[38;2;255;168;108m■[39m[38;2;255;170;109m■[39m[38;2;255;173;109m■[39m[38;2;255;175;110m■[39m[38;2;255;177;110m■[39m[38;2;255;180;110m■[39m[38;2;255;182;111m■[39m[38;2;255;184;111m■[39m[38;2;255;186;111m■[39m[38;2;255;188;112m■[39m[38;2;255;191;112m■[39m[38;2;255;193;113m■[39m[38;2;255;195;113m■[39m
|
|
154
|
-
vice [38;2;94;231;223m■[39m[38;2;95;230;227m■[39m[38;2;96;228;230m■[39m[38;2;98;223;229m■[39m[38;2;99;218;229m■[39m[38;2;100;213;228m■[39m[38;2;101;208;227m■[39m[38;2;103;203;227m■[39m[38;2;104;198;226m■[39m[38;2;105;194;225m■[39m[38;2;106;189;225m■[39m[38;2;107;185;224m■[39m[38;2;108;181;224m■[39m[38;2;110;177;223m■[39m[38;2;111;173;222m■[39m[38;2;112;169;222m■[39m[38;2;113;166;221m■[39m[38;2;114;162;220m■[39m[38;2;115;159;220m■[39m[38;2;116;155;219m■[39m[38;2;117;152;219m■[39m[38;2;119;149;218m■[39m[38;2;120;146;217m■[39m[38;2;121;143;217m■[39m[38;2;122;141;216m■[39m[38;2;123;138;216m■[39m[38;2;124;136;215m■[39m[38;2;125;133;214m■[39m[38;2;126;131;214m■[39m[38;2;127;129;213m■[39m[38;2;129;128;212m■[39m[38;2;133;129;212m■[39m[38;2;137;130;211m■[39m[38;2;141;131;211m■[39m[38;2;144;132;210m■[39m[38;2;148;133;209m■[39m[38;2;151;134;209m■[39m[38;2;154;135;208m■[39m[38;2;157;136;208m■[39m[38;2;160;137;207m■[39m[38;2;163;138;206m■[39m[38;2;166;139;206m■[39m[38;2;169;140;205m■[39m[38;2;171;140;204m■[39m[38;2;173;141;204m■[39m[38;2;176;142;203m■[39m[38;2;178;143;203m■[39m[38;2;180;144;202m■[39m
|
|
155
|
-
passion [38;2;244;59;71m■[39m[38;2;240;59;73m■[39m[38;2;237;59;74m■[39m[38;2;233;59;76m■[39m[38;2;229;59;78m■[39m[38;2;225;59;79m■[39m[38;2;222;59;81m■[39m[38;2;218;59;82m■[39m[38;2;214;59;84m■[39m[38;2;210;59;86m■[39m[38;2;207;59;87m■[39m[38;2;203;59;89m■[39m[38;2;199;59;91m■[39m[38;2;196;59;92m■[39m[38;2;192;59;94m■[39m[38;2;188;59;96m■[39m[38;2;184;59;97m■[39m[38;2;181;59;99m■[39m[38;2;177;59;100m■[39m[38;2;173;59;102m■[39m[38;2;170;59;104m■[39m[38;2;166;59;105m■[39m[38;2;162;59;107m■[39m[38;2;158;59;109m■[39m[38;2;155;58;110m■[39m[38;2;151;58;112m■[39m[38;2;147;58;114m■[39m[38;2;143;58;115m■[39m[38;2;140;58;117m■[39m[38;2;136;58;119m■[39m[38;2;132;58;120m■[39m[38;2;129;58;122m■[39m[38;2;125;58;123m■[39m[38;2;121;58;125m■[39m[38;2;117;58;127m■[39m[38;2;114;58;128m■[39m[38;2;110;58;130m■[39m[38;2;106;58;132m■[39m[38;2;103;58;133m■[39m[38;2;99;58;135m■[39m[38;2;95;58;137m■[39m[38;2;91;58;138m■[39m[38;2;88;58;140m■[39m[38;2;84;58;141m■[39m[38;2;80;58;143m■[39m[38;2;76;58;145m■[39m[38;2;73;58;146m■[39m[38;2;69;58;148m■[39m
|
|
156
|
-
fruit [38;2;255;78;80m■[39m[38;2;255;81;79m■[39m[38;2;255;84;78m■[39m[38;2;255;87;77m■[39m[38;2;254;89;76m■[39m[38;2;254;92;75m■[39m[38;2;254;95;74m■[39m[38;2;254;98;73m■[39m[38;2;254;101;72m■[39m[38;2;254;104;71m■[39m[38;2;254;107;70m■[39m[38;2;254;109;69m■[39m[38;2;253;112;69m■[39m[38;2;253;115;68m■[39m[38;2;253;118;67m■[39m[38;2;253;121;66m■[39m[38;2;253;124;65m■[39m[38;2;253;126;64m■[39m[38;2;253;129;63m■[39m[38;2;253;132;62m■[39m[38;2;252;135;61m■[39m[38;2;252;138;60m■[39m[38;2;252;141;59m■[39m[38;2;252;144;58m■[39m[38;2;252;146;57m■[39m[38;2;252;149;56m■[39m[38;2;252;152;55m■[39m[38;2;252;155;54m■[39m[38;2;251;158;53m■[39m[38;2;251;161;52m■[39m[38;2;251;164;51m■[39m[38;2;251;166;50m■[39m[38;2;251;169;49m■[39m[38;2;251;172;48m■[39m[38;2;251;175;47m■[39m[38;2;251;178;46m■[39m[38;2;250;181;46m■[39m[38;2;250;183;45m■[39m[38;2;250;186;44m■[39m[38;2;250;189;43m■[39m[38;2;250;192;42m■[39m[38;2;250;195;41m■[39m[38;2;250;198;40m■[39m[38;2;250;201;39m■[39m[38;2;249;203;38m■[39m[38;2;249;206;37m■[39m[38;2;249;209;36m■[39m[38;2;249;212;35m■[39m
|
|
157
|
-
instagram [38;2;131;58;180m■[39m[38;2;136;57;173m■[39m[38;2;142;55;167m■[39m[38;2;147;54;160m■[39m[38;2;152;53;154m■[39m[38;2;158;52;147m■[39m[38;2;163;50;141m■[39m[38;2;168;49;134m■[39m[38;2;173;48;127m■[39m[38;2;179;47;121m■[39m[38;2;184;45;114m■[39m[38;2;189;44;108m■[39m[38;2;195;43;101m■[39m[38;2;200;42;95m■[39m[38;2;205;40;88m■[39m[38;2;211;39;82m■[39m[38;2;216;38;75m■[39m[38;2;221;37;68m■[39m[38;2;226;35;62m■[39m[38;2;232;34;55m■[39m[38;2;237;33;49m■[39m[38;2;242;32;42m■[39m[38;2;248;30;36m■[39m[38;2;253;29;29m■[39m[38;2;253;35;31m■[39m[38;2;253;41;32m■[39m[38;2;253;47;34m■[39m[38;2;253;54;36m■[39m[38;2;253;60;37m■[39m[38;2;253;66;39m■[39m[38;2;253;72;41m■[39m[38;2;253;78;42m■[39m[38;2;253;84;44m■[39m[38;2;253;90;46m■[39m[38;2;253;96;47m■[39m[38;2;253;103;49m■[39m[38;2;252;109;51m■[39m[38;2;252;115;52m■[39m[38;2;252;121;54m■[39m[38;2;252;127;56m■[39m[38;2;252;133;57m■[39m[38;2;252;139;59m■[39m[38;2;252;145;61m■[39m[38;2;252;152;62m■[39m[38;2;252;158;64m■[39m[38;2;252;164;66m■[39m[38;2;252;170;67m■[39m[38;2;252;176;69m■[39m
|
|
158
|
-
atlas [38;2;254;172;94m■[39m[38;2;252;170;99m■[39m[38;2;249;168;104m■[39m[38;2;247;165;109m■[39m[38;2;244;163;114m■[39m[38;2;242;161;119m■[39m[38;2;240;159;124m■[39m[38;2;237;156;129m■[39m[38;2;235;154;134m■[39m[38;2;232;152;139m■[39m[38;2;230;150;144m■[39m[38;2;228;148;149m■[39m[38;2;225;145;153m■[39m[38;2;223;143;158m■[39m[38;2;221;141;163m■[39m[38;2;218;139;168m■[39m[38;2;216;137;173m■[39m[38;2;213;134;178m■[39m[38;2;211;132;183m■[39m[38;2;209;130;188m■[39m[38;2;206;128;193m■[39m[38;2;204;125;198m■[39m[38;2;201;123;203m■[39m[38;2;199;121;208m■[39m[38;2;194;124;208m■[39m[38;2;189;127;207m■[39m[38;2;184;130;207m■[39m[38;2;178;133;207m■[39m[38;2;173;136;206m■[39m[38;2;168;139;206m■[39m[38;2;163;142;206m■[39m[38;2;158;145;205m■[39m[38;2;153;148;205m■[39m[38;2;147;151;205m■[39m[38;2;142;154;204m■[39m[38;2;137;157;204m■[39m[38;2;132;159;204m■[39m[38;2;127;162;203m■[39m[38;2;122;165;203m■[39m[38;2;116;168;203m■[39m[38;2;111;171;202m■[39m[38;2;106;174;202m■[39m[38;2;101;177;202m■[39m[38;2;96;180;201m■[39m[38;2;91;183;201m■[39m[38;2;85;186;201m■[39m[38;2;80;189;200m■[39m[38;2;75;192;200m■[39m
|
|
159
|
-
retro [38;2;63;81;177m■[39m[38;2;68;82;176m■[39m[38;2;74;83;176m■[39m[38;2;79;83;175m■[39m[38;2;85;84;175m■[39m[38;2;90;85;174m■[39m[38;2;96;87;174m■[39m[38;2;101;88;173m■[39m[38;2;107;90;173m■[39m[38;2;112;92;173m■[39m[38;2;118;93;172m■[39m[38;2;123;95;172m■[39m[38;2;126;97;172m■[39m[38;2;130;99;173m■[39m[38;2;133;101;173m■[39m[38;2;136;102;173m■[39m[38;2;140;104;174m■[39m[38;2;143;106;174m■[39m[38;2;147;106;172m■[39m[38;2;151;106;171m■[39m[38;2;156;106;169m■[39m[38;2;160;106;167m■[39m[38;2;164;106;166m■[39m[38;2;168;106;164m■[39m[38;2;174;106;160m■[39m[38;2;180;106;157m■[39m[38;2;186;107;153m■[39m[38;2;192;107;149m■[39m[38;2;198;107;146m■[39m[38;2;204;107;142m■[39m[38;2;210;111;137m■[39m[38;2;216;115;132m■[39m[38;2;223;119;128m■[39m[38;2;229;122;123m■[39m[38;2;235;126;118m■[39m[38;2;241;130;113m■[39m[38;2;241;136;112m■[39m[38;2;242;141;110m■[39m[38;2;242;147;109m■[39m[38;2;242;153;108m■[39m[38;2;243;158;106m■[39m[38;2;243;164;105m■[39m[38;2;244;170;108m■[39m[38;2;244;176;110m■[39m[38;2;245;183;113m■[39m[38;2;246;189;115m■[39m[38;2;246;195;118m■[39m[38;2;247;201;120m■[39m
|
|
160
|
-
summer [38;2;253;187;45m■[39m[38;2;248;187;48m■[39m[38;2;244;187;51m■[39m[38;2;239;187;55m■[39m[38;2;234;188;58m■[39m[38;2;230;188;61m■[39m[38;2;225;188;64m■[39m[38;2;220;188;67m■[39m[38;2;216;188;71m■[39m[38;2;211;188;74m■[39m[38;2;206;188;77m■[39m[38;2;202;188;80m■[39m[38;2;197;189;83m■[39m[38;2;192;189;86m■[39m[38;2;188;189;90m■[39m[38;2;183;189;93m■[39m[38;2;178;189;96m■[39m[38;2;174;189;99m■[39m[38;2;169;189;102m■[39m[38;2;164;189;106m■[39m[38;2;160;190;109m■[39m[38;2;155;190;112m■[39m[38;2;150;190;115m■[39m[38;2;146;190;118m■[39m[38;2;141;190;122m■[39m[38;2;137;190;125m■[39m[38;2;132;190;128m■[39m[38;2;127;190;131m■[39m[38;2;123;191;134m■[39m[38;2;118;191;138m■[39m[38;2;113;191;141m■[39m[38;2;109;191;144m■[39m[38;2;104;191;147m■[39m[38;2;99;191;150m■[39m[38;2;95;191;154m■[39m[38;2;90;191;157m■[39m[38;2;85;192;160m■[39m[38;2;81;192;163m■[39m[38;2;76;192;166m■[39m[38;2;71;192;169m■[39m[38;2;67;192;173m■[39m[38;2;62;192;176m■[39m[38;2;57;192;179m■[39m[38;2;53;192;182m■[39m[38;2;48;193;185m■[39m[38;2;43;193;189m■[39m[38;2;39;193;192m■[39m[38;2;34;193;195m■[39m
|
|
161
|
-
pastel [38;2;116;235;213m■[39m[38;2;116;235;228m■[39m[38;2;116;227;235m■[39m[38;2;116;212;235m■[39m[38;2;116;196;235m■[39m[38;2;116;181;235m■[39m[38;2;116;166;235m■[39m[38;2;116;151;235m■[39m[38;2;116;136;235m■[39m[38;2;116;120;235m■[39m[38;2;127;116;235m■[39m[38;2;142;116;235m■[39m[38;2;157;116;235m■[39m[38;2;172;116;235m■[39m[38;2;188;116;235m■[39m[38;2;203;116;235m■[39m[38;2;218;116;235m■[39m[38;2;233;116;235m■[39m[38;2;235;116;222m■[39m[38;2;235;116;207m■[39m[38;2;235;116;192m■[39m[38;2;235;116;177m■[39m[38;2;235;116;161m■[39m[38;2;235;116;146m■[39m[38;2;235;116;131m■[39m[38;2;236;116;116m■[39m[38;2;236;132;116m■[39m[38;2;236;147;116m■[39m[38;2;236;162;116m■[39m[38;2;236;177;116m■[39m[38;2;236;193;116m■[39m[38;2;236;208;116m■[39m[38;2;236;223;116m■[39m[38;2;233;236;116m■[39m[38;2;218;236;116m■[39m[38;2;202;236;116m■[39m[38;2;187;236;116m■[39m[38;2;172;236;116m■[39m[38;2;157;236;116m■[39m[38;2;141;236;116m■[39m[38;2;126;236;116m■[39m[38;2;116;236;121m■[39m[38;2;116;236;136m■[39m[38;2;116;236;152m■[39m[38;2;116;236;167m■[39m[38;2;116;236;182m■[39m[38;2;116;236;198m■[39m[38;2;116;236;213m■[39m
|
|
162
|
-
rainbow [38;2;255;0;0m■[39m[38;2;255;0;33m■[39m[38;2;255;0;65m■[39m[38;2;255;0;98m■[39m[38;2;255;0;130m■[39m[38;2;255;0;163m■[39m[38;2;255;0;195m■[39m[38;2;255;0;228m■[39m[38;2;250;0;255m■[39m[38;2;217;0;255m■[39m[38;2;185;0;255m■[39m[38;2;152;0;255m■[39m[38;2;120;0;255m■[39m[38;2;87;0;255m■[39m[38;2;55;0;255m■[39m[38;2;22;0;255m■[39m[38;2;0;11;255m■[39m[38;2;0;43;255m■[39m[38;2;0;76;255m■[39m[38;2;0;108;255m■[39m[38;2;0;141;255m■[39m[38;2;0;173;255m■[39m[38;2;0;206;255m■[39m[38;2;0;238;255m■[39m[38;2;0;255;239m■[39m[38;2;0;255;207m■[39m[38;2;0;255;174m■[39m[38;2;0;255;142m■[39m[38;2;0;255;109m■[39m[38;2;0;255;77m■[39m[38;2;0;255;44m■[39m[38;2;0;255;12m■[39m[38;2;21;255;0m■[39m[38;2;54;255;0m■[39m[38;2;86;255;0m■[39m[38;2;119;255;0m■[39m[38;2;151;255;0m■[39m[38;2;184;255;0m■[39m[38;2;216;255;0m■[39m[38;2;249;255;0m■[39m[38;2;255;229;0m■[39m[38;2;255;196;0m■[39m[38;2;255;164;0m■[39m[38;2;255;131;0m■[39m[38;2;255;99;0m■[39m[38;2;255;66;0m■[39m[38;2;255;34;0m■[39m[38;2;255;1;0m■[39m
|
|
163
|
-
`
|
|
164
|
-
await shellfie(string, { name: 'gradient', mode: 'raw', viewport: {width: 600, height: 350} });
|
|
59
|
+
const svg = shellfie("\x1b[32m$ npm test\x1b[0m\nAll tests passed!", {
|
|
60
|
+
template: "macos",
|
|
61
|
+
title: "terminal",
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
document.body.innerHTML = svg;
|
|
65
|
+
</script>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Templates
|
|
69
|
+
|
|
70
|
+
| macOS | Windows | Minimal |
|
|
71
|
+
| --------------------------------- | ------------------------------------- | ------------------------------------- |
|
|
72
|
+
|  |  |  |
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
shellfie(output, { template: "macos" }); // default
|
|
76
|
+
shellfie(output, { template: "windows" });
|
|
77
|
+
shellfie(output, { template: "minimal" });
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Options
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
shellfie(input, {
|
|
84
|
+
template?: "macos", // 'macos' | 'windows' | 'minimal' | Template
|
|
85
|
+
title?: "my-terminal", // window title
|
|
86
|
+
width?: 80, // terminal columns (auto-detected if not set)
|
|
87
|
+
padding?: 16, // number | [v, h] | [top, right, bottom, left]
|
|
88
|
+
controls?: true, // show window control buttons
|
|
89
|
+
fontSize?: 14, // font size in pixels
|
|
90
|
+
lineHeight?: 1.4, // line height multiplier
|
|
91
|
+
fontFamily?: "'SF Mono', Monaco, monospace", // font stack
|
|
92
|
+
customGlyphs?: true, // pixel-perfect box drawing characters
|
|
93
|
+
embedFont?: true, // embed default font as base64 (async only)
|
|
94
|
+
customFont?: { // use your own font
|
|
95
|
+
data: base64FontData, // base64-encoded font data
|
|
96
|
+
format: "woff2", // 'woff2' | 'woff' | 'ttf'
|
|
97
|
+
},
|
|
98
|
+
theme?: customTheme, // custom color theme or see themes below
|
|
99
|
+
watermark?: "Generated by shellfie", // bottom-right text (supports ANSI)
|
|
100
|
+
watermarkPadding?: 16, // number | [v, h] | [top, right, bottom, left]
|
|
101
|
+
header?: { // header configuration
|
|
102
|
+
backgroundColor?: "#2d2d2d", // title bar background color
|
|
103
|
+
height?: 40, // title bar height in pixels
|
|
104
|
+
border?: true, // show bottom border
|
|
105
|
+
borderColor?: "#1a1a1a", // border color
|
|
106
|
+
borderWidth?: 1, // border width in pixels
|
|
107
|
+
},
|
|
108
|
+
footer?: { // footer configuration
|
|
109
|
+
backgroundColor?: "#2d2d2d", // footer background color
|
|
110
|
+
height?: 30, // footer height in pixels
|
|
111
|
+
border?: true, // show top border
|
|
112
|
+
borderColor?: "#1a1a1a", // border color
|
|
113
|
+
borderWidth?: 1, // border width in pixels
|
|
114
|
+
},
|
|
115
|
+
});
|
|
165
116
|
```
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
await shellfie(backgroundColors, { name: 'background', viewport: {width: 500, height: 400} });
|
|
117
|
+
|
|
118
|
+
## Font Embedding
|
|
119
|
+
|
|
120
|
+
For portable SVGs that render identically everywhere:
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import { shellfieAsync } from "shellfie";
|
|
124
|
+
|
|
125
|
+
const svg = await shellfieAsync(input, { embedFont: true });
|
|
176
126
|
```
|
|
177
127
|
|
|
178
|
-
|
|
128
|
+
The font gets base64-encoded directly into the SVG. No external requests, no CORS issues, no "why does this look different on their machine" debugging sessions.
|
|
129
|
+
|
|
130
|
+
## Themes
|
|
131
|
+
|
|
132
|
+
shellfie comes with 12 built-in themes:
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
import shellfie, { dracula, nord, tokyoNight } from "shellfie";
|
|
136
|
+
|
|
137
|
+
shellfie(output, { theme: dracula });
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
| Dracula | Nord | Tokyo Night |
|
|
141
|
+
| -------------------------------------------- | -------------------------------------- | ---------------------------------------------------- |
|
|
142
|
+
|  |  |  |
|
|
143
|
+
|
|
144
|
+
| One Dark | Monokai | Catppuccin Mocha |
|
|
145
|
+
| ---------------------------------------------- | -------------------------------------------- | -------------------------------------------------------------- |
|
|
146
|
+
|  |  |  |
|
|
147
|
+
|
|
148
|
+
| GitHub Dark | GitHub Light | Gruvbox Dark |
|
|
149
|
+
| ---------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------ |
|
|
150
|
+
|  |  |  |
|
|
151
|
+
|
|
152
|
+
| Gruvbox Light | Solarized Dark | Solarized Light |
|
|
153
|
+
| -------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------ |
|
|
154
|
+
|  |  |  |
|
|
155
|
+
|
|
156
|
+
## Custom Themes
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
import shellfie, { createTheme } from "shellfie";
|
|
160
|
+
|
|
161
|
+
const theme = createTheme({
|
|
162
|
+
name: "ocean",
|
|
163
|
+
background: "#0a2540",
|
|
164
|
+
foreground: "#e6f1ff",
|
|
165
|
+
red: "#ff6b6b",
|
|
166
|
+
green: "#69db7c",
|
|
167
|
+
// ... all 16 ANSI colors
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
shellfie(output, { theme });
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Full Color Support
|
|
174
|
+
|
|
175
|
+
### 24-bit True Color & 256-color palette
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
import gradient from "gradient-string";
|
|
179
|
+
import shellfie from "shellfie";
|
|
180
|
+
|
|
181
|
+
const svg = shellfie(gradient.rainbow("Hello World"), {
|
|
182
|
+
template: "macos",
|
|
183
|
+
title: "gradient string",
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+

|
|
188
|
+
|
|
189
|
+
### Works with any ANSI output
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
import Chartscii from "chartscii";
|
|
193
|
+
import shellfie from "shellfie";
|
|
194
|
+
|
|
195
|
+
const chart = new Chartscii(data, {
|
|
196
|
+
barSize: 2,
|
|
197
|
+
fill: "▒",
|
|
198
|
+
colorLabels: true,
|
|
199
|
+
orientation: "vertical",
|
|
200
|
+
valueLabels: true,
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
const svg = shellfie(chart.create(), {
|
|
204
|
+
template: "macos",
|
|
205
|
+
title: "Chartscii",
|
|
206
|
+
padding: 50,
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+

|
|
211
|
+
|
|
212
|
+
### CLI tools, test runners, anything
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
shellfie(execSync("git diff --color=always").toString());
|
|
216
|
+
shellfie(execSync("npm test 2>&1").toString());
|
|
217
|
+
shellfie(execSync("ls -la --color=always").toString());
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Utilities
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
import { parse, render, stripAnsi, getMaxWidth } from "shellfie";
|
|
224
|
+
|
|
225
|
+
const lines = parse("\x1b[31mred\x1b[0m text");
|
|
226
|
+
const svg = render(lines, options);
|
|
227
|
+
|
|
228
|
+
stripAnsi("\x1b[31mred\x1b[0m"); // 'red'
|
|
229
|
+
getMaxWidth(lines); // 80
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## License
|
|
233
|
+
|
|
234
|
+
MIT — do whatever you want with it. If you build something cool, I'd love to see it.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FontConfig } from '../types';
|
|
2
|
+
export declare const defaultFontFamily = "'SF Mono', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'Courier New', monospace";
|
|
3
|
+
export declare const systemFontPaths: Record<string, string[]>;
|
|
4
|
+
export declare function getFontFormat(path: string): 'woff2' | 'woff' | 'ttf' | null;
|
|
5
|
+
export declare function loadFont(path: string): Promise<{
|
|
6
|
+
data: string;
|
|
7
|
+
format: 'woff2' | 'woff' | 'ttf';
|
|
8
|
+
} | null>;
|
|
9
|
+
export declare function createFontConfig(options: {
|
|
10
|
+
family?: string;
|
|
11
|
+
size?: number;
|
|
12
|
+
lineHeight?: number;
|
|
13
|
+
embedData?: string;
|
|
14
|
+
embedFormat?: 'woff2' | 'woff' | 'ttf';
|
|
15
|
+
}): FontConfig;
|
|
16
|
+
export declare function findSystemFont(): string | null;
|
|
17
|
+
export declare function loadEmbeddedFont(customPath?: string): Promise<{
|
|
18
|
+
data: string;
|
|
19
|
+
format: 'woff2' | 'woff' | 'ttf';
|
|
20
|
+
} | null>;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fonts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI3C,eAAO,MAAM,iBAAiB,sFACuD,CAAC;AAEtF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAepD,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,CAa3E;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;CAAE,GAAG,IAAI,CAAC,CAkBpE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;CACxC,GAAG,UAAU,CASb;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAW9C;AAED,wBAAsB,gBAAgB,CACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;CAAE,GAAG,IAAI,CAAC,CAcpE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.systemFontPaths = exports.defaultFontFamily = void 0;
|
|
4
|
+
exports.getFontFormat = getFontFormat;
|
|
5
|
+
exports.loadFont = loadFont;
|
|
6
|
+
exports.createFontConfig = createFontConfig;
|
|
7
|
+
exports.findSystemFont = findSystemFont;
|
|
8
|
+
exports.loadEmbeddedFont = loadEmbeddedFont;
|
|
9
|
+
const promises_1 = require("node:fs/promises");
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
exports.defaultFontFamily = "'SF Mono', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'Courier New', monospace";
|
|
12
|
+
exports.systemFontPaths = {
|
|
13
|
+
darwin: [
|
|
14
|
+
'/System/Library/Fonts/SFMono.ttf',
|
|
15
|
+
'/System/Library/Fonts/Monaco.dfont',
|
|
16
|
+
'/System/Library/Fonts/Menlo.ttc',
|
|
17
|
+
],
|
|
18
|
+
linux: [
|
|
19
|
+
'/usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf',
|
|
20
|
+
'/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf',
|
|
21
|
+
'/usr/share/fonts/TTF/DejaVuSansMono.ttf',
|
|
22
|
+
],
|
|
23
|
+
win32: [
|
|
24
|
+
'C:\\Windows\\Fonts\\consola.ttf',
|
|
25
|
+
'C:\\Windows\\Fonts\\cour.ttf',
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
function getFontFormat(path) {
|
|
29
|
+
const ext = path.toLowerCase().split('.').pop();
|
|
30
|
+
switch (ext) {
|
|
31
|
+
case 'woff2':
|
|
32
|
+
return 'woff2';
|
|
33
|
+
case 'woff':
|
|
34
|
+
return 'woff';
|
|
35
|
+
case 'ttf':
|
|
36
|
+
case 'otf':
|
|
37
|
+
return 'ttf';
|
|
38
|
+
default:
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function loadFont(path) {
|
|
43
|
+
try {
|
|
44
|
+
if (!(0, node_fs_1.existsSync)(path)) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const format = getFontFormat(path);
|
|
48
|
+
if (!format) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const buffer = await (0, promises_1.readFile)(path);
|
|
52
|
+
const data = buffer.toString('base64');
|
|
53
|
+
return { data, format };
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function createFontConfig(options) {
|
|
60
|
+
return {
|
|
61
|
+
family: options.family ?? exports.defaultFontFamily,
|
|
62
|
+
size: options.size ?? 14,
|
|
63
|
+
lineHeight: options.lineHeight ?? 1.4,
|
|
64
|
+
charWidth: 0.6,
|
|
65
|
+
embedData: options.embedData,
|
|
66
|
+
embedFormat: options.embedFormat,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function findSystemFont() {
|
|
70
|
+
const platform = process.platform;
|
|
71
|
+
const paths = exports.systemFontPaths[platform] ?? [];
|
|
72
|
+
for (const path of paths) {
|
|
73
|
+
if ((0, node_fs_1.existsSync)(path)) {
|
|
74
|
+
return path;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
async function loadEmbeddedFont(customPath) {
|
|
80
|
+
if (customPath) {
|
|
81
|
+
const result = await loadFont(customPath);
|
|
82
|
+
if (result) {
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const systemPath = findSystemFont();
|
|
87
|
+
if (systemPath) {
|
|
88
|
+
return loadFont(systemPath);
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fonts/index.ts"],"names":[],"mappings":";;;AAwBA,sCAaC;AAED,4BAoBC;AAED,4CAeC;AAED,wCAWC;AAED,4CAgBC;AA1GD,+CAA4C;AAC5C,qCAAqC;AAExB,QAAA,iBAAiB,GAC5B,mFAAmF,CAAC;AAEzE,QAAA,eAAe,GAA6B;IACvD,MAAM,EAAE;QACN,kCAAkC;QAClC,oCAAoC;QACpC,iCAAiC;KAClC;IACD,KAAK,EAAE;QACL,mDAAmD;QACnD,qDAAqD;QACrD,yCAAyC;KAC1C;IACD,KAAK,EAAE;QACL,iCAAiC;QACjC,8BAA8B;KAC/B;CACF,CAAC;AAEF,SAAgB,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAChD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,QAAQ,CAC5B,IAAY;IAEZ,IAAI,CAAC;QACH,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAMhC;IACC,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,yBAAiB;QAC3C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,GAAG;QACrC,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,KAAK,GAAG,uBAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,UAAmB;IAEnB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ParsedLine, shellfieOptions } from './types';
|
|
2
|
+
export declare const shellfie: (input: string, options?: shellfieOptions) => string;
|
|
3
|
+
export declare const shellfieAsync: (input: string, options?: shellfieOptions) => Promise<string>;
|
|
4
|
+
export declare const parse: (input: string) => ParsedLine[];
|
|
5
|
+
export declare const render: (lines: ParsedLine[], options?: shellfieOptions) => string;
|
|
6
|
+
export type { ControlStyle, FontConfig, ParsedLine, RGB, ShellConfig, shellfieOptions, Template, TextSpan, TextStyle, Theme } from './types';
|
|
7
|
+
export { createFontConfig, loadEmbeddedFont, loadFont } from './fonts';
|
|
8
|
+
export { getMaxWidth, parseAnsi, stripAnsi } from './parser';
|
|
9
|
+
export { createTheme, darkTheme } from './renderer';
|
|
10
|
+
export { createTemplate, resolveTemplate, templates } from './templates';
|
|
11
|
+
export * from './themes';
|
|
12
|
+
export { themes } from './themes';
|
|
13
|
+
export default shellfie;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAIV,UAAU,EAKV,eAAe,EAEhB,MAAM,SAAS,CAAC;AAmFjB,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,UAAS,eAAoB,KAAG,MACd,CAAC;AAE3D,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,UAAS,eAAoB,KAC5B,OAAO,CAAC,MAAM,CAYhB,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,KAAG,UAAU,EAAsB,CAAC;AAEvE,eAAO,MAAM,MAAM,GAAI,OAAO,UAAU,EAAE,EAAE,UAAS,eAAoB,KAAG,MAC7B,CAAC;AAEhD,YAAY,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,GAAG,EACH,WAAW,EACX,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,KAAK,EACN,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzE,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,eAAe,QAAQ,CAAC"}
|