├── .gitignore
├── README.md
├── index.html
├── package-lock.json
├── package.json
├── public
└── favicon.png
├── src
├── App.vue
├── assets
│ ├── typerip_logo_small.png
│ └── typerip_logo_transparent.png
├── components
│ ├── FontBox.vue
│ ├── FontSetContainer.vue
│ ├── MessageBox.vue
│ └── SearchBar.vue
├── main.js
├── models
│ └── fontset.js
├── scripts
│ └── typerip.js
└── styles
│ ├── hella.css
│ └── main.css
└── vite.config.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 | ### The [Adobe Fonts](https://fonts.adobe.com/) ripper.
3 |
4 | ## [Get It Here](http://codezombie.github.io/TypeRip/)
5 |
6 | ### How to use it
7 | 1. Enter an Adobe Fonts [font family](https://fonts.adobe.com/fonts) or [font collection](https://fonts.adobe.com/collections) URL into the address bar, then press enter.
8 | 2. Browse the available fonts under this family, using the download button to save them to your machine.
9 | 3. That's it.
10 |
11 | ### Terms
12 | * Do not use any downloaded fonts for anything other than testing purposes. Think of it like a try-before-you-buy system. This tool merely saves a copy of what Adobe makes publicly available through their website, but this does not give you the _legal right_ to use the fonts as if you have purchased a license. If you want to publish any work using these fonts, or do _anything_ restricted to license-holders by said license, you _must_ purchase a license through Adobe.
13 |
14 | ### Whats new?
15 |
16 | January 7th, 2024:
17 | * Complete rewrite using Vite, Vue components and other _modern javascript practices_.
18 | * Removed all OpenType.js-based font rebuilding as this wasn't working well and is no longer necessary because:
19 | * We now have access to the full-featured font file in WOFF2 format with no missing glyphs or broken kerning or anything thanks to [research](https://github.com/CodeZombie/TypeRip/issues/27) by [Artellia](https://github.com/Artellia).
20 | * Fonts are converted automatically from WOFF2 to TTF format in the browser before downloading for ease-of-installation as Windows does not natively support WOFF2.
21 |
22 | May 5, 2021:
23 | * Typerip can now rip the entire available character set from any font. Big thanks to everyone that reported bugs and collected information on this issue.
24 | * Added the option to download fonts without processing. This is useful if your download hangs and/or crashes your browser. Downloading the fonts without processing will always work, but you will have to edit the fonts manually to change their names and ensure compatibility with your OS.
25 |
26 | May 3, 2021:
27 | * Added the ability to read font collection URLs and download their contents as you would with a font family.
28 | * Added a "Download All" button to font families and collections, downloading a single zip of all the contents of the font pack.
29 | * Fonts now download as a ZIP archive.
30 | * Switched to a more consistent CORS proxy.
31 |
32 | March 22, 2020:
33 | * Cosmetic fixes
34 | * Removed all references to "TypeKit", as Adobe has renamed the service to "Adobe Fonts"
35 |
36 | March 9, 2020:
37 | * Fixed a bug in OpenType.js that would fail to re-encode some fonts.
38 |
39 | Oct 21, 2019:
40 | * Rewrote entire application from scratch
41 | * New, cleaner and simpler user interface
42 | * Fonts are automatically repaired and renamed correctly
43 |
44 | ### Screenshot
45 | 
46 |
47 | ### License
48 | typerip.js is released under the WTFPL (http://www.wtfpl.net/)
49 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | TypeRip
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "typerip",
3 | "version": "0.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "typerip",
9 | "version": "0.0.0",
10 | "dependencies": {
11 | "axios": "^1.6.0",
12 | "file-saver": "^2.0.4",
13 | "vue": "^3.3.11"
14 | },
15 | "devDependencies": {
16 | "@vitejs/plugin-vue": "^4.5.2",
17 | "gh-pages": "^6.1.1",
18 | "vite": "^5.0.8"
19 | }
20 | },
21 | "node_modules/@babel/parser": {
22 | "version": "7.23.6",
23 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
24 | "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
25 | "bin": {
26 | "parser": "bin/babel-parser.js"
27 | },
28 | "engines": {
29 | "node": ">=6.0.0"
30 | }
31 | },
32 | "node_modules/@esbuild/aix-ppc64": {
33 | "version": "0.21.5",
34 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
35 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
36 | "cpu": [
37 | "ppc64"
38 | ],
39 | "dev": true,
40 | "license": "MIT",
41 | "optional": true,
42 | "os": [
43 | "aix"
44 | ],
45 | "engines": {
46 | "node": ">=12"
47 | }
48 | },
49 | "node_modules/@esbuild/android-arm": {
50 | "version": "0.21.5",
51 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
52 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
53 | "cpu": [
54 | "arm"
55 | ],
56 | "dev": true,
57 | "license": "MIT",
58 | "optional": true,
59 | "os": [
60 | "android"
61 | ],
62 | "engines": {
63 | "node": ">=12"
64 | }
65 | },
66 | "node_modules/@esbuild/android-arm64": {
67 | "version": "0.21.5",
68 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
69 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
70 | "cpu": [
71 | "arm64"
72 | ],
73 | "dev": true,
74 | "license": "MIT",
75 | "optional": true,
76 | "os": [
77 | "android"
78 | ],
79 | "engines": {
80 | "node": ">=12"
81 | }
82 | },
83 | "node_modules/@esbuild/android-x64": {
84 | "version": "0.21.5",
85 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
86 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
87 | "cpu": [
88 | "x64"
89 | ],
90 | "dev": true,
91 | "license": "MIT",
92 | "optional": true,
93 | "os": [
94 | "android"
95 | ],
96 | "engines": {
97 | "node": ">=12"
98 | }
99 | },
100 | "node_modules/@esbuild/darwin-arm64": {
101 | "version": "0.21.5",
102 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
103 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
104 | "cpu": [
105 | "arm64"
106 | ],
107 | "dev": true,
108 | "license": "MIT",
109 | "optional": true,
110 | "os": [
111 | "darwin"
112 | ],
113 | "engines": {
114 | "node": ">=12"
115 | }
116 | },
117 | "node_modules/@esbuild/darwin-x64": {
118 | "version": "0.21.5",
119 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
120 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
121 | "cpu": [
122 | "x64"
123 | ],
124 | "dev": true,
125 | "license": "MIT",
126 | "optional": true,
127 | "os": [
128 | "darwin"
129 | ],
130 | "engines": {
131 | "node": ">=12"
132 | }
133 | },
134 | "node_modules/@esbuild/freebsd-arm64": {
135 | "version": "0.21.5",
136 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
137 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
138 | "cpu": [
139 | "arm64"
140 | ],
141 | "dev": true,
142 | "license": "MIT",
143 | "optional": true,
144 | "os": [
145 | "freebsd"
146 | ],
147 | "engines": {
148 | "node": ">=12"
149 | }
150 | },
151 | "node_modules/@esbuild/freebsd-x64": {
152 | "version": "0.21.5",
153 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
154 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
155 | "cpu": [
156 | "x64"
157 | ],
158 | "dev": true,
159 | "license": "MIT",
160 | "optional": true,
161 | "os": [
162 | "freebsd"
163 | ],
164 | "engines": {
165 | "node": ">=12"
166 | }
167 | },
168 | "node_modules/@esbuild/linux-arm": {
169 | "version": "0.21.5",
170 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
171 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
172 | "cpu": [
173 | "arm"
174 | ],
175 | "dev": true,
176 | "license": "MIT",
177 | "optional": true,
178 | "os": [
179 | "linux"
180 | ],
181 | "engines": {
182 | "node": ">=12"
183 | }
184 | },
185 | "node_modules/@esbuild/linux-arm64": {
186 | "version": "0.21.5",
187 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
188 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
189 | "cpu": [
190 | "arm64"
191 | ],
192 | "dev": true,
193 | "license": "MIT",
194 | "optional": true,
195 | "os": [
196 | "linux"
197 | ],
198 | "engines": {
199 | "node": ">=12"
200 | }
201 | },
202 | "node_modules/@esbuild/linux-ia32": {
203 | "version": "0.21.5",
204 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
205 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
206 | "cpu": [
207 | "ia32"
208 | ],
209 | "dev": true,
210 | "license": "MIT",
211 | "optional": true,
212 | "os": [
213 | "linux"
214 | ],
215 | "engines": {
216 | "node": ">=12"
217 | }
218 | },
219 | "node_modules/@esbuild/linux-loong64": {
220 | "version": "0.21.5",
221 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
222 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
223 | "cpu": [
224 | "loong64"
225 | ],
226 | "dev": true,
227 | "license": "MIT",
228 | "optional": true,
229 | "os": [
230 | "linux"
231 | ],
232 | "engines": {
233 | "node": ">=12"
234 | }
235 | },
236 | "node_modules/@esbuild/linux-mips64el": {
237 | "version": "0.21.5",
238 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
239 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
240 | "cpu": [
241 | "mips64el"
242 | ],
243 | "dev": true,
244 | "license": "MIT",
245 | "optional": true,
246 | "os": [
247 | "linux"
248 | ],
249 | "engines": {
250 | "node": ">=12"
251 | }
252 | },
253 | "node_modules/@esbuild/linux-ppc64": {
254 | "version": "0.21.5",
255 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
256 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
257 | "cpu": [
258 | "ppc64"
259 | ],
260 | "dev": true,
261 | "license": "MIT",
262 | "optional": true,
263 | "os": [
264 | "linux"
265 | ],
266 | "engines": {
267 | "node": ">=12"
268 | }
269 | },
270 | "node_modules/@esbuild/linux-riscv64": {
271 | "version": "0.21.5",
272 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
273 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
274 | "cpu": [
275 | "riscv64"
276 | ],
277 | "dev": true,
278 | "license": "MIT",
279 | "optional": true,
280 | "os": [
281 | "linux"
282 | ],
283 | "engines": {
284 | "node": ">=12"
285 | }
286 | },
287 | "node_modules/@esbuild/linux-s390x": {
288 | "version": "0.21.5",
289 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
290 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
291 | "cpu": [
292 | "s390x"
293 | ],
294 | "dev": true,
295 | "license": "MIT",
296 | "optional": true,
297 | "os": [
298 | "linux"
299 | ],
300 | "engines": {
301 | "node": ">=12"
302 | }
303 | },
304 | "node_modules/@esbuild/linux-x64": {
305 | "version": "0.21.5",
306 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
307 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
308 | "cpu": [
309 | "x64"
310 | ],
311 | "dev": true,
312 | "license": "MIT",
313 | "optional": true,
314 | "os": [
315 | "linux"
316 | ],
317 | "engines": {
318 | "node": ">=12"
319 | }
320 | },
321 | "node_modules/@esbuild/netbsd-x64": {
322 | "version": "0.21.5",
323 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
324 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
325 | "cpu": [
326 | "x64"
327 | ],
328 | "dev": true,
329 | "license": "MIT",
330 | "optional": true,
331 | "os": [
332 | "netbsd"
333 | ],
334 | "engines": {
335 | "node": ">=12"
336 | }
337 | },
338 | "node_modules/@esbuild/openbsd-x64": {
339 | "version": "0.21.5",
340 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
341 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
342 | "cpu": [
343 | "x64"
344 | ],
345 | "dev": true,
346 | "license": "MIT",
347 | "optional": true,
348 | "os": [
349 | "openbsd"
350 | ],
351 | "engines": {
352 | "node": ">=12"
353 | }
354 | },
355 | "node_modules/@esbuild/sunos-x64": {
356 | "version": "0.21.5",
357 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
358 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
359 | "cpu": [
360 | "x64"
361 | ],
362 | "dev": true,
363 | "license": "MIT",
364 | "optional": true,
365 | "os": [
366 | "sunos"
367 | ],
368 | "engines": {
369 | "node": ">=12"
370 | }
371 | },
372 | "node_modules/@esbuild/win32-arm64": {
373 | "version": "0.21.5",
374 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
375 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
376 | "cpu": [
377 | "arm64"
378 | ],
379 | "dev": true,
380 | "license": "MIT",
381 | "optional": true,
382 | "os": [
383 | "win32"
384 | ],
385 | "engines": {
386 | "node": ">=12"
387 | }
388 | },
389 | "node_modules/@esbuild/win32-ia32": {
390 | "version": "0.21.5",
391 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
392 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
393 | "cpu": [
394 | "ia32"
395 | ],
396 | "dev": true,
397 | "license": "MIT",
398 | "optional": true,
399 | "os": [
400 | "win32"
401 | ],
402 | "engines": {
403 | "node": ">=12"
404 | }
405 | },
406 | "node_modules/@esbuild/win32-x64": {
407 | "version": "0.21.5",
408 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
409 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
410 | "cpu": [
411 | "x64"
412 | ],
413 | "dev": true,
414 | "license": "MIT",
415 | "optional": true,
416 | "os": [
417 | "win32"
418 | ],
419 | "engines": {
420 | "node": ">=12"
421 | }
422 | },
423 | "node_modules/@jridgewell/sourcemap-codec": {
424 | "version": "1.4.15",
425 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
426 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
427 | },
428 | "node_modules/@rollup/rollup-android-arm-eabi": {
429 | "version": "4.27.3",
430 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz",
431 | "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==",
432 | "cpu": [
433 | "arm"
434 | ],
435 | "dev": true,
436 | "license": "MIT",
437 | "optional": true,
438 | "os": [
439 | "android"
440 | ]
441 | },
442 | "node_modules/@rollup/rollup-android-arm64": {
443 | "version": "4.27.3",
444 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz",
445 | "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==",
446 | "cpu": [
447 | "arm64"
448 | ],
449 | "dev": true,
450 | "license": "MIT",
451 | "optional": true,
452 | "os": [
453 | "android"
454 | ]
455 | },
456 | "node_modules/@rollup/rollup-darwin-arm64": {
457 | "version": "4.27.3",
458 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz",
459 | "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==",
460 | "cpu": [
461 | "arm64"
462 | ],
463 | "dev": true,
464 | "license": "MIT",
465 | "optional": true,
466 | "os": [
467 | "darwin"
468 | ]
469 | },
470 | "node_modules/@rollup/rollup-darwin-x64": {
471 | "version": "4.27.3",
472 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz",
473 | "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==",
474 | "cpu": [
475 | "x64"
476 | ],
477 | "dev": true,
478 | "license": "MIT",
479 | "optional": true,
480 | "os": [
481 | "darwin"
482 | ]
483 | },
484 | "node_modules/@rollup/rollup-freebsd-arm64": {
485 | "version": "4.27.3",
486 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz",
487 | "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==",
488 | "cpu": [
489 | "arm64"
490 | ],
491 | "dev": true,
492 | "license": "MIT",
493 | "optional": true,
494 | "os": [
495 | "freebsd"
496 | ]
497 | },
498 | "node_modules/@rollup/rollup-freebsd-x64": {
499 | "version": "4.27.3",
500 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz",
501 | "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==",
502 | "cpu": [
503 | "x64"
504 | ],
505 | "dev": true,
506 | "license": "MIT",
507 | "optional": true,
508 | "os": [
509 | "freebsd"
510 | ]
511 | },
512 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
513 | "version": "4.27.3",
514 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz",
515 | "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==",
516 | "cpu": [
517 | "arm"
518 | ],
519 | "dev": true,
520 | "license": "MIT",
521 | "optional": true,
522 | "os": [
523 | "linux"
524 | ]
525 | },
526 | "node_modules/@rollup/rollup-linux-arm-musleabihf": {
527 | "version": "4.27.3",
528 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz",
529 | "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==",
530 | "cpu": [
531 | "arm"
532 | ],
533 | "dev": true,
534 | "license": "MIT",
535 | "optional": true,
536 | "os": [
537 | "linux"
538 | ]
539 | },
540 | "node_modules/@rollup/rollup-linux-arm64-gnu": {
541 | "version": "4.27.3",
542 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz",
543 | "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==",
544 | "cpu": [
545 | "arm64"
546 | ],
547 | "dev": true,
548 | "license": "MIT",
549 | "optional": true,
550 | "os": [
551 | "linux"
552 | ]
553 | },
554 | "node_modules/@rollup/rollup-linux-arm64-musl": {
555 | "version": "4.27.3",
556 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz",
557 | "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==",
558 | "cpu": [
559 | "arm64"
560 | ],
561 | "dev": true,
562 | "license": "MIT",
563 | "optional": true,
564 | "os": [
565 | "linux"
566 | ]
567 | },
568 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
569 | "version": "4.27.3",
570 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz",
571 | "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==",
572 | "cpu": [
573 | "ppc64"
574 | ],
575 | "dev": true,
576 | "license": "MIT",
577 | "optional": true,
578 | "os": [
579 | "linux"
580 | ]
581 | },
582 | "node_modules/@rollup/rollup-linux-riscv64-gnu": {
583 | "version": "4.27.3",
584 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz",
585 | "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==",
586 | "cpu": [
587 | "riscv64"
588 | ],
589 | "dev": true,
590 | "license": "MIT",
591 | "optional": true,
592 | "os": [
593 | "linux"
594 | ]
595 | },
596 | "node_modules/@rollup/rollup-linux-s390x-gnu": {
597 | "version": "4.27.3",
598 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz",
599 | "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==",
600 | "cpu": [
601 | "s390x"
602 | ],
603 | "dev": true,
604 | "license": "MIT",
605 | "optional": true,
606 | "os": [
607 | "linux"
608 | ]
609 | },
610 | "node_modules/@rollup/rollup-linux-x64-gnu": {
611 | "version": "4.27.3",
612 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz",
613 | "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==",
614 | "cpu": [
615 | "x64"
616 | ],
617 | "dev": true,
618 | "license": "MIT",
619 | "optional": true,
620 | "os": [
621 | "linux"
622 | ]
623 | },
624 | "node_modules/@rollup/rollup-linux-x64-musl": {
625 | "version": "4.27.3",
626 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz",
627 | "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==",
628 | "cpu": [
629 | "x64"
630 | ],
631 | "dev": true,
632 | "license": "MIT",
633 | "optional": true,
634 | "os": [
635 | "linux"
636 | ]
637 | },
638 | "node_modules/@rollup/rollup-win32-arm64-msvc": {
639 | "version": "4.27.3",
640 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz",
641 | "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==",
642 | "cpu": [
643 | "arm64"
644 | ],
645 | "dev": true,
646 | "license": "MIT",
647 | "optional": true,
648 | "os": [
649 | "win32"
650 | ]
651 | },
652 | "node_modules/@rollup/rollup-win32-ia32-msvc": {
653 | "version": "4.27.3",
654 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz",
655 | "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==",
656 | "cpu": [
657 | "ia32"
658 | ],
659 | "dev": true,
660 | "license": "MIT",
661 | "optional": true,
662 | "os": [
663 | "win32"
664 | ]
665 | },
666 | "node_modules/@rollup/rollup-win32-x64-msvc": {
667 | "version": "4.27.3",
668 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz",
669 | "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==",
670 | "cpu": [
671 | "x64"
672 | ],
673 | "dev": true,
674 | "license": "MIT",
675 | "optional": true,
676 | "os": [
677 | "win32"
678 | ]
679 | },
680 | "node_modules/@types/estree": {
681 | "version": "1.0.6",
682 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
683 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
684 | "dev": true,
685 | "license": "MIT"
686 | },
687 | "node_modules/@vitejs/plugin-vue": {
688 | "version": "4.6.2",
689 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz",
690 | "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==",
691 | "dev": true,
692 | "engines": {
693 | "node": "^14.18.0 || >=16.0.0"
694 | },
695 | "peerDependencies": {
696 | "vite": "^4.0.0 || ^5.0.0",
697 | "vue": "^3.2.25"
698 | }
699 | },
700 | "node_modules/@vue/compiler-core": {
701 | "version": "3.4.3",
702 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.3.tgz",
703 | "integrity": "sha512-u8jzgFg0EDtSrb/hG53Wwh1bAOQFtc1ZCegBpA/glyvTlgHl+tq13o1zvRfLbegYUw/E4mSTGOiCnAJ9SJ+lsg==",
704 | "dependencies": {
705 | "@babel/parser": "^7.23.6",
706 | "@vue/shared": "3.4.3",
707 | "entities": "^4.5.0",
708 | "estree-walker": "^2.0.2",
709 | "source-map-js": "^1.0.2"
710 | }
711 | },
712 | "node_modules/@vue/compiler-dom": {
713 | "version": "3.4.3",
714 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.3.tgz",
715 | "integrity": "sha512-oGF1E9/htI6JWj/lTJgr6UgxNCtNHbM6xKVreBWeZL9QhRGABRVoWGAzxmtBfSOd+w0Zi5BY0Es/tlJrN6WgEg==",
716 | "dependencies": {
717 | "@vue/compiler-core": "3.4.3",
718 | "@vue/shared": "3.4.3"
719 | }
720 | },
721 | "node_modules/@vue/compiler-sfc": {
722 | "version": "3.4.3",
723 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.3.tgz",
724 | "integrity": "sha512-NuJqb5is9I4uzv316VRUDYgIlPZCG8D+ARt5P4t5UDShIHKL25J3TGZAUryY/Aiy0DsY7srJnZL5ryB6DD63Zw==",
725 | "dependencies": {
726 | "@babel/parser": "^7.23.6",
727 | "@vue/compiler-core": "3.4.3",
728 | "@vue/compiler-dom": "3.4.3",
729 | "@vue/compiler-ssr": "3.4.3",
730 | "@vue/shared": "3.4.3",
731 | "estree-walker": "^2.0.2",
732 | "magic-string": "^0.30.5",
733 | "postcss": "^8.4.32",
734 | "source-map-js": "^1.0.2"
735 | }
736 | },
737 | "node_modules/@vue/compiler-ssr": {
738 | "version": "3.4.3",
739 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.3.tgz",
740 | "integrity": "sha512-wnYQtMBkeFSxgSSQbYGQeXPhQacQiog2c6AlvMldQH6DB+gSXK/0F6DVXAJfEiuBSgBhUc8dwrrG5JQcqwalsA==",
741 | "dependencies": {
742 | "@vue/compiler-dom": "3.4.3",
743 | "@vue/shared": "3.4.3"
744 | }
745 | },
746 | "node_modules/@vue/reactivity": {
747 | "version": "3.4.3",
748 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.3.tgz",
749 | "integrity": "sha512-q5f9HLDU+5aBKizXHAx0w4whkIANs1Muiq9R5YXm0HtorSlflqv9u/ohaMxuuhHWCji4xqpQ1eL04WvmAmGnFg==",
750 | "dependencies": {
751 | "@vue/shared": "3.4.3"
752 | }
753 | },
754 | "node_modules/@vue/runtime-core": {
755 | "version": "3.4.3",
756 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.3.tgz",
757 | "integrity": "sha512-C1r6QhB1qY7D591RCSFhMULyzL9CuyrGc+3PpB0h7dU4Qqw6GNyo4BNFjHZVvsWncrUlKX3DIKg0Y7rNNr06NQ==",
758 | "dependencies": {
759 | "@vue/reactivity": "3.4.3",
760 | "@vue/shared": "3.4.3"
761 | }
762 | },
763 | "node_modules/@vue/runtime-dom": {
764 | "version": "3.4.3",
765 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.3.tgz",
766 | "integrity": "sha512-wrsprg7An5Ec+EhPngWdPuzkp0BEUxAKaQtN9dPU/iZctPyD9aaXmVtehPJerdQxQale6gEnhpnfywNw3zOv2A==",
767 | "dependencies": {
768 | "@vue/runtime-core": "3.4.3",
769 | "@vue/shared": "3.4.3",
770 | "csstype": "^3.1.3"
771 | }
772 | },
773 | "node_modules/@vue/server-renderer": {
774 | "version": "3.4.3",
775 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.3.tgz",
776 | "integrity": "sha512-BUxt8oVGMKKsqSkM1uU3d3Houyfy4WAc2SpSQRebNd+XJGATVkW/rO129jkyL+kpB/2VRKzE63zwf5RtJ3XuZw==",
777 | "dependencies": {
778 | "@vue/compiler-ssr": "3.4.3",
779 | "@vue/shared": "3.4.3"
780 | },
781 | "peerDependencies": {
782 | "vue": "3.4.3"
783 | }
784 | },
785 | "node_modules/@vue/shared": {
786 | "version": "3.4.3",
787 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.3.tgz",
788 | "integrity": "sha512-rIwlkkP1n4uKrRzivAKPZIEkHiuwY5mmhMJ2nZKCBLz8lTUlE73rQh4n1OnnMurXt1vcUNyH4ZPfdh8QweTjpQ=="
789 | },
790 | "node_modules/array-union": {
791 | "version": "1.0.2",
792 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
793 | "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
794 | "dev": true,
795 | "dependencies": {
796 | "array-uniq": "^1.0.1"
797 | },
798 | "engines": {
799 | "node": ">=0.10.0"
800 | }
801 | },
802 | "node_modules/array-uniq": {
803 | "version": "1.0.3",
804 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
805 | "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
806 | "dev": true,
807 | "engines": {
808 | "node": ">=0.10.0"
809 | }
810 | },
811 | "node_modules/async": {
812 | "version": "3.2.5",
813 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
814 | "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
815 | "dev": true
816 | },
817 | "node_modules/asynckit": {
818 | "version": "0.4.0",
819 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
820 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
821 | },
822 | "node_modules/axios": {
823 | "version": "1.7.7",
824 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
825 | "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
826 | "license": "MIT",
827 | "dependencies": {
828 | "follow-redirects": "^1.15.6",
829 | "form-data": "^4.0.0",
830 | "proxy-from-env": "^1.1.0"
831 | }
832 | },
833 | "node_modules/balanced-match": {
834 | "version": "1.0.2",
835 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
836 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
837 | "dev": true
838 | },
839 | "node_modules/brace-expansion": {
840 | "version": "1.1.11",
841 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
842 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
843 | "dev": true,
844 | "dependencies": {
845 | "balanced-match": "^1.0.0",
846 | "concat-map": "0.0.1"
847 | }
848 | },
849 | "node_modules/combined-stream": {
850 | "version": "1.0.8",
851 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
852 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
853 | "dependencies": {
854 | "delayed-stream": "~1.0.0"
855 | },
856 | "engines": {
857 | "node": ">= 0.8"
858 | }
859 | },
860 | "node_modules/commander": {
861 | "version": "11.1.0",
862 | "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
863 | "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
864 | "dev": true,
865 | "engines": {
866 | "node": ">=16"
867 | }
868 | },
869 | "node_modules/commondir": {
870 | "version": "1.0.1",
871 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
872 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
873 | "dev": true
874 | },
875 | "node_modules/concat-map": {
876 | "version": "0.0.1",
877 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
878 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
879 | "dev": true
880 | },
881 | "node_modules/csstype": {
882 | "version": "3.1.3",
883 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
884 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
885 | },
886 | "node_modules/delayed-stream": {
887 | "version": "1.0.0",
888 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
889 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
890 | "engines": {
891 | "node": ">=0.4.0"
892 | }
893 | },
894 | "node_modules/email-addresses": {
895 | "version": "5.0.0",
896 | "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
897 | "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==",
898 | "dev": true
899 | },
900 | "node_modules/entities": {
901 | "version": "4.5.0",
902 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
903 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
904 | "engines": {
905 | "node": ">=0.12"
906 | },
907 | "funding": {
908 | "url": "https://github.com/fb55/entities?sponsor=1"
909 | }
910 | },
911 | "node_modules/esbuild": {
912 | "version": "0.21.5",
913 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
914 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
915 | "dev": true,
916 | "hasInstallScript": true,
917 | "license": "MIT",
918 | "bin": {
919 | "esbuild": "bin/esbuild"
920 | },
921 | "engines": {
922 | "node": ">=12"
923 | },
924 | "optionalDependencies": {
925 | "@esbuild/aix-ppc64": "0.21.5",
926 | "@esbuild/android-arm": "0.21.5",
927 | "@esbuild/android-arm64": "0.21.5",
928 | "@esbuild/android-x64": "0.21.5",
929 | "@esbuild/darwin-arm64": "0.21.5",
930 | "@esbuild/darwin-x64": "0.21.5",
931 | "@esbuild/freebsd-arm64": "0.21.5",
932 | "@esbuild/freebsd-x64": "0.21.5",
933 | "@esbuild/linux-arm": "0.21.5",
934 | "@esbuild/linux-arm64": "0.21.5",
935 | "@esbuild/linux-ia32": "0.21.5",
936 | "@esbuild/linux-loong64": "0.21.5",
937 | "@esbuild/linux-mips64el": "0.21.5",
938 | "@esbuild/linux-ppc64": "0.21.5",
939 | "@esbuild/linux-riscv64": "0.21.5",
940 | "@esbuild/linux-s390x": "0.21.5",
941 | "@esbuild/linux-x64": "0.21.5",
942 | "@esbuild/netbsd-x64": "0.21.5",
943 | "@esbuild/openbsd-x64": "0.21.5",
944 | "@esbuild/sunos-x64": "0.21.5",
945 | "@esbuild/win32-arm64": "0.21.5",
946 | "@esbuild/win32-ia32": "0.21.5",
947 | "@esbuild/win32-x64": "0.21.5"
948 | }
949 | },
950 | "node_modules/escape-string-regexp": {
951 | "version": "1.0.5",
952 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
953 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
954 | "dev": true,
955 | "engines": {
956 | "node": ">=0.8.0"
957 | }
958 | },
959 | "node_modules/estree-walker": {
960 | "version": "2.0.2",
961 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
962 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
963 | },
964 | "node_modules/file-saver": {
965 | "version": "2.0.5",
966 | "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
967 | "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
968 | },
969 | "node_modules/filename-reserved-regex": {
970 | "version": "2.0.0",
971 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
972 | "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
973 | "dev": true,
974 | "engines": {
975 | "node": ">=4"
976 | }
977 | },
978 | "node_modules/filenamify": {
979 | "version": "4.3.0",
980 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
981 | "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
982 | "dev": true,
983 | "dependencies": {
984 | "filename-reserved-regex": "^2.0.0",
985 | "strip-outer": "^1.0.1",
986 | "trim-repeated": "^1.0.0"
987 | },
988 | "engines": {
989 | "node": ">=8"
990 | },
991 | "funding": {
992 | "url": "https://github.com/sponsors/sindresorhus"
993 | }
994 | },
995 | "node_modules/find-cache-dir": {
996 | "version": "3.3.2",
997 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
998 | "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
999 | "dev": true,
1000 | "dependencies": {
1001 | "commondir": "^1.0.1",
1002 | "make-dir": "^3.0.2",
1003 | "pkg-dir": "^4.1.0"
1004 | },
1005 | "engines": {
1006 | "node": ">=8"
1007 | },
1008 | "funding": {
1009 | "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
1010 | }
1011 | },
1012 | "node_modules/find-up": {
1013 | "version": "4.1.0",
1014 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
1015 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
1016 | "dev": true,
1017 | "dependencies": {
1018 | "locate-path": "^5.0.0",
1019 | "path-exists": "^4.0.0"
1020 | },
1021 | "engines": {
1022 | "node": ">=8"
1023 | }
1024 | },
1025 | "node_modules/follow-redirects": {
1026 | "version": "1.15.9",
1027 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
1028 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
1029 | "funding": [
1030 | {
1031 | "type": "individual",
1032 | "url": "https://github.com/sponsors/RubenVerborgh"
1033 | }
1034 | ],
1035 | "license": "MIT",
1036 | "engines": {
1037 | "node": ">=4.0"
1038 | },
1039 | "peerDependenciesMeta": {
1040 | "debug": {
1041 | "optional": true
1042 | }
1043 | }
1044 | },
1045 | "node_modules/form-data": {
1046 | "version": "4.0.0",
1047 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
1048 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1049 | "dependencies": {
1050 | "asynckit": "^0.4.0",
1051 | "combined-stream": "^1.0.8",
1052 | "mime-types": "^2.1.12"
1053 | },
1054 | "engines": {
1055 | "node": ">= 6"
1056 | }
1057 | },
1058 | "node_modules/fs-extra": {
1059 | "version": "11.2.0",
1060 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
1061 | "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
1062 | "dev": true,
1063 | "dependencies": {
1064 | "graceful-fs": "^4.2.0",
1065 | "jsonfile": "^6.0.1",
1066 | "universalify": "^2.0.0"
1067 | },
1068 | "engines": {
1069 | "node": ">=14.14"
1070 | }
1071 | },
1072 | "node_modules/fs.realpath": {
1073 | "version": "1.0.0",
1074 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1075 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
1076 | "dev": true
1077 | },
1078 | "node_modules/fsevents": {
1079 | "version": "2.3.3",
1080 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1081 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1082 | "dev": true,
1083 | "hasInstallScript": true,
1084 | "license": "MIT",
1085 | "optional": true,
1086 | "os": [
1087 | "darwin"
1088 | ],
1089 | "engines": {
1090 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1091 | }
1092 | },
1093 | "node_modules/gh-pages": {
1094 | "version": "6.1.1",
1095 | "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.1.1.tgz",
1096 | "integrity": "sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==",
1097 | "dev": true,
1098 | "dependencies": {
1099 | "async": "^3.2.4",
1100 | "commander": "^11.0.0",
1101 | "email-addresses": "^5.0.0",
1102 | "filenamify": "^4.3.0",
1103 | "find-cache-dir": "^3.3.1",
1104 | "fs-extra": "^11.1.1",
1105 | "globby": "^6.1.0"
1106 | },
1107 | "bin": {
1108 | "gh-pages": "bin/gh-pages.js",
1109 | "gh-pages-clean": "bin/gh-pages-clean.js"
1110 | },
1111 | "engines": {
1112 | "node": ">=10"
1113 | }
1114 | },
1115 | "node_modules/glob": {
1116 | "version": "7.2.3",
1117 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1118 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1119 | "dev": true,
1120 | "dependencies": {
1121 | "fs.realpath": "^1.0.0",
1122 | "inflight": "^1.0.4",
1123 | "inherits": "2",
1124 | "minimatch": "^3.1.1",
1125 | "once": "^1.3.0",
1126 | "path-is-absolute": "^1.0.0"
1127 | },
1128 | "engines": {
1129 | "node": "*"
1130 | },
1131 | "funding": {
1132 | "url": "https://github.com/sponsors/isaacs"
1133 | }
1134 | },
1135 | "node_modules/globby": {
1136 | "version": "6.1.0",
1137 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
1138 | "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
1139 | "dev": true,
1140 | "dependencies": {
1141 | "array-union": "^1.0.1",
1142 | "glob": "^7.0.3",
1143 | "object-assign": "^4.0.1",
1144 | "pify": "^2.0.0",
1145 | "pinkie-promise": "^2.0.0"
1146 | },
1147 | "engines": {
1148 | "node": ">=0.10.0"
1149 | }
1150 | },
1151 | "node_modules/graceful-fs": {
1152 | "version": "4.2.11",
1153 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1154 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
1155 | "dev": true
1156 | },
1157 | "node_modules/inflight": {
1158 | "version": "1.0.6",
1159 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1160 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
1161 | "dev": true,
1162 | "dependencies": {
1163 | "once": "^1.3.0",
1164 | "wrappy": "1"
1165 | }
1166 | },
1167 | "node_modules/inherits": {
1168 | "version": "2.0.4",
1169 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1170 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1171 | "dev": true
1172 | },
1173 | "node_modules/jsonfile": {
1174 | "version": "6.1.0",
1175 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
1176 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
1177 | "dev": true,
1178 | "dependencies": {
1179 | "universalify": "^2.0.0"
1180 | },
1181 | "optionalDependencies": {
1182 | "graceful-fs": "^4.1.6"
1183 | }
1184 | },
1185 | "node_modules/locate-path": {
1186 | "version": "5.0.0",
1187 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
1188 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
1189 | "dev": true,
1190 | "dependencies": {
1191 | "p-locate": "^4.1.0"
1192 | },
1193 | "engines": {
1194 | "node": ">=8"
1195 | }
1196 | },
1197 | "node_modules/magic-string": {
1198 | "version": "0.30.5",
1199 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
1200 | "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
1201 | "dependencies": {
1202 | "@jridgewell/sourcemap-codec": "^1.4.15"
1203 | },
1204 | "engines": {
1205 | "node": ">=12"
1206 | }
1207 | },
1208 | "node_modules/make-dir": {
1209 | "version": "3.1.0",
1210 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1211 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1212 | "dev": true,
1213 | "dependencies": {
1214 | "semver": "^6.0.0"
1215 | },
1216 | "engines": {
1217 | "node": ">=8"
1218 | },
1219 | "funding": {
1220 | "url": "https://github.com/sponsors/sindresorhus"
1221 | }
1222 | },
1223 | "node_modules/mime-db": {
1224 | "version": "1.52.0",
1225 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1226 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1227 | "engines": {
1228 | "node": ">= 0.6"
1229 | }
1230 | },
1231 | "node_modules/mime-types": {
1232 | "version": "2.1.35",
1233 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1234 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1235 | "dependencies": {
1236 | "mime-db": "1.52.0"
1237 | },
1238 | "engines": {
1239 | "node": ">= 0.6"
1240 | }
1241 | },
1242 | "node_modules/minimatch": {
1243 | "version": "3.1.2",
1244 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1245 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1246 | "dev": true,
1247 | "dependencies": {
1248 | "brace-expansion": "^1.1.7"
1249 | },
1250 | "engines": {
1251 | "node": "*"
1252 | }
1253 | },
1254 | "node_modules/nanoid": {
1255 | "version": "3.3.7",
1256 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1257 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
1258 | "funding": [
1259 | {
1260 | "type": "github",
1261 | "url": "https://github.com/sponsors/ai"
1262 | }
1263 | ],
1264 | "bin": {
1265 | "nanoid": "bin/nanoid.cjs"
1266 | },
1267 | "engines": {
1268 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1269 | }
1270 | },
1271 | "node_modules/object-assign": {
1272 | "version": "4.1.1",
1273 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1274 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1275 | "dev": true,
1276 | "engines": {
1277 | "node": ">=0.10.0"
1278 | }
1279 | },
1280 | "node_modules/once": {
1281 | "version": "1.4.0",
1282 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1283 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1284 | "dev": true,
1285 | "dependencies": {
1286 | "wrappy": "1"
1287 | }
1288 | },
1289 | "node_modules/p-limit": {
1290 | "version": "2.3.0",
1291 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
1292 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
1293 | "dev": true,
1294 | "dependencies": {
1295 | "p-try": "^2.0.0"
1296 | },
1297 | "engines": {
1298 | "node": ">=6"
1299 | },
1300 | "funding": {
1301 | "url": "https://github.com/sponsors/sindresorhus"
1302 | }
1303 | },
1304 | "node_modules/p-locate": {
1305 | "version": "4.1.0",
1306 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
1307 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
1308 | "dev": true,
1309 | "dependencies": {
1310 | "p-limit": "^2.2.0"
1311 | },
1312 | "engines": {
1313 | "node": ">=8"
1314 | }
1315 | },
1316 | "node_modules/p-try": {
1317 | "version": "2.2.0",
1318 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1319 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1320 | "dev": true,
1321 | "engines": {
1322 | "node": ">=6"
1323 | }
1324 | },
1325 | "node_modules/path-exists": {
1326 | "version": "4.0.0",
1327 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1328 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1329 | "dev": true,
1330 | "engines": {
1331 | "node": ">=8"
1332 | }
1333 | },
1334 | "node_modules/path-is-absolute": {
1335 | "version": "1.0.1",
1336 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1337 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1338 | "dev": true,
1339 | "engines": {
1340 | "node": ">=0.10.0"
1341 | }
1342 | },
1343 | "node_modules/picocolors": {
1344 | "version": "1.1.1",
1345 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1346 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1347 | "license": "ISC"
1348 | },
1349 | "node_modules/pify": {
1350 | "version": "2.3.0",
1351 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1352 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
1353 | "dev": true,
1354 | "engines": {
1355 | "node": ">=0.10.0"
1356 | }
1357 | },
1358 | "node_modules/pinkie": {
1359 | "version": "2.0.4",
1360 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1361 | "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
1362 | "dev": true,
1363 | "engines": {
1364 | "node": ">=0.10.0"
1365 | }
1366 | },
1367 | "node_modules/pinkie-promise": {
1368 | "version": "2.0.1",
1369 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1370 | "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
1371 | "dev": true,
1372 | "dependencies": {
1373 | "pinkie": "^2.0.0"
1374 | },
1375 | "engines": {
1376 | "node": ">=0.10.0"
1377 | }
1378 | },
1379 | "node_modules/pkg-dir": {
1380 | "version": "4.2.0",
1381 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
1382 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
1383 | "dev": true,
1384 | "dependencies": {
1385 | "find-up": "^4.0.0"
1386 | },
1387 | "engines": {
1388 | "node": ">=8"
1389 | }
1390 | },
1391 | "node_modules/postcss": {
1392 | "version": "8.4.49",
1393 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
1394 | "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
1395 | "funding": [
1396 | {
1397 | "type": "opencollective",
1398 | "url": "https://opencollective.com/postcss/"
1399 | },
1400 | {
1401 | "type": "tidelift",
1402 | "url": "https://tidelift.com/funding/github/npm/postcss"
1403 | },
1404 | {
1405 | "type": "github",
1406 | "url": "https://github.com/sponsors/ai"
1407 | }
1408 | ],
1409 | "license": "MIT",
1410 | "dependencies": {
1411 | "nanoid": "^3.3.7",
1412 | "picocolors": "^1.1.1",
1413 | "source-map-js": "^1.2.1"
1414 | },
1415 | "engines": {
1416 | "node": "^10 || ^12 || >=14"
1417 | }
1418 | },
1419 | "node_modules/proxy-from-env": {
1420 | "version": "1.1.0",
1421 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1422 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
1423 | },
1424 | "node_modules/rollup": {
1425 | "version": "4.27.3",
1426 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz",
1427 | "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==",
1428 | "dev": true,
1429 | "license": "MIT",
1430 | "dependencies": {
1431 | "@types/estree": "1.0.6"
1432 | },
1433 | "bin": {
1434 | "rollup": "dist/bin/rollup"
1435 | },
1436 | "engines": {
1437 | "node": ">=18.0.0",
1438 | "npm": ">=8.0.0"
1439 | },
1440 | "optionalDependencies": {
1441 | "@rollup/rollup-android-arm-eabi": "4.27.3",
1442 | "@rollup/rollup-android-arm64": "4.27.3",
1443 | "@rollup/rollup-darwin-arm64": "4.27.3",
1444 | "@rollup/rollup-darwin-x64": "4.27.3",
1445 | "@rollup/rollup-freebsd-arm64": "4.27.3",
1446 | "@rollup/rollup-freebsd-x64": "4.27.3",
1447 | "@rollup/rollup-linux-arm-gnueabihf": "4.27.3",
1448 | "@rollup/rollup-linux-arm-musleabihf": "4.27.3",
1449 | "@rollup/rollup-linux-arm64-gnu": "4.27.3",
1450 | "@rollup/rollup-linux-arm64-musl": "4.27.3",
1451 | "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3",
1452 | "@rollup/rollup-linux-riscv64-gnu": "4.27.3",
1453 | "@rollup/rollup-linux-s390x-gnu": "4.27.3",
1454 | "@rollup/rollup-linux-x64-gnu": "4.27.3",
1455 | "@rollup/rollup-linux-x64-musl": "4.27.3",
1456 | "@rollup/rollup-win32-arm64-msvc": "4.27.3",
1457 | "@rollup/rollup-win32-ia32-msvc": "4.27.3",
1458 | "@rollup/rollup-win32-x64-msvc": "4.27.3",
1459 | "fsevents": "~2.3.2"
1460 | }
1461 | },
1462 | "node_modules/semver": {
1463 | "version": "6.3.1",
1464 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1465 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1466 | "dev": true,
1467 | "bin": {
1468 | "semver": "bin/semver.js"
1469 | }
1470 | },
1471 | "node_modules/source-map-js": {
1472 | "version": "1.2.1",
1473 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1474 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1475 | "license": "BSD-3-Clause",
1476 | "engines": {
1477 | "node": ">=0.10.0"
1478 | }
1479 | },
1480 | "node_modules/strip-outer": {
1481 | "version": "1.0.1",
1482 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
1483 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
1484 | "dev": true,
1485 | "dependencies": {
1486 | "escape-string-regexp": "^1.0.2"
1487 | },
1488 | "engines": {
1489 | "node": ">=0.10.0"
1490 | }
1491 | },
1492 | "node_modules/trim-repeated": {
1493 | "version": "1.0.0",
1494 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
1495 | "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
1496 | "dev": true,
1497 | "dependencies": {
1498 | "escape-string-regexp": "^1.0.2"
1499 | },
1500 | "engines": {
1501 | "node": ">=0.10.0"
1502 | }
1503 | },
1504 | "node_modules/universalify": {
1505 | "version": "2.0.1",
1506 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
1507 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
1508 | "dev": true,
1509 | "engines": {
1510 | "node": ">= 10.0.0"
1511 | }
1512 | },
1513 | "node_modules/vite": {
1514 | "version": "5.4.11",
1515 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
1516 | "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
1517 | "dev": true,
1518 | "license": "MIT",
1519 | "dependencies": {
1520 | "esbuild": "^0.21.3",
1521 | "postcss": "^8.4.43",
1522 | "rollup": "^4.20.0"
1523 | },
1524 | "bin": {
1525 | "vite": "bin/vite.js"
1526 | },
1527 | "engines": {
1528 | "node": "^18.0.0 || >=20.0.0"
1529 | },
1530 | "funding": {
1531 | "url": "https://github.com/vitejs/vite?sponsor=1"
1532 | },
1533 | "optionalDependencies": {
1534 | "fsevents": "~2.3.3"
1535 | },
1536 | "peerDependencies": {
1537 | "@types/node": "^18.0.0 || >=20.0.0",
1538 | "less": "*",
1539 | "lightningcss": "^1.21.0",
1540 | "sass": "*",
1541 | "sass-embedded": "*",
1542 | "stylus": "*",
1543 | "sugarss": "*",
1544 | "terser": "^5.4.0"
1545 | },
1546 | "peerDependenciesMeta": {
1547 | "@types/node": {
1548 | "optional": true
1549 | },
1550 | "less": {
1551 | "optional": true
1552 | },
1553 | "lightningcss": {
1554 | "optional": true
1555 | },
1556 | "sass": {
1557 | "optional": true
1558 | },
1559 | "sass-embedded": {
1560 | "optional": true
1561 | },
1562 | "stylus": {
1563 | "optional": true
1564 | },
1565 | "sugarss": {
1566 | "optional": true
1567 | },
1568 | "terser": {
1569 | "optional": true
1570 | }
1571 | }
1572 | },
1573 | "node_modules/vue": {
1574 | "version": "3.4.3",
1575 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.3.tgz",
1576 | "integrity": "sha512-GjN+culMAGv/mUbkIv8zMKItno8npcj5gWlXkSxf1SPTQf8eJ4A+YfHIvQFyL1IfuJcMl3soA7SmN1fRxbf/wA==",
1577 | "dependencies": {
1578 | "@vue/compiler-dom": "3.4.3",
1579 | "@vue/compiler-sfc": "3.4.3",
1580 | "@vue/runtime-dom": "3.4.3",
1581 | "@vue/server-renderer": "3.4.3",
1582 | "@vue/shared": "3.4.3"
1583 | },
1584 | "peerDependencies": {
1585 | "typescript": "*"
1586 | },
1587 | "peerDependenciesMeta": {
1588 | "typescript": {
1589 | "optional": true
1590 | }
1591 | }
1592 | },
1593 | "node_modules/wrappy": {
1594 | "version": "1.0.2",
1595 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1596 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1597 | "dev": true
1598 | }
1599 | }
1600 | }
1601 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "typerip",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "homepage": "https://badnoise.net/TypeRip/",
7 | "scripts": {
8 | "dev": "vite",
9 | "build": "vite build",
10 | "deploy": "vite build && gh-pages -d dist",
11 | "preview": "vite preview"
12 | },
13 | "dependencies": {
14 | "axios": "^1.6.0",
15 | "file-saver": "^2.0.4",
16 | "vue": "^3.3.11"
17 | },
18 | "devDependencies": {
19 | "@vitejs/plugin-vue": "^4.5.2",
20 | "gh-pages": "^6.1.1",
21 | "vite": "^5.0.8"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodeZombie/TypeRip/4208b4bbc0d797a814557770c123711d15626222/public/favicon.png
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
8 |
9 |
14 |
15 |
16 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/assets/typerip_logo_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodeZombie/TypeRip/4208b4bbc0d797a814557770c123711d15626222/src/assets/typerip_logo_small.png
--------------------------------------------------------------------------------
/src/assets/typerip_logo_transparent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodeZombie/TypeRip/4208b4bbc0d797a814557770c123711d15626222/src/assets/typerip_logo_transparent.png
--------------------------------------------------------------------------------
/src/components/FontBox.vue:
--------------------------------------------------------------------------------
1 |
2 |
18 |
19 |
20 |
21 |
27 |
28 |
51 |
--------------------------------------------------------------------------------
/src/components/FontSetContainer.vue:
--------------------------------------------------------------------------------
1 |
2 |
18 |
19 |
20 |
21 |
22 |
23 |
48 |
49 |
52 |
--------------------------------------------------------------------------------
/src/components/MessageBox.vue:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
18 |
--------------------------------------------------------------------------------
/src/components/SearchBar.vue:
--------------------------------------------------------------------------------
1 |
2 | Tr
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
26 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import './styles/hella.css'
3 | import './styles/main.css'
4 | import App from './App.vue'
5 |
6 | createApp(App).mount('#app')
7 |
--------------------------------------------------------------------------------
/src/models/fontset.js:
--------------------------------------------------------------------------------
1 | //A FontSet represents a group of fonts that belong to the same Collection or Family.
2 |
3 | export class FontSet {
4 | constructor(name, designers, fonts, sample_text) {
5 | this.name = name
6 | this.designers = designers
7 | this.fonts = fonts
8 | this.sampletext = sample_text
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/scripts/typerip.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import saveAs from 'file-saver';
3 | import 'https://unpkg.com/wawoff2@2.0.1/build/decompress_binding.js';
4 |
5 | export default class TypeRip {
6 | static CORSProxies = [
7 | "https://thingproxy.freeboard.io/fetch/", // Returns 404 when Adobe Fonts sends a 404
8 | "https://api.allorigins.win/raw?url=", // Returns a 200 when Adobe Fonts sends a 404
9 | "https://api.codetabs.com/v1/proxy/?quest=", // Returns a 200 when Adobe Fonts sends a 404
10 | "https://corsproxy.io/?", // Adobe Fonts sends a 404 through this one even when the URL is valid. Did Adobe blacklist this one?
11 | ];
12 |
13 | static Messages = Object.freeze({
14 | RequestFailed: "Check that the Adobe Fonts URL is correct, then check your internet connection, and then try again.",
15 | MalformedFontResponse: "Unexpected Adobe Fonts page structure. Please check your URL and try again, otherwise open an issue on GitHub.",
16 | AllProxiesFailed: "All CORS proxies failed. Please check your internet connection, otherwise open an issue on GitHub."
17 | })
18 |
19 | static URLTypes = Object.freeze({
20 | Invalid: 0,
21 | FontFamily: 1,
22 | FontCollection: 2
23 | });
24 |
25 | static ResponseTypes = Object.freeze({
26 | Success: 0,
27 | Error: 1
28 | });
29 |
30 | static prependHttpsToURL(url) {
31 | if (!url.toLowerCase().startsWith("http://") && !url.toLowerCase().startsWith("https://")) {
32 | url = "https://" + url;
33 | }
34 | return url
35 | }
36 |
37 | static getURLType(url){
38 | if(url.indexOf("fonts.adobe.com/collections") != -1){
39 | return this.URLTypes.FontCollection;
40 | }else if(url.indexOf("fonts.adobe.com/fonts") != -1){
41 | return this.URLTypes.FontFamily;
42 | }else{
43 | return this.URLTypes.Invalid;
44 | }
45 | }
46 |
47 | static getNetworkResource(url_) {
48 | let last_working_cors_proxy_index = parseInt(localStorage.getItem("cors_proxy_index"))
49 | if (last_working_cors_proxy_index == null || last_working_cors_proxy_index >= this.CORSProxies.length) {
50 | last_working_cors_proxy_index = 0
51 | }
52 |
53 | let re_ordered_cors_proxies = [...this.CORSProxies]
54 | re_ordered_cors_proxies.splice(last_working_cors_proxy_index, 1)
55 | re_ordered_cors_proxies.unshift(this.CORSProxies[last_working_cors_proxy_index])
56 |
57 | function try_all_proxies_until_success(proxy_index, proxy_list){
58 | let proxy = re_ordered_cors_proxies[proxy_index];
59 | return new Promise(function(resolve, reject) {
60 | axios.get(proxy + url_)
61 | .then((response) => {
62 | localStorage.setItem("cors_proxy_index", TypeRip.CORSProxies.indexOf(proxy));
63 | console.log("Succesful proxy: " + proxy)
64 | resolve(response);
65 | })
66 | .catch((error) => {
67 |
68 | // Don't check for 404 at this stage because some CORS proxies return a 404,
69 | // even if the Adobe Fonts URL is valid.
70 |
71 | // if (error.response){
72 | // if (error.response.status == 404) {
73 | // return reject(error);
74 | // }
75 | // }
76 |
77 | if (proxy_index + 1 >= proxy_list.length) {
78 | reject({message: TypeRip.Messages.AllProxiesFailed + " (#007)"})
79 | }else {
80 | try_all_proxies_until_success(proxy_index + 1, proxy_list)
81 | .then(resolve)
82 | .catch(reject);
83 | }
84 | });
85 | })
86 | }
87 |
88 | return try_all_proxies_until_success(0, re_ordered_cors_proxies)
89 | }
90 |
91 | //TODO: refactor this so that it returns a Promise instead of manually specifying a 'callback_' method.
92 | // then we can have our promise provide a "resolve" and "reject" interface instead of using this stupid `ResponseTypes` enum system
93 | static getFontCollection(url_, callback_){
94 | this.getNetworkResource(url_)
95 | .then((response) => {
96 | let fontCollection = {
97 | name: "",
98 | designers: [],
99 | fonts: []
100 | }
101 |
102 | //search for the first part of the json
103 | let json_start = response.data.toString().search('{"fontpack":{"all_valid_slugs":');
104 | if(json_start == -1) {
105 | callback_(this.ResponseTypes.Error, TypeRip.Messages.RequestFailed + " (#001)")
106 |
107 | // Because (as we've seen with corsproxy.io) it's possible for Adobe to return a 404 page to a proxy
108 | // when given a valid url, we have to consider that cors proxy can be blacklisted.
109 | // For this reaosn, we want to increment the cors_proxy_index so when the user tries agian, TypeRip will
110 | // attempt the network request with a different proxy.
111 | localStorage.setItem("cors_proxy_index", parseInt(localStorage.getItem("cors_proxy_index")) + 1)
112 | return
113 | }
114 |
115 | //cut off everything before this point
116 | let data = response.data.substring(json_start)
117 |
118 | //find the stuff directly after the json, and use this as the anchor
119 | let json_end = data.search('')
120 | if(json_end == -1) {
121 | callback_(this.ResponseTypes.Error, TypeRip.Messages.MalformedFontResponse + " (#002)")
122 | return
123 | }
124 |
125 | //parse the json blob
126 | let json;
127 | try {
128 | json = JSON.parse(data.substring(0, json_end));
129 | }catch(e){
130 | callback_(this.ResponseTypes.Error, TypeRip.Messages.MalformedFontResponse + " (#003)")
131 | return
132 | }
133 |
134 | //find the default language of the first font in this collection.
135 | fontCollection.defaultLanguage = json.fontpack.font_variations[0].default_language;
136 |
137 | //grab the sample text data for this language
138 | fontCollection.sampleText = json.textSampleData.textSamples[fontCollection.defaultLanguage]["list"];
139 |
140 | //Font collection name
141 | fontCollection.name = json.fontpack.name
142 |
143 | //Find the contributor who curated this collection:
144 | fontCollection.designers.push({
145 | "name": json.fontpack.contributor_credit,
146 | "url": url_
147 | })
148 |
149 | //populate subfonts
150 | for (let i = 0; i < json.fontpack.font_variations.length; i++) {
151 | fontCollection.fonts.push({
152 | url: "https://use.typekit.net/pf/tk/" + json.fontpack.font_variations[i].opaque_id + "/" + json.fontpack.font_variations[i].fvd + "/l?unicode=AAAAAQAAAAEAAAAB&features=ALL&v=3&ec_token=3bb2a6e53c9684ffdc9a9bf71d5b2a620e68abb153386c46ebe547292f11a96176a59ec4f0c7aacfef2663c08018dc100eedf850c284fb72392ba910777487b32ba21c08cc8c33d00bda49e7e2cc90baff01835518dde43e2e8d5ebf7b76545fc2687ab10bc2b0911a141f3cf7f04f3cac438a135f",
153 | name: json.fontpack.font_variations[i].full_display_name,
154 | style: json.fontpack.font_variations[i].variation_name,
155 | familyName: json.fontpack.font_variations[i].family.name,
156 | familyUrl: "https://fonts.adobe.com/fonts/" + json.fontpack.font_variations[i].family.slug
157 | });
158 | }
159 |
160 | callback_(this.ResponseTypes.Success, fontCollection)
161 | })
162 | .catch( (error) => {
163 | callback_(this.ResponseTypes.Error, error.message)
164 | })
165 | }
166 |
167 | static getFontFamily(url_, callback_) {
168 | this.getNetworkResource(url_)
169 | .then((response) => {
170 | let fontFamily = {
171 | name: "",
172 | designers: [],
173 | fonts: []
174 | }
175 |
176 | //search for the first part of the json
177 | let json_start = response.data.toString().search('{"family":{"slug":"');
178 | if(json_start == -1) {
179 | callback_(this.ResponseTypes.Error, TypeRip.Messages.RequestFailed + " (#004)")
180 |
181 | // Because (as we've seen with corsproxy.io) it's possible for Adobe to return a 404 page to a proxy
182 | // when given a valid url, we have to consider that cors proxy can be blacklisted.
183 | // For this reaosn, we want to increment the cors_proxy_index so when the user tries agian, TypeRip will
184 | // attempt the network request with a different proxy.
185 | localStorage.setItem("cors_proxy_index", parseInt(localStorage.getItem("cors_proxy_index")) + 1)
186 | return
187 | }
188 |
189 | //cut off everything before this point
190 | let data = response.data.substring(json_start)
191 |
192 | //find the stuff directly after the json, and use this as the anchor
193 | let json_end = data.search('')
194 | if(json_end == -1) {
195 | callback_(this.ResponseTypes.Error, TypeRip.Messages.MalformedFontResponse + " (#005)")
196 | return
197 | }
198 |
199 | //parse the json blob
200 | let json;
201 | try {
202 | json = JSON.parse(data.substring(0, json_end));
203 | }catch(e){
204 | callback_(this.ResponseTypes.Error, TypeRip.Messages.MalformedFontResponse + " (#006)")
205 | return
206 | }
207 |
208 | //find the default language of this font
209 | fontFamily.defaultLanguage = json.family.display_font.default_language;
210 |
211 | //grab the sample text data for this language
212 | fontFamily.sampleText = json.textSampleData.textSamples[fontFamily.defaultLanguage]["list"];
213 |
214 | //family/foundry names
215 | fontFamily.foundryName = json.family.foundry.name;
216 | fontFamily.name = json.family.name
217 | fontFamily.slug = json.family.slug
218 |
219 | //designers
220 | for(let i = 0; i < json.family.designers.length; i++) {
221 | let designer = {}
222 | designer["name"] = json.family.designers[i].name
223 |
224 | if(json.designer_info[json.family.designers[i].slug] != null){
225 | designer["url"] = "https://fonts.adobe.com" + json.designer_info[json.family.designers[i].slug].url
226 | }
227 |
228 | fontFamily.designers.push(designer)
229 | }
230 |
231 | //populate subfonts
232 | for (let i = 0; i < json.family.fonts.length; i++) {
233 | fontFamily.fonts.push({
234 | url: "https://use.typekit.net/pf/tk/" + json.family.fonts[i].family.web_id + "/" + json.family.fonts[i].font.web.fvd + "/l?unicode=AAAAAQAAAAEAAAAB&features=ALL&v=3&ec_token=3bb2a6e53c9684ffdc9a9bf71d5b2a620e68abb153386c46ebe547292f11a96176a59ec4f0c7aacfef2663c08018dc100eedf850c284fb72392ba910777487b32ba21c08cc8c33d00bda49e7e2cc90baff01835518dde43e2e8d5ebf7b76545fc2687ab10bc2b0911a141f3cf7f04f3cac438a135f",
235 | name: json.family.fonts[i].name,
236 | style: json.family.fonts[i].variation_name,
237 | familyName: json.family.fonts[i].preferred_family_name,
238 | familyUrl: "https://fonts.adobe.com/fonts/" + json.family.slug
239 | });
240 | }
241 | callback_(this.ResponseTypes.Success, fontFamily)
242 | })
243 | .catch((error) => {
244 | callback_(this.ResponseTypes.Error, error.message)
245 | })
246 | }
247 |
248 | static async downloadFontsAsZip(fonts, zipfile_name){
249 | for(var i = 0; i < fonts.length; i++) {
250 | var file = await this.getFontFile(fonts[i])
251 | saveAs(new Blob([file]), fonts[i].name + ".ttf");
252 | }
253 | }
254 |
255 | static async convertWoff2ToTTF(woff2Uint8Array) {
256 | const loadScript = (src) => new Promise((onload) => document.documentElement.append(
257 | Object.assign(document.createElement('script'), {src, onload})
258 | ));
259 | if (!window.Module) {
260 | const path = 'https://unpkg.com/wawoff2@2.0.1/build/decompress_binding.js'
261 | const init = new Promise((done) => window.Module = { onRuntimeInitialized: done});
262 | await loadScript(path).then(() => init);
263 | }
264 |
265 | return Module.decompress(woff2Uint8Array)
266 | }
267 |
268 | static async getFontFile(font) {
269 | let response = await axios.get(font.url, {responseType: 'arraybuffer'})
270 | return this.convertWoff2ToTTF(new Uint8Array(response.data));
271 | }
272 | }
273 |
--------------------------------------------------------------------------------
/src/styles/hella.css:
--------------------------------------------------------------------------------
1 | .grid {
2 | width:100%;
3 | padding: 0 32px;
4 | max-width:1024px;
5 | margin: 0 auto;
6 | box-sizing: border-box;
7 | }
8 | .row {
9 | display: flex;
10 | flex-flow: row;
11 | }
12 | .row:after, .grid:after{
13 | clear:both;
14 | content:"";
15 | display:table;
16 | }
17 | .column{
18 | display: flex;
19 | flex-direction: column;
20 | flex-grow: 0;
21 | width:100%;
22 | float:left;
23 | box-sizing:border-box;
24 | }
25 | @media only all{
26 | .column:not(.no-margin){margin-right:2%;}
27 | .column:last-child{margin-right: 0;}
28 | .column.one{width:6.5%;}
29 | .column.one.no-margin:not(:last-child){width:8.5%;}
30 | .column.two{width: 15%;}
31 | .column.two.no-margin:not(:last-child){width:17%;}
32 | .column.three{width: 23.5%;}
33 | .column.three.no-margin:not(:last-child){width:25.5%}
34 | .column.four{width: 32%;}
35 | .column.four.no-margin:not(:last-child){width:34%}
36 | .column.five{width: 40.5%;}
37 | .column.five.no-margin:not(:last-child){width:42.5%}
38 | .column.six{width: 49%;}
39 | .column.six.no-margin:not(:last-child){width:51%}
40 | .column.seven{width: 57.5%;}
41 | .column.seven.no-margin:not(:last-child){width:59.5%}
42 | .column.eight{width: 66%;}
43 | .column.eight.no-margin:not(:last-child){width:68%}
44 | .column.nine{width: 74.5%;}
45 | .column.nine.no-margin:not(:last-child){width:76.5%}
46 | .column.ten{width:83%;}
47 | .column.ten.no-margin:not(:last-child){width:85%}
48 | .column.eleven{width:91.5%}
49 | .column.eleven.no-margin:not(:last-child){width:93.5%}
50 | .column.offset-one{margin-left:8.5%;}
51 | .column.offset-two{margin-left:17%;}
52 | .column.offset-three{margin-left:25.5%;}
53 | .column.offset-four{margin-left:34%;}
54 | .column.offset-five{margin-left:42.5%;}
55 | .column.offset-six{margin-left:51%;}
56 | .column.offset-seven{margin-left:59.5%;}
57 | .column.offset-eight{margin-left:68%;}
58 | .column.offset-nine{margin-left:76.5%;}
59 | .column.offset-ten{margin-left:85%;}
60 | .column.offset-eleven{margin-left:93.5%;}
61 | }
62 | @media (max-width: 640px){
63 | .row:not(.non-responsive) > .column{
64 | width:100% !important;
65 | margin-right:0;
66 | margin-left:0;
67 | }
68 | .large-only {
69 | display:none;
70 | }
71 | .row:not(.non-responsive){
72 | flex-direction: column;
73 | }
74 | }
75 | @media (min-width: 640px){
76 | .small-only {
77 | display:none;
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/src/styles/main.css:
--------------------------------------------------------------------------------
1 | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
2 | margin: 0;
3 | padding: 0;
4 | border: 0;
5 | font-size: 100%;
6 | font: inherit;
7 | vertical-align: baseline;
8 | }
9 |
10 | html {
11 | font-size: 62.5%;
12 | }
13 |
14 | body {
15 | font-size:1.6em;
16 | line-height:1.5;
17 | font-family: 'Source Sans Pro', sans-serif;
18 | }
19 |
20 | h1, h2, h3, h4, h5, h6 {
21 | font-weight:400;
22 | }
23 | h1 { font-size: 5rem; }
24 | h2 { font-size: 4.5rem; }
25 | h3 { font-size: 4rem; }
26 | h4 { font-size: 3.5rem; }
27 | h5 { font-size: 3rem; }
28 | h6 { font-size: 2.5rem; }
29 | .subtext {
30 | font-size:1.85rem;
31 | font-weight: 300;
32 | }
33 | .subtext strong {
34 | font-weight: 400;
35 | }
36 |
37 | header, .alertBox, .item, footer {
38 | margin-bottom: 3rem;
39 | }
40 |
41 | em{
42 | font-style: italic;
43 | }
44 |
45 | header {
46 | width:100%;
47 | display: flex;
48 | flex-direction: row;
49 | }
50 |
51 | .alertBox {
52 | flex-direction: row;
53 | display: flex;
54 | align-items: center;
55 | background-color:#F5F5F5;
56 | border-radius: .5rem;
57 | padding:2rem;
58 | }
59 |
60 | .alertBox {
61 | color: #575757;
62 | }
63 | .alertBox .subtext {
64 | color: #8B8B8B;
65 | }
66 | .alertBox .subtext a, .item .lower .info_container a{
67 | color: #888;
68 | }
69 | .alertbox a[href]:hover, .item .lower .info_container a:hover {
70 | color: #005DFF;
71 | }
72 | header #icon, header #url_submit_button {
73 | box-sizing: border-box;
74 | min-width:8rem;
75 | line-height: 8rem;
76 | text-align: center;
77 | font-size: 5rem;
78 | }
79 |
80 | header #icon {
81 | font-weight: 600;
82 | background: #005DFF;
83 | color:#fff;
84 | border: 1px solid #005DFF;
85 | }
86 |
87 |
88 | header #url_submit_button {
89 | color: #ccc;
90 | font-size: 3rem;
91 | display:flex;
92 | align-items: center;
93 | justify-content: center;
94 | border-bottom: 1px solid #bbb;
95 | }
96 |
97 | header #url_submit_button:hover {
98 | color: #888;
99 | cursor: pointer;
100 | }
101 |
102 | header #url_input {
103 | line-height: 8rem;
104 | padding: 0;
105 | padding-left:2rem;
106 | width:100%;
107 | border:0;
108 | font-size: 1.8rem;
109 | font-family: 'Source Code Pro', monospace;
110 | border-bottom: 1px solid #bbb;
111 | }
112 |
113 | .item {
114 | display:flex;
115 | flex-flow: column;
116 | height:100%;
117 | }
118 |
119 | .item .upper {
120 | border: 1px solid #bbb;
121 | border-top-left-radius: .5rem;
122 | border-top-right-radius: .5rem;
123 | border-bottom:none;
124 | padding:2rem;
125 | font-size: 3rem;
126 | height:100%;
127 | }
128 |
129 | .item .lower {
130 | background: #F5F5F5;
131 | border: 1px solid #bbb;
132 | border-bottom-left-radius: .5rem;
133 | border-bottom-right-radius: .5rem;
134 | display: flex;
135 | flex-direction: row;
136 | align-items: center;
137 | }
138 |
139 | .info_container {
140 | flex-grow: 1;
141 | padding:1rem;
142 | }
143 | .info_container .small {
144 | font-size: 1.5rem;
145 | color:#888;
146 | }
147 | .button_container {
148 | padding:1rem;
149 | }
150 |
151 | .button_container .button{
152 | background: #fff;
153 | border-radius: .5rem;
154 | border: 1px solid #005DFF;
155 | padding:1rem;
156 | padding-left:1.25rem;
157 | padding-right:1.25rem;
158 | color: #005DFF;
159 | display:flex;
160 | align-items: center;
161 | justify-content: center;
162 | text-align: center;
163 | }
164 |
165 | .button_container .button:hover{
166 | background: #005DFF;
167 | color: #fff;
168 | cursor: pointer;
169 | }
170 |
171 | footer p, footer a, footer a:active{
172 | color:#888;
173 | }
174 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import vue from '@vitejs/plugin-vue'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [vue()],
7 | base: '',
8 | build : {
9 | minify: false
10 | }
11 | // optimizeDeps: {
12 | // include: ['woff2'],
13 | // },
14 | // define: {
15 | // 'process.env': {},
16 | // 'process.version': {},
17 | // 'process.versions.modules': {},
18 | // 'process.platform': {},
19 | // }
20 | })
21 |
--------------------------------------------------------------------------------