From 2fbf820ca79dc356733307ca6d50a63970606f63 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Thu, 18 Jun 2026 09:12:42 +0100 Subject: [PATCH 1/3] build: split bundled fonts into a separate artifact and slim the publication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why: the published graph-compose artifact set was ~40 MB per release — the ~18 MB of bundled Google fonts shipped inside the main jar AND again in the -sources jar, and the -tests classifier jar was deployed too. Fonts change rarely, so re-shipping them on every engine release wasted Maven Central storage and forced an engine-only upgrade to re-download fonts. What: - New io.github.demchaav:graph-compose-fonts module (independent 1.0.0 line) carries the fonts/google/** binaries; classpath paths preserved byte-for-byte so DefaultFonts resolves them unchanged. The engine depends on it at TEST scope only, so it never propagates to consumers. - New io.github.demchaav:graph-compose-bundle (pom) aggregates engine + fonts for a one-line "batteries-included" install; tracks the engine version. - The engine release no longer attaches or deploys the -tests jar (kept as a local build aid for the benchmarks module); with the fonts gone the -sources jar is lean too. Main jar drops from ~20 MB to ~2.6 MB. - A missing fonts/google resource now fails with an actionable message naming the graph-compose-fonts dependency. - Fonts publish on their own fonts-v* tag (publish-fonts.yml); the engine v* tag deploys engine + bundle and installs fonts first for the test-scope verify. cut-release.ps1 bumps the bundle in lockstep while fonts stays independent; VersionConsistencyGuardTest enforces both. CHANGELOG, README, and docs/migration/v1.8.0-fonts.md document the consumer-facing change. Verification: ./mvnw clean verify -pl . green (1397 tests, including two new font-degradation tests and the bundle/fonts version guards); the fonts and bundle modules build and resolve; the release jar contains no fonts/google and no -tests classifier; the CvSidebarPortrait example renders (Google fonts from the fonts jar + portrait asset from the engine jar). BREAKING CHANGE: bundled Google fonts are no longer inside graph-compose. To keep them, add io.github.demchaav:graph-compose-fonts (or depend on graph-compose-bundle). The FontName API and DefaultFonts catalog are unchanged (source- and binary-compatible); standard-14 documents render with no extra dependency. See docs/migration/v1.8.0-fonts.md. --- .github/workflows/publish-fonts.yml | 67 ++++++ .github/workflows/publish.yml | 24 ++- CHANGELOG.md | 26 +++ README.md | 19 ++ aggregator/pom.xml | 30 +++ benchmarks/pom.xml | 12 ++ bundle/pom.xml | 138 ++++++++++++ docs/contributing/release-process.md | 36 +++- docs/migration/v1.8.0-fonts.md | 86 ++++++++ docs/troubleshooting.md | 4 +- examples/pom.xml | 12 ++ fonts/pom.xml | 198 ++++++++++++++++++ .../compose/fonts/GraphComposeFonts.java | 44 ++++ .../google/alegreyasans/AlegreyaSans-Bold.ttf | Bin .../alegreyasans/AlegreyaSans-BoldItalic.ttf | Bin .../alegreyasans/AlegreyaSans-Italic.ttf | Bin .../alegreyasans/AlegreyaSans-Regular.ttf | Bin .../fonts/google/alegreyasans/OFL.txt | 0 .../fonts/google/andika/Andika-Bold.ttf | Bin .../fonts/google/andika/Andika-BoldItalic.ttf | Bin .../fonts/google/andika/Andika-Italic.ttf | Bin .../fonts/google/andika/Andika-Regular.ttf | Bin .../resources/fonts/google/andika/OFL.txt | 0 .../fonts/google/arsenal/Arsenal-Bold.ttf | Bin .../google/arsenal/Arsenal-BoldItalic.ttf | Bin .../fonts/google/arsenal/Arsenal-Italic.ttf | Bin .../fonts/google/arsenal/Arsenal-Regular.ttf | Bin .../resources/fonts/google/arsenal/OFL.txt | 0 .../asapcondensed/AsapCondensed-Bold.ttf | Bin .../AsapCondensed-BoldItalic.ttf | Bin .../asapcondensed/AsapCondensed-Italic.ttf | Bin .../asapcondensed/AsapCondensed-Regular.ttf | Bin .../fonts/google/asapcondensed/OFL.txt | 0 .../google/baijamjuree/BaiJamjuree-Bold.ttf | Bin .../baijamjuree/BaiJamjuree-BoldItalic.ttf | Bin .../google/baijamjuree/BaiJamjuree-Italic.ttf | Bin .../baijamjuree/BaiJamjuree-Regular.ttf | Bin .../fonts/google/baijamjuree/OFL.txt | 0 .../fonts/google/barlow/Barlow-Bold.ttf | Bin .../fonts/google/barlow/Barlow-BoldItalic.ttf | Bin .../fonts/google/barlow/Barlow-Italic.ttf | Bin .../fonts/google/barlow/Barlow-Regular.ttf | Bin .../resources/fonts/google/barlow/OFL.txt | 0 .../barlowcondensed/BarlowCondensed-Bold.ttf | Bin .../BarlowCondensed-BoldItalic.ttf | Bin .../BarlowCondensed-Italic.ttf | Bin .../BarlowCondensed-Regular.ttf | Bin .../fonts/google/barlowcondensed/OFL.txt | 0 .../fonts/google/carlito/Carlito-Bold.ttf | Bin .../google/carlito/Carlito-BoldItalic.ttf | Bin .../fonts/google/carlito/Carlito-Italic.ttf | Bin .../fonts/google/carlito/Carlito-Regular.ttf | Bin .../resources/fonts/google/carlito/OFL.txt | 0 .../fonts/google/cousine/Cousine-Bold.ttf | Bin .../google/cousine/Cousine-BoldItalic.ttf | Bin .../fonts/google/cousine/Cousine-Italic.ttf | Bin .../fonts/google/cousine/Cousine-Regular.ttf | Bin .../fonts/google/cousine/LICENSE.txt | 0 .../google/crimsontext/CrimsonText-Bold.ttf | Bin .../crimsontext/CrimsonText-BoldItalic.ttf | Bin .../google/crimsontext/CrimsonText-Italic.ttf | Bin .../crimsontext/CrimsonText-Regular.ttf | Bin .../fonts/google/crimsontext/OFL.txt | 0 .../fonts/google/firasans/FiraSans-Bold.ttf | Bin .../google/firasans/FiraSans-BoldItalic.ttf | Bin .../fonts/google/firasans/FiraSans-Italic.ttf | Bin .../google/firasans/FiraSans-Regular.ttf | Bin .../resources/fonts/google/firasans/OFL.txt | 0 .../FiraSansCondensed-Bold.ttf | Bin .../FiraSansCondensed-BoldItalic.ttf | Bin .../FiraSansCondensed-Italic.ttf | Bin .../FiraSansCondensed-Regular.ttf | Bin .../fonts/google/firasanscondensed/OFL.txt | 0 .../google/gentiumplus/GentiumPlus-Bold.ttf | Bin .../gentiumplus/GentiumPlus-BoldItalic.ttf | Bin .../google/gentiumplus/GentiumPlus-Italic.ttf | Bin .../gentiumplus/GentiumPlus-Regular.ttf | Bin .../fonts/google/gentiumplus/OFL.txt | 0 .../google/ibmplexmono/IBMPlexMono-Bold.ttf | Bin .../ibmplexmono/IBMPlexMono-BoldItalic.ttf | Bin .../google/ibmplexmono/IBMPlexMono-Italic.ttf | Bin .../ibmplexmono/IBMPlexMono-Regular.ttf | Bin .../fonts/google/ibmplexmono/OFL.txt | 0 .../google/ibmplexserif/IBMPlexSerif-Bold.ttf | Bin .../ibmplexserif/IBMPlexSerif-BoldItalic.ttf | Bin .../ibmplexserif/IBMPlexSerif-Italic.ttf | Bin .../ibmplexserif/IBMPlexSerif-Regular.ttf | Bin .../fonts/google/ibmplexserif/OFL.txt | 0 .../jetbrainsmono/JetBrainsMono-Bold.ttf | Bin .../JetBrainsMono-BoldItalic.ttf | Bin .../jetbrainsmono/JetBrainsMono-Italic.ttf | Bin .../jetbrainsmono/JetBrainsMono-Regular.ttf | Bin .../fonts/google/jetbrainsmono/OFL.txt | 0 .../fonts/google/kanit/Kanit-Bold.ttf | Bin .../fonts/google/kanit/Kanit-BoldItalic.ttf | Bin .../fonts/google/kanit/Kanit-Italic.ttf | Bin .../fonts/google/kanit/Kanit-Regular.ttf | Bin .../main/resources/fonts/google/kanit/OFL.txt | 0 .../resources/fonts/google/lato/Lato-Bold.ttf | Bin .../fonts/google/lato/Lato-BoldItalic.ttf | Bin .../fonts/google/lato/Lato-Italic.ttf | Bin .../fonts/google/lato/Lato-Regular.ttf | Bin .../main/resources/fonts/google/lato/OFL.txt | 0 .../resources/fonts/google/poppins/OFL.txt | 0 .../fonts/google/poppins/Poppins-Bold.ttf | Bin .../google/poppins/Poppins-BoldItalic.ttf | Bin .../fonts/google/poppins/Poppins-Italic.ttf | Bin .../fonts/google/poppins/Poppins-Regular.ttf | Bin .../resources/fonts/google/prompt/OFL.txt | 0 .../fonts/google/prompt/Prompt-Bold.ttf | Bin .../fonts/google/prompt/Prompt-BoldItalic.ttf | Bin .../fonts/google/prompt/Prompt-Italic.ttf | Bin .../fonts/google/prompt/Prompt-Regular.ttf | Bin .../resources/fonts/google/ptsans/OFL.txt | 0 .../fonts/google/ptsans/PT_Sans-Web-Bold.ttf | Bin .../google/ptsans/PT_Sans-Web-BoldItalic.ttf | Bin .../google/ptsans/PT_Sans-Web-Italic.ttf | Bin .../google/ptsans/PT_Sans-Web-Regular.ttf | Bin .../resources/fonts/google/ptserif/OFL.txt | 0 .../google/ptserif/PT_Serif-Web-Bold.ttf | Bin .../ptserif/PT_Serif-Web-BoldItalic.ttf | Bin .../google/ptserif/PT_Serif-Web-Italic.ttf | Bin .../google/ptserif/PT_Serif-Web-Regular.ttf | Bin .../resources/fonts/google/sarabun/OFL.txt | 0 .../fonts/google/sarabun/Sarabun-Bold.ttf | Bin .../google/sarabun/Sarabun-BoldItalic.ttf | Bin .../fonts/google/sarabun/Sarabun-Italic.ttf | Bin .../fonts/google/sarabun/Sarabun-Regular.ttf | Bin .../resources/fonts/google/spectral/OFL.txt | 0 .../fonts/google/spectral/Spectral-Bold.ttf | Bin .../google/spectral/Spectral-BoldItalic.ttf | Bin .../fonts/google/spectral/Spectral-Italic.ttf | Bin .../google/spectral/Spectral-Regular.ttf | Bin .../resources/fonts/google/taviraj/OFL.txt | 0 .../fonts/google/taviraj/Taviraj-Bold.ttf | Bin .../google/taviraj/Taviraj-BoldItalic.ttf | Bin .../fonts/google/taviraj/Taviraj-Italic.ttf | Bin .../fonts/google/taviraj/Taviraj-Regular.ttf | Bin .../resources/fonts/google/tinos/LICENSE.txt | 0 .../fonts/google/tinos/Tinos-Bold.ttf | Bin .../fonts/google/tinos/Tinos-BoldItalic.ttf | Bin .../fonts/google/tinos/Tinos-Italic.ttf | Bin .../fonts/google/tinos/Tinos-Regular.ttf | Bin .../resources/fonts/google/trirong/OFL.txt | 0 .../fonts/google/trirong/Trirong-Bold.ttf | Bin .../google/trirong/Trirong-BoldItalic.ttf | Bin .../fonts/google/trirong/Trirong-Italic.ttf | Bin .../fonts/google/trirong/Trirong-Regular.ttf | Bin .../resources/fonts/google/ubuntu/UFL.txt | 0 .../fonts/google/ubuntu/Ubuntu-Bold.ttf | Bin .../fonts/google/ubuntu/Ubuntu-BoldItalic.ttf | Bin .../fonts/google/ubuntu/Ubuntu-Italic.ttf | Bin .../fonts/google/ubuntu/Ubuntu-Regular.ttf | Bin .../resources/fonts/google/volkhov/OFL.txt | 0 .../fonts/google/volkhov/Volkhov-Bold.ttf | Bin .../google/volkhov/Volkhov-BoldItalic.ttf | Bin .../fonts/google/volkhov/Volkhov-Italic.ttf | Bin .../fonts/google/volkhov/Volkhov-Regular.ttf | Bin .../resources/fonts/google/zillaslab/OFL.txt | 0 .../fonts/google/zillaslab/ZillaSlab-Bold.ttf | Bin .../google/zillaslab/ZillaSlab-BoldItalic.ttf | Bin .../google/zillaslab/ZillaSlab-Italic.ttf | Bin .../google/zillaslab/ZillaSlab-Regular.ttf | Bin pom.xml | 61 +++++- scripts/cut-release.ps1 | 18 +- .../compose/font/FontFamilyDefinition.java | 20 +- .../font/FontLibraryIntegrationTest.java | 34 ++- .../VersionConsistencyGuardTest.java | 34 +++ 168 files changed, 848 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/publish-fonts.yml create mode 100644 bundle/pom.xml create mode 100644 docs/migration/v1.8.0-fonts.md create mode 100644 fonts/pom.xml create mode 100644 fonts/src/main/java/com/demcha/compose/fonts/GraphComposeFonts.java rename {src => fonts/src}/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/alegreyasans/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/andika/Andika-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/andika/Andika-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/andika/Andika-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/andika/Andika-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/andika/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/arsenal/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/asapcondensed/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/baijamjuree/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/barlow/Barlow-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/barlow/Barlow-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/barlow/Barlow-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/barlow/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/barlowcondensed/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/carlito/Carlito-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/carlito/Carlito-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/carlito/Carlito-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/carlito/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/cousine/Cousine-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/cousine/Cousine-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/cousine/Cousine-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/cousine/LICENSE.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/crimsontext/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/firasans/FiraSans-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/firasans/FiraSans-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/firasans/FiraSans-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/firasans/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/firasanscondensed/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/gentiumplus/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexmono/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ibmplexserif/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/jetbrainsmono/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/kanit/Kanit-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/kanit/Kanit-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/kanit/Kanit-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/kanit/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/lato/Lato-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/lato/Lato-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/lato/Lato-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/lato/Lato-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/lato/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/poppins/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/poppins/Poppins-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/poppins/Poppins-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/poppins/Poppins-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/prompt/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/prompt/Prompt-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/prompt/Prompt-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/prompt/Prompt-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ptsans/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ptserif/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/sarabun/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/spectral/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/spectral/Spectral-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/spectral/Spectral-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/spectral/Spectral-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/taviraj/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/tinos/LICENSE.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/tinos/Tinos-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/tinos/Tinos-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/tinos/Tinos-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/trirong/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/trirong/Trirong-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/trirong/Trirong-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/trirong/Trirong-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ubuntu/UFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/volkhov/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/zillaslab/OFL.txt (100%) rename {src => fonts/src}/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf (100%) rename {src => fonts/src}/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf (100%) diff --git a/.github/workflows/publish-fonts.yml b/.github/workflows/publish-fonts.yml new file mode 100644 index 00000000..b85dfb52 --- /dev/null +++ b/.github/workflows/publish-fonts.yml @@ -0,0 +1,67 @@ +name: Publish fonts to Maven Central + +# Publishes the graph-compose-fonts companion artifact to Maven Central, +# independently of the engine. The bundled Google fonts change rarely, so +# they release on their OWN tag line (fonts-v*) — pushing an engine v* tag +# never touches them, and re-publishing fonts does not require an engine +# release. This mirrors publish.yml (Track D4) but targets fonts/pom.xml. +# +# Tagging: fonts-vX.Y.Z (e.g. fonts-v1.0.0). The fonts artifact carries its +# own independent version (see fonts/pom.xml) — keep it in sync with the tag. +# +# Human prerequisites are identical to publish.yml (GPG key + Central token +# secrets). See docs/contributing/release-process.md for the runbook. + +on: + push: + tags: + - 'fonts-v*' + workflow_dispatch: + inputs: + tag: + description: 'Existing fonts-v*-prefixed tag to (re-)publish' + required: true + type: string + +permissions: + contents: read + +jobs: + publish-fonts: + name: Publish ${{ github.ref_name }} to Maven Central + runs-on: ubuntu-latest + # Only ship plain semver tags (fonts-vX.Y.Z) to Central; pre-release + # suffixes ship nowhere from here. + if: | + github.event_name == 'workflow_dispatch' || + (!contains(github.ref, '-rc') && !contains(github.ref, '-alpha') && !contains(github.ref, '-beta') && !contains(github.ref, '-snapshot')) + env: + JAVA_TOOL_OPTIONS: -Djava.awt.headless=true + + steps: + - name: Check out repository at tag + uses: actions/checkout@v6 + with: + ref: ${{ github.event.inputs.tag || github.ref }} + + - name: Set up Temurin JDK 17 with Central credentials and GPG key + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: '17' + cache: maven + server-id: central + server-username: CENTRAL_USERNAME + server-password: CENTRAL_TOKEN + gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE + + - name: Publish fonts to Maven Central + # Activates the fonts module's release profile (sources + javadoc + + # gpg sign + central-publishing) and flips gpg.skip=false. Blocks + # until Sonatype's validator confirms validation. + run: ./mvnw -B -ntp -f fonts/pom.xml -P release -Dgpg.skip=false deploy + env: + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4d3c4580..b4d826a3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -79,6 +79,14 @@ jobs: gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} gpg-passphrase: MAVEN_GPG_PASSPHRASE + - name: Install graph-compose-fonts into the local repo + # The engine's visual / snapshot suite renders with the bundled + # Google fonts, which now live in the separately-versioned + # graph-compose-fonts artifact (engine depends on it at test + # scope). Build + install it locally so the verify step below can + # resolve it even before it (or this engine version) is on Central. + run: ./mvnw -B -ntp -f fonts/pom.xml clean install + - name: Verify (full canonical suite green at tagged commit) # Re-verify the tagged commit before publishing — defence in # depth against a tag pushed from a broken branch by mistake. @@ -86,13 +94,27 @@ jobs: # but failing here surfaces a clearer error. run: ./mvnw -B -ntp clean verify -pl . - - name: Publish to Maven Central + - name: Publish engine to Maven Central # Activates the release profile (sources + javadoc + gpg sign + # central-publishing) and flips gpg.skip=false. The deploy # phase invokes central-publishing-maven-plugin's upload goal # which blocks until Sonatype's validator confirms validation. + # The release profile also disables the tests-jar execution, so + # only the main + sources + javadoc + pom artefacts are uploaded. run: ./mvnw -B -ntp -P release -DskipTests -Dgpg.skip=false deploy env: CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + + - name: Publish bundle to Maven Central + # The graph-compose-bundle convenience aggregate pins this engine + # version + a compatible graph-compose-fonts version. It tracks the + # engine line, so it ships on the same v* tag. pom-packaged → only a + # signed .pom is uploaded; engine + fonts resolve from the local repo + # (installed by the engine deploy above and the fonts step earlier). + run: ./mvnw -B -ntp -f bundle/pom.xml -P release -DskipTests -Dgpg.skip=false deploy + env: + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 02945e00..5e1da015 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -237,6 +237,32 @@ Entries land here as they merge. node-label settings survive the toggle, `debug(none())` reliably disables everything — and disabled debug output stays byte-identical. +### Build & distribution + +- **Bundled Google fonts moved to a separate, independently-versioned + artifact** (`io.github.demchaav:graph-compose-fonts`). **Breaking for + consumers who use the bundled families.** The ~18 MB of curated Google fonts + no longer ship inside the `graph-compose` jar, so an engine upgrade never + re-downloads them and the engine artifact drops from ~40 MB to a few MB. The + public `FontName` constants and the `DefaultFonts` catalog are unchanged + (source- and binary-compatible), and the classpath layout `fonts/google/...` + is preserved byte-for-byte. To keep the bundled fonts, add + `io.github.demchaav:graph-compose-fonts` (its own version line, starting at + `1.0.0`) to your build, or depend on the new "batteries-included" + `io.github.demchaav:graph-compose-bundle` (engine + fonts at compatible + versions). With neither on the classpath, standard-14 documents render + unchanged and requesting a bundled family fails fast with a message that + names the missing dependency. See + [docs/migration/v1.8.0-fonts.md](docs/migration/v1.8.0-fonts.md). +- **Leaner Maven Central publication.** The release build no longer attaches or + uploads the `-tests` classifier jar (it stays a local-only build aid for the + benchmarks module), and with the fonts gone the `-sources.jar` no longer + carries font binaries either. The published artifact set is now just the + engine bytecode plus the small template assets. +- **`graph-compose-fonts` releases on its own `fonts-v*` tag** via a dedicated + publish workflow, so the font set ships only when it actually changes, + independent of the engine's `v*` release cadence. + ### Bug fixes - **A stray non-drawing element no longer breaks a whole SVG icon.** A diff --git a/README.md b/README.md index 8940ff26..08e35959 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,25 @@ Sits between **iText** (low-level page primitives) and **JasperReports** (XML-te dependencies { implementation("io.github.demchaav:graph-compose:1.7.1") } ``` +> **Bundled fonts (from v1.8.0).** The curated Google fonts no longer ship +> inside the engine jar — they live in an independently-versioned +> companion artifact so an engine upgrade never re-downloads ~18 MB of +> fonts. Pure-text and standard-14 documents need nothing extra; to use the +> bundled families, add: +> +> ```xml +> +> io.github.demchaav +> graph-compose-fonts +> 1.0.0 +> +> ``` +> +> Prefer a single "batteries-included" coordinate? Depend on +> `io.github.demchaav:graph-compose-bundle` (same version as `graph-compose` +> above) to pull the engine + fonts together. Full details and upgrade steps: +> the [v1.8.0 fonts migration note](./docs/migration/v1.8.0-fonts.md). + > **Distribution** — Maven Central is the canonical channel from **v1.6.6** onwards > (`io.github.demchaav:graph-compose:`). Hosted Javadocs auto-publish to > [javadoc.io/doc/io.github.demchaav/graph-compose](https://javadoc.io/doc/io.github.demchaav/graph-compose) diff --git a/aggregator/pom.xml b/aggregator/pom.xml index 34675b2f..bac1dc18 100644 --- a/aggregator/pom.xml +++ b/aggregator/pom.xml @@ -22,8 +22,38 @@ mvn -f aggregator/pom.xml versions:set -DnewVersion=X # bump all modules + + + true + + 1.0.0 + + + .. + ../fonts + ../bundle ../examples ../benchmarks diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index b48aff3a..09f4afc6 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -54,6 +54,18 @@ ${graphcompose.version} + + + io.github.demchaav + graph-compose-fonts + ${graphcompose.fonts.version} + + + io.github.demchaav + graph-compose-bundle + + 1.7.1 + pom + + GraphCompose Bundle + Batteries-included aggregate: the GraphCompose engine plus the bundled Google fonts at compatible versions. + https://github.com/DemchaAV/GraphCompose + + + + MIT License + https://opensource.org/licenses/MIT + repo + + + + + + DemchaAV + Artem Demchyshyn + demchishynartem@gmail.com + https://github.com/DemchaAV + + Lead Developer + Architect + + UTC 0 + + + + + scm:git:https://github.com/DemchaAV/GraphCompose.git + scm:git:ssh://git@github.com/DemchaAV/GraphCompose.git + https://github.com/DemchaAV/GraphCompose/tree/main + + + + UTF-8 + + + 1.0.0 + + 3.2.8 + 0.10.0 + + true + + + + + + io.github.demchaav + graph-compose + ${project.version} + + + + io.github.demchaav + graph-compose-fonts + ${graphcompose.fonts.version} + + + + + + + release + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven.gpg.plugin.version} + + + sign-artifacts + verify + + sign + + + ${gpg.skip} + + --pinentry-mode + loopback + + + + + + + org.sonatype.central + central-publishing-maven-plugin + ${central.publishing.plugin.version} + true + + central + false + validated + + + + + + + diff --git a/docs/contributing/release-process.md b/docs/contributing/release-process.md index cbdd7eef..42ae6fc1 100644 --- a/docs/contributing/release-process.md +++ b/docs/contributing/release-process.md @@ -46,7 +46,7 @@ The shell setup and exact PowerShell commands live in the `graphcompose-release- The script's Step 1–4 mutates these. The agent only confirms the *current state is one the script can transition from*: -- [ ] The version lives in four sites that must stay in lockstep: the standalone library `pom.xml`, the reactor `aggregator/pom.xml`, and the inherited `` version of `examples/pom.xml` and `benchmarks/pom.xml` (the children no longer pin their own `` — they inherit from `graph-compose-build`, and declare `${project.version}` rather than a literal). All four read the same value: either the in-flight develop value or already the target. `VersionConsistencyGuardTest` asserts they agree; `cut-release.ps1` Step 1 moves all four (plus the README) together. Bumping by hand outside the script — or `mvn versions:set` on a single pom — is what previously left benchmarks on the prior release; if you must bump outside the script, use `mvn -f aggregator/pom.xml versions:set -DnewVersion=`. +- [ ] The engine version lives in **five** sites that must stay in lockstep: the standalone library `pom.xml`, the reactor `aggregator/pom.xml`, the inherited `` version of `examples/pom.xml` and `benchmarks/pom.xml` (the children no longer pin their own `` — they inherit from `graph-compose-build`, and declare `${project.version}` rather than a literal), and the standalone `bundle/pom.xml` (`graph-compose-bundle`, whose `graph-compose` dep is `${project.version}`). All five read the same value: either the in-flight develop value or already the target. `VersionConsistencyGuardTest` asserts they agree; `cut-release.ps1` Step 1 moves all five (plus the README) together. Note `mvn -f aggregator/pom.xml versions:set` only rewrites the aggregator + its inheriting children — it does **not** touch the standalone `pom.xml` or `bundle/pom.xml`, so prefer the script. **`fonts/pom.xml` (`graph-compose-fonts`) is intentionally NOT in this set** — it carries an independent version line (see §2.D) and must be free to diverge from the engine. - [ ] `examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java` `GH_BASE` points to `/blob/develop`. The script flips it to `/blob/v` and regenerates `web/examples.json`. ### E. Tag must not exist @@ -60,11 +60,11 @@ The script's Step 1–4 mutates these. The agent only confirms the *current stat Running `pwsh ./scripts/cut-release.ps1 -Version ` performs: 1. **Pre-flight** — re-checks all of A above (branch, clean tree, in-sync, no existing tag). -2. **Bump versions** to `` across the library `pom.xml`, the `aggregator/pom.xml`, the inherited `` refs in `examples/pom.xml` and `benchmarks/pom.xml`, **and** the README Maven + Gradle install snippets — all in one pass, so `VersionConsistencyGuardTest` stays green at Step 5. +2. **Bump versions** to `` across the library `pom.xml`, the `aggregator/pom.xml`, the inherited `` refs in `examples/pom.xml` and `benchmarks/pom.xml`, the standalone `bundle/pom.xml` (`graph-compose-bundle`), **and** the README Maven + Gradle install snippets — all in one pass, so `VersionConsistencyGuardTest` stays green at Step 5. (`fonts/pom.xml` is left alone — it versions independently; see §2.D.) 3. **Date the CHANGELOG** — flips `## v — Planned` to `## v`. 4. **Switch ShowcaseMetadata GH_BASE** from `/blob/develop` to `/blob/v` and regenerate `web/examples.json`. 5. **`mvnw verify -pl .`** — full sanity build (skip with `-SkipVerify` only if you just ran it). -6. **Commit** as `Release v`. Files committed: the library `pom.xml`, `aggregator/pom.xml`, `examples/pom.xml`, `benchmarks/pom.xml`, `README.md` (install snippets), `CHANGELOG.md`, `ShowcaseMetadata.java`, `web/examples.json`, `web/index.html`, and `web/showcase/`. `examples/README.md` and any other docs are NOT touched by the script — fix those pre-release. +6. **Commit** as `Release v`. Files committed: the library `pom.xml`, `aggregator/pom.xml`, `examples/pom.xml`, `benchmarks/pom.xml`, `bundle/pom.xml`, `README.md` (install snippets), `CHANGELOG.md`, `ShowcaseMetadata.java`, `web/examples.json`, `web/index.html`, and `web/showcase/`. `examples/README.md` and any other docs are NOT touched by the script — fix those pre-release. 7. **Annotated tag** `v` (`git tag -a -m "Release v"`). 8. **Push** `develop` and the tag to `origin` (skip with `-SkipPush`). @@ -100,6 +100,36 @@ Run within 1 hour of the tag push. Independent steps can run in parallel. The release is **done** only when steps 1–7 are all green; step 9 adds Maven Central availability once the D-track of v1.6.6 has shipped. +### 2.D The fonts artifact and the bundle (since v1.8.0) + +The bundled Google fonts ship as a **separate, independently-versioned** +artifact, `io.github.demchaav:graph-compose-fonts` (under `fonts/`), and there +is a convenience aggregate `io.github.demchaav:graph-compose-bundle` (under +`bundle/`). + +- **The bundle tracks the engine line.** `cut-release.ps1` Step 1 bumps + `bundle/pom.xml` in lockstep with the engine (its `` and, via + `${project.version}`, its `graph-compose` dependency). `VersionConsistencyGuardTest` + enforces `bundle == engine`. The engine `v` tag's + [`publish.yml`](../../.github/workflows/publish.yml) deploys the engine **and** + the bundle. Nothing extra to do for the bundle at release time. +- **The fonts artifact is NOT bumped by the engine release.** It carries its own + version line (started at `1.0.0`) and is bumped **only when the font set + changes**. `cut-release.ps1` deliberately does not touch `fonts/pom.xml`, and + the version guard deliberately does not require it to equal the engine version. +- **Cutting a fonts release** (only when fonts change): bump `fonts/pom.xml` + ``, push a `fonts-vX.Y.Z` tag. That tag triggers + [`publish-fonts.yml`](../../.github/workflows/publish-fonts.yml), which deploys + only `graph-compose-fonts` to Central. Then bump + `` in the engine `pom.xml`, `aggregator/pom.xml`, + and `bundle/pom.xml` to the new fonts version so the next engine release pins + it (the engine→fonts dependency is test-scope; examples/benchmarks/bundle pin + it for real). +- **First-time bootstrap.** The engine verify depends on `graph-compose-fonts` + at test scope. `publish.yml` installs it locally first + (`./mvnw -f fonts/pom.xml install`); for a local full-reactor build run that + once before building the engine standalone (`./mvnw clean verify -pl .`). + --- ## 2.C One-time Maven Central setup (maintainer) diff --git a/docs/migration/v1.8.0-fonts.md b/docs/migration/v1.8.0-fonts.md new file mode 100644 index 00000000..f6903bc2 --- /dev/null +++ b/docs/migration/v1.8.0-fonts.md @@ -0,0 +1,86 @@ +# Migration: bundled fonts split out in v1.8.0 + +In v1.8.0 the curated Google font binaries that used to ship inside the +`graph-compose` jar moved into a separate, independently-versioned artifact: + +| Artifact | Coordinate | Version line | +|---|---|---| +| Engine (lean) | `io.github.demchaav:graph-compose` | `1.8.x` | +| Bundled fonts | `io.github.demchaav:graph-compose-fonts` | own line, from `1.0.0` | +| Batteries-included aggregate | `io.github.demchaav:graph-compose-bundle` | tracks the engine | + +## Why + +The fonts were ~18 MB and were re-shipped on **every** engine release (and +duplicated again inside the `-sources.jar`), even though the font set changes +very rarely. Splitting them out keeps the engine artifact small, stops an engine +upgrade from re-downloading fonts, and lets the fonts release on their own +cadence. + +## What stays the same + +- The public `FontName` constants (`FontName.LATO`, `FontName.POPPINS`, …) and + the `DefaultFonts` catalog are **unchanged** — your code compiles and links + without edits (source- and binary-compatible). +- The classpath resource layout (`fonts/google/{family}/{file}.ttf`) is + preserved byte-for-byte, so once `graph-compose-fonts` is on the classpath the + bundled families resolve exactly as before. +- Standard-14 PDF fonts (Helvetica, Times, Courier) are built into PDF and need + no artifact at all. + +## What you need to do + +Pick one: + +### Option A — keep using the bundled fonts (most common) + +Add the fonts artifact next to the engine: + +```xml + + io.github.demchaav + graph-compose + 1.8.0 + + + io.github.demchaav + graph-compose-fonts + 1.0.0 + +``` + +```kotlin +dependencies { + implementation("io.github.demchaav:graph-compose:1.8.0") + implementation("io.github.demchaav:graph-compose-fonts:1.0.0") +} +``` + +You now pin the two independently: bumping the engine does not change your fonts +version, and vice-versa. + +### Option B — one coordinate, batteries included + +Depend on the bundle, which pulls a compatible engine + fonts pair: + +```xml + + io.github.demchaav + graph-compose-bundle + 1.8.0 + +``` + +### Option C — standard-14 only / your own fonts + +If you only render with the standard-14 families or register your own fonts via +`FontFamilyDefinition`, you need neither extra artifact. Requesting a bundled +Google family without `graph-compose-fonts` on the classpath fails fast with an +`IllegalArgumentException` that names the missing dependency. + +## Notes + +- `graph-compose-fonts` carries its own version line and ships on a `fonts-v*` + git tag, separate from the engine's `v*` releases. +- The font binaries remain under the SIL Open Font License (each family bundles + its `OFL.txt`). diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 4b08cdaa..067ef763 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -73,8 +73,8 @@ More: [examples/README](../examples/README.md). **Build fails copying fonts — `The cloud file provider is not running`.** The checkout lives in a cloud-synced folder (OneDrive / Dropbox / iCloud) -and the font resources under `src/main/resources/fonts/` are dehydrated -placeholders. Make sure the sync client is running and the files are +and the font resources under `fonts/src/main/resources/fonts/` (the +`graph-compose-fonts` module, since v1.8.0) are dehydrated placeholders. Make sure the sync client is running and the files are downloaded locally ("Always keep on this device"), or move the checkout outside the synced folder. diff --git a/examples/pom.xml b/examples/pom.xml index 0626462a..f75dcc5f 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -44,6 +44,18 @@ ${graphcompose.version} + + + io.github.demchaav + graph-compose-fonts + ${graphcompose.fonts.version} + + diff --git a/fonts/pom.xml b/fonts/pom.xml new file mode 100644 index 00000000..136d7a40 --- /dev/null +++ b/fonts/pom.xml @@ -0,0 +1,198 @@ + + + 4.0.0 + + + io.github.demchaav + graph-compose-fonts + 1.0.0 + + GraphCompose Fonts + Bundled Google font binaries for GraphCompose, packaged as an independently-versioned companion artifact. + https://github.com/DemchaAV/GraphCompose + + + + + MIT License + https://opensource.org/licenses/MIT + repo + + + SIL Open Font License 1.1 + https://openfontlicense.org + repo + Applies to the bundled font binaries under fonts/google/**; each family includes its own OFL.txt. + + + + + + DemchaAV + Artem Demchyshyn + demchishynartem@gmail.com + https://github.com/DemchaAV + + Lead Developer + Architect + + UTC 0 + + + + + scm:git:https://github.com/DemchaAV/GraphCompose.git + scm:git:ssh://git@github.com/DemchaAV/GraphCompose.git + https://github.com/DemchaAV/GraphCompose/tree/main + + + + UTF-8 + 17 + + 3.15.0 + 3.5.0 + 3.4.0 + 3.12.0 + 3.2.8 + 0.10.0 + + + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + + + + + release + + + + org.apache.maven.plugins + maven-source-plugin + ${maven.source.plugin.version} + + + attach-sources + package + + jar-no-fork + + + + + fonts/** + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven.javadoc.plugin.version} + + + attach-javadocs + package + + jar + + + none + false + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven.gpg.plugin.version} + + + sign-artifacts + verify + + sign + + + ${gpg.skip} + + --pinentry-mode + loopback + + + + + + + org.sonatype.central + central-publishing-maven-plugin + ${central.publishing.plugin.version} + true + + central + false + validated + + + + + + + diff --git a/fonts/src/main/java/com/demcha/compose/fonts/GraphComposeFonts.java b/fonts/src/main/java/com/demcha/compose/fonts/GraphComposeFonts.java new file mode 100644 index 00000000..07f6f42d --- /dev/null +++ b/fonts/src/main/java/com/demcha/compose/fonts/GraphComposeFonts.java @@ -0,0 +1,44 @@ +package com.demcha.compose.fonts; + +/** + * Marker and metadata for the {@code graph-compose-fonts} companion artifact. + * + *

This artifact carries the bundled Google font binaries that the engine's + * {@code com.demcha.compose.font.DefaultFonts} catalog resolves from the + * classpath. The fonts were split out of the core {@code graph-compose} jar in + * the engine's v1.8.0 cycle so that the engine stays lean and the two release on + * independent cadences — upgrading the engine never re-downloads the fonts.

+ * + *

There is no API to call here: simply having this jar on the classpath makes + * the bundled families available. The font descriptors and the public + * {@code FontName} constants live in the engine, not in this module, so this + * class intentionally depends on nothing from the engine.

+ * + * @author Artem Demchyshyn + * @since 1.0.0 + */ +public final class GraphComposeFonts { + + /** + * Classpath resource prefix under which the bundled font families are + * packaged (for example {@code fonts/google/lato/Lato-Regular.ttf}). This + * layout is preserved byte-for-byte from the pre-split engine jar. + */ + public static final String RESOURCE_ROOT = "fonts/google/"; + + private GraphComposeFonts() { + } + + /** + * Reports whether the bundled font binaries are reachable on the current + * classpath. A {@code true} result means this artifact (or an equivalent + * resource set) is present and the engine's bundled Google families will + * resolve; {@code false} means only the standard-14 PDF fonts are available. + * + * @return {@code true} if the bundled font resources are on the classpath + */ + public static boolean isAvailable() { + return GraphComposeFonts.class.getClassLoader() + .getResource(RESOURCE_ROOT + "lato/Lato-Regular.ttf") != null; + } +} diff --git a/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf b/fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf rename to fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf diff --git a/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf b/fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf rename to fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf diff --git a/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf b/fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf rename to fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf diff --git a/src/main/resources/fonts/google/alegreyasans/OFL.txt b/fonts/src/main/resources/fonts/google/alegreyasans/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/OFL.txt rename to fonts/src/main/resources/fonts/google/alegreyasans/OFL.txt diff --git a/src/main/resources/fonts/google/andika/Andika-Bold.ttf b/fonts/src/main/resources/fonts/google/andika/Andika-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/andika/Andika-Bold.ttf rename to fonts/src/main/resources/fonts/google/andika/Andika-Bold.ttf diff --git a/src/main/resources/fonts/google/andika/Andika-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/andika/Andika-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/andika/Andika-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/andika/Andika-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/andika/Andika-Italic.ttf b/fonts/src/main/resources/fonts/google/andika/Andika-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/andika/Andika-Italic.ttf rename to fonts/src/main/resources/fonts/google/andika/Andika-Italic.ttf diff --git a/src/main/resources/fonts/google/andika/Andika-Regular.ttf b/fonts/src/main/resources/fonts/google/andika/Andika-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/andika/Andika-Regular.ttf rename to fonts/src/main/resources/fonts/google/andika/Andika-Regular.ttf diff --git a/src/main/resources/fonts/google/andika/OFL.txt b/fonts/src/main/resources/fonts/google/andika/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/andika/OFL.txt rename to fonts/src/main/resources/fonts/google/andika/OFL.txt diff --git a/src/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf b/fonts/src/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf rename to fonts/src/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf diff --git a/src/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf b/fonts/src/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf rename to fonts/src/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf diff --git a/src/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf b/fonts/src/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf rename to fonts/src/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf diff --git a/src/main/resources/fonts/google/arsenal/OFL.txt b/fonts/src/main/resources/fonts/google/arsenal/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/arsenal/OFL.txt rename to fonts/src/main/resources/fonts/google/arsenal/OFL.txt diff --git a/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf b/fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf rename to fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf diff --git a/src/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf b/fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf rename to fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf diff --git a/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf b/fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf rename to fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf diff --git a/src/main/resources/fonts/google/asapcondensed/OFL.txt b/fonts/src/main/resources/fonts/google/asapcondensed/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/OFL.txt rename to fonts/src/main/resources/fonts/google/asapcondensed/OFL.txt diff --git a/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf b/fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf rename to fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf diff --git a/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf b/fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf rename to fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf diff --git a/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf b/fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf rename to fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf diff --git a/src/main/resources/fonts/google/baijamjuree/OFL.txt b/fonts/src/main/resources/fonts/google/baijamjuree/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/OFL.txt rename to fonts/src/main/resources/fonts/google/baijamjuree/OFL.txt diff --git a/src/main/resources/fonts/google/barlow/Barlow-Bold.ttf b/fonts/src/main/resources/fonts/google/barlow/Barlow-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/barlow/Barlow-Bold.ttf rename to fonts/src/main/resources/fonts/google/barlow/Barlow-Bold.ttf diff --git a/src/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/barlow/Barlow-Italic.ttf b/fonts/src/main/resources/fonts/google/barlow/Barlow-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/barlow/Barlow-Italic.ttf rename to fonts/src/main/resources/fonts/google/barlow/Barlow-Italic.ttf diff --git a/src/main/resources/fonts/google/barlow/Barlow-Regular.ttf b/fonts/src/main/resources/fonts/google/barlow/Barlow-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/barlow/Barlow-Regular.ttf rename to fonts/src/main/resources/fonts/google/barlow/Barlow-Regular.ttf diff --git a/src/main/resources/fonts/google/barlow/OFL.txt b/fonts/src/main/resources/fonts/google/barlow/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/barlow/OFL.txt rename to fonts/src/main/resources/fonts/google/barlow/OFL.txt diff --git a/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf b/fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf rename to fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf diff --git a/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf b/fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf rename to fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf diff --git a/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf b/fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf rename to fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf diff --git a/src/main/resources/fonts/google/barlowcondensed/OFL.txt b/fonts/src/main/resources/fonts/google/barlowcondensed/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/OFL.txt rename to fonts/src/main/resources/fonts/google/barlowcondensed/OFL.txt diff --git a/src/main/resources/fonts/google/carlito/Carlito-Bold.ttf b/fonts/src/main/resources/fonts/google/carlito/Carlito-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/carlito/Carlito-Bold.ttf rename to fonts/src/main/resources/fonts/google/carlito/Carlito-Bold.ttf diff --git a/src/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/carlito/Carlito-Italic.ttf b/fonts/src/main/resources/fonts/google/carlito/Carlito-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/carlito/Carlito-Italic.ttf rename to fonts/src/main/resources/fonts/google/carlito/Carlito-Italic.ttf diff --git a/src/main/resources/fonts/google/carlito/Carlito-Regular.ttf b/fonts/src/main/resources/fonts/google/carlito/Carlito-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/carlito/Carlito-Regular.ttf rename to fonts/src/main/resources/fonts/google/carlito/Carlito-Regular.ttf diff --git a/src/main/resources/fonts/google/carlito/OFL.txt b/fonts/src/main/resources/fonts/google/carlito/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/carlito/OFL.txt rename to fonts/src/main/resources/fonts/google/carlito/OFL.txt diff --git a/src/main/resources/fonts/google/cousine/Cousine-Bold.ttf b/fonts/src/main/resources/fonts/google/cousine/Cousine-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/cousine/Cousine-Bold.ttf rename to fonts/src/main/resources/fonts/google/cousine/Cousine-Bold.ttf diff --git a/src/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/cousine/Cousine-Italic.ttf b/fonts/src/main/resources/fonts/google/cousine/Cousine-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/cousine/Cousine-Italic.ttf rename to fonts/src/main/resources/fonts/google/cousine/Cousine-Italic.ttf diff --git a/src/main/resources/fonts/google/cousine/Cousine-Regular.ttf b/fonts/src/main/resources/fonts/google/cousine/Cousine-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/cousine/Cousine-Regular.ttf rename to fonts/src/main/resources/fonts/google/cousine/Cousine-Regular.ttf diff --git a/src/main/resources/fonts/google/cousine/LICENSE.txt b/fonts/src/main/resources/fonts/google/cousine/LICENSE.txt similarity index 100% rename from src/main/resources/fonts/google/cousine/LICENSE.txt rename to fonts/src/main/resources/fonts/google/cousine/LICENSE.txt diff --git a/src/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf b/fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf rename to fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf diff --git a/src/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf b/fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf rename to fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf diff --git a/src/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf b/fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf rename to fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf diff --git a/src/main/resources/fonts/google/crimsontext/OFL.txt b/fonts/src/main/resources/fonts/google/crimsontext/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/crimsontext/OFL.txt rename to fonts/src/main/resources/fonts/google/crimsontext/OFL.txt diff --git a/src/main/resources/fonts/google/firasans/FiraSans-Bold.ttf b/fonts/src/main/resources/fonts/google/firasans/FiraSans-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/firasans/FiraSans-Bold.ttf rename to fonts/src/main/resources/fonts/google/firasans/FiraSans-Bold.ttf diff --git a/src/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/firasans/FiraSans-Italic.ttf b/fonts/src/main/resources/fonts/google/firasans/FiraSans-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/firasans/FiraSans-Italic.ttf rename to fonts/src/main/resources/fonts/google/firasans/FiraSans-Italic.ttf diff --git a/src/main/resources/fonts/google/firasans/FiraSans-Regular.ttf b/fonts/src/main/resources/fonts/google/firasans/FiraSans-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/firasans/FiraSans-Regular.ttf rename to fonts/src/main/resources/fonts/google/firasans/FiraSans-Regular.ttf diff --git a/src/main/resources/fonts/google/firasans/OFL.txt b/fonts/src/main/resources/fonts/google/firasans/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/firasans/OFL.txt rename to fonts/src/main/resources/fonts/google/firasans/OFL.txt diff --git a/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf b/fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf rename to fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf diff --git a/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf b/fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf rename to fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf diff --git a/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf b/fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf rename to fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf diff --git a/src/main/resources/fonts/google/firasanscondensed/OFL.txt b/fonts/src/main/resources/fonts/google/firasanscondensed/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/OFL.txt rename to fonts/src/main/resources/fonts/google/firasanscondensed/OFL.txt diff --git a/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf b/fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf rename to fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf diff --git a/src/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf b/fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf rename to fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf diff --git a/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf b/fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf rename to fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf diff --git a/src/main/resources/fonts/google/gentiumplus/OFL.txt b/fonts/src/main/resources/fonts/google/gentiumplus/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/OFL.txt rename to fonts/src/main/resources/fonts/google/gentiumplus/OFL.txt diff --git a/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf b/fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf rename to fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf diff --git a/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf b/fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf rename to fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf diff --git a/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf b/fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf rename to fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf diff --git a/src/main/resources/fonts/google/ibmplexmono/OFL.txt b/fonts/src/main/resources/fonts/google/ibmplexmono/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/OFL.txt rename to fonts/src/main/resources/fonts/google/ibmplexmono/OFL.txt diff --git a/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf b/fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf rename to fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf diff --git a/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf b/fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf rename to fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf diff --git a/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf b/fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf rename to fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf diff --git a/src/main/resources/fonts/google/ibmplexserif/OFL.txt b/fonts/src/main/resources/fonts/google/ibmplexserif/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/OFL.txt rename to fonts/src/main/resources/fonts/google/ibmplexserif/OFL.txt diff --git a/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf b/fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf rename to fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf diff --git a/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf b/fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf rename to fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf diff --git a/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf b/fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf rename to fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf diff --git a/src/main/resources/fonts/google/jetbrainsmono/OFL.txt b/fonts/src/main/resources/fonts/google/jetbrainsmono/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/OFL.txt rename to fonts/src/main/resources/fonts/google/jetbrainsmono/OFL.txt diff --git a/src/main/resources/fonts/google/kanit/Kanit-Bold.ttf b/fonts/src/main/resources/fonts/google/kanit/Kanit-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/kanit/Kanit-Bold.ttf rename to fonts/src/main/resources/fonts/google/kanit/Kanit-Bold.ttf diff --git a/src/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/kanit/Kanit-Italic.ttf b/fonts/src/main/resources/fonts/google/kanit/Kanit-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/kanit/Kanit-Italic.ttf rename to fonts/src/main/resources/fonts/google/kanit/Kanit-Italic.ttf diff --git a/src/main/resources/fonts/google/kanit/Kanit-Regular.ttf b/fonts/src/main/resources/fonts/google/kanit/Kanit-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/kanit/Kanit-Regular.ttf rename to fonts/src/main/resources/fonts/google/kanit/Kanit-Regular.ttf diff --git a/src/main/resources/fonts/google/kanit/OFL.txt b/fonts/src/main/resources/fonts/google/kanit/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/kanit/OFL.txt rename to fonts/src/main/resources/fonts/google/kanit/OFL.txt diff --git a/src/main/resources/fonts/google/lato/Lato-Bold.ttf b/fonts/src/main/resources/fonts/google/lato/Lato-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/lato/Lato-Bold.ttf rename to fonts/src/main/resources/fonts/google/lato/Lato-Bold.ttf diff --git a/src/main/resources/fonts/google/lato/Lato-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/lato/Lato-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/lato/Lato-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/lato/Lato-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/lato/Lato-Italic.ttf b/fonts/src/main/resources/fonts/google/lato/Lato-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/lato/Lato-Italic.ttf rename to fonts/src/main/resources/fonts/google/lato/Lato-Italic.ttf diff --git a/src/main/resources/fonts/google/lato/Lato-Regular.ttf b/fonts/src/main/resources/fonts/google/lato/Lato-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/lato/Lato-Regular.ttf rename to fonts/src/main/resources/fonts/google/lato/Lato-Regular.ttf diff --git a/src/main/resources/fonts/google/lato/OFL.txt b/fonts/src/main/resources/fonts/google/lato/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/lato/OFL.txt rename to fonts/src/main/resources/fonts/google/lato/OFL.txt diff --git a/src/main/resources/fonts/google/poppins/OFL.txt b/fonts/src/main/resources/fonts/google/poppins/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/poppins/OFL.txt rename to fonts/src/main/resources/fonts/google/poppins/OFL.txt diff --git a/src/main/resources/fonts/google/poppins/Poppins-Bold.ttf b/fonts/src/main/resources/fonts/google/poppins/Poppins-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/poppins/Poppins-Bold.ttf rename to fonts/src/main/resources/fonts/google/poppins/Poppins-Bold.ttf diff --git a/src/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/poppins/Poppins-Italic.ttf b/fonts/src/main/resources/fonts/google/poppins/Poppins-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/poppins/Poppins-Italic.ttf rename to fonts/src/main/resources/fonts/google/poppins/Poppins-Italic.ttf diff --git a/src/main/resources/fonts/google/poppins/Poppins-Regular.ttf b/fonts/src/main/resources/fonts/google/poppins/Poppins-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/poppins/Poppins-Regular.ttf rename to fonts/src/main/resources/fonts/google/poppins/Poppins-Regular.ttf diff --git a/src/main/resources/fonts/google/prompt/OFL.txt b/fonts/src/main/resources/fonts/google/prompt/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/prompt/OFL.txt rename to fonts/src/main/resources/fonts/google/prompt/OFL.txt diff --git a/src/main/resources/fonts/google/prompt/Prompt-Bold.ttf b/fonts/src/main/resources/fonts/google/prompt/Prompt-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/prompt/Prompt-Bold.ttf rename to fonts/src/main/resources/fonts/google/prompt/Prompt-Bold.ttf diff --git a/src/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/prompt/Prompt-Italic.ttf b/fonts/src/main/resources/fonts/google/prompt/Prompt-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/prompt/Prompt-Italic.ttf rename to fonts/src/main/resources/fonts/google/prompt/Prompt-Italic.ttf diff --git a/src/main/resources/fonts/google/prompt/Prompt-Regular.ttf b/fonts/src/main/resources/fonts/google/prompt/Prompt-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/prompt/Prompt-Regular.ttf rename to fonts/src/main/resources/fonts/google/prompt/Prompt-Regular.ttf diff --git a/src/main/resources/fonts/google/ptsans/OFL.txt b/fonts/src/main/resources/fonts/google/ptsans/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/ptsans/OFL.txt rename to fonts/src/main/resources/fonts/google/ptsans/OFL.txt diff --git a/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf b/fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf rename to fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf diff --git a/src/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf b/fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf rename to fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf diff --git a/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf b/fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf rename to fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf diff --git a/src/main/resources/fonts/google/ptserif/OFL.txt b/fonts/src/main/resources/fonts/google/ptserif/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/ptserif/OFL.txt rename to fonts/src/main/resources/fonts/google/ptserif/OFL.txt diff --git a/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf b/fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf rename to fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf diff --git a/src/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf b/fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf rename to fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf diff --git a/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf b/fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf rename to fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf diff --git a/src/main/resources/fonts/google/sarabun/OFL.txt b/fonts/src/main/resources/fonts/google/sarabun/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/sarabun/OFL.txt rename to fonts/src/main/resources/fonts/google/sarabun/OFL.txt diff --git a/src/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf b/fonts/src/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf rename to fonts/src/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf diff --git a/src/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf b/fonts/src/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf rename to fonts/src/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf diff --git a/src/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf b/fonts/src/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf rename to fonts/src/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf diff --git a/src/main/resources/fonts/google/spectral/OFL.txt b/fonts/src/main/resources/fonts/google/spectral/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/spectral/OFL.txt rename to fonts/src/main/resources/fonts/google/spectral/OFL.txt diff --git a/src/main/resources/fonts/google/spectral/Spectral-Bold.ttf b/fonts/src/main/resources/fonts/google/spectral/Spectral-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/spectral/Spectral-Bold.ttf rename to fonts/src/main/resources/fonts/google/spectral/Spectral-Bold.ttf diff --git a/src/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/spectral/Spectral-Italic.ttf b/fonts/src/main/resources/fonts/google/spectral/Spectral-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/spectral/Spectral-Italic.ttf rename to fonts/src/main/resources/fonts/google/spectral/Spectral-Italic.ttf diff --git a/src/main/resources/fonts/google/spectral/Spectral-Regular.ttf b/fonts/src/main/resources/fonts/google/spectral/Spectral-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/spectral/Spectral-Regular.ttf rename to fonts/src/main/resources/fonts/google/spectral/Spectral-Regular.ttf diff --git a/src/main/resources/fonts/google/taviraj/OFL.txt b/fonts/src/main/resources/fonts/google/taviraj/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/taviraj/OFL.txt rename to fonts/src/main/resources/fonts/google/taviraj/OFL.txt diff --git a/src/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf b/fonts/src/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf rename to fonts/src/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf diff --git a/src/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf b/fonts/src/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf rename to fonts/src/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf diff --git a/src/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf b/fonts/src/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf rename to fonts/src/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf diff --git a/src/main/resources/fonts/google/tinos/LICENSE.txt b/fonts/src/main/resources/fonts/google/tinos/LICENSE.txt similarity index 100% rename from src/main/resources/fonts/google/tinos/LICENSE.txt rename to fonts/src/main/resources/fonts/google/tinos/LICENSE.txt diff --git a/src/main/resources/fonts/google/tinos/Tinos-Bold.ttf b/fonts/src/main/resources/fonts/google/tinos/Tinos-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/tinos/Tinos-Bold.ttf rename to fonts/src/main/resources/fonts/google/tinos/Tinos-Bold.ttf diff --git a/src/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/tinos/Tinos-Italic.ttf b/fonts/src/main/resources/fonts/google/tinos/Tinos-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/tinos/Tinos-Italic.ttf rename to fonts/src/main/resources/fonts/google/tinos/Tinos-Italic.ttf diff --git a/src/main/resources/fonts/google/tinos/Tinos-Regular.ttf b/fonts/src/main/resources/fonts/google/tinos/Tinos-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/tinos/Tinos-Regular.ttf rename to fonts/src/main/resources/fonts/google/tinos/Tinos-Regular.ttf diff --git a/src/main/resources/fonts/google/trirong/OFL.txt b/fonts/src/main/resources/fonts/google/trirong/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/trirong/OFL.txt rename to fonts/src/main/resources/fonts/google/trirong/OFL.txt diff --git a/src/main/resources/fonts/google/trirong/Trirong-Bold.ttf b/fonts/src/main/resources/fonts/google/trirong/Trirong-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/trirong/Trirong-Bold.ttf rename to fonts/src/main/resources/fonts/google/trirong/Trirong-Bold.ttf diff --git a/src/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/trirong/Trirong-Italic.ttf b/fonts/src/main/resources/fonts/google/trirong/Trirong-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/trirong/Trirong-Italic.ttf rename to fonts/src/main/resources/fonts/google/trirong/Trirong-Italic.ttf diff --git a/src/main/resources/fonts/google/trirong/Trirong-Regular.ttf b/fonts/src/main/resources/fonts/google/trirong/Trirong-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/trirong/Trirong-Regular.ttf rename to fonts/src/main/resources/fonts/google/trirong/Trirong-Regular.ttf diff --git a/src/main/resources/fonts/google/ubuntu/UFL.txt b/fonts/src/main/resources/fonts/google/ubuntu/UFL.txt similarity index 100% rename from src/main/resources/fonts/google/ubuntu/UFL.txt rename to fonts/src/main/resources/fonts/google/ubuntu/UFL.txt diff --git a/src/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf b/fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf rename to fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf diff --git a/src/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf b/fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf rename to fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf diff --git a/src/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf b/fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf rename to fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf diff --git a/src/main/resources/fonts/google/volkhov/OFL.txt b/fonts/src/main/resources/fonts/google/volkhov/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/volkhov/OFL.txt rename to fonts/src/main/resources/fonts/google/volkhov/OFL.txt diff --git a/src/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf b/fonts/src/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf rename to fonts/src/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf diff --git a/src/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf b/fonts/src/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf rename to fonts/src/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf diff --git a/src/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf b/fonts/src/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf rename to fonts/src/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf diff --git a/src/main/resources/fonts/google/zillaslab/OFL.txt b/fonts/src/main/resources/fonts/google/zillaslab/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/zillaslab/OFL.txt rename to fonts/src/main/resources/fonts/google/zillaslab/OFL.txt diff --git a/src/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf b/fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf rename to fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf diff --git a/src/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf b/fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf rename to fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf diff --git a/src/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf b/fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf rename to fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf diff --git a/pom.xml b/pom.xml index 1f773f12..88491ede 100644 --- a/pom.xml +++ b/pom.xml @@ -62,11 +62,26 @@ 5.23.0 1.18.10 + + 1.0.0 + 0.10.0 3.15.0 3.6.3 3.2.8 + 3.5.0 3.12.0 3.4.0 3.5.6 @@ -216,6 +231,20 @@ + + + io.github.demchaav + graph-compose-fonts + ${graphcompose.fonts.version} + test + + ch.qos.logback logback-classic @@ -397,18 +426,22 @@ org.apache.maven.plugins maven-jar-plugin - 3.5.0 + ${maven.jar.plugin.version} + attach-test-jar test-jar @@ -448,6 +481,28 @@ release + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + attach-test-jar + none + + + org.apache.maven.plugins maven-source-plugin diff --git a/scripts/cut-release.ps1 b/scripts/cut-release.ps1 index b047502b..5d3a1910 100644 --- a/scripts/cut-release.ps1 +++ b/scripts/cut-release.ps1 @@ -423,14 +423,24 @@ try { Note ("tag {0}: available OK" -f $tag) Step 1 "Bump versions to $Version (poms + README install snippets)" - # All four version sites must move together or VersionConsistencyGuardTest - # fails the verify gate below: the standalone library pom.xml (the published - # JitPack artifact), the reactor aggregator, and the examples/benchmarks - # children whose inherited version tracks the aggregator. + # All ENGINE-LINE version sites must move together or + # VersionConsistencyGuardTest fails the verify gate below: the standalone + # library pom.xml (the published artifact), the reactor aggregator, the + # examples/benchmarks children whose inherited version tracks the + # aggregator, and the standalone bundle aggregate (graph-compose-bundle). + # NOTE: graph-compose-fonts is deliberately absent — it carries an + # INDEPENDENT version line (currently 1.0.0) and ships on its own fonts-v* + # tag, so an engine release must never rewrite it. Its first is + # 1.0.0, not the engine version, so even a stray reactor bump would skip it. Update-PomVersion (Join-Path $repoRoot 'pom.xml') $Version Update-PomVersion (Join-Path $repoRoot 'aggregator/pom.xml') $Version Update-PomVersion (Join-Path $repoRoot 'examples/pom.xml') $Version Update-PomVersion (Join-Path $repoRoot 'benchmarks/pom.xml') $Version + # Bundle tracks the engine line: its project bumps here; its + # graph-compose dep is ${project.version} (follows automatically) and its + # graph-compose-fonts dep is ${graphcompose.fonts.version} (stays pinned — + # the bump regex does not touch the $-prefixed property reference). + Update-PomVersion (Join-Path $repoRoot 'bundle/pom.xml') $Version Update-ReadmeInstallVersion (Join-Path $repoRoot 'README.md') $Version Update-IndexHtmlVersion (Join-Path $repoRoot 'web/index.html') $Version # The Next.js site/ and the docs->site/public mirror were retired when the static diff --git a/src/main/java/com/demcha/compose/font/FontFamilyDefinition.java b/src/main/java/com/demcha/compose/font/FontFamilyDefinition.java index 4f9321b6..b40c424e 100644 --- a/src/main/java/com/demcha/compose/font/FontFamilyDefinition.java +++ b/src/main/java/com/demcha/compose/font/FontFamilyDefinition.java @@ -325,11 +325,29 @@ public InputStream openStream() { String normalizedPath = resourcePath.startsWith("/") ? resourcePath : "/" + resourcePath; InputStream inputStream = FontFamilyDefinition.class.getResourceAsStream(normalizedPath); if (inputStream == null) { - throw new IllegalArgumentException("Classpath font resource not found: " + normalizedPath); + throw new IllegalArgumentException(missingResourceMessage(normalizedPath)); } return inputStream; } + /** + * Builds the not-found message. For a bundled Google-font resource the + * likely cause is that the separately-versioned font artifact is not on + * the classpath (the fonts moved out of the core jar in v1.8.0), so the + * message points at the fix instead of a bare path. + */ + private static String missingResourceMessage(String normalizedPath) { + if (normalizedPath.startsWith("/fonts/google/")) { + return "Bundled font resource not found: " + normalizedPath + + ". The bundled Google fonts ship in a separate artifact since v1.8.0 — " + + "add the dependency io.github.demchaav:graph-compose-fonts (or the " + + "io.github.demchaav:graph-compose-bundle aggregate) to your build to use " + + "them, or register your own font with FontFamilyDefinition. " + + "See https://github.com/DemchaAV/GraphCompose/blob/main/docs/migration/v1.8.0-fonts.md"; + } + return "Classpath font resource not found: " + normalizedPath; + } + @Override public String description() { return resourcePath; diff --git a/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java b/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java index 317eaec4..6e6d4b75 100644 --- a/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java +++ b/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java @@ -11,6 +11,7 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class FontLibraryIntegrationTest { @@ -36,7 +37,10 @@ void shouldExposeBundledGoogleFontsInEngineComposerHarness() throws Exception { @Test void shouldRegisterCustomFontFamilyFromFilePaths() throws Exception { FontName customFamily = FontName.of("Brand Sans"); - Path fontsRoot = Path.of("src", "main", "resources", "fonts", "google", "lato"); + // The bundled fonts moved to the graph-compose-fonts module in v1.8.0. + // This test exercises file-based registration, so it reads the real TTFs + // from that module's resources (engine test cwd is the repo root). + Path fontsRoot = Path.of("fonts", "src", "main", "resources", "fonts", "google", "lato"); try (EngineComposerHarness composer = com.demcha.compose.testsupport.EngineComposerHarness.pdf() .registerFontFamily( @@ -62,4 +66,32 @@ void shouldRegisterCustomFontFamilyFromFilePaths() throws Exception { assertThat(fonts.getFont(customFamily, WordFont.class)).isPresent(); } } + + @Test + void shouldMaterializeStandard14FontsWithoutBundledFontsArtifact() { + // The standard-14 families embed nothing and need no PDF document and no + // graph-compose-fonts jar — this is the baseline an engine-only consumer + // (no bundled fonts on the classpath) still gets. + FontLibrary standard = DefaultFonts.standardLibrary(); + + assertThat(standard.getFont(FontName.HELVETICA, PdfFont.class)).isPresent(); + assertThat(standard.getFont(FontName.TIMES_ROMAN, PdfFont.class)).isPresent(); + assertThat(standard.getFont(FontName.COURIER, PdfFont.class)).isPresent(); + } + + @Test + void shouldGiveActionableErrorWhenBundledFontResourceMissing() { + // Simulates the bundled fonts being absent (graph-compose-fonts not on + // the classpath): a fonts/google/... resource that cannot be found must + // point the caller at the companion artifact, not just print a raw path. + FontFamilyDefinition missing = FontFamilyDefinition + .classpath(FontName.of("Missing Family"), "fonts/google/__missing__/Missing-Regular.ttf") + .build(); + FontFamilyDefinition.FontBinarySource regular = missing.fontSourceSet().orElseThrow().regular(); + + assertThatThrownBy(regular::openStream) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("graph-compose-fonts") + .hasMessageContaining("fonts/google/__missing__/Missing-Regular.ttf"); + } } diff --git a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java index 2d54c1d0..f501e64c 100644 --- a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java +++ b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java @@ -58,6 +58,31 @@ void everyModuleResolvesToTheRootProjectVersion() throws Exception { assertThat(effectiveVersion(PROJECT_ROOT.resolve("benchmarks/pom.xml"))) .describedAs("benchmarks must inherit the root version (%s)", root) .isEqualTo(root); + assertThat(effectiveVersion(PROJECT_ROOT.resolve("bundle/pom.xml"))) + .describedAs("bundle (graph-compose-bundle) tracks the engine line and must equal the root version (%s)", root) + .isEqualTo(root); + + // NOTE: fonts/pom.xml (graph-compose-fonts) is intentionally NOT checked + // here. It carries an independent version line (it ships on its own + // fonts-v* tag and is bumped only when the font set changes), so it must + // be free to diverge from the engine version. + } + + @Test + void bundledFontsVersionAgreesAcrossModules() throws Exception { + // graph-compose-fonts carries an independent version line, but the + // ${graphcompose.fonts.version} property that pins it is duplicated in + // three poms (engine, aggregator, bundle) because there is no shared + // parent to single-source it. This guards the PR-7.1 drift class: the + // three must always agree, even though they differ from the engine line. + String engine = fontsVersionProperty(PROJECT_ROOT.resolve("pom.xml")); + + assertThat(fontsVersionProperty(PROJECT_ROOT.resolve("aggregator/pom.xml"))) + .describedAs("aggregator graphcompose.fonts.version must match the engine's (%s)", engine) + .isEqualTo(engine); + assertThat(fontsVersionProperty(PROJECT_ROOT.resolve("bundle/pom.xml"))) + .describedAs("bundle graphcompose.fonts.version must match the engine's (%s)", engine) + .isEqualTo(engine); } @Test @@ -202,6 +227,15 @@ private static boolean declaresOwnVersion(Path pom) throws Exception { return directChild(parse(pom).getDocumentElement(), "version") != null; } + private static String fontsVersionProperty(Path pom) throws IOException { + Matcher matcher = Pattern.compile("([^<]+)") + .matcher(Files.readString(pom)); + assertThat(matcher.find()) + .describedAs("expected a property in %s", pom) + .isTrue(); + return matcher.group(1).trim(); + } + private static String effectiveVersion(Path pom) throws Exception { Element project = parse(pom).getDocumentElement(); From c6b9201034704459ef97d3fe66b6a4f99001e268 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Thu, 18 Jun 2026 09:30:08 +0100 Subject: [PATCH 2/3] ci: build the engine without the fonts artifact; install fonts for consumer jobs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why: the bundled-fonts split made every engine CI build red. The engine declared a TEST-scope dependency on io.github.demchaav:graph-compose-fonts, which is not on Central yet — and Maven resolves declared dependencies before running (or skipping) tests, so even -DskipTests jobs (japicmp, CodeQL) failed at "Could not resolve dependencies … graph-compose-fonts:jar:1.0.0 (test)". What: - The engine no longer depends on the fonts artifact at all. Its visual / snapshot suite gets the bundled fonts on the TEST classpath directly from the sibling module's source via a entry pointing at fonts/src/main/resources. This fully decouples the engine build from the fonts artifact: an engine-only build needs no fonts jar published or installed, and contributors no longer need a bootstrap install. The fonts are excluded from the tests-jar so they don't bloat it (the benchmarks module gets fonts from the artifact). The engine pom drops the now-unused graphcompose.fonts.version property. - VersionConsistencyGuardTest now checks the fonts version agrees between the aggregator and the bundle (the two modules that pin the artifact); the engine no longer carries the property. - Consumer CI jobs that build the examples / benchmarks modules (which DO depend on the fonts artifact) install graph-compose-fonts into the local repo first (ci.yml examples / perf-smoke / weekly-diff, benchmarks-jmh.yml). The now-unnecessary fonts bootstrap is removed from publish.yml. - release-process.md §2.D updated to match (no engine fonts.version; no engine bootstrap). Verification: with graph-compose-fonts removed from the local ~/.m2, ./mvnw clean verify -pl . is green (1398 tests) — replicating the CI environment; the main jar stays 2.54 MB with no fonts/google entries and the tests-jar carries the test classes but no fonts. --- .github/workflows/benchmarks-jmh.yml | 3 + .github/workflows/ci.yml | 18 +++++ .github/workflows/publish.yml | 8 --- docs/contributing/release-process.md | 18 ++--- pom.xml | 66 +++++++++++-------- .../VersionConsistencyGuardTest.java | 21 +++--- 6 files changed, 81 insertions(+), 53 deletions(-) diff --git a/.github/workflows/benchmarks-jmh.yml b/.github/workflows/benchmarks-jmh.yml index a5f909a4..505d97ed 100644 --- a/.github/workflows/benchmarks-jmh.yml +++ b/.github/workflows/benchmarks-jmh.yml @@ -41,6 +41,9 @@ jobs: java-version: '17' cache: maven + - name: Install graph-compose-fonts (the benchmarks render with the bundled families) + run: ./mvnw -B -ntp -f fonts/pom.xml -DskipTests install + - name: Install root artifact (graph-compose + test-jar) run: ./mvnw -B -ntp -DskipTests install -pl . diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2cf8a7d..f173235b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,6 +99,12 @@ jobs: java-version: '17' cache: maven + - name: Install graph-compose-fonts (consumed by the examples / benchmarks modules) + # The engine itself does not depend on the fonts artifact, but the + # examples and benchmarks modules render with the bundled families, so + # install graph-compose-fonts into the local repo before building them. + run: ./mvnw -B -ntp -f fonts/pom.xml -DskipTests install + - name: Install root artifact run: ./mvnw -B -ntp -DskipTests install -pl . @@ -202,6 +208,12 @@ jobs: java-version: '17' cache: maven + - name: Install graph-compose-fonts (consumed by the examples / benchmarks modules) + # The engine itself does not depend on the fonts artifact, but the + # examples and benchmarks modules render with the bundled families, so + # install graph-compose-fonts into the local repo before building them. + run: ./mvnw -B -ntp -f fonts/pom.xml -DskipTests install + - name: Install root artifact run: ./mvnw -B -ntp -DskipTests install -pl . @@ -264,6 +276,12 @@ jobs: benchmark-current-speed-${{ github.ref_name }}- benchmark-current-speed- + - name: Install graph-compose-fonts (consumed by the examples / benchmarks modules) + # The engine itself does not depend on the fonts artifact, but the + # examples and benchmarks modules render with the bundled families, so + # install graph-compose-fonts into the local repo before building them. + run: ./mvnw -B -ntp -f fonts/pom.xml -DskipTests install + - name: Install root artifact run: ./mvnw -B -ntp -DskipTests install -pl . diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b4d826a3..f7241141 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -79,14 +79,6 @@ jobs: gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} gpg-passphrase: MAVEN_GPG_PASSPHRASE - - name: Install graph-compose-fonts into the local repo - # The engine's visual / snapshot suite renders with the bundled - # Google fonts, which now live in the separately-versioned - # graph-compose-fonts artifact (engine depends on it at test - # scope). Build + install it locally so the verify step below can - # resolve it even before it (or this engine version) is on Central. - run: ./mvnw -B -ntp -f fonts/pom.xml clean install - - name: Verify (full canonical suite green at tagged commit) # Re-verify the tagged commit before publishing — defence in # depth against a tag pushed from a broken branch by mistake. diff --git a/docs/contributing/release-process.md b/docs/contributing/release-process.md index 42ae6fc1..83d5f57f 100644 --- a/docs/contributing/release-process.md +++ b/docs/contributing/release-process.md @@ -121,14 +121,16 @@ is a convenience aggregate `io.github.demchaav:graph-compose-bundle` (under ``, push a `fonts-vX.Y.Z` tag. That tag triggers [`publish-fonts.yml`](../../.github/workflows/publish-fonts.yml), which deploys only `graph-compose-fonts` to Central. Then bump - `` in the engine `pom.xml`, `aggregator/pom.xml`, - and `bundle/pom.xml` to the new fonts version so the next engine release pins - it (the engine→fonts dependency is test-scope; examples/benchmarks/bundle pin - it for real). -- **First-time bootstrap.** The engine verify depends on `graph-compose-fonts` - at test scope. `publish.yml` installs it locally first - (`./mvnw -f fonts/pom.xml install`); for a local full-reactor build run that - once before building the engine standalone (`./mvnw clean verify -pl .`). + `` in `aggregator/pom.xml` (inherited by + examples + benchmarks) and `bundle/pom.xml` to the new fonts version so those + consumers pin it. The engine `pom.xml` does **not** carry this property — the + engine has no dependency on the fonts artifact (its tests read the fonts from + the sibling module's source via ``). +- **No fonts bootstrap for the engine.** Because the engine does not depend on + the fonts artifact, `./mvnw clean verify -pl .` builds standalone without the + fonts jar being published or installed. Only the consumer modules (examples, + benchmarks) need `graph-compose-fonts` in the local repo — their CI jobs run + `./mvnw -f fonts/pom.xml install` before building. --- diff --git a/pom.xml b/pom.xml index 88491ede..e7c68527 100644 --- a/pom.xml +++ b/pom.xml @@ -62,20 +62,6 @@ 5.23.0 1.18.10 - - 1.0.0 - 0.10.0 3.15.0 @@ -232,19 +218,15 @@ - - io.github.demchaav - graph-compose-fonts - ${graphcompose.fonts.version} - test - - ch.qos.logback logback-classic @@ -311,6 +293,26 @@ + + + + src/test/resources + + + + ${project.basedir}/fonts/src/main/resources + + + + + fonts/** + + diff --git a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java index f501e64c..e5ceeebc 100644 --- a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java +++ b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java @@ -70,19 +70,18 @@ void everyModuleResolvesToTheRootProjectVersion() throws Exception { @Test void bundledFontsVersionAgreesAcrossModules() throws Exception { - // graph-compose-fonts carries an independent version line, but the - // ${graphcompose.fonts.version} property that pins it is duplicated in - // three poms (engine, aggregator, bundle) because there is no shared - // parent to single-source it. This guards the PR-7.1 drift class: the - // three must always agree, even though they differ from the engine line. - String engine = fontsVersionProperty(PROJECT_ROOT.resolve("pom.xml")); + // graph-compose-fonts carries an independent version line. The engine + // does NOT depend on the fonts artifact (its tests read the fonts from + // the sibling module's source), so the ${graphcompose.fonts.version} + // property that pins the artifact lives only in the modules that consume + // it: the aggregator (inherited by examples + benchmarks) and the bundle. + // This guards the PR-7.1 drift class: those must always agree, even + // though they differ from the engine version line. + String aggregator = fontsVersionProperty(PROJECT_ROOT.resolve("aggregator/pom.xml")); - assertThat(fontsVersionProperty(PROJECT_ROOT.resolve("aggregator/pom.xml"))) - .describedAs("aggregator graphcompose.fonts.version must match the engine's (%s)", engine) - .isEqualTo(engine); assertThat(fontsVersionProperty(PROJECT_ROOT.resolve("bundle/pom.xml"))) - .describedAs("bundle graphcompose.fonts.version must match the engine's (%s)", engine) - .isEqualTo(engine); + .describedAs("bundle graphcompose.fonts.version must match the aggregator's (%s)", aggregator) + .isEqualTo(aggregator); } @Test From 31fdbe5f22c3075264003ed4c6ed7650ed8348db Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Thu, 18 Jun 2026 09:42:47 +0100 Subject: [PATCH 3/3] docs(fonts): font-coverage reflects the graph-compose-fonts split The "use a font that covers the range" section still claimed FontName.JETBRAINS_MONO is bundled in the engine. Since v1.8.0 the curated Google families ship in the separate io.github.demchaav:graph-compose-fonts artifact, so the page now tells the reader to add it (or the bundle) to use them, that the engine renders with standard-14 only without it (and fails fast naming the dependency when a bundled family is requested), and links the migration note. --- docs/font-coverage.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/font-coverage.md b/docs/font-coverage.md index 08a25147..6ae5c24e 100644 --- a/docs/font-coverage.md +++ b/docs/font-coverage.md @@ -57,9 +57,16 @@ for the full set (`dot`, `arrow`, `chevron`, `diamond`, `star`, `checkmark`, ### 2. Use a font that covers the range -`FontName.JETBRAINS_MONO` is bundled for monospaced code and data. For broader -Unicode coverage, register a custom font family that includes the glyphs you -need and select it through `DocumentTextStyle.fontName(...)`. +The curated Google families — `FontName.JETBRAINS_MONO` for monospaced code and +data, plus the serif / sans / Thai families with broader Unicode coverage — ship +in the separate `io.github.demchaav:graph-compose-fonts` artifact since v1.8.0. +Add it (or the `graph-compose-bundle` aggregate) to use them; without it on the +classpath the engine renders with the standard-14 fonts only, and asking for a +bundled family fails fast with a message naming the dependency. See the +[v1.8.0 fonts migration note](migration/v1.8.0-fonts.md). + +For glyphs no bundled family covers, register a custom font family that includes +them and select it through `DocumentTextStyle.fontName(...)`. ### 3. Stay inside WinAnsi