mimeforge 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +291 -2
  4. package/THIRD_PARTY.md +10 -0
  5. package/assets/bodies/archive.svg +13 -0
  6. package/assets/bodies/audio.svg +14 -0
  7. package/assets/bodies/code.svg +14 -0
  8. package/assets/bodies/data.svg +13 -0
  9. package/assets/bodies/database.svg +14 -0
  10. package/assets/bodies/design.svg +15 -0
  11. package/assets/bodies/disk.svg +16 -0
  12. package/assets/bodies/ebook.svg +13 -0
  13. package/assets/bodies/executable.svg +13 -0
  14. package/assets/bodies/font.svg +13 -0
  15. package/assets/bodies/game.svg +17 -0
  16. package/assets/bodies/generic.svg +13 -0
  17. package/assets/bodies/geo.svg +13 -0
  18. package/assets/bodies/image.svg +14 -0
  19. package/assets/bodies/mail.svg +13 -0
  20. package/assets/bodies/model3d.svg +14 -0
  21. package/assets/bodies/pdf.svg +13 -0
  22. package/assets/bodies/science.svg +13 -0
  23. package/assets/bodies/security.svg +14 -0
  24. package/assets/bodies/sheet.svg +13 -0
  25. package/assets/bodies/slides.svg +13 -0
  26. package/assets/bodies/text.svg +14 -0
  27. package/assets/bodies/video.svg +13 -0
  28. package/assets/bodies/word.svg +12 -0
  29. package/assets/fonts/monogram.json +106 -0
  30. package/dist/body.d.ts +24 -0
  31. package/dist/body.js +70 -0
  32. package/dist/categories.d.ts +10 -0
  33. package/dist/categories.js +122 -0
  34. package/dist/cli.d.ts +2 -0
  35. package/dist/cli.js +127 -0
  36. package/dist/color.d.ts +12 -0
  37. package/dist/color.js +34 -0
  38. package/dist/config.d.ts +22 -0
  39. package/dist/config.js +30 -0
  40. package/dist/font.d.ts +47 -0
  41. package/dist/font.js +102 -0
  42. package/dist/index.d.ts +8 -0
  43. package/dist/index.js +8 -0
  44. package/dist/label.d.ts +18 -0
  45. package/dist/label.js +36 -0
  46. package/dist/mime.d.ts +6 -0
  47. package/dist/mime.js +28 -0
  48. package/dist/palette.d.ts +13 -0
  49. package/dist/palette.js +32 -0
  50. package/dist/paths.d.ts +3 -0
  51. package/dist/paths.js +5 -0
  52. package/dist/png.d.ts +2 -0
  53. package/dist/png.js +11 -0
  54. package/dist/render.d.ts +26 -0
  55. package/dist/render.js +23 -0
  56. package/dist/testrun.d.ts +12 -0
  57. package/dist/testrun.js +70 -0
  58. package/docs/bodies.md +86 -0
  59. package/docs/categories.md +42 -0
  60. package/docs/fonts.md +63 -0
  61. package/docs/preview.svg +1 -0
  62. package/package.json +76 -4
  63. package/third_party/MIME-DB-LICENSE +23 -0
  64. package/third_party/monogram/CREDITS.txt +15 -0
  65. package/third_party/monogram/monogram.ttf +0 -0
