mobile bluesky app made with flutter lazurite.stormlightlabs.org/
mobile bluesky flutter
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: launcher image gen

+686 -1
+2 -1
.prettierrc
··· 1 1 { 2 2 "bracketSameLine": true, 3 - "printWidth": 120 3 + "printWidth": 120, 4 + "objectWrap": "collapse" 4 5 }
+34
scripts/.gitignore
··· 1 + # dependencies (bun install) 2 + node_modules 3 + 4 + # output 5 + out 6 + dist 7 + *.tgz 8 + 9 + # code coverage 10 + coverage 11 + *.lcov 12 + 13 + # logs 14 + logs 15 + _.log 16 + report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json 17 + 18 + # dotenv environment variable files 19 + .env 20 + .env.development.local 21 + .env.test.local 22 + .env.production.local 23 + .env.local 24 + 25 + # caches 26 + .eslintcache 27 + .cache 28 + *.tsbuildinfo 29 + 30 + # IntelliJ based IDEs 31 + .idea 32 + 33 + # Finder (MacOS) folder config 34 + .DS_Store
+92
scripts/README.md
··· 1 + # Lazurite Splash Screen Generator 2 + 3 + CLI tool to generate PNG splash screen images (for Android and iOS) for Lazurite, styled with different color themes. 4 + 5 + ## Usage 6 + 7 + Run without arguments to use the interactive theme selector: 8 + 9 + ```bash 10 + bun run index.ts 11 + ``` 12 + 13 + ### Args 14 + 15 + ```bash 16 + bun run index.ts [options] 17 + ``` 18 + 19 + #### Options 20 + 21 + | Option | Short | Description | Default | 22 + | ----------- | ----- | --------------------------------------------------------- | ----------- | 23 + | `--theme` | `-t` | Theme name: `oxocarbon`, `catppuccin`, `nord`, `rosePine` | Interactive | 24 + | `--variant` | `-v` | Theme variant: `light` or `dark` | Interactive | 25 + | `--output` | `-o` | Output directory for generated images | `./output` | 26 + | `--all` | `-a` | Generate splash screens for all themes | `false` | 27 + | `--help` | `-h` | Show help message | - | 28 + 29 + ### Examples 30 + 31 + Generate splash screens for a specific theme: 32 + 33 + ```bash 34 + bun run index.ts -t oxocarbon -v dark 35 + ``` 36 + 37 + Generate all themes at once: 38 + 39 + ```bash 40 + bun run index.ts --all 41 + ``` 42 + 43 + Specify custom output directory: 44 + 45 + ```bash 46 + bun run index.ts -t nord -v light -o ./assets/splash 47 + ``` 48 + 49 + ## Output Structure 50 + 51 + ```sh 52 + ./dist/ 53 + ├── oxocarbon/ 54 + │ ├── android/ 55 + │ │ ├── splash_mdpi.png 56 + │ │ ├── splash_hdpi.png 57 + │ │ ├── splash_xhdpi.png 58 + │ │ ├── splash_xxhdpi.png 59 + │ │ └── splash_xxxhdpi.png 60 + │ └── ios/ 61 + │ ├── Default.png 62 + │ ├── Default@2x.png 63 + │ ├── Default-568h@2x.png 64 + │ └── ... (more sizes) 65 + ├── catppuccin/ 66 + │ └── ... 67 + └── ... 68 + ``` 69 + 70 + ## Available Themes 71 + 72 + | Theme | Dark Background | Light Background | Primary Color | 73 + | ---------- | --------------- | ---------------- | ------------- | 74 + | Oxocarbon | `#161616` | `#ffffff` | `#78a9ff` | 75 + | Catppuccin | `#1e1e2e` | `#eff1f5` | `#b4befe` | 76 + | Nord | `#2e3440` | `#eceff4` | `#88c0d0` | 77 + | Rosé Pine | `#191724` | `#faf4ed` | `#ebbcba` | 78 + 79 + ## Technical Details 80 + 81 + - **Logo**: Uses the Lazurite SVG logo from `../assets/logo.svg` 82 + - **Font**: Falls back to system serif font (Crimson Pro recommended) 83 + - **Canvas**: Uses `node-canvas` for rendering 84 + - **SVG Processing**: Uses `sharp` for SVG to PNG conversion 85 + 86 + ## Requirements 87 + 88 + [Bun](https://bun.sh/) runtime 89 + 90 + ## License 91 + 92 + See [LICENSE](../LICENSE).
+225
scripts/bun.lock
··· 1 + { 2 + "lockfileVersion": 1, 3 + "configVersion": 1, 4 + "workspaces": { 5 + "": { 6 + "name": "scripts", 7 + "dependencies": { 8 + "@types/inquirer": "^9.0.9", 9 + "canvas": "^3.2.1", 10 + "chalk": "^5.6.2", 11 + "inquirer": "^13.3.2", 12 + "sharp": "^0.34.5", 13 + }, 14 + "devDependencies": { 15 + "@types/bun": "latest", 16 + }, 17 + "peerDependencies": { 18 + "typescript": "^5", 19 + }, 20 + }, 21 + }, 22 + "packages": { 23 + "@emnapi/runtime": ["@emnapi/runtime@1.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw=="], 24 + 25 + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], 26 + 27 + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], 28 + 29 + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], 30 + 31 + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], 32 + 33 + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], 34 + 35 + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], 36 + 37 + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], 38 + 39 + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], 40 + 41 + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], 42 + 43 + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], 44 + 45 + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], 46 + 47 + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], 48 + 49 + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], 50 + 51 + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], 52 + 53 + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], 54 + 55 + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], 56 + 57 + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], 58 + 59 + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], 60 + 61 + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], 62 + 63 + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], 64 + 65 + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], 66 + 67 + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], 68 + 69 + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], 70 + 71 + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], 72 + 73 + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], 74 + 75 + "@inquirer/ansi": ["@inquirer/ansi@2.0.4", "", {}, "sha512-DpcZrQObd7S0R/U3bFdkcT5ebRwbTTC4D3tCc1vsJizmgPLxNJBo+AAFmrZwe8zk30P2QzgzGWZ3Q9uJwWuhIg=="], 76 + 77 + "@inquirer/checkbox": ["@inquirer/checkbox@5.1.2", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/core": "^11.1.7", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PubpMPO2nJgMufkoB3P2wwxNXEMUXnBIKi/ACzDUYfaoPuM7gSTmuxJeMscoLVEsR4qqrCMf5p0SiYGWnVJ8kw=="], 78 + 79 + "@inquirer/confirm": ["@inquirer/confirm@6.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-tiNyA73pgpQ0FQ7axqtoLUe4GDYjNCDcVsbgcA5anvwg2z6i+suEngLKKJrWKJolT//GFPZHwN30binDIHgSgQ=="], 80 + 81 + "@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], 82 + 83 + "@inquirer/editor": ["@inquirer/editor@5.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/external-editor": "^2.0.4", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-VJx4XyaKea7t8hEApTw5dxeIyMtWXre2OiyJcICCRZI4hkoHsMoCnl/KbUnJJExLbH9csLLHMVR144ZhFE1CwA=="], 84 + 85 + "@inquirer/expand": ["@inquirer/expand@5.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-fC0UHJPXsTRvY2fObiwuQYaAnHrp3aDqfwKUJSdfpgv18QUG054ezGbaRNStk/BKD5IPijeMKWej8VV8O5Q/eQ=="], 86 + 87 + "@inquirer/external-editor": ["@inquirer/external-editor@2.0.4", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Prenuv9C1PHj2Itx0BcAOVBTonz02Hc2Nd2DbU67PdGUaqn0nPCnV34oDyyoaZHnmfRxkpuhh/u51ThkrO+RdA=="], 88 + 89 + "@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], 90 + 91 + "@inquirer/input": ["@inquirer/input@5.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-nvZ6qEVeX/zVtZ1dY2hTGDQpVGD3R7MYPLODPgKO8Y+RAqxkrP3i/3NwF3fZpLdaMiNuK0z2NaYIx9tPwiSegQ=="], 92 + 93 + "@inquirer/number": ["@inquirer/number@4.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Ht8OQstxiS3APMGjHV0aYAjRAysidWdwurWEo2i8yI5xbhOBWqizT0+MU1S2GCcuhIBg+3SgWVjEoXgfhY+XaA=="], 94 + 95 + "@inquirer/password": ["@inquirer/password@5.0.10", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QbNyvIE8q2GTqKLYSsA8ATG+eETo+m31DSR0+AU7x3d2FhaTWzqQek80dj3JGTo743kQc6mhBR0erMjYw5jQ0A=="], 96 + 97 + "@inquirer/prompts": ["@inquirer/prompts@8.3.2", "", { "dependencies": { "@inquirer/checkbox": "^5.1.2", "@inquirer/confirm": "^6.0.10", "@inquirer/editor": "^5.0.10", "@inquirer/expand": "^5.0.10", "@inquirer/input": "^5.0.10", "@inquirer/number": "^4.0.10", "@inquirer/password": "^5.0.10", "@inquirer/rawlist": "^5.2.6", "@inquirer/search": "^4.1.6", "@inquirer/select": "^5.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yFroiSj2iiBFlm59amdTvAcQFvWS6ph5oKESls/uqPBect7rTU2GbjyZO2DqxMGuIwVA8z0P4K6ViPcd/cp+0w=="], 98 + 99 + "@inquirer/rawlist": ["@inquirer/rawlist@5.2.6", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-jfw0MLJ5TilNsa9zlJ6nmRM0ZFVZhhTICt4/6CU2Dv1ndY7l3sqqo1gIYZyMMDw0LvE1u1nzJNisfHEhJIxq5w=="], 100 + 101 + "@inquirer/search": ["@inquirer/search@4.1.6", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-3/6kTRae98hhDevENScy7cdFEuURnSpM3JbBNg8yfXLw88HgTOl+neUuy/l9W0No5NzGsLVydhBzTIxZP7yChQ=="], 102 + 103 + "@inquirer/select": ["@inquirer/select@5.1.2", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/core": "^11.1.7", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-kTK8YIkHV+f02y7bWCh7E0u2/11lul5WepVTclr3UMBtBr05PgcZNWfMa7FY57ihpQFQH/spLMHTcr0rXy50tA=="], 104 + 105 + "@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], 106 + 107 + "@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="], 108 + 109 + "@types/inquirer": ["@types/inquirer@9.0.9", "", { "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw=="], 110 + 111 + "@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], 112 + 113 + "@types/through": ["@types/through@0.0.33", "", { "dependencies": { "@types/node": "*" } }, "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ=="], 114 + 115 + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], 116 + 117 + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], 118 + 119 + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], 120 + 121 + "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="], 122 + 123 + "canvas": ["canvas@3.2.1", "", { "dependencies": { "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.3" } }, "sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg=="], 124 + 125 + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], 126 + 127 + "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], 128 + 129 + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], 130 + 131 + "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], 132 + 133 + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], 134 + 135 + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], 136 + 137 + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 138 + 139 + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], 140 + 141 + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], 142 + 143 + "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], 144 + 145 + "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], 146 + 147 + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.0", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w=="], 148 + 149 + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], 150 + 151 + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], 152 + 153 + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], 154 + 155 + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], 156 + 157 + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 158 + 159 + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], 160 + 161 + "inquirer": ["inquirer@13.3.2", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/core": "^11.1.7", "@inquirer/prompts": "^8.3.2", "@inquirer/type": "^4.0.4", "mute-stream": "^3.0.0", "run-async": "^4.0.6", "rxjs": "^7.8.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-bh/OjBGxNR9qvfQj1n5bxtIF58mbOTp2InN5dKuwUK03dXcDGFsjlDinQRuXMZ4EGiJaFieUWHCAaxH2p7iUBw=="], 162 + 163 + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], 164 + 165 + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], 166 + 167 + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], 168 + 169 + "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], 170 + 171 + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], 172 + 173 + "node-abi": ["node-abi@3.89.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA=="], 174 + 175 + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], 176 + 177 + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], 178 + 179 + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], 180 + 181 + "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], 182 + 183 + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], 184 + 185 + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], 186 + 187 + "run-async": ["run-async@4.0.6", "", {}, "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ=="], 188 + 189 + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], 190 + 191 + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], 192 + 193 + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], 194 + 195 + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], 196 + 197 + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], 198 + 199 + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], 200 + 201 + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], 202 + 203 + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], 204 + 205 + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], 206 + 207 + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], 208 + 209 + "tar-fs": ["tar-fs@2.1.4", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ=="], 210 + 211 + "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], 212 + 213 + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 214 + 215 + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], 216 + 217 + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], 218 + 219 + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], 220 + 221 + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 222 + 223 + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 224 + } 225 + }
+88
scripts/constants.ts
··· 1 + import type { ThemeColors } from "./types"; 2 + 3 + /** Splash screen sizes for Android */ 4 + export const ANDROID_SIZES = [ 5 + { name: "mdpi", size: 320 }, 6 + { name: "hdpi", size: 480 }, 7 + { name: "xhdpi", size: 640 }, 8 + { name: "xxhdpi", size: 960 }, 9 + { name: "xxxhdpi", size: 1280 }, 10 + ]; 11 + 12 + /** Splash screen sizes for iOS */ 13 + export const IOS_SIZES = [ 14 + { name: "Default", size: 320, scale: 1 }, 15 + { name: "Default@2x", size: 640, scale: 2 }, 16 + { name: "Default-568h@2x", size: 640, scale: 2, height: 1136 }, 17 + { name: "Default-667h@2x", size: 750, scale: 2, height: 1334 }, 18 + { name: "Default-Portrait-736h@3x", size: 1242, scale: 3, height: 2208 }, 19 + { name: "Default-Landscape-736h@3x", size: 2208, scale: 3, height: 1242 }, 20 + { name: "Default-Portrait-812h@3x", size: 1125, scale: 3, height: 2436 }, // iPhone X 21 + { name: "Default-Landscape-812h@3x", size: 2436, scale: 3, height: 1125 }, 22 + { name: "Default-Portrait-896h@3x", size: 828, scale: 3, height: 1792 }, // iPhone XR 23 + { name: "Default-Landscape-896h@3x", size: 1792, scale: 3, height: 828 }, 24 + { name: "Default-Portrait-926h@3x", size: 1170, scale: 3, height: 2532 }, // iPhone 12/13/14 25 + { name: "Default-Landscape-926h@3x", size: 2532, scale: 3, height: 1170 }, 26 + { name: "Default-Portrait-932h@3x", size: 1179, scale: 3, height: 2556 }, // iPhone 14 Pro 27 + { name: "Default-Landscape-932h@3x", size: 2556, scale: 3, height: 1179 }, 28 + ]; 29 + 30 + type ThemeKey = 31 + | "oxocarbon" 32 + | "oxocarbon-light" 33 + | "catppuccin" 34 + | "catppuccin-light" 35 + | "nord" 36 + | "nord-light" 37 + | "rosePine" 38 + | "rosePine-light"; 39 + 40 + export const THEMES: Record<ThemeKey, ThemeColors> = { 41 + oxocarbon: { name: "Oxocarbon", variant: "dark", background: "#161616", text: "#f2f4f8", primary: "#78a9ff" }, 42 + "oxocarbon-light": { 43 + name: "Oxocarbon Light", 44 + variant: "light", 45 + background: "#ffffff", 46 + text: "#161616", 47 + primary: "#0f62fe", 48 + }, 49 + catppuccin: { name: "Catppuccin", variant: "dark", background: "#1e1e2e", text: "#cdd6f4", primary: "#b4befe" }, 50 + "catppuccin-light": { 51 + name: "Catppuccin Light", 52 + variant: "light", 53 + background: "#eff1f5", 54 + text: "#4c4f69", 55 + primary: "#7287fd", 56 + }, 57 + nord: { name: "Nord", variant: "dark", background: "#2e3440", text: "#e5e9f0", primary: "#88c0d0" }, 58 + "nord-light": { name: "Nord Light", variant: "light", background: "#eceff4", text: "#4c566a", primary: "#88c0d0" }, 59 + rosePine: { name: "Rosé Pine", variant: "dark", background: "#191724", text: "#e0def4", primary: "#ebbcba" }, 60 + "rosePine-light": { 61 + name: "Rosé Pine Light", 62 + variant: "light", 63 + background: "#faf4ed", 64 + text: "#575279", 65 + primary: "#d7827e", 66 + }, 67 + }; 68 + 69 + export function getThemeFromKey(k: ThemeKey | string): ThemeColors { 70 + switch (k) { 71 + case "oxocarbon": 72 + return THEMES.oxocarbon; 73 + case "oxocarbon-light": 74 + return THEMES["oxocarbon-light"]; 75 + case "catppuccin": 76 + return THEMES.catppuccin; 77 + case "catppuccin-light": 78 + return THEMES["catppuccin-light"]; 79 + case "nord": 80 + return THEMES.nord; 81 + case "nord-light": 82 + return THEMES["nord-light"]; 83 + case "rosePine": 84 + return THEMES.rosePine; 85 + default: 86 + return THEMES["rosePine-light"]; 87 + } 88 + }
+187
scripts/index.ts
··· 1 + #!/usr/bin/env bun 2 + 3 + import { createCanvas, loadImage } from "canvas"; 4 + import chalk from "chalk"; 5 + import { mkdir } from "fs/promises"; 6 + import { parseArgs } from "util"; 7 + import inquirer from "inquirer"; 8 + import sharp from "sharp"; 9 + import { readFile } from "fs/promises"; 10 + import path from "path"; 11 + import type { ThemeColors } from "./types"; 12 + import { ANDROID_SIZES, IOS_SIZES, THEMES, getThemeFromKey } from "./constants"; 13 + 14 + async function generateSplashScreen( 15 + theme: ThemeColors, 16 + width: number, 17 + height: number, 18 + logoSvgPath: string, 19 + outputPath: string, 20 + ): Promise<void> { 21 + const canvas = createCanvas(width, height); 22 + const ctx = canvas.getContext("2d"); 23 + 24 + ctx.fillStyle = theme.background; 25 + ctx.fillRect(0, 0, width, height); 26 + 27 + const minDim = Math.min(width, height); 28 + const logoSize = minDim * 0.22; 29 + const gap = minDim * 0.04; // Gap between logo and text (like 16px in about screen) 30 + const fontSize = minDim * 0.07; 31 + 32 + // Calculate total height of logo + gap + text to center the group 33 + const totalGroupHeight = logoSize + gap + fontSize; 34 + const groupCenterY = height / 2; 35 + const logoY = groupCenterY - totalGroupHeight / 2; 36 + const textY = logoY + logoSize + gap + fontSize / 2; 37 + 38 + try { 39 + let svgContent = await readFile(logoSvgPath, "utf-8"); 40 + svgContent = svgContent.replace('fill="currentColor"', `fill="${theme.primary}"`); 41 + 42 + const svgBuffer = Buffer.from(svgContent); 43 + const logoPngBuffer = await sharp(svgBuffer).resize(Math.round(logoSize), Math.round(logoSize)).png().toBuffer(); 44 + const logo = await loadImage(logoPngBuffer); 45 + const logoX = (width - logoSize) / 2; 46 + 47 + ctx.drawImage(logo, logoX, logoY, logoSize, logoSize); 48 + } catch (error) { 49 + console.warn(chalk.yellow("⚠ Warning: Could not load logo, drawing placeholder")); 50 + ctx.beginPath(); 51 + ctx.arc(width / 2, logoY + logoSize / 2, logoSize / 2, 0, Math.PI * 2); 52 + ctx.fillStyle = theme.primary; 53 + ctx.fill(); 54 + } 55 + 56 + ctx.font = `${fontSize}px serif`; 57 + ctx.fillStyle = theme.text; 58 + ctx.textAlign = "center"; 59 + ctx.textBaseline = "middle"; 60 + ctx.fillText("Lazurite", width / 2, textY); 61 + 62 + const buffer = canvas.toBuffer("image/png"); 63 + await Bun.write(outputPath, buffer); 64 + } 65 + 66 + async function main() { 67 + console.log(chalk.cyan.bold("🎨 Lazurite Splash Screen Generator\n")); 68 + 69 + const { values, positionals } = parseArgs({ 70 + args: Bun.argv.slice(2), 71 + options: { 72 + theme: { 73 + type: "string", 74 + short: "t", 75 + help: "Theme name (oxocarbon, catppuccin, nord, rosePine) or with -light suffix", 76 + }, 77 + variant: { type: "string", short: "v", help: "Theme variant (light or dark)" }, 78 + output: { type: "string", short: "o", default: "./dist", help: "Output directory for generated images" }, 79 + all: { type: "boolean", short: "a", default: false, help: "Generate for all themes" }, 80 + help: { type: "boolean", short: "h", default: false, help: "Show help" }, 81 + }, 82 + strict: true, 83 + allowPositionals: true, 84 + }); 85 + 86 + if (values.help) { 87 + console.log(chalk.bold("Usage:")); 88 + console.log(" bun run index.ts [options]\n"); 89 + console.log(chalk.bold("Options:")); 90 + console.log(" -t, --theme <name> Theme name (oxocarbon, catppuccin, nord, rosePine)"); 91 + console.log(" -v, --variant <type> Theme variant (light or dark)"); 92 + console.log(" -o, --output <dir> Output directory (default: ./dist)"); 93 + console.log(" -a, --all Generate for all themes"); 94 + console.log(" -h, --help Show this help message\n"); 95 + console.log(chalk.bold("Examples:")); 96 + console.log(" bun run index.ts -t oxocarbon -v dark"); 97 + console.log(" bun run index.ts --all"); 98 + console.log(" bun run index.ts -t nord -o ./splash\n"); 99 + process.exit(0); 100 + } 101 + 102 + let themesToGenerate: ThemeColors[] = []; 103 + 104 + if (values.all) { 105 + themesToGenerate = Object.values(THEMES); 106 + } else if (values.theme) { 107 + const themeKey = values.variant === "light" ? `${values.theme}-light` : values.theme; 108 + const theme = getThemeFromKey(themeKey); 109 + themesToGenerate = [theme]; 110 + } else { 111 + const answers = await inquirer.prompt([ 112 + { 113 + type: "list", 114 + name: "palette", 115 + message: "Select theme palette:", 116 + choices: [ 117 + { name: "Oxocarbon", value: "oxocarbon" }, 118 + { name: "Catppuccin", value: "catppuccin" }, 119 + { name: "Nord", value: "nord" }, 120 + { name: "Rosé Pine", value: "rosePine" }, 121 + ], 122 + }, 123 + { 124 + type: "list", 125 + name: "variant", 126 + message: "Select theme variant:", 127 + choices: [ 128 + { name: "Dark", value: "dark" }, 129 + { name: "Light", value: "light" }, 130 + ], 131 + }, 132 + { type: "confirm", name: "generateAll", message: "Generate for all themes instead?", default: false }, 133 + ]); 134 + 135 + if (answers.generateAll) { 136 + themesToGenerate = Object.values(THEMES); 137 + } else { 138 + const themeKey = answers.variant === "light" ? `${answers.palette}-light` : answers.palette; 139 + themesToGenerate = [getThemeFromKey(themeKey)]; 140 + } 141 + } 142 + 143 + const outputDir = values.output || "./dist"; 144 + const logoPath = path.resolve("../assets/logo.svg"); 145 + 146 + console.log(chalk.blue(`\n📁 Output directory: ${outputDir}`)); 147 + console.log(chalk.blue(`🎨 Themes to generate: ${themesToGenerate.length}`)); 148 + console.log(); 149 + 150 + for (const theme of themesToGenerate) { 151 + console.log(chalk.magenta(`\n🖼 Generating for ${theme.name} (${theme.variant})...`)); 152 + 153 + const themeDir = path.join(outputDir, theme.name.toLowerCase().replace(" ", "-")); 154 + const androidDir = path.join(themeDir, "android"); 155 + const iosDir = path.join(themeDir, "ios"); 156 + 157 + await mkdir(androidDir, { recursive: true }); 158 + await mkdir(iosDir, { recursive: true }); 159 + 160 + for (const size of ANDROID_SIZES) { 161 + const fileName = `splash_${size.name}.png`; 162 + const outputPath = path.join(androidDir, fileName); 163 + 164 + await generateSplashScreen(theme, size.size, Math.round(size.size * 1.5), logoPath, outputPath); 165 + 166 + console.log(chalk.green(` ✓ ${fileName}`)); 167 + } 168 + 169 + for (const size of IOS_SIZES) { 170 + const width = size.size; 171 + const height = size.height || Math.round(width * 1.5); 172 + const fileName = `${size.name}.png`; 173 + const outputPath = path.join(iosDir, fileName); 174 + 175 + await generateSplashScreen(theme, width, height, logoPath, outputPath); 176 + 177 + console.log(chalk.green(` ✓ ${fileName}`)); 178 + } 179 + } 180 + 181 + console.log(chalk.cyan.bold("\n✅ Splash screen generation complete!\n")); 182 + } 183 + 184 + main().catch((error) => { 185 + console.error(chalk.red("✗ Error:"), error.message); 186 + process.exit(1); 187 + });
+26
scripts/package.json
··· 1 + { 2 + "name": "lazurite-splash-generator", 3 + "version": "1.0.0", 4 + "description": "CLI tool to generate splash screen images for Lazurite app", 5 + "module": "index.ts", 6 + "type": "module", 7 + "private": true, 8 + "scripts": { 9 + "start": "bun run index.ts", 10 + "build": "bun build index.ts --outfile=dist/splash-gen --target=bun", 11 + "generate": "bun run index.ts" 12 + }, 13 + "devDependencies": { 14 + "@types/bun": "latest" 15 + }, 16 + "peerDependencies": { 17 + "typescript": "^5" 18 + }, 19 + "dependencies": { 20 + "@types/inquirer": "^9.0.9", 21 + "canvas": "^3.2.1", 22 + "chalk": "^5.6.2", 23 + "inquirer": "^13.3.2", 24 + "sharp": "^0.34.5" 25 + } 26 + }
+29
scripts/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + // Environment setup & latest features 4 + "lib": ["ESNext"], 5 + "target": "ESNext", 6 + "module": "Preserve", 7 + "moduleDetection": "force", 8 + "jsx": "react-jsx", 9 + "allowJs": true, 10 + 11 + // Bundler mode 12 + "moduleResolution": "bundler", 13 + "allowImportingTsExtensions": true, 14 + "verbatimModuleSyntax": true, 15 + "noEmit": true, 16 + 17 + // Best practices 18 + "strict": true, 19 + "skipLibCheck": true, 20 + "noFallthroughCasesInSwitch": true, 21 + "noUncheckedIndexedAccess": true, 22 + "noImplicitOverride": true, 23 + 24 + // Some stricter flags (disabled by default) 25 + "noUnusedLocals": false, 26 + "noUnusedParameters": false, 27 + "noPropertyAccessFromIndexSignature": false 28 + } 29 + }
+3
scripts/types.ts
··· 1 + export type ThemeVariant = "light" | "dark"; 2 + 3 + export type ThemeColors = { name: string; variant: ThemeVariant; background: string; text: string; primary: string };