From e387c4f3d123429982491e44b3a479a2f763863f Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Sun, 22 Mar 2026 20:20:56 +0100 Subject: [PATCH] Minor updates --- .gitignore | 2 +- README.md | 27 ++++++++++++++++-- nixpacks.toml | 4 +-- {assets => public/assets}/app.js | 0 public/assets/favicon/apple-touch-icon.png | Bin 0 -> 4766 bytes public/assets/favicon/favicon-96x96.png | Bin 0 -> 2572 bytes public/assets/favicon/favicon.ico | Bin 0 -> 15086 bytes .../assets/favicon/favicon.svg | 0 public/assets/favicon/site.webmanifest | 21 ++++++++++++++ .../favicon/web-app-manifest-192x192.png | Bin 0 -> 5019 bytes .../favicon/web-app-manifest-512x512.png | Bin 0 -> 14327 bytes {assets => public/assets}/ofl.svg | 0 {assets => public/assets}/sample.html | 0 public/assets/showcase.svg | 13 +++++++++ {assets => public/assets}/styles.css | 0 index.php => public/index.php | 10 +++++-- serve-locally.sh | 6 ++++ {web => src}/load_fonts.php | 5 ++-- 18 files changed, 77 insertions(+), 11 deletions(-) rename {assets => public/assets}/app.js (100%) create mode 100644 public/assets/favicon/apple-touch-icon.png create mode 100644 public/assets/favicon/favicon-96x96.png create mode 100644 public/assets/favicon/favicon.ico rename assets/showcase.svg => public/assets/favicon/favicon.svg (100%) create mode 100644 public/assets/favicon/site.webmanifest create mode 100644 public/assets/favicon/web-app-manifest-192x192.png create mode 100644 public/assets/favicon/web-app-manifest-512x512.png rename {assets => public/assets}/ofl.svg (100%) rename {assets => public/assets}/sample.html (100%) create mode 100644 public/assets/showcase.svg rename {assets => public/assets}/styles.css (100%) rename index.php => public/index.php (95%) create mode 100755 serve-locally.sh rename {web => src}/load_fonts.php (83%) diff --git a/.gitignore b/.gitignore index 61a2f04..c574055 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -repos/ebook-fonts +public/repos/ebook-fonts .env diff --git a/README.md b/README.md index 8e00f4c..b9ae325 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,26 @@ -# ebook-fonts showcase +# Showcase for ebook-fonts -A website to showcase my [font collection](https://github.com/nicoverbruggen/ebook-fonts). +**This repository is just to make the source code available.** You can visit the interactive showcase here: [ebook-fonts.nicoverbruggen.be](https://ebook-fonts.nicoverbruggen.be). -You can visit the website at: https://ebook-fonts.nicoverbruggen.be. \ No newline at end of file +A website to showcase my [font collection](https://github.com/nicoverbruggen/ebook-fonts). Browse and preview fonts with adjustable size, line height, dark mode, and bezel color. + +## Project structure + +``` +public/ Web root (served to browsers) + assets/ CSS, JS, SVGs, favicons +src/ PHP includes (not web-accessible) + load_fonts.php Scans the font repo and builds the font list +``` + +## Local development + +```bash +./serve-locally.sh +``` + +Starts a PHP dev server on `http://localhost:8888`. Set `PORT` to use a different port. + +## Deployment + +Fonts are cloned from [ebook-fonts](https://github.com/nicoverbruggen/ebook-fonts) during the build phase (see `nixpacks.toml`). diff --git a/nixpacks.toml b/nixpacks.toml index 1f9d8c2..0a28c14 100644 --- a/nixpacks.toml +++ b/nixpacks.toml @@ -1,6 +1,6 @@ [phases.setup] nixPkgs = ["php84"] -cmds = ["git clone --branch trunk --depth 1 https://github.com/nicoverbruggen/ebook-fonts.git ./repos/ebook-fonts"] +cmds = ["git clone --branch trunk --depth 1 https://github.com/nicoverbruggen/ebook-fonts.git ./public/repos/ebook-fonts"] [start] -cmd = "php -S 0.0.0.0:${PORT:-8080} -t ." +cmd = "php -S 0.0.0.0:${PORT:-8080} -t public" diff --git a/assets/app.js b/public/assets/app.js similarity index 100% rename from assets/app.js rename to public/assets/app.js diff --git a/public/assets/favicon/apple-touch-icon.png b/public/assets/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a1fb45c49fd8dd4cc501d784d9ac54894f1144 GIT binary patch literal 4766 zcmd5=_ct8g)0T+dOC)Nvgs9OiQIhDE#S*IvB3YtD@1h6MOGIbw>Sc9NHae@9B}9oD zbp?y)?|%M*_t)>aWq!D4&b>2pXXZIiw4Say6*&tz0RaJ(riO|EUe^D&NblnJ+UlgY zctLEVt*%0F``^fKFHRvKpa*NJyfF01-p}zhXEe_J(OTY;b(siOURT_3a3;E2$oV_2 zpT&D5z+=^Z)eboGQD$^KWf-{nL9)M3Hrf^_iS<*ly~p?>^;OcQqRNZsiQtV?;_ra( z{7^S@jk$mm{4WMYUXFQSh&b&y1jTLNU| z>t$BluQMpl1f`ZhTQgVq+k4R3Zj;}SyY$em$uy*_oTYVN3F2-@;~8rg_J=7buc3;Z#wP=d_7vFm47Ovui#RlP2? z^owwK1;Uj}-B>1ILyp)%GI&A`(AKp!?8IJT!J5_*F=9Vu0XvVK84U450OMmdsvA5# zy{Smw<{KO{?k9JDa-@HVvcVpbt^7=@R_u$W{f3MV@f!ixYsWv1hWZglx+ln_uP>i( zQG~OF*eT63kVA-8&R*rMls=9%5n@vMBcz*MGAv9v?W|a+>V|j5!2aE8(c$|b-C9TmNm|oI>%8Wg>?JY4 z??MdRe;&a!NcY_)Zea~`{?$%N13rmvqmV7&o+>cWBAn-rGNW|~sr$9C)*UFyfjKI^ z9UN1PO2OUlaLZYU6wYUyPbTYoC8_FIWtFbcGj+?hwe15j!_u)-%4QZsL#?l3%Gw@n zS3Pl}z1KfK*gHBh)iu-E<8Wto_@(i(vN6bNrZ4$(FHczD^&%1Fr4I0Zf2tNd zc%i1gX^m_#4IYY&FoK{nKjVZ*ydN2@KCfs=30&`PY?Z

