From 7668f46c42bba6d9f91fd8fada2774e50b5ff876 Mon Sep 17 00:00:00 2001 From: neon <18559658+neonsolstice@users.noreply.github.com> Date: Sat, 22 Aug 2026 05:51:17 +0000 Subject: [PATCH] feat(reader): let readers pick the font style for body text Read variable-font axes and named instances so readers can select real weight and style variants instead of synthesized faces. Preserve the axis default, accept the full CSS weight range, and keep saved choices stable while font catalogs load. Require the new settings fields for complete EPUB defaults, keep per-book patches partial, and widen the persisted font-weight constraints to match CSS. Closes #533 --- client/src/features/reader/ReaderView.vue | 4 + .../epub/components/ReaderSettingsPanel.vue | 85 +- .../__tests__/ReaderSettingsPanel.spec.ts | 127 + .../__tests__/useCustomFonts.spec.ts | 78 + .../__tests__/useReaderState.spec.ts | 48 + .../reader/epub/composables/useCustomFonts.ts | 25 +- .../reader/epub/composables/useReaderState.ts | 46 +- .../composables/useReaderSettings.test.ts | 18 + .../shared/composables/useReaderSettings.ts | 7 + .../lib/__tests__/font-variants.spec.ts | 143 + .../reader/shared/lib/font-variants.ts | 67 + .../src/features/settings/EbookSettings.vue | 114 +- .../features/settings/FontLibraryPanel.vue | 39 +- .../settings/__tests__/EbookSettings.spec.ts | 39 +- .../settings/__tests__/font-store-fixture.ts | 11 +- client/src/locales/en.json | 9 +- packages/types/src/font.ts | 66 +- packages/types/src/reader-settings.ts | 8 + .../0072_add_variable_font_axes.sql | 8 + .../db/migrations/0073_widen_font_weights.sql | 4 + .../src/db/migrations/meta/0072_snapshot.json | 16328 ++++++++++++++++ .../src/db/migrations/meta/0073_snapshot.json | 16328 ++++++++++++++++ server/src/db/migrations/meta/_journal.json | 14 + server/src/db/schema/fonts.ts | 28 +- .../src/modules/font/dto/font-response.dto.ts | 5 +- .../src/modules/font/dto/update-font.dto.ts | 7 +- .../modules/font/font-metadata.parser.test.ts | 175 +- .../src/modules/font/font-metadata.parser.ts | 443 +- server/src/modules/font/font-test-fixtures.ts | 153 +- .../src/modules/font/font-upload.pipeline.ts | 8 +- server/src/modules/font/font.service.test.ts | 6 + server/src/modules/font/font.service.ts | 9 +- .../font/font.validation.service.test.ts | 171 +- .../modules/font/font.validation.service.ts | 131 +- .../reader-preferences.service.test.ts | 37 + .../reader-preferences.service.ts | 4 + .../server-font/server-font.service.test.ts | 6 + .../server-font/server-font.service.ts | 9 +- 38 files changed, 34608 insertions(+), 200 deletions(-) create mode 100644 client/src/features/reader/shared/lib/__tests__/font-variants.spec.ts create mode 100644 client/src/features/reader/shared/lib/font-variants.ts create mode 100644 server/src/db/migrations/0072_add_variable_font_axes.sql create mode 100644 server/src/db/migrations/0073_widen_font_weights.sql create mode 100644 server/src/db/migrations/meta/0072_snapshot.json create mode 100644 server/src/db/migrations/meta/0073_snapshot.json diff --git a/client/src/features/reader/ReaderView.vue b/client/src/features/reader/ReaderView.vue index 61080ad16..f55e98978 100644 --- a/client/src/features/reader/ReaderView.vue +++ b/client/src/features/reader/ReaderView.vue @@ -80,6 +80,8 @@ const { setFontSize, setLineHeight, setFontFamily, + setFontWeight, + setFontStyle, setMaxColumnCount, setGap, setMaxInlineSize, @@ -336,6 +338,8 @@ const epubSetters: Record void> = { fontSize: (v) => setFontSize(v as number), lineHeight: (v) => setLineHeight(v as number), fontFamily: (v) => setFontFamily(v as string | null), + fontWeight: (v) => setFontWeight(v as number), + fontStyle: (v) => setFontStyle(v as EpubReaderSettings['fontStyle']), maxColumnCount: (v) => setMaxColumnCount(v as number), gap: (v) => setGap(v as number), maxInlineSize: (v) => setMaxInlineSize(v as number), diff --git a/client/src/features/reader/epub/components/ReaderSettingsPanel.vue b/client/src/features/reader/epub/components/ReaderSettingsPanel.vue index 08f78fb74..08d4a5265 100644 --- a/client/src/features/reader/epub/components/ReaderSettingsPanel.vue +++ b/client/src/features/reader/epub/components/ReaderSettingsPanel.vue @@ -1,7 +1,7 @@