├── .github └── workflows │ └── release.yml ├── .gitignore ├── .nvmrc ├── README.md ├── changelog-config.json ├── neobread.afdesign ├── package-lock.json ├── package.json ├── preview.png ├── scripts ├── generateManifest.ts ├── generateMeta.ts ├── generatePNGs.ts └── generatePreview.ts ├── svg ├── neobread.svg ├── neobread_3c.svg ├── neobread_aww.svg ├── neobread_blep.svg ├── neobread_blush.svg ├── neobread_blush_hide.svg ├── neobread_boop.svg ├── neobread_bottom.svg ├── neobread_box.svg ├── neobread_cat_ears.svg ├── neobread_checkmark.svg ├── neobread_cowboy.svg ├── neobread_cross.svg ├── neobread_cross_stitch.svg ├── neobread_cutlery.svg ├── neobread_cutlery_eyes.svg ├── neobread_drake_dislike.svg ├── neobread_drake_like.svg ├── neobread_eyes.svg ├── neobread_facepalm.svg ├── neobread_filament.svg ├── neobread_fingerguns.svg ├── neobread_fingerguns_cool.svg ├── neobread_flag_ace.svg ├── neobread_flag_agender.svg ├── neobread_flag_aro.svg ├── neobread_flag_bi.svg ├── neobread_flag_lesbian.svg ├── neobread_flag_nb.svg ├── neobread_flag_pan.svg ├── neobread_flag_rainbow.svg ├── neobread_flag_trans.svg ├── neobread_fox_ears.svg ├── neobread_gamer.svg ├── neobread_gamer_angry.svg ├── neobread_grimace.svg ├── neobread_halo.svg ├── neobread_happy.svg ├── neobread_hat_tip.svg ├── neobread_heart.svg ├── neobread_heart_eyes.svg ├── neobread_hmph.svg ├── neobread_hug.svg ├── neobread_hug_bee.svg ├── neobread_hug_bee_heart.svg ├── neobread_hug_bun.svg ├── neobread_hug_bun_heart.svg ├── neobread_hug_cat.svg ├── neobread_hug_cat_heart.svg ├── neobread_hug_fox.svg ├── neobread_hug_fox_heart.svg ├── neobread_hug_heart.svg ├── neobread_hug_mouse.svg ├── neobread_hug_mouse_heart.svg ├── neobread_hug_potato.svg ├── neobread_hug_potato_heart.svg ├── neobread_hug_wolf.svg ├── neobread_hug_wolf_heart.svg ├── neobread_kisser.svg ├── neobread_knife.svg ├── neobread_laptop.svg ├── neobread_laugh.svg ├── neobread_laugh_sweat.svg ├── neobread_laugh_tears.svg ├── neobread_lego.svg ├── neobread_meeple.svg ├── neobread_megaphone.svg ├── neobread_mug.svg ├── neobread_nd.svg ├── neobread_nom_potato.svg ├── neobread_party.svg ├── neobread_pat.svg ├── neobread_peek.svg ├── neobread_pensive.svg ├── neobread_pleading.svg ├── neobread_pleased.svg ├── neobread_popcorn.svg ├── neobread_sad.svg ├── neobread_scream.svg ├── neobread_scream_angry.svg ├── neobread_shrug.svg ├── neobread_sleep.svg ├── neobread_smug.svg ├── neobread_snuggle.svg ├── neobread_snuggle_fox.svg ├── neobread_sob.svg ├── neobread_sob_loud.svg ├── neobread_surprise.svg ├── neobread_think.svg ├── neobread_train_wagon.svg ├── neobread_upside_down.svg ├── neobread_uwu.svg ├── neobread_verified.svg ├── neobread_wave.svg ├── neobread_wink.svg ├── neobread_woem.svg └── neobread_woozy.svg └── tsconfig.json /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Create Release 2 | on: 3 | push: 4 | tags: 5 | - '*' 6 | 7 | jobs: 8 | generate-pngs: 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | 15 | - name: Install node 16 | uses: actions/setup-node@v4 17 | with: 18 | node-version: 20 19 | 20 | - name: Install dependencies 21 | run: npm install 22 | 23 | - name: Generate PNGs 24 | run: npm run generate-pngs 25 | 26 | - name: Generate hi-res PNGs 27 | run: npm run generate-pngs -- --size 2048 --outdir ./png-2048 28 | 29 | - name: Create tar archive 30 | run: tar -czvf neobread.tar.gz -C png . 31 | 32 | - name: Generate meta 33 | run: npm run generate-meta 34 | 35 | - name: Generate preview 36 | run: npm run generate-preview 37 | 38 | - name: Create PNG archive 39 | run: zip -rj neobread.zip png/* 40 | 41 | - name: Create hi-res PNG archive 42 | run: zip -rj neobread-hires.zip png-2048/* 43 | 44 | - name: Generate checksum 45 | id: checksum 46 | run: 47 | echo "checksum=$(sha256sum neobread.zip | cut -d " " -f 1)" >> 48 | $GITHUB_OUTPUT 49 | 50 | - name: Generate manifest 51 | run: npm run generate-manifest ${{ steps.checksum.outputs.checksum }} 52 | 53 | - name: Create SVG archive 54 | run: zip -rj neobread-svg.zip svg 55 | 56 | - name: Create changelog 57 | id: changelog 58 | if: ${{ !contains(github.ref_name, 'prerelease') }} 59 | uses: mikepenz/release-changelog-builder-action@v4 60 | with: 61 | configuration: 'changelog-config.json' 62 | commitMode: true 63 | 64 | - name: Create release 65 | uses: softprops/action-gh-release@v2 66 | if: ${{ !contains(github.ref_name, 'prerelease') }} 67 | with: 68 | body: ${{ steps.changelog.outputs.changelog }} 69 | files: | 70 | preview.png 71 | neobread.zip 72 | neobread-hires.zip 73 | neobread.tar.gz 74 | neobread-svg.zip 75 | manifest.json 76 | filemap.json 77 | 78 | - name: Create prerelease 79 | uses: softprops/action-gh-release@v2 80 | if: ${{ contains(github.ref_name, 'prerelease') }} 81 | with: 82 | body: 83 | '![A grid of bread emojis making various 84 | expressions](https://github.com/olivvybee/neobread/releases/download/${{github.ref_name}}/preview.png)' 85 | prerelease: true 86 | files: | 87 | preview.png 88 | neobread.zip 89 | neobread-hires.zip 90 | neobread.tar.gz 91 | neobread-svg.zip 92 | manifest.json 93 | filemap.json 94 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.afdesign~lock~ 3 | node_modules 4 | png 5 | manifest.json 6 | filemap.json 7 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 20 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # neobread 2 | 3 | Neobread is a set of bread emojis based on Neofox and Neocat, which were created 4 | by [Volpeon](https://volpeon.ink/emojis/). 5 | 6 | **_Note: neobread has moved to a 7 | [new repo](https://github.com/olivvybee/emojis)!_** 8 | 9 | This repo is no longer under active development and exists only to preserve the 10 | history of neobread. 11 | -------------------------------------------------------------------------------- /changelog-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "pr_template": "- #{{TITLE}}", 3 | "template": "#{{CHANGELOG}}\n\n## Changes in this release\n\n#{{UNCATEGORIZED}}\n\n![A grid of bread emojis making various expressions](https://github.com/olivvybee/neobread/releases/download/#{{TO_TAG}}/preview.png)\n\n*See the [README](https://github.com/olivvybee/neobread/) for usage instructions.*", 4 | "categories": [] 5 | } 6 | -------------------------------------------------------------------------------- /neobread.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olivvybee/neobread/4cde7e659de240a3db18fb138248c97bc7fe1c11/neobread.afdesign -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "neobread", 3 | "version": "1.0.0", 4 | "description": "A set of bread emojis based on Neofox and Neocat.", 5 | "scripts": { 6 | "generate-pngs": "tsx ./scripts/generatePNGs.ts", 7 | "generate-manifest": "tsx ./scripts/generateManifest.ts", 8 | "generate-meta": "tsx ./scripts/generateMeta.ts", 9 | "generate-preview": "tsx ./scripts/generatePreview.ts" 10 | }, 11 | "license": "MIT", 12 | "dependencies": { 13 | "@types/archiver": "^6.0.2", 14 | "@types/cli-progress": "^3.11.5", 15 | "@types/yargs": "^17.0.32", 16 | "archiver": "^7.0.1", 17 | "canvas": "^2.11.2", 18 | "cli-progress": "^3.12.0", 19 | "nan": "^2.19.0", 20 | "svg2img": "^1.0.0-beta.2", 21 | "tsx": "^4.7.1", 22 | "typescript": "^5.4.2", 23 | "yargs": "^17.7.2" 24 | }, 25 | "engines": { 26 | "node": ">=20" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olivvybee/neobread/4cde7e659de240a3db18fb138248c97bc7fe1c11/preview.png -------------------------------------------------------------------------------- /scripts/generateManifest.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs'; 3 | import { argv } from 'process'; 4 | 5 | const checksum = argv[2]; 6 | if (!checksum) { 7 | throw new Error('No checksum provided'); 8 | } 9 | 10 | const pngDirectory = path.resolve('.', 'png'); 11 | 12 | if (!fs.existsSync(pngDirectory)) { 13 | throw new Error('png directory does not exist'); 14 | } 15 | 16 | const filenames = fs 17 | .readdirSync(pngDirectory) 18 | .filter((filename) => filename.endsWith('.png')); 19 | 20 | const fileMap = filenames.reduce((processed, filename) => { 21 | const name = filename.replace('.png', ''); 22 | return { 23 | ...processed, 24 | [name]: filename, 25 | }; 26 | }, {}); 27 | 28 | const fileMapOutput = path.resolve('.', 'filemap.json'); 29 | fs.writeFileSync(fileMapOutput, JSON.stringify(fileMap, null, 2)); 30 | 31 | const manifest = { 32 | neobread: { 33 | description: 'Bread emojis by @olivvybee@honeycomb.engineer', 34 | files: 35 | 'https://github.com/olivvybee/neobread/releases/latest/download/filemap.json', 36 | homepage: 'https://github.com/olivvybee/neobread/', 37 | src: 'https://github.com/olivvybee/neobread/releases/latest/download/neobread.zip', 38 | src_sha256: checksum, 39 | license: 'CC BY-NC-SA 4.0', 40 | }, 41 | }; 42 | 43 | const manifestOutput = path.resolve('.', 'manifest.json'); 44 | fs.writeFileSync(manifestOutput, JSON.stringify(manifest, null, 2)); 45 | -------------------------------------------------------------------------------- /scripts/generateMeta.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs'; 3 | 4 | const baseMeta = { 5 | metaVersion: 2, 6 | host: 'beehive.gay', 7 | exportedAt: new Date().toISOString(), 8 | }; 9 | 10 | const pngDirectory = path.resolve('.', 'png'); 11 | 12 | if (!fs.existsSync(pngDirectory)) { 13 | throw new Error('png directory does not exist'); 14 | } 15 | 16 | const filenames = fs 17 | .readdirSync(pngDirectory) 18 | .filter((filename) => filename.endsWith('.png')); 19 | 20 | const emojis = filenames.map((filename) => { 21 | const name = filename.replace('.png', ''); 22 | 23 | const firstUnderscore = name.indexOf('_'); 24 | const category = 25 | firstUnderscore !== -1 ? name.slice(0, firstUnderscore) : name; 26 | 27 | return { 28 | downloaded: true, 29 | fileName: filename, 30 | emoji: { 31 | name, 32 | category, 33 | aliases: [], 34 | }, 35 | }; 36 | }); 37 | 38 | const meta = { 39 | ...baseMeta, 40 | emojis, 41 | }; 42 | 43 | const outPath = path.resolve(pngDirectory, 'meta.json'); 44 | fs.writeFileSync(outPath, JSON.stringify(meta, null, 2)); 45 | -------------------------------------------------------------------------------- /scripts/generatePNGs.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs'; 3 | 4 | import yargs from 'yargs'; 5 | import cliProgress, { Presets } from 'cli-progress'; 6 | 7 | import svg2imgWithCallback, { svg2imgOptions } from 'svg2img'; 8 | 9 | const svg2img = (svg: string, options?: svg2imgOptions): Promise => 10 | new Promise((resolve, reject) => 11 | svg2imgWithCallback(svg, options, (err, buffer) => { 12 | if (err) { 13 | reject(err); 14 | } 15 | resolve(buffer); 16 | }) 17 | ); 18 | 19 | interface RunArgs { 20 | newOnly?: boolean; 21 | size: number; 22 | outdir: string; 23 | } 24 | 25 | const DEFAULT_SIZE = 256; 26 | const DEFAULT_DIR = path.resolve('.', 'png'); 27 | 28 | const run = async ({ 29 | newOnly = false, 30 | size = DEFAULT_SIZE, 31 | outdir = DEFAULT_DIR, 32 | }: RunArgs) => { 33 | const svgDirectory = path.resolve('.', 'svg'); 34 | const svgs = fs 35 | .readdirSync(svgDirectory) 36 | .filter((filename) => filename.endsWith('.svg')); 37 | 38 | if (!fs.existsSync(outdir)) { 39 | fs.mkdirSync(outdir); 40 | } 41 | 42 | const existingPngs = fs 43 | .readdirSync(outdir) 44 | .filter((filename) => filename.endsWith('.png')); 45 | 46 | const svgsToProcess = newOnly 47 | ? svgs.filter( 48 | (filename) => !existingPngs.includes(filename.replace('svg', 'png')) 49 | ) 50 | : svgs; 51 | 52 | if (svgsToProcess.length === 0) { 53 | console.log('No new SVGs found to process.'); 54 | return; 55 | } 56 | 57 | const progress = new cliProgress.MultiBar({}, Presets.shades_classic); 58 | const progressBar = progress.create(svgsToProcess.length, 0); 59 | 60 | for (let i = 0; i < svgsToProcess.length; i++) { 61 | const svgFilename = svgsToProcess[i]; 62 | const svgPath = path.resolve(svgDirectory, svgFilename); 63 | const pngFilename = svgFilename.replace('svg', 'png'); 64 | const pngPath = path.resolve(outdir, pngFilename); 65 | 66 | const buffer = await svg2img(svgPath, { 67 | resvg: { 68 | fitTo: { 69 | mode: 'width', 70 | value: size, 71 | }, 72 | }, 73 | }); 74 | 75 | fs.writeFileSync(pngPath, buffer); 76 | progress.log(`${svgFilename} -> ${pngFilename}\n`); 77 | progressBar.increment(); 78 | } 79 | 80 | progress.remove(progressBar); 81 | progress.stop(); 82 | }; 83 | 84 | const argv = yargs(process.argv) 85 | .option('newOnly', { 86 | alias: 'n', 87 | type: 'boolean', 88 | description: 89 | "Only generate PNGs for SVGs that don't already have a PNG version", 90 | }) 91 | .option('size', { 92 | alias: 's', 93 | type: 'number', 94 | description: 'The size to generate PNGs at, in pixels', 95 | default: DEFAULT_SIZE, 96 | }) 97 | .option('outdir', { 98 | alias: 'o', 99 | type: 'string', 100 | description: 'Output directory to save PNGs into', 101 | default: DEFAULT_DIR, 102 | }) 103 | .parseSync(); 104 | 105 | run(argv); 106 | -------------------------------------------------------------------------------- /scripts/generatePreview.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs'; 3 | import { createCanvas, Image } from 'canvas'; 4 | 5 | const MAX_COLUMNS = 10; 6 | const EMOJI_SIZE = 256; 7 | const SPACE_PER_EMOJI = 300; 8 | const SPACING = SPACE_PER_EMOJI - EMOJI_SIZE; 9 | 10 | const pngDirectory = path.resolve('.', 'png'); 11 | 12 | if (!fs.existsSync(pngDirectory)) { 13 | throw new Error('png directory does not exist'); 14 | } 15 | 16 | const filenames = fs 17 | .readdirSync(pngDirectory) 18 | .filter((filename) => filename.endsWith('.png')); 19 | 20 | const rows = Math.ceil(filenames.length / MAX_COLUMNS); 21 | const columns = rows === 1 ? filenames.length : MAX_COLUMNS; 22 | 23 | const height = rows * SPACE_PER_EMOJI; 24 | const width = columns * SPACE_PER_EMOJI; 25 | 26 | const canvas = createCanvas(width, height); 27 | const ctx = canvas.getContext('2d'); 28 | 29 | ctx.fillStyle = '#cfb0eb'; 30 | ctx.fillRect(0, 0, width, height); 31 | 32 | filenames.forEach((filename, index) => { 33 | const filePath = path.resolve(pngDirectory, filename); 34 | 35 | const x = (index % MAX_COLUMNS) * SPACE_PER_EMOJI + SPACING / 2; 36 | const y = Math.floor(index / MAX_COLUMNS) * SPACE_PER_EMOJI + SPACING / 2; 37 | 38 | const fileData = fs.readFileSync(filePath); 39 | const image = new Image(); 40 | image.onload = () => { 41 | ctx.drawImage(image, x, y); 42 | }; 43 | image.src = fileData; 44 | image.width = EMOJI_SIZE; 45 | }); 46 | 47 | const output = canvas.toBuffer(); 48 | const outPath = path.resolve('.', 'preview.png'); 49 | 50 | fs.writeFileSync(outPath, output); 51 | -------------------------------------------------------------------------------- /svg/neobread.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /svg/neobread_3c.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /svg/neobread_aww.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /svg/neobread_blep.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /svg/neobread_blush.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /svg/neobread_blush_hide.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /svg/neobread_boop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /svg/neobread_cat_ears.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /svg/neobread_checkmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /svg/neobread_cowboy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /svg/neobread_cross.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /svg/neobread_drake_dislike.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /svg/neobread_drake_like.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /svg/neobread_eyes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /svg/neobread_facepalm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /svg/neobread_fingerguns.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /svg/neobread_fingerguns_cool.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /svg/neobread_flag_ace.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /svg/neobread_flag_agender.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /svg/neobread_flag_aro.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /svg/neobread_flag_bi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /svg/neobread_flag_lesbian.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /svg/neobread_flag_nb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /svg/neobread_flag_pan.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /svg/neobread_flag_rainbow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /svg/neobread_flag_trans.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /svg/neobread_fox_ears.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /svg/neobread_gamer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /svg/neobread_gamer_angry.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /svg/neobread_grimace.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /svg/neobread_halo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /svg/neobread_happy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /svg/neobread_heart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /svg/neobread_heart_eyes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /svg/neobread_hug.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /svg/neobread_hug_mouse.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /svg/neobread_hug_wolf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /svg/neobread_kisser.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /svg/neobread_laptop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /svg/neobread_laugh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /svg/neobread_laugh_sweat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /svg/neobread_laugh_tears.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /svg/neobread_pat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /svg/neobread_pensive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /svg/neobread_pleading.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /svg/neobread_pleased.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /svg/neobread_sad.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /svg/neobread_scream.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /svg/neobread_scream_angry.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /svg/neobread_shrug.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /svg/neobread_sleep.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /svg/neobread_smug.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /svg/neobread_snuggle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /svg/neobread_sob.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /svg/neobread_sob_loud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /svg/neobread_surprise.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /svg/neobread_think.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /svg/neobread_upside_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /svg/neobread_uwu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /svg/neobread_wave.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /svg/neobread_wink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /svg/neobread_woem.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /svg/neobread_woozy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "esModuleInterop": true, 5 | "module": "ESNext", 6 | "moduleResolution": "node", 7 | "strict": true, 8 | "target": "es2017", 9 | "noImplicitAny": false 10 | }, 11 | "include": ["scripts/**/*"] 12 | } 13 | --------------------------------------------------------------------------------