osdy-pi 0.1.6 → 0.1.8
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/README.md +57 -2
- package/extensions/osdy-pi/constants.ts +245 -244
- package/extensions/osdy-pi/diff-panel.ts +319 -0
- package/extensions/osdy-pi/runtime-helpers.ts +21 -4
- package/extensions/osdy-pi/runtime.ts +287 -21
- package/extensions/osdy-pi/types.ts +31 -0
- package/extensions/osdy-pi/working-tree.ts +290 -0
- package/package.json +3 -2
|
@@ -6,129 +6,130 @@ export const ANIMATION_ENABLED = true;
|
|
|
6
6
|
export const ANIMATION_INTERVAL_MS = 30;
|
|
7
7
|
export const INTRO_ANIMATION_FRAMES = 28;
|
|
8
8
|
export const WORKING_SPINNER_FRAMES = [
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
"⠋",
|
|
10
|
+
"⠙",
|
|
11
|
+
"⠹",
|
|
12
|
+
"⠸",
|
|
13
|
+
"⠼",
|
|
14
|
+
"⠴",
|
|
15
|
+
"⠦",
|
|
16
|
+
"⠧",
|
|
17
|
+
"⠇",
|
|
18
|
+
"⠏",
|
|
19
19
|
];
|
|
20
20
|
export const WORKING_WIDGET_KEY = "osdy-pi-working";
|
|
21
|
+
export const WORKING_TREE_WIDGET_KEY = "osdy-pi-working-tree";
|
|
21
22
|
export const MASCOT_MIN_ROWS = 34;
|
|
22
23
|
export const MASCOT_GAP = 0;
|
|
23
24
|
|
|
24
25
|
const HTML_MASCOT = [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
26
|
+
" ▓▓▓▓▒ ",
|
|
27
|
+
" ░ ▓▓▓ ▒▓ ",
|
|
28
|
+
" ░░░▓▓▓ ▓▓ ",
|
|
29
|
+
" ▒ ▒ ▒▒ ▒ ░░ ▓▓▓▓ ░▒▓▓ ",
|
|
30
|
+
"▓▓▓▓▓▓▓▓░░░░░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒ ░░▒▓ ",
|
|
31
|
+
"▓▓ ▓▓▓▓▓░░░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░ ░░▒▒ ",
|
|
32
|
+
"▓▓░ ▒▓▓▓▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▒▒▒▒▒▒▒░░ ░▒▒ ",
|
|
33
|
+
" ▓▒░░ ▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓█▓▓█▓▓▓▓▓▒▒▒░▒▒░ ",
|
|
34
|
+
" ▓▒░░ ░▒▒▒▒▒▓▓▓▓▓▒█▒▒▒▒▒▓▓▓▓ ░░░ ▓▓▓▓▒▒▒░░ ",
|
|
35
|
+
" ▒▒░░ ░▒▒▒▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▓▓ ░ ▓ ▒▒░░ ",
|
|
36
|
+
" ▒▒▒▒░▒▒▓▓▓▓░ ░▓▒▒▒▒▒ ░▒▒█▓ ▒▓▓▓░▒ ",
|
|
37
|
+
" ░ ░▒▒▓▓▒ ▓░░ ░░ ░ ▓▓▓▒ ",
|
|
38
|
+
" ░░▒▓░ ░▒░▓▓ ░░ ░▓▓▒ ",
|
|
39
|
+
" ░▒ ▒ ░▒▒▒ ▒▒▒▒ ░ ▒▒▒ ",
|
|
40
|
+
" ░▒▓▓░ ▓▓░░░ █▓ ▒ ░▒▒▒ ",
|
|
41
|
+
" ▒▓▓▓░ ▓▓ ▓▓▓▓▓▓▓▓▓ ░░▒ ",
|
|
42
|
+
" ▓▓▓░ ░ ▓▓▓▓▓▓▒▓▓▓▓ ▓▓▓▓▓▓▓▒░░░░ ░ ",
|
|
43
|
+
" ▒▒▒▒ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░░░ ",
|
|
44
|
+
" ▓▒▒░░ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒░░ ▓ ",
|
|
45
|
+
" ░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒ ░░░ ",
|
|
46
|
+
" ░ ░░░░░░░░░░░▒▒░░ ░ ░ ░ ▓ ",
|
|
47
|
+
" ░░░░░▒▒▒▒░░▒░ ▒▒▒▒▒░░ ░░▒▒▒░░░░░░░░ ",
|
|
48
|
+
" ▒▒▒▒▒░░░▒▒▒▒▒▒▒▒▒▒▒▒░░░ ▒░░▒▒▒▒▓▓▓▓░░░░ ",
|
|
49
|
+
" ░▒▒▒▒▒░ ░░▒▒▒▒▒▒▒▒░░░ ░░▒▓▓▓▓▒▒░░ ",
|
|
50
|
+
" ▓░░░░░░ ░ ░░░░░░░░░░░ ░░░░░░▓▒▒▒▒ ░",
|
|
51
|
+
" ░░░▒▒▓▓▓▓▓▒░░░░░░░░░░ ░░▒▒▒▒░░░░░░░▒▒░░ ",
|
|
52
|
+
" ░▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒░░░ ░▒▒▒▓▓▒░░░ ░░░▒ ",
|
|
53
|
+
" ▒░▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒░░░ ░▒▒▓▓▒░ ░ ",
|
|
54
|
+
" ░░▒▒▒▒▒▒▓▓▓▓▓▓▒▒▒▒▒▒░░░░ ░▒▒▒▒▒ ░ ",
|
|
55
|
+
" ▒░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░ ▒▒░▒ ",
|
|
56
|
+
" ░░░░░░░░░░▒░░▒░▒▒░░░░ ░ ░░░░ ",
|
|
57
|
+
" ░░░░ ░░░░░░░░░░░ ░░░░ ",
|
|
58
|
+
" ░ ░░░░░░ ▓ ",
|
|
59
|
+
" ░░░░░ ░░░░░░ ",
|
|
60
|
+
" ░ ░ ",
|
|
60
61
|
] as const;
|
|
61
62
|
|
|
62
63
|
const HTML_MASCOT_MAP = [
|
|
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
|
-
|
|
64
|
+
" hhhhl ",
|
|
65
|
+
" dmmhhhmmlhm ",
|
|
66
|
+
" dmmmhhhdmmmmhh ",
|
|
67
|
+
" ldldllddmdldmmmmhhlhddmmmlhh ",
|
|
68
|
+
"hhhhhhhhmmmlm llllllllllllllllllmlldddmmmll ",
|
|
69
|
+
"hhmmmmlhhhhmmmdllllllllllllllllllllllllmddmmmll ",
|
|
70
|
+
"hhmmmddlhhhlmlllllllllllllllllllhlllllllllmmlld ",
|
|
71
|
+
" llmmmdddlmllllllllllllllllllhbhhbhhhhhllllllm ",
|
|
72
|
+
" dllmmmddllllllhhhhhlblllllhhhhmmmmmmhhhhlllmm ",
|
|
73
|
+
" dllmmmlllllhhhhhhhhhhllllhhmmmmmmmmmddddhdlllm ",
|
|
74
|
+
" lllllllhhhhmmmmmmmhllllldmdlllbhmmmmddddlhhhlldd ",
|
|
75
|
+
" mdlllhhlmmdhmmmddmmdmmddmmmmdldddddddddmmmhhhl ",
|
|
76
|
+
" lllhmddmlmhhmmmmmddmmmddddddddddddddddmmdmmmhhl ",
|
|
77
|
+
" mlldldddmlllddddddddlllldmddddddddddddmmmddmlll ",
|
|
78
|
+
" llhhmddddmmdddddddddhhmmmdbhdldddddddddmmddmlll ",
|
|
79
|
+
" llhhmmmdddddddddddddhhddddmhhhhhhhhhmmdddddlml ",
|
|
80
|
+
" hhhmmmmmddddddddldhhhhhhlhhhhmhhhhhhhlmmmmmm ",
|
|
81
|
+
" llllmddmddddddddhhhhhhhhhhlhhhhhhhlllmmmm ",
|
|
82
|
+
" hllllmddddddmhhhhhhhhhhhhhllllllmmmh ",
|
|
83
|
+
" dmmmmmmmmlllllllllllllmdmmm ",
|
|
84
|
+
" mmmmmmmmmmmmmmmlllmm ",
|
|
85
|
+
" dlmmmmllllmmlmmllllllm dmllllmmmmmmmm ",
|
|
86
|
+
" lllllmmlllllllllllllmmm lmllllllllhlmmmmm ",
|
|
87
|
+
" mlllllmdmlllllllllmmmd mddmmmmlhhhlllmmmmm ",
|
|
88
|
+
" hmmmmmmdmdmmmmmmmmmmm dddmmmmmmmmlllllmmdmm",
|
|
89
|
+
" mmmlllllhllllmmmmmmmm dmmllllmmmmmmmlllmdm ",
|
|
90
|
+
" mlllhhhhhhhhlllllllmmdddmlllhllmmmmmmlmml ",
|
|
91
|
+
" llllllhhhhhhhllllllllmmdddmmlllllmmmmdmmd ",
|
|
92
|
+
" mllllllllhhllllllllllmmmddmmmlllllmdddmm ",
|
|
93
|
+
" lmllmlllllllllllllllmmmmmddmmmllllmdddd ",
|
|
94
|
+
" lmmmmmmllllmllllllmmmdmdddddmmmmmddmd ",
|
|
95
|
+
" dmmmmmmd dmmmmmmmmmmmmddddmmmmmdd ",
|
|
96
|
+
" dmmmmmd dmmmmmmd h ",
|
|
97
|
+
" mmmmmmmm dmmmmmmm ",
|
|
98
|
+
" dmmmmmm ",
|
|
98
99
|
] as const;
|
|
99
100
|
|
|
100
101
|
const HEADER_CLASSIC = [
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
102
|
+
"░█████╗░░██████╗██████╗░██╗░░░██╗░░░░░░██████╗░██╗",
|
|
103
|
+
"██╔══██╗██╔════╝██╔══██╗╚██╗░██╔╝░░░░░░██╔══██╗ ║",
|
|
104
|
+
"██║░░██║╚█████╗░██║░░██║░╚████╔╝░█████╗██████╔╝██║",
|
|
105
|
+
"██║░░██║░╚═══██╗██║░░██║░░╚██╔╝░░╚════╝██╔═══╝░██║",
|
|
106
|
+
"╚█████╔╝██████╔╝██████╔╝░░░██║░░░░░░░░░██║░░░░░██║",
|
|
107
|
+
"░╚════╝░╚═════╝░╚═════╝░░░░╚═╝░░░░░░░░░╚═╝░░░░░╚═╝",
|
|
108
|
+
" ╭━╮╱╱╱╱╱╱╭╮╱╱╱╱╱╭╮╱╱╱╱╱╭╮╱╱╭╮╭╮╱╱╱╱╭━╮",
|
|
109
|
+
" ┃╭╋━┳━━┳━╋╋╮╭━╮╭╯┣━┳┳╮╭╯┣━╮┣╋╯┣━┳━╮┃━┫",
|
|
110
|
+
" ┃╰┫╋┃┃┃┃╋┃┃╰┫╋╰┫╋┃╋┃╭╯┃╋┃┻┫┃┃╋┃┻┫╋╰╋━┃",
|
|
111
|
+
" ╰━┻━┻┻┻┫╭┻┻━┻━━┻━┻━┻╯╱╰━┻━╯╰┻━┻━┻━━┻━╯",
|
|
112
|
+
" ╱╱╱╱╱╱╱╰╯ </>",
|
|
112
113
|
] as const;
|
|
113
114
|
|
|
114
115
|
const HEADER_SIMPLE = [
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
116
|
+
" ███████ █████ ███████████ ███ ",
|
|
117
|
+
" ███░░░░░███ ░░███ ░░███░░░░░███ ░░░ ",
|
|
118
|
+
" ███ ░░███ █████ ███████ █████ ████ ░███ ░███ ████ ",
|
|
119
|
+
"░███ ░███ ███░░ ███░░███ ░░███ ░███ ██████████ ░██████████ ░░███ ",
|
|
120
|
+
"░███ ░███░░█████ ░███ ░███ ░███ ░███ ░░░░░░░░░░ ░███░░░░░░ ░███ ",
|
|
121
|
+
"░░███ ███ ░░░░███░███ ░███ ░███ ░███ ░███ ░███ ",
|
|
122
|
+
" ░░░███████░ ██████ ░░████████ ░░███████ █████ █████",
|
|
123
|
+
" ░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░███ ░░░░░ ░░░░░ ",
|
|
124
|
+
" ███ ░███",
|
|
125
|
+
" ░░██████",
|
|
126
|
+
" ░░░░░░ <ideas_compiler/>",
|
|
126
127
|
] as const;
|
|
127
128
|
|
|
128
129
|
type HeaderPalette = {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
130
|
+
baseColor: string;
|
|
131
|
+
highlightColor: string;
|
|
132
|
+
trailColor: string;
|
|
132
133
|
};
|
|
133
134
|
|
|
134
135
|
export type MascotToneKey = "b" | "h" | "l" | "m" | "d" | "p" | "c" | "v";
|
|
@@ -136,203 +137,203 @@ export type MascotToneKey = "b" | "h" | "l" | "m" | "d" | "p" | "c" | "v";
|
|
|
136
137
|
export type MascotTonePalette = Record<MascotToneKey, string>;
|
|
137
138
|
|
|
138
139
|
type HeaderVariantConfig = {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
140
|
+
label: string;
|
|
141
|
+
header: readonly string[];
|
|
142
|
+
headerMap?: readonly string[];
|
|
143
|
+
headerTonePalette?: MascotTonePalette;
|
|
144
|
+
minRowsForFull?: number;
|
|
145
|
+
fallbackHeader?: readonly string[];
|
|
146
|
+
fallbackLinePalette?: (lineIndex: number) => HeaderPalette;
|
|
147
|
+
mascot?: readonly string[];
|
|
148
|
+
mascotMap?: readonly string[];
|
|
149
|
+
linePalette: (lineIndex: number) => HeaderPalette;
|
|
150
|
+
mascotPalette: HeaderPalette;
|
|
151
|
+
mascotTonePalette?: MascotTonePalette;
|
|
151
152
|
};
|
|
152
153
|
|
|
153
154
|
const CLASSIC_PALETTE: HeaderPalette = {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
baseColor: "accent",
|
|
156
|
+
highlightColor: "mdHeading",
|
|
157
|
+
trailColor: "mdLink",
|
|
157
158
|
};
|
|
158
159
|
|
|
159
160
|
const CLASSIC_LINK_PALETTE: HeaderPalette = {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
baseColor: "mdLink",
|
|
162
|
+
highlightColor: "mdHeading",
|
|
163
|
+
trailColor: "mdLink",
|
|
163
164
|
};
|
|
164
165
|
|
|
165
166
|
const OSDY_THEME_PINK_PALETTE: HeaderPalette = {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
167
|
+
baseColor: "accent",
|
|
168
|
+
highlightColor: "mdHeading",
|
|
169
|
+
trailColor: "mdLink",
|
|
169
170
|
};
|
|
170
171
|
|
|
171
172
|
const OSDY_THEME_CYAN_PALETTE: HeaderPalette = {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
baseColor: "mdLink",
|
|
174
|
+
highlightColor: "accent",
|
|
175
|
+
trailColor: "mdHeading",
|
|
175
176
|
};
|
|
176
177
|
|
|
177
178
|
const OSDY_THEME_PURPLE_PALETTE: HeaderPalette = {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
179
|
+
baseColor: "mdHeading",
|
|
180
|
+
highlightColor: "mdLink",
|
|
181
|
+
trailColor: "accent",
|
|
181
182
|
};
|
|
182
183
|
|
|
183
184
|
const OSDY_THEME_MASCOT_PALETTE: HeaderPalette = {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
185
|
+
baseColor: "mdLink",
|
|
186
|
+
highlightColor: "accent",
|
|
187
|
+
trailColor: "mdHeading",
|
|
187
188
|
};
|
|
188
189
|
|
|
189
190
|
const HTML_MASCOT_TONES: MascotTonePalette = {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
191
|
+
b: "mascotBg",
|
|
192
|
+
h: "mascotBright",
|
|
193
|
+
l: "mascotLight",
|
|
194
|
+
m: "mascotMid",
|
|
195
|
+
d: "mascotDark",
|
|
196
|
+
p: "htmlPink",
|
|
197
|
+
c: "mdLink",
|
|
198
|
+
v: "mdHeading",
|
|
198
199
|
};
|
|
199
200
|
|
|
200
201
|
type MascotArt = {
|
|
201
|
-
|
|
202
|
-
|
|
202
|
+
mascot: readonly string[];
|
|
203
|
+
toneMap: readonly string[];
|
|
203
204
|
};
|
|
204
205
|
|
|
205
206
|
function sampleIndex(
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
207
|
+
outputIndex: number,
|
|
208
|
+
outputCount: number,
|
|
209
|
+
inputCount: number,
|
|
209
210
|
): number {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
211
|
+
if (outputCount <= 1) return 0;
|
|
212
|
+
return Math.min(
|
|
213
|
+
inputCount - 1,
|
|
214
|
+
Math.round((outputIndex * (inputCount - 1)) / (outputCount - 1)),
|
|
215
|
+
);
|
|
215
216
|
}
|
|
216
217
|
|
|
217
218
|
function sampleLine(
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
219
|
+
line: string,
|
|
220
|
+
outputWidth: number,
|
|
221
|
+
inputWidth: number,
|
|
221
222
|
): string {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
223
|
+
const chars = Array.from(line.padEnd(inputWidth, " "));
|
|
224
|
+
return Array.from({ length: outputWidth }, (_value, outputIndex) => {
|
|
225
|
+
const inputIndex = sampleIndex(outputIndex, outputWidth, inputWidth);
|
|
226
|
+
return chars[inputIndex] ?? " ";
|
|
227
|
+
}).join("");
|
|
227
228
|
}
|
|
228
229
|
|
|
229
230
|
function scaleMascotArt(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
mascot: readonly string[],
|
|
232
|
+
toneMap: readonly string[],
|
|
233
|
+
scale: number,
|
|
233
234
|
): MascotArt {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
235
|
+
const inputRows = Math.min(mascot.length, toneMap.length);
|
|
236
|
+
const inputWidth = Math.max(
|
|
237
|
+
...mascot.slice(0, inputRows).map((line) => Array.from(line).length),
|
|
238
|
+
...toneMap.slice(0, inputRows).map((line) => Array.from(line).length),
|
|
239
|
+
);
|
|
240
|
+
const outputRows = Math.max(1, Math.round(inputRows * scale));
|
|
241
|
+
const outputWidth = Math.max(1, Math.round(inputWidth * scale));
|
|
241
242
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
243
|
+
return Array.from({ length: outputRows }, (_value, outputIndex) => {
|
|
244
|
+
const inputIndex = sampleIndex(outputIndex, outputRows, inputRows);
|
|
245
|
+
return {
|
|
246
|
+
mascot: sampleLine(mascot[inputIndex] ?? "", outputWidth, inputWidth),
|
|
247
|
+
toneMap: sampleLine(toneMap[inputIndex] ?? "", outputWidth, inputWidth),
|
|
248
|
+
};
|
|
249
|
+
}).reduce<MascotArt>(
|
|
250
|
+
(accumulator, line) => ({
|
|
251
|
+
mascot: [...accumulator.mascot, line.mascot],
|
|
252
|
+
toneMap: [...accumulator.toneMap, line.toneMap],
|
|
253
|
+
}),
|
|
254
|
+
{ mascot: [], toneMap: [] },
|
|
255
|
+
);
|
|
255
256
|
}
|
|
256
257
|
|
|
257
258
|
function addRightEdgeGlow(
|
|
258
|
-
|
|
259
|
-
|
|
259
|
+
mascot: readonly string[],
|
|
260
|
+
toneMap: readonly string[],
|
|
260
261
|
): readonly string[] {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
262
|
+
return toneMap.map((lineMap, lineIndex) => {
|
|
263
|
+
const chars = Array.from(lineMap);
|
|
264
|
+
const mascotLine = mascot[lineIndex] ?? "";
|
|
265
|
+
const rightEdgeIndex = Math.max(
|
|
266
|
+
...Array.from(mascotLine).map((char, index) =>
|
|
267
|
+
char === " " ? -1 : index,
|
|
268
|
+
),
|
|
269
|
+
);
|
|
270
|
+
if (rightEdgeIndex < 0) return lineMap;
|
|
271
|
+
const glowTones = ["p", "c", "v"] as const;
|
|
272
|
+
for (let offset = 0; offset < glowTones.length; offset += 1) {
|
|
273
|
+
const glowTone = glowTones[offset];
|
|
274
|
+
const index = rightEdgeIndex - offset;
|
|
275
|
+
if (
|
|
276
|
+
glowTone &&
|
|
277
|
+
index >= 0 &&
|
|
278
|
+
index < chars.length &&
|
|
279
|
+
chars[index] !== " "
|
|
280
|
+
) {
|
|
281
|
+
chars[index] = glowTone;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return chars.join("");
|
|
285
|
+
});
|
|
285
286
|
}
|
|
286
287
|
|
|
287
288
|
const OSDY_THEME_MASCOT_ART = scaleMascotArt(HTML_MASCOT, HTML_MASCOT_MAP, 0.9);
|
|
288
289
|
const OSDY_THEME_MASCOT_MAP = addRightEdgeGlow(
|
|
289
|
-
|
|
290
|
-
|
|
290
|
+
OSDY_THEME_MASCOT_ART.mascot,
|
|
291
|
+
OSDY_THEME_MASCOT_ART.toneMap,
|
|
291
292
|
);
|
|
292
293
|
|
|
293
294
|
function osdyThemePalette(lineIndex: number): HeaderPalette {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
295
|
+
if (lineIndex < 4) return OSDY_THEME_PINK_PALETTE;
|
|
296
|
+
if (lineIndex < 8) return OSDY_THEME_CYAN_PALETTE;
|
|
297
|
+
return OSDY_THEME_PURPLE_PALETTE;
|
|
297
298
|
}
|
|
298
299
|
|
|
299
300
|
export const HEADER_VARIANTS: Record<HeaderVariant, HeaderVariantConfig> = {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
301
|
+
"osdy-theme": {
|
|
302
|
+
label: "OsdyTheme",
|
|
303
|
+
header: HEADER_SIMPLE,
|
|
304
|
+
mascot: OSDY_THEME_MASCOT_ART.mascot,
|
|
305
|
+
mascotMap: OSDY_THEME_MASCOT_MAP,
|
|
306
|
+
linePalette: osdyThemePalette,
|
|
307
|
+
mascotPalette: OSDY_THEME_MASCOT_PALETTE,
|
|
308
|
+
mascotTonePalette: HTML_MASCOT_TONES,
|
|
309
|
+
},
|
|
310
|
+
classic: {
|
|
311
|
+
label: "Classic",
|
|
312
|
+
header: HEADER_CLASSIC,
|
|
313
|
+
mascot: HTML_MASCOT,
|
|
314
|
+
mascotMap: HTML_MASCOT_MAP,
|
|
315
|
+
linePalette: (lineIndex) =>
|
|
316
|
+
lineIndex >= 6 ? CLASSIC_LINK_PALETTE : CLASSIC_PALETTE,
|
|
317
|
+
mascotPalette: OSDY_THEME_MASCOT_PALETTE,
|
|
318
|
+
mascotTonePalette: HTML_MASCOT_TONES,
|
|
319
|
+
},
|
|
319
320
|
};
|
|
320
321
|
|
|
321
322
|
export function headerWidth(variant: HeaderVariant): number {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
323
|
+
return HEADER_VARIANTS[variant].header.reduce(
|
|
324
|
+
(maxWidth, line) => Math.max(maxWidth, visibleWidth(line)),
|
|
325
|
+
0,
|
|
326
|
+
);
|
|
326
327
|
}
|
|
327
328
|
|
|
328
329
|
export function mascotWidth(variant: HeaderVariant): number {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
330
|
+
return (HEADER_VARIANTS[variant].mascot ?? []).reduce(
|
|
331
|
+
(maxWidth, line) => Math.max(maxWidth, visibleWidth(line)),
|
|
332
|
+
0,
|
|
333
|
+
);
|
|
333
334
|
}
|
|
334
335
|
|
|
335
336
|
export const HEADER_FALLBACK = [
|
|
336
|
-
|
|
337
|
-
|
|
337
|
+
"OSDY - PI",
|
|
338
|
+
"</> Compilador de ideas",
|
|
338
339
|
] as const;
|