@@ -0,0 +1,42 @@
1
+ # Categories and extension mapping
2
+
3
+ ## The 24 categories
4
+
5
+ `generic text code data pdf word sheet slides image audio video archive font ebook database executable security model3d geo mail science disk design game`
6
+
7
+ Each category has one body in `assets/bodies/<category>.svg` and one default color in `src/palette.ts`.
8
+ `mimeforge --list` prints the category of every known extension, for example:
9
+
10
+ ```bash
11
+ mimeforge --list | grep -i '^docx ' # docx word
12
+ mimeforge --list | grep ' game$' | head # extensions in one category
13
+ ```
14
+
15
+ ## How an extension gets its category
16
+
17
+ `src/categories.ts` decides, in this order:
18
+
19
+ 1. **Our extension tables** (`EXT_GROUPS` and `FUNCTION_MAP`). They cover popular formats that mime types describe badly or not
20
+ at all (`py`, `tsx`, `vue`, `psd`, `rom`, `sqlite`, …) and formats we map by function (for example Google `gdoc` → `word`).
21
+ 2. **Mime types** from [mime-db](https://github.com/jshttp/mime-db). An extension can have several mime types
22
+ (`mp4` is both `application/mp4` and `video/mp4`); the first mime type that maps to a category wins. The rules are in
23
+ `MIME_RULES`, first match wins, so specific rules come before broad ones.
24
+ 3. **`generic`** when nothing matches.
25
+
26
+ Extensions that are ambiguous in the real world are deliberately left out (for example `bin`, `sc` or `gbr`).
27
+
28
+ ## Change or add a mapping
29
+
30
+ Edit `src/categories.ts`:
31
+
32
+ - add the extension (lowercase, no dot) to the right string in `EXT_GROUPS`, or to `FUNCTION_MAP` as `ext: 'category'`;
33
+ - or add or adjust a regular expression in `MIME_RULES` to move a whole mime family.
34
+
35
+ Add a test in `tests/categories.test.ts`, then run `npm test`. From code you can also skip the lookup entirely with
36
+ `renderIcon(ext, { category: 'archive' })`.
37
+
38
+ ## Add a category
39
+
40
+ 1. Add the name to `CATEGORIES` (`src/categories.ts`) and a default color to `DEFAULT_PALETTE` (`src/palette.ts`).
41
+ 2. Add the body `assets/bodies/<name>.svg` (see [bodies.md](bodies.md)).
42
+ 3. Add a sample extension to `SAMPLES` in `src/testrun.ts` and to `scripts/make-preview.mjs`, map extensions to it, and run `npm test`.
package/docs/fonts.md ADDED
@@ -0,0 +1,63 @@
1
+ # Fonts
2
+
3
+ The label font is chosen with `--font` (or `font` in the config file, or `loadFont()` in the API):
4
+
5
+ | Spec | Result |
6
+ |---|---|
7
+ | `monogram` or nothing | the built-in pixel font (bitmap table in `assets/fonts/monogram.json`) |
8
+ | `path/to/font.json` | a bitmap font in the JSON format below |
9
+ | `path/to/font.ttf`, `.otf`, `.woff` | an outline font (`.woff2` is not supported) |
10
+
11
+ Glyphs are always converted to SVG shapes, so the finished icons do not need the font at runtime.
12
+
13
+ ## Bitmap font format
14
+
15
+ ```json
16
+ {
17
+ "name": "Tiny",
18
+ "cols": 3,
19
+ "rows": 3,
20
+ "descender": 0,
21
+ "advance": 4,
22
+ "glyphs": {
23
+ "A": ["###", "#.#", "#.#"],
24
+ "B": ["##.", "###", "##."]
25
+ }
26
+ }
27
+ ```
28
+
29
+ | Field | Meaning |
30
+ |---|---|
31
+ | `cols` | glyph width in cells |
32
+ | `rows` | rows above the baseline (the "capital height") |
33
+ | `descender` | optional extra rows below the baseline (for `Q`, `g`, …) |
34
+ | `advance` | distance from one glyph to the next, in cells (width plus spacing). All glyphs share it, so bitmap fonts are monospaced |
35
+ | `glyphs` | one entry per character; each is `rows + descender` strings of exactly `cols` characters, `#` filled, `.` empty |
36
+
37
+ Optional metadata (`author`, `license`, `source`) is ignored by the renderer.
38
+
39
+ How it is drawn: every filled cell run becomes a rectangle. The label text is 6 units tall (9 cells of 2/3 unit, which
40
+ is one pixel of a 48 px rendering). A font with `rows: 7` such as Monogram is stretched to 9 cell rows by doubling a
41
+ few rows; a font with a different `rows` is stretched the same way, so very small fonts look chunkier.
42
+ Characters missing from `glyphs` are skipped.
43
+
44
+ Letter case: the label is uppercase by default (`--label-case`). Put both cases into `glyphs` if you need `lower`.
45
+
46
+ ## Outline fonts
47
+
48
+ Outline glyphs are converted to paths and scaled so the height of the capital `H` is 6 units. Advance widths are used
49
+ as they are (no kerning). The font needs the characters you use (digits and letters for most extensions).
50
+
51
+ ## Regenerating the built-in font
52
+
53
+ `assets/fonts/monogram.json` is generated from the Monogram TTF (CC0, in `third_party/monogram/`) by sampling each
54
+ glyph into a 5 × 7 grid plus one descender row:
55
+
56
+ ```bash
57
+ npm run extract-font
58
+ ```
59
+
60
+ ## Licenses
61
+
62
+ Check the license of any font you use. The bundled Monogram is CC0 (see [THIRD_PARTY.md](../THIRD_PARTY.md)).
63
+ Icons made with a font are usually fine to distribute, but some font licenses restrict embedding glyph outlines.
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="844" height="324" viewBox="0 0 844 324"><g transform="translate(26 12) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M13 10A3 3 0 0 1 19 10C19 11.8 16 11.5 16 13" fill="none" stroke="#990000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><circle cx="16" cy="17" r="1" fill="#990000"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#990000"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h1v1h-1zM4 4h1v1h-1zM0 5h1v1h-1zM4 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM0 8h4v1h-4zM7 0h3v1h-3zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h1v1h-1zM10 4h1v1h-1zM6 5h5v1h-5zM6 6h1v2h-1zM10 6h1v2h-1zM6 8h1v1h-1zM10 8h1v1h-1zM12 0h5v1h-5zM14 1h1v2h-1zM14 3h1v1h-1zM14 4h1v1h-1zM14 5h1v1h-1zM14 6h1v2h-1zM14 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="58" y="92" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">generic</text><g transform="translate(130 12) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><rect x="9" y="6" width="10" height="2" rx="1" fill="#999999"/><rect x="9" y="11" width="14" height="2" rx="1" fill="#999999"/><rect x="9" y="16" width="8" height="2" rx="1" fill="#999999"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#999999"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h5v1h-5zM2 1h1v2h-1zM2 3h1v1h-1zM2 4h1v1h-1zM2 5h1v1h-1zM2 6h1v2h-1zM2 8h1v1h-1zM6 0h1v1h-1zM10 0h1v1h-1zM6 1h1v2h-1zM10 1h1v2h-1zM7 3h1v1h-1zM9 3h1v1h-1zM8 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM6 8h1v1h-1zM10 8h1v1h-1zM12 0h5v1h-5zM14 1h1v2h-1zM14 3h1v1h-1zM14 4h1v1h-1zM14 5h1v1h-1zM14 6h1v2h-1zM14 8h1v1h-1z" fill="#1B1F24"/></g></g><text x="162" y="92" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">text</text><g transform="translate(234 12) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M11.5 7L10 12L11.5 17" fill="none" stroke="#2F7F8F" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M20.5 7L22 12L20.5 17" fill="none" stroke="#2F7F8F" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M16.7 7L15.3 17" fill="none" stroke="#2F7F8F" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#2F7F8F"/><path transform="translate(12.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h1v1h-1zM6 0h1v1h-1zM10 0h1v1h-1zM6 1h1v2h-1zM10 1h1v2h-1zM7 3h1v1h-1zM9 3h1v1h-1zM8 4h1v1h-1zM8 5h1v1h-1zM8 6h1v2h-1zM8 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="266" y="92" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">code</text><g transform="translate(338 12) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M14 7Q12 7 12 9.5V10.5Q12 12 10 12Q12 12 12 13.5V14.5Q12 17 14 17" fill="none" stroke="#336699" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M18 7Q20 7 20 9.5V10.5Q20 12 22 12Q20 12 20 13.5V14.5Q20 17 18 17" fill="none" stroke="#336699" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#336699"/><path transform="translate(8.667 20.667) scale(0.667)" d="M4 0h1v1h-1zM4 1h1v2h-1zM4 3h1v1h-1zM4 4h1v1h-1zM0 5h1v1h-1zM4 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM1 8h3v1h-3zM7 0h3v1h-3zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM7 4h3v1h-3zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM7 8h3v1h-3zM13 0h3v1h-3zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM16 3h1v1h-1zM12 4h1v1h-1zM16 4h1v1h-1zM12 5h1v1h-1zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM13 8h3v1h-3zM18 0h1v1h-1zM22 0h1v1h-1zM18 1h1v2h-1zM22 1h1v2h-1zM18 3h2v1h-2zM22 3h1v1h-1zM18 4h1v1h-1zM20 4h1v1h-1zM22 4h1v1h-1zM18 5h1v1h-1zM21 5h2v1h-2zM18 6h1v2h-1zM22 6h1v2h-1zM18 8h1v1h-1zM22 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="370" y="92" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">data</text><g transform="translate(442 12) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M16 6C18.8 9.5 22.5 11.5 22.5 14.5C22.5 16.8 19.6 18 16 18C12.4 18 9.5 16.8 9.5 14.5C9.5 11.5 13.2 9.5 16 6Z" fill="#D64545"/><path d="M16 11C17.8 12.8 19 13.8 19 15C19 16 17.7 16.6 16 16.6C14.3 16.6 13 16 13 15C13 13.8 14.2 12.8 16 11Z" fill="#EDABAB"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#D64545"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h1v1h-1zM6 0h4v1h-4zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h1v1h-1zM10 4h1v1h-1zM6 5h1v1h-1zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM6 8h4v1h-4zM12 0h5v1h-5zM12 1h1v2h-1zM12 3h1v1h-1zM12 4h4v1h-4zM12 5h1v1h-1zM12 6h1v2h-1zM12 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="474" y="92" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">pdf</text><g transform="translate(546 12) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M10 7L12.7 17L16 10L19.3 17L22 7" fill="none" stroke="#2B6CB0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#2B6CB0"/><path transform="translate(8.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h1v1h-1zM4 4h1v1h-1zM0 5h1v1h-1zM4 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM0 8h4v1h-4zM7 0h3v1h-3zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h1v1h-1zM10 4h1v1h-1zM6 5h1v1h-1zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM7 8h3v1h-3zM13 0h3v1h-3zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM12 4h1v1h-1zM12 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM13 8h3v1h-3zM18 0h1v1h-1zM22 0h1v1h-1zM18 1h1v2h-1zM22 1h1v2h-1zM19 3h1v1h-1zM21 3h1v1h-1zM20 4h1v1h-1zM19 5h1v1h-1zM21 5h1v1h-1zM18 6h1v2h-1zM22 6h1v2h-1zM18 8h1v1h-1zM22 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="578" y="92" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">word</text><g transform="translate(650 12) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M9 10h6v3H9z M17 10h6v3h-6z" fill="#217346"/><path d="M9 15h6v3H9z M17 15h6v3h-6z" fill="#9BC0AC"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#217346"/><path transform="translate(8.667 20.667) scale(0.667)" d="M0 0h1v1h-1zM4 0h1v1h-1zM0 1h1v2h-1zM4 1h1v2h-1zM1 3h1v1h-1zM3 3h1v1h-1zM2 4h1v1h-1zM1 5h1v1h-1zM3 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM0 8h1v1h-1zM4 8h1v1h-1zM6 0h1v1h-1zM6 1h1v2h-1zM6 3h1v1h-1zM6 4h1v1h-1zM6 5h1v1h-1zM6 6h1v2h-1zM6 8h5v1h-5zM13 0h3v1h-3zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM13 4h3v1h-3zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM13 8h3v1h-3zM18 0h1v1h-1zM22 0h1v1h-1zM18 1h1v2h-1zM22 1h1v2h-1zM19 3h1v1h-1zM21 3h1v1h-1zM20 4h1v1h-1zM19 5h1v1h-1zM21 5h1v1h-1zM18 6h1v2h-1zM22 6h1v2h-1zM18 8h1v1h-1zM22 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="682" y="92" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">sheet</text><g transform="translate(754 12) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><rect x="9" y="9" width="14" height="9" rx="2" fill="#EBAC9D"/><path d="M11 13h2v3h-2z M15 11.5h2v4.5h-2z M19 10h2v6h-2z" fill="#D24726"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#D24726"/><path transform="translate(8.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h1v1h-1zM6 0h4v1h-4zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h4v1h-4zM6 5h1v1h-1zM6 6h1v2h-1zM6 8h1v1h-1zM12 0h5v1h-5zM14 1h1v2h-1zM14 3h1v1h-1zM14 4h1v1h-1zM14 5h1v1h-1zM14 6h1v2h-1zM14 8h1v1h-1zM18 0h1v1h-1zM22 0h1v1h-1zM18 1h1v2h-1zM22 1h1v2h-1zM19 3h1v1h-1zM21 3h1v1h-1zM20 4h1v1h-1zM19 5h1v1h-1zM21 5h1v1h-1zM18 6h1v2h-1zM22 6h1v2h-1zM18 8h1v1h-1zM22 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="786" y="92" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">slides</text><g transform="translate(26 116) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><rect x="9" y="9" width="14" height="9" rx="2" fill="#D1D18C"/><polygon points="11,18 15,11.5 19,18" fill="#999900"/><circle cx="20" cy="12.5" r="1.5" fill="#999900"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#999900"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h1v1h-1zM6 0h1v1h-1zM10 0h1v1h-1zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h2v1h-2zM10 3h1v1h-1zM6 4h1v1h-1zM8 4h1v1h-1zM10 4h1v1h-1zM6 5h1v1h-1zM9 5h2v1h-2zM6 6h1v2h-1zM10 6h1v2h-1zM6 8h1v1h-1zM10 8h1v1h-1zM13 0h3v1h-3zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM12 4h1v1h-1zM14 4h3v1h-3zM12 5h1v1h-1zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM13 8h3v1h-3z" fill="#FFFFFF"/></g></g><text x="58" y="196" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">image</text><g transform="translate(130 116) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><circle cx="13" cy="15" r="3" fill="#1E9E5A"/><rect x="14" y="7" width="2" height="8" rx="0" fill="#1E9E5A"/><path d="M15 7.5Q21 8 20 13" fill="none" stroke="#1E9E5A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#1E9E5A"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h1v1h-1zM4 0h1v1h-1zM0 1h2v2h-2zM3 1h2v2h-2zM0 3h1v1h-1zM2 3h1v1h-1zM4 3h1v1h-1zM0 4h1v1h-1zM4 4h1v1h-1zM0 5h1v1h-1zM4 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM0 8h1v1h-1zM4 8h1v1h-1zM6 0h4v1h-4zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h4v1h-4zM6 5h1v1h-1zM6 6h1v2h-1zM6 8h1v1h-1zM13 0h3v1h-3zM12 1h1v2h-1zM16 1h1v2h-1zM16 3h1v1h-1zM14 4h2v1h-2zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM13 8h3v1h-3z" fill="#FFFFFF"/></g></g><text x="162" y="196" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">audio</text><g transform="translate(234 116) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><rect x="9" y="9" width="14" height="9" rx="2.5" fill="#8E44AD"/><polygon points="14,10.8 19.5,13.5 14,16.2" fill="#FFFFFF"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#8E44AD"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h1v1h-1zM4 0h1v1h-1zM0 1h2v2h-2zM3 1h2v2h-2zM0 3h1v1h-1zM2 3h1v1h-1zM4 3h1v1h-1zM0 4h1v1h-1zM4 4h1v1h-1zM0 5h1v1h-1zM4 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM0 8h1v1h-1zM4 8h1v1h-1zM6 0h4v1h-4zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h4v1h-4zM6 5h1v1h-1zM6 6h1v2h-1zM6 8h1v1h-1zM13 0h1v1h-1zM16 0h1v1h-1zM13 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM16 3h1v1h-1zM12 4h5v1h-5zM16 5h1v1h-1zM16 6h1v2h-1zM16 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="266" y="196" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">video</text><g transform="translate(338 116) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M13 6h3v2h-3z M16 8h3v2h-3z M13 10h3v2h-3z M16 12h3v2h-3z" fill="#996600"/><rect x="12" y="16" width="8" height="2" rx="1" fill="#996600"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#996600"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h5v1h-5zM4 1h1v2h-1zM3 3h1v1h-1zM2 4h1v1h-1zM1 5h1v1h-1zM0 6h1v2h-1zM0 8h5v1h-5zM6 0h5v1h-5zM8 1h1v2h-1zM8 3h1v1h-1zM8 4h1v1h-1zM8 5h1v1h-1zM8 6h1v2h-1zM6 8h5v1h-5zM12 0h4v1h-4zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM16 3h1v1h-1zM12 4h4v1h-4zM12 5h1v1h-1zM12 6h1v2h-1zM12 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="370" y="196" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">archive</text><g transform="translate(442 116) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M11 17L16 7L21 17M13.3 13H18.7" fill="none" stroke="#7B4B94" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M9 16h6v2H9z M17 16h6v2h-6z" fill="#7B4B94"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#7B4B94"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h5v1h-5zM2 1h1v2h-1zM2 3h1v1h-1zM2 4h1v1h-1zM2 5h1v1h-1zM2 6h1v2h-1zM2 8h1v1h-1zM6 0h5v1h-5zM8 1h1v2h-1zM8 3h1v1h-1zM8 4h1v1h-1zM8 5h1v1h-1zM8 6h1v2h-1zM8 8h1v1h-1zM12 0h5v1h-5zM12 1h1v2h-1zM12 3h1v1h-1zM12 4h4v1h-4zM12 5h1v1h-1zM12 6h1v2h-1zM12 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="474" y="196" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">font</text><g transform="translate(546 116) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M9 10Q12 8.5 15 10V18Q12 16 9 18Z" fill="#B5651D"/><path d="M23 10Q20 8.5 17 10V18Q20 16 23 18Z" fill="#B5651D"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#B5651D"/><path transform="translate(8.667 20.667) scale(0.667)" d="M0 0h5v1h-5zM0 1h1v2h-1zM0 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h5v1h-5zM6 0h4v1h-4zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h4v1h-4zM6 5h1v1h-1zM6 6h1v2h-1zM6 8h1v1h-1zM12 0h1v1h-1zM16 0h1v1h-1zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM16 3h1v1h-1zM12 4h1v1h-1zM16 4h1v1h-1zM12 5h1v1h-1zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM13 8h3v1h-3zM18 0h4v1h-4zM18 1h1v2h-1zM22 1h1v2h-1zM18 3h1v1h-1zM22 3h1v1h-1zM18 4h4v1h-4zM18 5h1v1h-1zM22 5h1v1h-1zM18 6h1v2h-1zM22 6h1v2h-1zM18 8h4v1h-4z" fill="#FFFFFF"/></g></g><text x="578" y="196" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">ebook</text><g transform="translate(650 116) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M9 10.5V15.5A7 2.5 0 0 0 23 15.5V10.5Z" fill="#B5BBBF"/><ellipse cx="16" cy="10.5" rx="7" ry="2.5" fill="#5B6770"/><path d="M9 12.8A7 2.5 0 0 0 23 12.8V14.8A7 2.5 0 0 1 9 14.8Z" fill="#5B6770"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#5B6770"/><path transform="translate(4.667 20.667) scale(0.667)" d="M1 0h3v1h-3zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM1 4h3v1h-3zM4 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM1 8h3v1h-3zM7 0h3v1h-3zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h1v1h-1zM10 4h1v1h-1zM6 5h1v1h-1zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM7 8h3v1h-3zM9 9h2v1h-2zM12 0h1v1h-1zM12 1h1v2h-1zM12 3h1v1h-1zM12 4h1v1h-1zM12 5h1v1h-1zM12 6h1v2h-1zM12 8h5v1h-5zM18 0h5v1h-5zM20 1h1v2h-1zM20 3h1v1h-1zM20 4h1v1h-1zM20 5h1v1h-1zM20 6h1v2h-1zM18 8h5v1h-5zM24 0h5v1h-5zM26 1h1v2h-1zM26 3h1v1h-1zM26 4h1v1h-1zM26 5h1v1h-1zM26 6h1v2h-1zM26 8h1v1h-1zM30 0h5v1h-5zM30 1h1v2h-1zM30 3h1v1h-1zM30 4h4v1h-4zM30 5h1v1h-1zM30 6h1v2h-1zM30 8h5v1h-5z" fill="#FFFFFF"/></g></g><text x="682" y="196" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">database</text><g transform="translate(754 116) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M10.5 8L15 12.5L10.5 17" fill="none" stroke="#444B57" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M17 17H22" fill="none" stroke="#444B57" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#444B57"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h5v1h-5zM0 1h1v2h-1zM0 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h5v1h-5zM6 0h1v1h-1zM10 0h1v1h-1zM6 1h1v2h-1zM10 1h1v2h-1zM7 3h1v1h-1zM9 3h1v1h-1zM8 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM6 8h1v1h-1zM10 8h1v1h-1zM12 0h5v1h-5zM12 1h1v2h-1zM12 3h1v1h-1zM12 4h4v1h-4zM12 5h1v1h-1zM12 6h1v2h-1zM12 8h5v1h-5z" fill="#FFFFFF"/></g></g><text x="786" y="196" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">executable</text><g transform="translate(26 220) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M13 11V10A3 3 0 0 1 19 10V11" fill="none" stroke="#B8860B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="9.5" y="11" width="13" height="7" rx="2" fill="#B8860B"/><circle cx="16" cy="14.5" r="1.5" fill="#FFFFFF"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#B8860B"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h1v1h-1zM6 0h5v1h-5zM6 1h1v2h-1zM6 3h1v1h-1zM6 4h4v1h-4zM6 5h1v1h-1zM6 6h1v2h-1zM6 8h5v1h-5zM12 0h1v1h-1zM16 0h1v1h-1zM12 1h2v2h-2zM15 1h2v2h-2zM12 3h1v1h-1zM14 3h1v1h-1zM16 3h1v1h-1zM12 4h1v1h-1zM16 4h1v1h-1zM12 5h1v1h-1zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM12 8h1v1h-1zM16 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="58" y="300" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">security</text><g transform="translate(130 220) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><polygon points="16,7 20.76,9.75 20.76,15.25 16,18 11.24,15.25 11.24,9.75" fill="#4B6CB7"/><polygon points="16,7 20.76,9.75 16,12.5 11.24,9.75" fill="#AEBDDF"/><path d="M16 12.5L11.24 9.75M16 12.5L20.76 9.75M16 12.5V18" fill="none" stroke="#FFFFFF" stroke-width="2"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#4B6CB7"/><path transform="translate(10.667 20.667) scale(0.667)" d="M1 0h3v1h-3zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM0 4h1v1h-1zM2 4h3v1h-3zM0 5h1v1h-1zM4 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM1 8h3v1h-3zM6 0h1v1h-1zM6 1h1v2h-1zM6 3h1v1h-1zM6 4h1v1h-1zM6 5h1v1h-1zM6 6h1v2h-1zM6 8h5v1h-5zM12 0h4v1h-4zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM16 3h1v1h-1zM12 4h4v1h-4zM12 5h1v1h-1zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM12 8h4v1h-4z" fill="#FFFFFF"/></g></g><text x="162" y="300" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">model3d</text><g transform="translate(234 220) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M16 18C14 15.5 11 13.5 11 11A5 5 0 0 1 21 11C21 13.5 18 15.5 16 18Z" fill="#99CC00"/><circle cx="16" cy="11" r="2" fill="#FFFFFF"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#99CC00"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h1v1h-1zM4 0h1v1h-1zM0 1h1v2h-1zM3 1h1v2h-1zM0 3h1v1h-1zM2 3h1v1h-1zM0 4h2v1h-2zM0 5h1v1h-1zM2 5h1v1h-1zM0 6h1v2h-1zM3 6h1v2h-1zM0 8h1v1h-1zM4 8h1v1h-1zM6 0h1v1h-1zM10 0h1v1h-1zM6 1h2v2h-2zM9 1h2v2h-2zM6 3h1v1h-1zM8 3h1v1h-1zM10 3h1v1h-1zM6 4h1v1h-1zM10 4h1v1h-1zM6 5h1v1h-1zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM6 8h1v1h-1zM10 8h1v1h-1zM12 0h1v1h-1zM12 1h1v2h-1zM12 3h1v1h-1zM12 4h1v1h-1zM12 5h1v1h-1zM12 6h1v2h-1zM12 8h5v1h-5z" fill="#1B1F24"/></g></g><text x="266" y="300" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">geo</text><g transform="translate(338 220) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><rect x="9" y="9.5" width="14" height="8.5" rx="2" fill="#2E86AB"/><polygon points="11.2,9.5 20.8,9.5 16,14.5" fill="#A1C9D9"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#2E86AB"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h5v1h-5zM0 1h1v2h-1zM0 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h5v1h-5zM6 0h1v1h-1zM10 0h1v1h-1zM6 1h2v2h-2zM9 1h2v2h-2zM6 3h1v1h-1zM8 3h1v1h-1zM10 3h1v1h-1zM6 4h1v1h-1zM10 4h1v1h-1zM6 5h1v1h-1zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM6 8h1v1h-1zM10 8h1v1h-1zM12 0h1v1h-1zM12 1h1v2h-1zM12 3h1v1h-1zM12 4h1v1h-1zM12 5h1v1h-1zM12 6h1v2h-1zM12 8h5v1h-5z" fill="#FFFFFF"/></g></g><text x="370" y="300" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">mail</text><g transform="translate(442 220) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M13.5 6H18.5V11.5L22.5 17Q23 18 22 18H10Q9 18 9.5 17L13.5 11.5Z" fill="#8CD1D1"/><path d="M11.3 14.5H20.7L22.5 17Q23 18 22 18H10Q9 18 9.5 17Z" fill="#009999"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#009999"/><path transform="translate(10.667 20.667) scale(0.667)" d="M1 0h3v1h-3zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM0 4h1v1h-1zM0 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM1 8h3v1h-3zM6 0h5v1h-5zM8 1h1v2h-1zM8 3h1v1h-1zM8 4h1v1h-1zM8 5h1v1h-1zM8 6h1v2h-1zM6 8h5v1h-5zM12 0h5v1h-5zM12 1h1v2h-1zM12 3h1v1h-1zM12 4h4v1h-4zM12 5h1v1h-1zM12 6h1v2h-1zM12 8h1v1h-1z" fill="#FFFFFF"/></g></g><text x="474" y="300" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">science</text><g transform="translate(546 220) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><rect x="9" y="6" width="14" height="12" rx="2" fill="#00796B"/><circle cx="14.5" cy="12" r="4" fill="#8CC3BC"/><circle cx="14.5" cy="12" r="1" fill="#00796B"/><path d="M20 15.5L17.2 12.4" fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round"/><circle cx="20" cy="15.5" r="1.5" fill="#FFFFFF"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#00796B"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h5v1h-5zM2 1h1v2h-1zM2 3h1v1h-1zM2 4h1v1h-1zM2 5h1v1h-1zM2 6h1v2h-1zM0 8h5v1h-5zM7 0h3v1h-3zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM7 4h3v1h-3zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM7 8h3v1h-3zM13 0h3v1h-3zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM16 3h1v1h-1zM12 4h1v1h-1zM16 4h1v1h-1zM12 5h1v1h-1zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM13 8h3v1h-3z" fill="#FFFFFF"/></g></g><text x="578" y="300" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">disk</text><g transform="translate(650 220) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><polygon points="12.5,6 19.5,6 20,8 12,8" fill="#E497B5"/><path d="M12.2 10H19.8L20.5 13L16 18L11.5 13Z" fill="#C2185B"/><rect x="15.3" y="12.8" width="1.4" height="5.2" rx="0" fill="#FFFFFF"/><circle cx="16" cy="12.8" r="1.5" fill="#FFFFFF"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#C2185B"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM0 6h1v2h-1zM0 8h1v1h-1zM7 0h3v1h-3zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM7 4h3v1h-3zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM7 8h3v1h-3zM12 0h4v1h-4zM12 1h1v2h-1zM16 1h1v2h-1zM12 3h1v1h-1zM16 3h1v1h-1zM12 4h1v1h-1zM16 4h1v1h-1zM12 5h1v1h-1zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM12 8h4v1h-4z" fill="#FFFFFF"/></g></g><text x="682" y="300" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">design</text><g transform="translate(754 220) scale(2)"><g id="page"><path d="M7.5 2.5H19.5L26.5 9.5V27.5A2 2 0 0 1 24.5 29.5H7.5A2 2 0 0 1 5.5 27.5V4.5A2 2 0 0 1 7.5 2.5Z" fill="#FFFFFF" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="emblem"><path d="M13 7.5H19C21.5 7.5 23 9.5 23 12.5C23 15.5 21.5 17.5 19.5 17.5C18 17.5 17.5 15.5 16 15.5C14.5 15.5 14 17.5 12.5 17.5C10.5 17.5 9 15.5 9 12.5C9 9.5 10.5 7.5 13 7.5Z" fill="#E08A00"/><polygon points="11.6,9.9 13.6,9.9 13.6,11.2 14.9,11.2 14.9,13.2 13.6,13.2 13.6,14.5 11.6,14.5 11.6,13.2 10.3,13.2 10.3,11.2 11.6,11.2" fill="#FFFFFF"/><circle cx="18.8" cy="9.9" r="1" fill="#FFFFFF"/><circle cx="18.8" cy="14.5" r="1" fill="#FFFFFF"/><circle cx="16.5" cy="12.2" r="1" fill="#FFFFFF"/><circle cx="21.1" cy="12.2" r="1" fill="#FFFFFF"/></g><g id="fold"><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="#E3E7EB"/><path d="M19.5 2.5V7.5Q19.5 9.5 21.5 9.5H26.5Z" fill="none" stroke="#B8BFC7" stroke-linejoin="round"/></g><g id="label"><rect x="3" y="19.333" width="26" height="8.667" rx="1" fill="#E08A00"/><path transform="translate(10.667 20.667) scale(0.667)" d="M0 0h4v1h-4zM0 1h1v2h-1zM4 1h1v2h-1zM0 3h1v1h-1zM4 3h1v1h-1zM0 4h4v1h-4zM0 5h1v1h-1zM4 5h1v1h-1zM0 6h1v2h-1zM4 6h1v2h-1zM0 8h1v1h-1zM4 8h1v1h-1zM7 0h3v1h-3zM6 1h1v2h-1zM10 1h1v2h-1zM6 3h1v1h-1zM10 3h1v1h-1zM6 4h1v1h-1zM10 4h1v1h-1zM6 5h1v1h-1zM10 5h1v1h-1zM6 6h1v2h-1zM10 6h1v2h-1zM7 8h3v1h-3zM12 0h1v1h-1zM16 0h1v1h-1zM12 1h2v2h-2zM15 1h2v2h-2zM12 3h1v1h-1zM14 3h1v1h-1zM16 3h1v1h-1zM12 4h1v1h-1zM16 4h1v1h-1zM12 5h1v1h-1zM16 5h1v1h-1zM12 6h1v2h-1zM16 6h1v2h-1zM12 8h1v1h-1zM16 8h1v1h-1z" fill="#1B1F24"/></g></g><text x="786" y="300" text-anchor="middle" font-family="-apple-system,Segoe UI,Helvetica,Arial,sans-serif" font-size="11" fill="#6e7781">game</text></svg>
package/package.json CHANGED
@@ -1,6 +1,78 @@
1
1
  {
2
2
  "name": "mimeforge",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Generate file-type icons as SVG from a file extension: 24 bundled bodies, extension labels, pluggable fonts, bodies and colors.",
5
+ "author": {
6
+ "name": "Levent Kurt",
7
+ "email": "reachdevel@gmail.com"
8
+ },
9
+ "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/reachdevel/mimeforge.git"
13
+ },
14
+ "homepage": "https://github.com/reachdevel/mimeforge#readme",
15
+ "bugs": {
16
+ "url": "https://github.com/reachdevel/mimeforge/issues"
17
+ },
18
+ "keywords": [
19
+ "file-icons",
20
+ "file-type-icons",
21
+ "svg",
22
+ "icons",
23
+ "mime",
24
+ "extension",
25
+ "generator"
26
+ ],
27
+ "type": "module",
28
+ "bin": {
29
+ "mimeforge": "dist/cli.js"
30
+ },
31
+ "main": "dist/index.js",
32
+ "types": "dist/index.d.ts",
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.ts",
36
+ "import": "./dist/index.js"
37
+ },
38
+ "./package.json": "./package.json"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "assets",
43
+ "third_party",
44
+ "docs",
45
+ "THIRD_PARTY.md",
46
+ "CHANGELOG.md"
47
+ ],
48
+ "engines": {
49
+ "node": ">=20"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "scripts": {
55
+ "prepare": "npm run build",
56
+ "build": "tsc -p tsconfig.json && node scripts/postbuild.mjs",
57
+ "dev": "tsx src/cli.ts",
58
+ "test": "vitest run",
59
+ "test-run": "tsx src/cli.ts --test-run",
60
+ "preview": "node scripts/make-preview.mjs",
61
+ "extract-font": "node scripts/extract-font.mjs",
62
+ "prepublishOnly": "npm run build && npm test"
63
+ },
64
+ "dependencies": {
65
+ "mime-db": "^1.54.0",
66
+ "opentype.js": "^2.0.0"
67
+ },
68
+ "optionalDependencies": {
69
+ "@resvg/resvg-js": "^2.6.2"
70
+ },
71
+ "devDependencies": {
72
+ "@types/mime-db": "^1.43.6",
73
+ "@types/node": "^26.6.4",
74
+ "tsx": "^4.23.15",
75
+ "typescript": "^7.0.2",
76
+ "vitest": "^4.1.11"
77
+ }
78
+ }
@@ -0,0 +1,23 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
4
+ Copyright (c) 2015-2022 Douglas Christopher Wilson <doug@somethingdoug.com>
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ 'Software'), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,15 @@
1
+ # CREDITS
2
+
3
+ Monogram is a free and Creative Commons Zero pixel font,
4
+ made by Vinícius Menézio (@vmenezio).
5
+
6
+ https://datagoblin.itch.io/monogram
7
+
8
+
9
+ # SPECIAL THANKS
10
+
11
+ thanks to Ateş Göral (@atesgoral) for creating the bitmap font converter:
12
+ https://codepen.io/atesgoral/details/RwGOvPZ
13
+
14
+ thanks to Éric Araujo (@merwok_) for the inital port of monogram to PICO-8:
15
+ https://itch.io/post/2625522