shellfie 1.3.7 → 2.0.1
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 +225 -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 +230 -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 +33 -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,238 @@
|
|
|
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
|
-
# data
|
|
52
|
-
**type**: `string[]` || `string`
|
|
53
|
-
**description**: string data to output to the terminal
|
|
54
|
-
|
|
55
|
-
# options
|
|
56
|
-
**type**: `object`
|
|
57
|
-
**description**: optional config for `shellfie`
|
|
58
|
-
### `name`
|
|
59
|
-
**type**: `string`
|
|
60
|
-
**description**: name of image
|
|
61
|
-
### `location`
|
|
62
|
-
**type**: `string`
|
|
63
|
-
**description**: relative path to save your shellfies
|
|
64
|
-
### `puppeteerOptions`
|
|
65
|
-
**type**: `object`
|
|
66
|
-
**description**: optional puppteer args
|
|
67
|
-
**default**: `{ args: ['--no-sandbox', '--disable-setuid-sandbox'] }`
|
|
68
|
-
### `mode`
|
|
69
|
-
**type**: `string`
|
|
70
|
-
**description**: can allow raw string input. for example: `yarn test --colors > help.txt`, then copy the text and provide it to `shellfie` with this option set to `raw`.
|
|
71
|
-
**default**: `default`
|
|
72
|
-
### `theme`
|
|
73
|
-
**type**: `object`
|
|
74
|
-
**description**: optional theme style
|
|
75
|
-
- #### `background`
|
|
76
|
-
**type**: `string`
|
|
77
|
-
**description**: css color for terminal background
|
|
78
|
-
**default**: `'#151515'`
|
|
79
|
-
- #### `forground`
|
|
80
|
-
**type**: `string`
|
|
81
|
-
**description**: css color for any unformatted string provided in `data`
|
|
82
|
-
### `style`
|
|
83
|
-
**type**: `object`
|
|
84
|
-
**description**: css properties for terminal output
|
|
85
|
-
- #### `fontSize`
|
|
86
|
-
**type**: `number`
|
|
87
|
-
**description**: font size
|
|
88
|
-
- #### `fontWeight`
|
|
89
|
-
**type**: `string`
|
|
90
|
-
**description**: font weight
|
|
91
|
-
- #### `fontFamily`
|
|
92
|
-
**type**: `string`
|
|
93
|
-
**description**: font family
|
|
94
|
-
### `viewport`
|
|
95
|
-
**type**: `object`
|
|
96
|
-
**description**: viewport of terminal
|
|
97
|
-
**default**: `{ width: 700, height: 600 }`
|
|
98
|
-
- #### `width`
|
|
99
|
-
**type**: `number`
|
|
100
|
-
**description**: viewport width
|
|
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>
|
|
165
66
|
```
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
|
|
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" });
|
|
176
78
|
```
|
|
177
79
|
|
|
178
|
-
|
|
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
|
+
});
|
|
116
|
+
```
|
|
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 });
|
|
126
|
+
```
|
|
127
|
+
|
|
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
|
+
## Related
|
|
233
|
+
- See [shellfie-cli](https://github.com/tool3/shellfie-cli) for command line usage
|
|
234
|
+
|
|
235
|
+
## License
|
|
236
|
+
|
|
237
|
+
MIT — do whatever you want with it. If you build something cool, I'd love to see it.
|
|
238
|
+
|
|
@@ -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"}
|