Cl-@Y$|)YOfz0d4pEvY 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 literal 0 HcmV?d00001 diff --git a/public/assets/favicon/favicon.ico b/public/assets/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cf1d9b745cb99fd6ae3728fbd44f9778b8a39240 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/public/assets/favicon/web-app-manifest-512x512.png b/public/assets/favicon/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..7f61431f07d469ecd2ac773354595cb12ad2b1c8 GIT binary patch literal 14327 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 + + + + + + + + + + + + diff --git a/assets/styles.css b/public/assets/styles.css similarity index 100% rename from assets/styles.css rename to public/assets/styles.css diff --git a/index.php b/public/index.php similarity index 95% rename from index.php rename to public/index.php index 7477140..c1a1218 100644 --- a/index.php +++ b/public/index.php @@ -1,6 +1,6 @@ @@ -12,7 +12,11 @@ require __DIR__ . '/web/load_fonts.php'; - + + + + + eBook Fonts Showcase diff --git a/serve-locally.sh b/serve-locally.sh new file mode 100755 index 0000000..94c15de --- /dev/null +++ b/serve-locally.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail + +PORT="${PORT:-8888}" +echo "Starting server on http://localhost:${PORT}" +php -S "0.0.0.0:${PORT}" -t public diff --git a/web/load_fonts.php b/src/load_fonts.php similarity index 83% rename from web/load_fonts.php rename to src/load_fonts.php index bf8d66a..3d17f24 100644 --- a/web/load_fonts.php +++ b/src/load_fonts.php @@ -4,7 +4,8 @@ if (!defined('APP_ROOT')) { exit; } -$fontRoot = APP_ROOT . '/repos/ebook-fonts/fonts'; +$fontRoot = APP_ROOT . '/public/repos/ebook-fonts/fonts'; +$webRoot = APP_ROOT . '/public'; $fontEntries = []; $iterator = new RecursiveIteratorIterator( @@ -21,7 +22,7 @@ foreach ($iterator as $fileInfo) { if (str_contains($fileInfo->getFilename(), 'NV_OpenDyslexic')) { continue; } - $relative = str_replace(APP_ROOT . '/', '', $fileInfo->getPathname()); + $relative = str_replace($webRoot . '/', '', $fileInfo->getPathname()); $relative = str_replace(DIRECTORY_SEPARATOR, '/', $relative); $fontEntries[] = $relative; }