Skip to content

style: Phase 1 - Simple light dark themes#1006

Merged
daveallie merged 3 commits into
crosspoint-reader:masterfrom
cdmoro:light-dark-themes
Feb 22, 2026
Merged

style: Phase 1 - Simple light dark themes#1006
daveallie merged 3 commits into
crosspoint-reader:masterfrom
cdmoro:light-dark-themes

Conversation

@cdmoro
Copy link
Copy Markdown
Contributor

@cdmoro cdmoro commented Feb 19, 2026

Summary

  • What is the goal of this PR? (e.g., Implements the new feature for file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in #837, this PR introduces a simple implementation of light/dark themes.

  • What changes are included?
  • Choose #6e9a82 as accent color (taken from logo)
  • Implement a very basic media query for dark themes (@media (prefers-color-scheme: dark))
  • Update style using CSS variables

Additional Context

  • Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks,
    specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase of a series of PRs (hopefully).

Next steps/Phases:

  1. Light/Dark themes (this PR)
  2. Load external CSS file to avoid duplication
  3. HTML enhancement (for example, use dialog element instead of divs)
  4. Use SVG instead of emojis
  5. Use Vite + Typescript to improve DX and have better minification

AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? < YES | PARTIALLY | NO >

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 19, 2026

📝 Walkthrough

Walkthrough

Applied a CSS variable-based theming system across three HTML pages (FilesPage, HomePage, SettingsPage). Replaced hard-coded color values with CSS custom properties, added a dark-mode @media (prefers-color-scheme: dark) override, and adjusted navigation active/hover states and some layout spacing.

Changes

Cohort / File(s) Summary
FilesPage (theming + nav)
src/network/html/FilesPage.html
Introduced CSS custom properties and dark-mode overrides; replaced literal colors with variables for body, headings, cards, borders, breadcrumbs, modals, file table rows, badges, folder/file colors, and action elements; added/ensured .nav-links a.active for File Manager.
HomePage (theming + nav)
src/network/html/HomePage.html
Added root CSS variables and dark-mode overrides; replaced hard-coded colors for body, headings, info rows, cards, labels/values, and nav links; switched nav to flex/gap, added active state and hover accent, marked Home link active.
SettingsPage (theming + nav + inputs)
src/network/html/SettingsPage.html
Moved colors to CSS variables with dark-mode overrides; updated headings, card backgrounds, borders, setting rows, inputs, toggles, and labels to use theme vars; adjusted nav layout and active state, plus minor padding/size/responsive tweaks.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'style: Phase 1 - Simple light dark themes' directly and clearly describes the main change: introducing light/dark theme support as the first phase of styling improvements.
Description check ✅ Passed The PR description clearly explains the goal (implement automatic dark theme), lists specific changes (CSS variables, media query, accent color choice), and provides helpful context about phase 1 of a multi-phase enhancement plan.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
src/network/html/SettingsPage.html (4)

94-103: ⚠️ Potential issue | 🟡 Minor

Hard-coded border color breaks dark mode consistency.

Line 99 uses #ddd instead of var(--border-color). This will appear visually inconsistent in dark mode where other borders use the theme variable.

Proposed fix
     .setting-control select,
     .setting-control input[type="number"],
     .setting-control input[type="text"],
     .setting-control input[type="password"] {
       padding: 6px 10px;
-      border: 1px solid `#ddd`;
+      border: 1px solid var(--border-color);
       border-radius: 4px;
       font-size: 0.95em;
       background: var(--card-background);
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 94 - 103, The CSS for form
controls (.setting-control select, .setting-control input[type="number"],
.setting-control input[type="text"], .setting-control input[type="password"])
uses a hard-coded border color "#ddd"; update the border property to use the
theme variable (var(--border-color)) so these inputs follow dark/light theme
consistency by replacing "border: 1px solid `#ddd`;" with a border that references
var(--border-color).

260-264: ⚠️ Potential issue | 🟡 Minor

Inline hard-coded color breaks theming.

Line 261 uses an inline color: #95a5a6`` which won't respond to theme changes. Use a CSS class with var(--label-color) or similar variable instead.

Proposed fix

Add a CSS class:

.footer-text {
  text-align: center;
  color: var(--label-color);
  margin: 0;
}

Update HTML:

   <div class="card">
-    <p style="text-align: center; color: `#95a5a6`; margin: 0;">
+    <p class="footer-text">
       CrossPoint E-Reader • Open Source
     </p>
   </div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 260 - 264, The paragraph
inside the div with class "card" uses a hard-coded inline style (color: `#95a5a6`)
which breaks theming; remove the inline style on that <p> element in
SettingsPage.html, add a CSS class (e.g., footer-text) applied to that <p>, and
define that class in the component stylesheet to use the theme variable (color:
var(--label-color)) plus the existing text-align and margin rules so the text
responds to theme changes.

179-188: ⚠️ Potential issue | 🟡 Minor

Message styles need dark mode variants.

The success and error message colors are hard-coded with light backgrounds (#d4edda, #f8d7da). These will appear visually jarring against the dark mode background (#333). Consider adding CSS variables for message backgrounds/text or provide dark mode overrides.

Example dark mode override approach
`@media` (prefers-color-scheme: dark) {
  .message.success {
    background-color: `#1e3a2f`;
    color: `#a3d9a5`;
    border-color: `#2d5a3f`;
  }
  .message.error {
    background-color: `#3a1e1e`;
    color: `#f5a5a5`;
    border-color: `#5a2d2d`;
  }
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 179 - 188, The
.message.success and .message.error rules in SettingsPage.html use hard-coded
light-theme colors which clash with dark backgrounds; add dark-mode-aware styles
by introducing CSS variables (e.g., --msg-success-bg, --msg-success-color,
--msg-success-border, --msg-error-bg, --msg-error-color, --msg-error-border) and
use them in the existing .message.success and .message.error selectors, then
provide overrides inside a `@media` (prefers-color-scheme: dark) block (or
.dark-theme wrapper) to set the variables to dark-friendly values as shown in
the review example so messages render correctly in dark mode.

384-388: ⚠️ Potential issue | 🟡 Minor

Inline error color in JavaScript won't adapt to theme.

Line 387 uses hard-coded color:#e74c3c`` in an inline style. Consider using a CSS class (e.g., .error-text) with a themed variable for consistency.

Proposed fix

Add CSS class:

.error-text {
  text-align: center;
  color: var(--error-color, `#e74c3c`);
}

Update JS:

-        '<div class="card"><p style="text-align:center;color:`#e74c3c`;">Failed to load settings</p></div>';
+        '<div class="card"><p class="error-text">Failed to load settings</p></div>';
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 384 - 388, Replace the
hard-coded inline color in the catch block that sets
document.getElementById('settings-container').innerHTML and instead use a CSS
class tied to a theme variable: add a .error-text rule (e.g., text-align:center;
color:var(--error-color, `#e74c3c`);) to your stylesheet and update the innerHTML
produced in the catch (the block that references 'settings-container') to use <p
class="error-text">Failed to load settings</p> rather than the inline style.
🧹 Nitpick comments (5)
src/network/html/SettingsPage.html (4)

221-225: Redundant margin-right with flex gap.

Line 223 adds margin-right: 6px but the parent .nav-links already uses gap: 10px (line 57). In flexbox, gap handles spacing between items, making margin-right redundant and causing uneven spacing.

Proposed fix
      .nav-links a {
        padding: 8px 12px;
-       margin-right: 6px;
        font-size: 0.9em;
      }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 221 - 225, The rule
.nav-links a currently sets margin-right: 6px which duplicates spacing provided
by the parent .nav-links's gap: 10px and causes uneven spacing; remove the
margin-right property from the .nav-links a selector so spacing is controlled
uniformly by .nav-links gap, and scan for any other per-item margins (e.g., in
.nav-links a or sibling selectors) that should be removed to avoid conflicts
with the flex gap.

155-171: Save button uses hard-coded colors.

The button colors (#27ae60, #219a52, #95a5a6) are not using CSS variables. If you want full theme flexibility, consider adding --button-primary, --button-primary-hover, and --button-disabled variables. However, keeping action buttons with fixed "brand" colors is also a valid design choice.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 155 - 171, The .save-btn
styles hard-code colors which prevents theme overrides; update the CSS for the
.save-btn, .save-btn:hover, and .save-btn:disabled selectors to use CSS
variables (e.g., --button-primary, --button-primary-hover, --button-disabled)
with the current hex values as fallbacks so themes can override them while
preserving existing colors by default; ensure the variables are referenced in
the background-color declarations for .save-btn, .save-btn:hover, and
.save-btn:disabled respectively.

126-144: Toggle switch has hard-coded colors that may not suit dark mode.

The toggle slider uses hard-coded #ccc (line 130) and white (line 141). Consider introducing variables like --toggle-background and --toggle-knob to ensure visual consistency across themes.

Proposed fix

Add to :root:

--toggle-background: `#ccc`;
--toggle-knob: white;

Add dark mode overrides if needed, then update the toggle styles:

     .toggle-slider {
       position: absolute;
       cursor: pointer;
       top: 0; left: 0; right: 0; bottom: 0;
-      background-color: `#ccc`;
+      background-color: var(--toggle-background);
       border-radius: 26px;
       transition: 0.3s;
     }
     .toggle-slider:before {
       position: absolute;
       content: "";
       height: 20px;
       width: 20px;
       left: 3px;
       bottom: 3px;
-      background-color: white;
+      background-color: var(--toggle-knob);
       border-radius: 50%;
       transition: 0.3s;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 126 - 144, Introduce CSS
variables for the toggle colors and use them in the existing rules: define
--toggle-background and --toggle-knob (e.g., in :root and in dark-theme
overrides) and replace the hard-coded `#ccc` in .toggle-slider and white in
.toggle-slider:before with var(--toggle-background) and var(--toggle-knob)
respectively so the toggle adapts to theme changes; update any theme-specific
CSS to override those variables for dark mode.

8-28: Good foundation for theming; consider overriding accent colors for dark mode.

The CSS variable setup and dark mode media query are well-structured. However, --accent-color and --accent-color-highlight are not overridden in the dark mode block. While the current green tones may work acceptably, you might want to provide slightly adjusted values for better contrast or aesthetics on dark backgrounds.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 8 - 28, In the dark-mode
:root block, add overrides for the CSS variables --accent-color and
--accent-color-highlight (currently only defined in the light :root) so they use
adjusted values suitable for dark backgrounds; update the :root inside `@media`
(prefers-color-scheme: dark) to set new contrast-optimized values for
--accent-color and --accent-color-highlight to ensure accessible contrast and
visual harmony with --card-background and --title-color.
src/network/html/FilesPage.html (1)

642-645: Consider aria-current="page" on the active nav link.

This improves screen-reader context for the current page.

♿ Optional accessibility tweak
-  <a href="/deoxy?target=https%3A%2F%2Fgithub.com%2Ffiles" class="active">File Manager</a>
+  <a href="/deoxy?target=https%3A%2F%2Fgithub.com%2Ffiles" class="active" aria-current="page">File Manager</a>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 642 - 645, The active
navigation link in the .nav-links block (the <a> element with class="active")
should include aria-current="page" to convey to screen readers which page is
current; update the anchor element with class="active" inside the .nav-links
container to add aria-current="page" (keep the existing text and href intact).
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d461d93 and be17565.

📒 Files selected for processing (3)
  • src/network/html/FilesPage.html
  • src/network/html/HomePage.html
  • src/network/html/SettingsPage.html
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Title Check
  • GitHub Check: build
🔇 Additional comments (7)
src/network/html/HomePage.html (4)

8-28: Nice centralization of theme tokens and dark-mode overrides.
This sets up a clean base for consistent theming across the page.


29-70: Theme-variable adoption looks solid.
Color usage is consistent and aligns with the new tokens.


79-98: Navigation styling is clean and consistent with the theme.
Active and hover states are clear and cohesive.


104-106: Active state set correctly for the Home link.

src/network/html/FilesPage.html (3)

8-107: Theme variables and base/nav styling look consistent.

Nice consolidation of core colors into CSS variables and applying them across base elements and navigation.


155-190: Modal/table/link/label theming looks consistent.

Good variable usage for modals, tables, links, and meta text to keep dark mode cohesive.

Also applies to: 217-223, 250-313


472-500: Delete modal theming change looks good.

The delete item title and cancel hover now follow the theme variables consistently.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/network/html/FilesPage.html`:
- Around line 192-194: Verify the intended hover visual: the existing selector
".file-table tr:hover:has(td)" highlights the entire row while the suggested
"tr:hover td" highlights only cells; if you want to preserve row-level
highlighting keep the original ":has" selector, otherwise switch to "tr:hover
td" for cell-level highlighting — to support older browsers while preserving
behavior, wrap the ":has" rule in a feature query and provide a fallback, e.g.
use "@supports selector(:has(*)) { .file-table tr:hover:has(td) {
background-color: var(--accent-color-10); } }" and outside that block add the
fallback ".file-table tr:hover td { background-color: var(--accent-color-10);
}".

---

Outside diff comments:
In `@src/network/html/SettingsPage.html`:
- Around line 94-103: The CSS for form controls (.setting-control select,
.setting-control input[type="number"], .setting-control input[type="text"],
.setting-control input[type="password"]) uses a hard-coded border color "#ddd";
update the border property to use the theme variable (var(--border-color)) so
these inputs follow dark/light theme consistency by replacing "border: 1px solid
`#ddd`;" with a border that references var(--border-color).
- Around line 260-264: The paragraph inside the div with class "card" uses a
hard-coded inline style (color: `#95a5a6`) which breaks theming; remove the inline
style on that <p> element in SettingsPage.html, add a CSS class (e.g.,
footer-text) applied to that <p>, and define that class in the component
stylesheet to use the theme variable (color: var(--label-color)) plus the
existing text-align and margin rules so the text responds to theme changes.
- Around line 179-188: The .message.success and .message.error rules in
SettingsPage.html use hard-coded light-theme colors which clash with dark
backgrounds; add dark-mode-aware styles by introducing CSS variables (e.g.,
--msg-success-bg, --msg-success-color, --msg-success-border, --msg-error-bg,
--msg-error-color, --msg-error-border) and use them in the existing
.message.success and .message.error selectors, then provide overrides inside a
`@media` (prefers-color-scheme: dark) block (or .dark-theme wrapper) to set the
variables to dark-friendly values as shown in the review example so messages
render correctly in dark mode.
- Around line 384-388: Replace the hard-coded inline color in the catch block
that sets document.getElementById('settings-container').innerHTML and instead
use a CSS class tied to a theme variable: add a .error-text rule (e.g.,
text-align:center; color:var(--error-color, `#e74c3c`);) to your stylesheet and
update the innerHTML produced in the catch (the block that references
'settings-container') to use <p class="error-text">Failed to load settings</p>
rather than the inline style.

---

Nitpick comments:
In `@src/network/html/FilesPage.html`:
- Around line 642-645: The active navigation link in the .nav-links block (the
<a> element with class="active") should include aria-current="page" to convey to
screen readers which page is current; update the anchor element with
class="active" inside the .nav-links container to add aria-current="page" (keep
the existing text and href intact).

In `@src/network/html/SettingsPage.html`:
- Around line 221-225: The rule .nav-links a currently sets margin-right: 6px
which duplicates spacing provided by the parent .nav-links's gap: 10px and
causes uneven spacing; remove the margin-right property from the .nav-links a
selector so spacing is controlled uniformly by .nav-links gap, and scan for any
other per-item margins (e.g., in .nav-links a or sibling selectors) that should
be removed to avoid conflicts with the flex gap.
- Around line 155-171: The .save-btn styles hard-code colors which prevents
theme overrides; update the CSS for the .save-btn, .save-btn:hover, and
.save-btn:disabled selectors to use CSS variables (e.g., --button-primary,
--button-primary-hover, --button-disabled) with the current hex values as
fallbacks so themes can override them while preserving existing colors by
default; ensure the variables are referenced in the background-color
declarations for .save-btn, .save-btn:hover, and .save-btn:disabled
respectively.
- Around line 126-144: Introduce CSS variables for the toggle colors and use
them in the existing rules: define --toggle-background and --toggle-knob (e.g.,
in :root and in dark-theme overrides) and replace the hard-coded `#ccc` in
.toggle-slider and white in .toggle-slider:before with var(--toggle-background)
and var(--toggle-knob) respectively so the toggle adapts to theme changes;
update any theme-specific CSS to override those variables for dark mode.
- Around line 8-28: In the dark-mode :root block, add overrides for the CSS
variables --accent-color and --accent-color-highlight (currently only defined in
the light :root) so they use adjusted values suitable for dark backgrounds;
update the :root inside `@media` (prefers-color-scheme: dark) to set new
contrast-optimized values for --accent-color and --accent-color-highlight to
ensure accessible contrast and visual harmony with --card-background and
--title-color.

Comment thread src/network/html/FilesPage.html Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (7)
src/network/html/HomePage.html (1)

130-132: ⚠️ Potential issue | 🟡 Minor

Hard-coded color bypasses theming system.

The inline color: #95a5a6`` won't respond to dark mode. Consider using a CSS variable or a dedicated class for footer text.

Proposed fix
-      <p style="text-align: center; color: `#95a5a6`; margin: 0">
+      <p style="text-align: center; color: var(--label-color); margin: 0">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/HomePage.html` around lines 130 - 132, The paragraph at the
bottom currently hardcodes color via inline style ("color: `#95a5a6`") which
bypasses theming; remove the inline color and give the element a semantic class
(e.g., "footer-text" or "muted-text") and update the stylesheet to style that
class using a CSS variable (e.g., var(--muted-color) or a theme-specific
variable) so the text responds to dark/light themes; modify the <p> element in
HomePage.html to use the new class and ensure the theme variables are
defined/used in your global CSS or theme provider.
src/network/html/FilesPage.html (4)

253-258: ⚠️ Potential issue | 🟡 Minor

.no-files uses hard-coded color that won't adapt to dark mode.

Proposed fix
     .no-files {
       text-align: center;
-      color: `#95a5a6`;
+      color: var(--label-color);
       padding: 40px;
       font-style: italic;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 253 - 258, The .no-files rule
uses a hard-coded hex color which won't adapt to dark mode; change it to use a
theme-aware CSS variable (e.g., replace the hex with something like
var(--muted-text) or another existing UI color variable) so the text color
follows light/dark themes, keeping the rest of the properties (text-align,
padding, font-style) intact and updating any variable name to match your
project's design tokens.

316-324: ⚠️ Potential issue | 🟡 Minor

Hard-coded border color on .folder-input doesn't adapt to dark mode.

Same issue as in SettingsPage.html - the #ddd border will have low contrast in dark mode.

Proposed fix
     .folder-input {
       width: 100%;
       padding: 10px;
-      border: 1px solid `#ddd`;
+      border: 1px solid var(--border-color);
       border-radius: 4px;
       font-size: 1em;
       margin-bottom: 10px;
       box-sizing: border-box;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 316 - 324, The .folder-input
rule uses a hard-coded border color (`#ddd`) which doesn't adapt to dark mode;
update the CSS for .folder-input to use a theme-aware variable or media-query
value instead (e.g. use an existing CSS variable like --border-color or define
one, or switch to color-scheme media queries) so the border adapts in dark mode
similar to the fix applied in SettingsPage.html; modify the .folder-input
selector to reference that variable (e.g., border: 1px solid
var(--border-color)) or set it inside `@media` (prefers-color-scheme: dark) to
ensure sufficient contrast.

350-368: ⚠️ Potential issue | 🟡 Minor

Action button hover backgrounds use hard-coded light colors that won't adapt to dark mode.

The hover states for .delete-btn, .rename-btn, and .move-btn use light background colors (#fee, #e8f4fd, #e6f7f4) that will appear jarring in dark mode.

Proposed fix using CSS variables or translucent colors
     .delete-btn:hover {
-      background-color: `#fee`;
+      background-color: rgba(231, 76, 60, 0.15);
       color: `#e74c3c`;
     }
     .rename-btn {
       color: `#2980b9`;
     }
     .rename-btn:hover {
-      background-color: `#e8f4fd`;
+      background-color: rgba(41, 128, 185, 0.15);
     }
     .move-btn {
       color: `#16a085`;
     }
     .move-btn:hover {
-      background-color: `#e6f7f4`;
+      background-color: rgba(22, 160, 133, 0.15);
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 350 - 368, The hover
backgrounds for .delete-btn, .rename-btn, and .move-btn are hard-coded to light
hex values and will clash in dark mode; replace those fixed colors with
theme-aware CSS variables or translucent colors so they adapt to light/dark
themes (for example use a variable like --btn-hover-bg or an rgba() based
translucent variant derived from the button color such as
rgba(var(--delete-color-rgb), 0.08)), update .delete-btn:hover,
.rename-btn:hover, and .move-btn:hover to use these variables/fallbacks, and
ensure the variables are defined in your root/theme CSS for both light and dark
modes.

682-686: ⚠️ Potential issue | 🟡 Minor

Hard-coded footer color bypasses theming (same issue as other pages).

Proposed fix
-  <p style="text-align: center; color: `#95a5a6`; margin: 0;">
+  <p style="text-align: center; color: var(--label-color); margin: 0;">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 682 - 686, The footer paragraph
in FilesPage.html currently hard-codes color: `#95a5a6` on the <p> inside the
div.card, which bypasses theming; remove the inline style and instead apply a
theme-aware class or CSS variable (e.g., add a class like "footer-text" or
"muted" to that <p> and ensure your global/theme stylesheet maps that class to a
color using a CSS variable such as var(--color-muted) or the existing theme
token) so the footer color follows the app theme; update the stylesheet (not the
HTML) to define the class using the theme variable.
src/network/html/SettingsPage.html (2)

95-104: ⚠️ Potential issue | 🟡 Minor

Hard-coded border color doesn't adapt to dark mode.

The border: 1px solid #ddd`` on input elements won't change in dark mode, causing potential low contrast issues.

Proposed fix
     .setting-control select,
     .setting-control input[type="number"],
     .setting-control input[type="text"],
     .setting-control input[type="password"] {
       padding: 6px 10px;
-      border: 1px solid `#ddd`;
+      border: 1px solid var(--border-color);
       border-radius: 4px;
       font-size: 0.95em;
       background: var(--card-bg);
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 95 - 104, The inputs/selects
under the .setting-control selector use a hard-coded border color (`#ddd`) that
doesn't adapt to dark mode; update the CSS for ".setting-control select,
.setting-control input[type=\"number\"], .setting-control input[type=\"text\"],
.setting-control input[type=\"password\"]" to use a theme-aware variable (e.g.,
var(--border) or var(--input-border)) or a color that responds to color-scheme
so the border adapts in dark mode rather than remaining `#ddd`.

260-264: ⚠️ Potential issue | 🟡 Minor

Hard-coded footer color bypasses theming (same issue as HomePage.html).

Proposed fix
-    <p style="text-align: center; color: `#95a5a6`; margin: 0;">
+    <p style="text-align: center; color: var(--label-color); margin: 0;">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 260 - 264, The footer
paragraph in SettingsPage.html currently hard-codes color: `#95a5a6` inline on the
<p> inside the .card, which bypasses theming; remove the inline style and apply
a theme-aware class or CSS variable (e.g., class="footer-text" or use an
existing .muted) and define its color using the theme variable (e.g., color:
var(--muted-color)) in the stylesheet so the footer follows the app theme (apply
the same change to HomePage.html where the same pattern exists).
🧹 Nitpick comments (3)
src/network/html/HomePage.html (2)

8-17: CSS variables defined consistently for light theme.

The CSS variable definitions provide a good foundation for theming. Consider adding --accent-color-10 here for consistency with FilesPage.html, which uses it for hover backgrounds (e.g., rgba(110, 154, 130, 0.1)).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/HomePage.html` around lines 8 - 17, Add a new CSS variable
--accent-color-10 to the :root block in HomePage.html so it matches
FilesPage.html's hover background usage; define --accent-color-10 with the
semi-transparent value used elsewhere (e.g., rgba(110, 154, 130, 0.1)) so
components referencing --accent-color-10 for hover/bg get a consistent theme
value.

94-97: Hover state overrides active state styling.

When hovering over the active .nav-links a.active link, the a:hover rule applies --accent-hover-color background, which may cause visual inconsistency. Consider excluding the active link from hover changes or making the hover distinct.

Optional: Exclude active link from hover change
-    .nav-links a:hover {
+    .nav-links a:not(.active):hover {
       background-color: var(--accent-hover-color);
       color: white;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/HomePage.html` around lines 94 - 97, The hover rule for
.nav-links a:hover is overriding the active link styling (.nav-links a.active);
update the CSS so hovered state excludes active links or explicitly preserves
active styles—for example, change the hover selector to exclude .active (use
:not(.active)) or add a more specific .nav-links a.active:hover rule that
reapplies the active background/color; update the selectors around .nav-links
a:hover and .nav-links a.active to ensure the active link retains its intended
styling when hovered.
src/network/html/FilesPage.html (1)

379-462: Failed uploads banner uses hard-coded warning colors that may need dark mode variants.

The warning banner colors (#fff3cd, #ffc107, #856404, etc.) are semantic and typically acceptable, but the light yellow backgrounds may appear overly bright in dark mode. Consider this for future iterations if dark mode UX feedback warrants it.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 379 - 462, The warning banner
CSS uses fixed light-mode yellows which will look bad in dark mode; add a
dark-mode stylesheet or a prefers-color-scheme: dark media query that overrides
the color tokens for .failed-uploads-banner (background-color, border),
.failed-uploads-title, .dismiss-btn, .failed-file-name, .failed-file-error,
.retry-btn and .retry-all-btn to darker/muted variants, or refactor the existing
colors into CSS variables (e.g. --warning-bg, --warning-border,
--warning-foreground) and provide dark-mode values for those variables so the
banner adapts automatically in dark themes.
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between be17565 and 7309f24.

📒 Files selected for processing (3)
  • src/network/html/FilesPage.html
  • src/network/html/HomePage.html
  • src/network/html/SettingsPage.html
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: build
  • GitHub Check: cppcheck
🔇 Additional comments (2)
src/network/html/SettingsPage.html (1)

8-30: Good addition of --toggle-bg variable for the toggle component.

The dark mode override for --toggle-bg (#666 vs #ccc) ensures the toggle remains visible in both themes.

src/network/html/FilesPage.html (1)

8-29: Good addition of --accent-color-10 for translucent hover backgrounds.

This rgba-based variable provides a nice subtle highlight effect. Consider adding this to the other pages for consistency, or extracting shared CSS in a future phase as mentioned in the PR objectives.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@src/network/html/FilesPage.html`:
- Around line 253-258: The .no-files rule uses a hard-coded hex color which
won't adapt to dark mode; change it to use a theme-aware CSS variable (e.g.,
replace the hex with something like var(--muted-text) or another existing UI
color variable) so the text color follows light/dark themes, keeping the rest of
the properties (text-align, padding, font-style) intact and updating any
variable name to match your project's design tokens.
- Around line 316-324: The .folder-input rule uses a hard-coded border color
(`#ddd`) which doesn't adapt to dark mode; update the CSS for .folder-input to use
a theme-aware variable or media-query value instead (e.g. use an existing CSS
variable like --border-color or define one, or switch to color-scheme media
queries) so the border adapts in dark mode similar to the fix applied in
SettingsPage.html; modify the .folder-input selector to reference that variable
(e.g., border: 1px solid var(--border-color)) or set it inside `@media`
(prefers-color-scheme: dark) to ensure sufficient contrast.
- Around line 350-368: The hover backgrounds for .delete-btn, .rename-btn, and
.move-btn are hard-coded to light hex values and will clash in dark mode;
replace those fixed colors with theme-aware CSS variables or translucent colors
so they adapt to light/dark themes (for example use a variable like
--btn-hover-bg or an rgba() based translucent variant derived from the button
color such as rgba(var(--delete-color-rgb), 0.08)), update .delete-btn:hover,
.rename-btn:hover, and .move-btn:hover to use these variables/fallbacks, and
ensure the variables are defined in your root/theme CSS for both light and dark
modes.
- Around line 682-686: The footer paragraph in FilesPage.html currently
hard-codes color: `#95a5a6` on the <p> inside the div.card, which bypasses
theming; remove the inline style and instead apply a theme-aware class or CSS
variable (e.g., add a class like "footer-text" or "muted" to that <p> and ensure
your global/theme stylesheet maps that class to a color using a CSS variable
such as var(--color-muted) or the existing theme token) so the footer color
follows the app theme; update the stylesheet (not the HTML) to define the class
using the theme variable.

In `@src/network/html/HomePage.html`:
- Around line 130-132: The paragraph at the bottom currently hardcodes color via
inline style ("color: `#95a5a6`") which bypasses theming; remove the inline color
and give the element a semantic class (e.g., "footer-text" or "muted-text") and
update the stylesheet to style that class using a CSS variable (e.g.,
var(--muted-color) or a theme-specific variable) so the text responds to
dark/light themes; modify the <p> element in HomePage.html to use the new class
and ensure the theme variables are defined/used in your global CSS or theme
provider.

In `@src/network/html/SettingsPage.html`:
- Around line 95-104: The inputs/selects under the .setting-control selector use
a hard-coded border color (`#ddd`) that doesn't adapt to dark mode; update the CSS
for ".setting-control select, .setting-control input[type=\"number\"],
.setting-control input[type=\"text\"], .setting-control
input[type=\"password\"]" to use a theme-aware variable (e.g., var(--border) or
var(--input-border)) or a color that responds to color-scheme so the border
adapts in dark mode rather than remaining `#ddd`.
- Around line 260-264: The footer paragraph in SettingsPage.html currently
hard-codes color: `#95a5a6` inline on the <p> inside the .card, which bypasses
theming; remove the inline style and apply a theme-aware class or CSS variable
(e.g., class="footer-text" or use an existing .muted) and define its color using
the theme variable (e.g., color: var(--muted-color)) in the stylesheet so the
footer follows the app theme (apply the same change to HomePage.html where the
same pattern exists).

---

Duplicate comments:
In `@src/network/html/FilesPage.html`:
- Around line 191-193: Replace the previous compatibility-breaking selector with
the simplified rule and remove the duplicate review annotation: use the
.file-table tr:hover selector (retain the background-color:
var(--accent-color-10);) instead of tr:hover:has(td), and delete the duplicated
review comment markers like [duplicate_comment] or redundant approval notes so
the commit/PR contains a single, clear message.

---

Nitpick comments:
In `@src/network/html/FilesPage.html`:
- Around line 379-462: The warning banner CSS uses fixed light-mode yellows
which will look bad in dark mode; add a dark-mode stylesheet or a
prefers-color-scheme: dark media query that overrides the color tokens for
.failed-uploads-banner (background-color, border), .failed-uploads-title,
.dismiss-btn, .failed-file-name, .failed-file-error, .retry-btn and
.retry-all-btn to darker/muted variants, or refactor the existing colors into
CSS variables (e.g. --warning-bg, --warning-border, --warning-foreground) and
provide dark-mode values for those variables so the banner adapts automatically
in dark themes.

In `@src/network/html/HomePage.html`:
- Around line 8-17: Add a new CSS variable --accent-color-10 to the :root block
in HomePage.html so it matches FilesPage.html's hover background usage; define
--accent-color-10 with the semi-transparent value used elsewhere (e.g.,
rgba(110, 154, 130, 0.1)) so components referencing --accent-color-10 for
hover/bg get a consistent theme value.
- Around line 94-97: The hover rule for .nav-links a:hover is overriding the
active link styling (.nav-links a.active); update the CSS so hovered state
excludes active links or explicitly preserves active styles—for example, change
the hover selector to exclude .active (use :not(.active)) or add a more specific
.nav-links a.active:hover rule that reapplies the active background/color;
update the selectors around .nav-links a:hover and .nav-links a.active to ensure
the active link retains its intended styling when hovered.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (8)
src/network/html/FilesPage.html (5)

253-258: Hardcoded color won't adapt to dark mode.

.no-files uses #95a5a6 which may have insufficient contrast against the dark background (#333). Consider using var(--label-color) for consistency.

♻️ Suggested fix
     .no-files {
       text-align: center;
-      color: `#95a5a6`;
+      color: var(--label-color);
       padding: 40px;
       font-style: italic;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 253 - 258, Replace the
hardcoded color in the .no-files rule with the theme variable so the text adapts
to dark mode: update the .no-files selector (in FilesPage.html) to use
var(--label-color) instead of the literal `#95a5a6`, ensuring it inherits the
app's label color for correct contrast across themes.

319-319: Input border won't adapt to dark mode.

The .folder-input uses a hardcoded #ddd border which won't change in dark mode and may look inconsistent.

♻️ Suggested fix
     .folder-input {
       width: 100%;
       padding: 10px;
-      border: 1px solid `#ddd`;
+      border: 1px solid var(--border-color);
       border-radius: 4px;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` at line 319, The .folder-input rule
currently uses a hardcoded border color (`#ddd`) that doesn't adapt to dark mode;
change the border declaration to use a theme-aware value (e.g., a CSS variable
like var(--border-color) or conditional rules under `@media`
(prefers-color-scheme: dark) or a .dark parent selector) so the border switches
in dark mode; update the .folder-input border property accordingly and ensure
the corresponding --border-color or dark-rule is defined elsewhere in your
stylesheet.

682-686: Inline style bypasses theming.

The footer paragraph uses an inline color: #95a5a6`` which won't adapt to dark mode. Consider using a class with var(--label-color) or defining a `.footer-text` class.

♻️ Suggested fix
 <div class="card">
-  <p style="text-align: center; color: `#95a5a6`; margin: 0;">
+  <p style="text-align: center; color: var(--label-color); margin: 0;">
     CrossPoint E-Reader • Open Source
   </p>
 </div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 682 - 686, The footer <p>
inside the <div class="card"> uses an inline color which prevents theme
adaptation; remove the inline style and apply a CSS class (e.g., .footer-text)
that sets color: var(--label-color) and any other layout rules (text-align,
margin) so the text respects dark/light themes and central alignment; update the
HTML to use class="footer-text" on that <p> and add the corresponding
.footer-text rule in your stylesheet.

533-542: Loader border may look faint in dark mode.

The loader uses #AAA border which may appear muted against the dark background. This is a minor visual concern.

♻️ Suggested fix
     .loader {
       width: 48px;
       height: 48px;
-      border: 5px solid `#AAA`;
+      border: 5px solid var(--label-color);
       border-bottom-color: transparent;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 533 - 542, The loader's border
color (.loader) uses a fixed `#AAA` which is too muted in dark mode; update the
CSS to use a theme-aware value (e.g., replace the hardcoded border color with a
CSS variable like --loader-border or use prefers-color-scheme media query) and
provide a stronger light-on-dark color for dark mode (or use currentColor with
an appropriate container color), ensuring the .loader rule still sets
border-bottom-color: transparent and keeps the rotation animation name
unchanged.

295-300: Progress bar background won't adapt to dark mode.

The progress bar track uses #e0e0e0 which will appear too light against the dark card background.

♻️ Suggested fix
     `#progress-bar` {
       width: 100%;
       height: 20px;
-      background-color: `#e0e0e0`;
+      background-color: var(--border-color);
       border-radius: 10px;
       overflow: hidden;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/FilesPage.html` around lines 295 - 300, The progress track
rule that currently sets background-color: `#e0e0e0` should be updated to support
dark mode; replace the hardcoded hex with a theme-aware value (e.g., a CSS
variable like --progress-track) or add a prefers-color-scheme media query to
override the color in dark mode. Locate the CSS rule containing
background-color: `#e0e0e0` (the progress bar track block with width, height,
border-radius, overflow) and change it to use var(--progress-track) and ensure
the variable is defined for both light and dark themes, or add `@media`
(prefers-color-scheme: dark) to set a darker track color for the same selector.
src/network/html/SettingsPage.html (3)

100-100: Input border won't adapt to dark mode.

Same pattern as FilesPage.html - the #ddd border should use var(--border-color) for dark mode consistency.

♻️ Suggested fix
     .setting-control select,
     .setting-control input[type="number"],
     .setting-control input[type="text"],
     .setting-control input[type="password"] {
       padding: 6px 10px;
-      border: 1px solid `#ddd`;
+      border: 1px solid var(--border-color);
       border-radius: 4px;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` at line 100, Replace the hard-coded
light-mode border color in the CSS rule that currently reads "border: 1px solid
`#ddd`;" with the theme-aware variable (use var(--border-color)) so the
input/element on SettingsPage adapts to dark mode; locate the CSS rule
containing "border: 1px solid `#ddd`;" in SettingsPage.html and update it to use
var(--border-color) instead, ensuring consistency with FilesPage.html's
approach.

260-264: Inline style bypasses theming (same as FilesPage).

The footer uses an inline color: #95a5a6`` which won't adapt to dark mode.

♻️ Suggested fix
   <div class="card">
-    <p style="text-align: center; color: `#95a5a6`; margin: 0;">
+    <p style="text-align: center; color: var(--label-color); margin: 0;">
       CrossPoint E-Reader • Open Source
     </p>
   </div>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 260 - 264, The footer
paragraph in SettingsPage.html currently uses an inline style (the <p> with style="color: `#95a5a6`") which prevents theme-aware colors; remove the inline
style, add a semantic class (e.g., "footer-text" or "card-footer") to that <p>,
and define its color in the shared stylesheet (or component CSS) using the theme
variable (e.g., --muted-text / a CSS class used by FilesPage) so it adapts to
dark/light themes; update any existing .card or footer-related CSS rules to
target the new class instead of an inline style.

196-205: Loader border (same as FilesPage).

Consider using var(--label-color) for the loader border for dark mode consistency, as noted in FilesPage.html.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/network/html/SettingsPage.html` around lines 196 - 205, The .loader style
uses a hardcoded border color (`#AAA`); update the CSS for the .loader rule so the
border uses the theme variable for dark mode consistency by replacing the fixed
color with var(--label-color) (keep the existing border-bottom-color:
transparent, border-radius, animation, etc.) so the loader matches FilesPage's
dark-mode behavior; modify the .loader selector in SettingsPage.html
accordingly.
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7309f24 and ad2649b.

📒 Files selected for processing (3)
  • src/network/html/FilesPage.html
  • src/network/html/HomePage.html
  • src/network/html/SettingsPage.html
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/network/html/HomePage.html
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: cppcheck
  • GitHub Check: build
🔇 Additional comments (7)
src/network/html/FilesPage.html (3)

8-29: LGTM! CSS variable theming foundation is well-structured.

The root variable definitions provide a clean foundation for theming. The dark mode media query correctly overrides the necessary variables, and color-scheme: dark ensures native form controls adapt appropriately.


89-107: LGTM! Navigation styling with active/hover states.

The flex layout with gap is cleaner than inline-block with margins. The active and hover states correctly use theme variables, and the :not(.active):hover selector properly prevents hover effects on the active link.


191-193: LGTM! Table hover simplified.

The previous :has() selector concern has been addressed. The simpler tr:hover selector provides better browser compatibility while achieving the same visual effect.

src/network/html/SettingsPage.html (4)

8-30: LGTM! CSS variables with toggle-specific addition.

The variable definitions are consistent with FilesPage.html, with the appropriate addition of --toggle-bg for the toggle switch component. The dark mode override correctly adjusts the toggle background to #666 for better visibility.


56-74: LGTM! Navigation styling consistent with FilesPage.

The navigation structure and styling match FilesPage.html, ensuring a consistent user experience across pages.


116-151: LGTM! Toggle switch theming.

The toggle switch properly uses --toggle-bg for the inactive state and --accent-color for the checked state, providing good visual feedback in both light and dark modes.


230-236: LGTM! Mobile responsive fix.

Using width: unset instead of a fixed width allows inputs to properly fit within the flex container on narrow screens without overflow.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/network/html/FilesPage.html`:
- Around line 253-258: Replace the hardcoded color in the .no-files rule with
the theme variable so the text adapts to dark mode: update the .no-files
selector (in FilesPage.html) to use var(--label-color) instead of the literal
`#95a5a6`, ensuring it inherits the app's label color for correct contrast across
themes.
- Line 319: The .folder-input rule currently uses a hardcoded border color
(`#ddd`) that doesn't adapt to dark mode; change the border declaration to use a
theme-aware value (e.g., a CSS variable like var(--border-color) or conditional
rules under `@media` (prefers-color-scheme: dark) or a .dark parent selector) so
the border switches in dark mode; update the .folder-input border property
accordingly and ensure the corresponding --border-color or dark-rule is defined
elsewhere in your stylesheet.
- Around line 682-686: The footer <p> inside the <div class="card"> uses an
inline color which prevents theme adaptation; remove the inline style and apply
a CSS class (e.g., .footer-text) that sets color: var(--label-color) and any
other layout rules (text-align, margin) so the text respects dark/light themes
and central alignment; update the HTML to use class="footer-text" on that <p>
and add the corresponding .footer-text rule in your stylesheet.
- Around line 533-542: The loader's border color (.loader) uses a fixed `#AAA`
which is too muted in dark mode; update the CSS to use a theme-aware value
(e.g., replace the hardcoded border color with a CSS variable like
--loader-border or use prefers-color-scheme media query) and provide a stronger
light-on-dark color for dark mode (or use currentColor with an appropriate
container color), ensuring the .loader rule still sets border-bottom-color:
transparent and keeps the rotation animation name unchanged.
- Around line 295-300: The progress track rule that currently sets
background-color: `#e0e0e0` should be updated to support dark mode; replace the
hardcoded hex with a theme-aware value (e.g., a CSS variable like
--progress-track) or add a prefers-color-scheme media query to override the
color in dark mode. Locate the CSS rule containing background-color: `#e0e0e0`
(the progress bar track block with width, height, border-radius, overflow) and
change it to use var(--progress-track) and ensure the variable is defined for
both light and dark themes, or add `@media` (prefers-color-scheme: dark) to set a
darker track color for the same selector.

In `@src/network/html/SettingsPage.html`:
- Line 100: Replace the hard-coded light-mode border color in the CSS rule that
currently reads "border: 1px solid `#ddd`;" with the theme-aware variable (use
var(--border-color)) so the input/element on SettingsPage adapts to dark mode;
locate the CSS rule containing "border: 1px solid `#ddd`;" in SettingsPage.html
and update it to use var(--border-color) instead, ensuring consistency with
FilesPage.html's approach.
- Around line 260-264: The footer paragraph in SettingsPage.html currently uses
an inline style (the <p> with style="color: `#95a5a6`") which prevents theme-aware
colors; remove the inline style, add a semantic class (e.g., "footer-text" or
"card-footer") to that <p>, and define its color in the shared stylesheet (or
component CSS) using the theme variable (e.g., --muted-text / a CSS class used
by FilesPage) so it adapts to dark/light themes; update any existing .card or
footer-related CSS rules to target the new class instead of an inline style.
- Around line 196-205: The .loader style uses a hardcoded border color (`#AAA`);
update the CSS for the .loader rule so the border uses the theme variable for
dark mode consistency by replacing the fixed color with var(--label-color) (keep
the existing border-bottom-color: transparent, border-radius, animation, etc.)
so the loader matches FilesPage's dark-mode behavior; modify the .loader
selector in SettingsPage.html accordingly.

@daveallie daveallie merged commit 8853776 into crosspoint-reader:master Feb 22, 2026
7 checks passed
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Feb 22, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Feb 22, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Feb 22, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Feb 22, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Feb 22, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Feb 22, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Feb 22, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Feb 22, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
whale-n pushed a commit to whale-n/njwiv-xt that referenced this pull request Mar 17, 2026
## Summary

* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)

Implement automatic dark theme on server files.

Instead of a big change proposed in
crosspoint-reader#837, this PR
introduces a simple implementation of light/dark themes.

* **What changes are included?**

- Choose `#6e9a82` as accent color (taken from
![logo](https://avatars.githubusercontent.com/u/254441081?s=48&v=4))
- Implement a very basic media query for dark themes (`@media
(prefers-color-scheme: dark)`)
- Update style using CSS variables 

## Additional Context

* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
  specific areas to focus on).

We can think of it as a incremental enhancement, this is the first phase
of a series of PRs (hopefully).

Next steps/Phases:
1. Light/Dark themes (this PR)
2. Load external CSS file to avoid duplication
3. HTML enhancement (for example, use dialog element instead of divs)
4. Use SVG instead of emojis
5. Use Vite + Typescript to improve DX and have better minification

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**< YES | PARTIALLY | NO
>**_

---------

Co-authored-by: carlosbonadeo <carlosbonadeo@skyscanner.net>
znelson added a commit that referenced this pull request Apr 3, 2026
## Summary

It's been a little while since the last release, but the community has
been incredibly busy. With 155 changes from 48 contributors (30 of which
were new!), there was a lot to cover. Here are some of the highlights:

**🔤 Kerning, Ligatures, and Font Improvements**
Text rendering gets a significant upgrade with proper kerning and
ligature support, fixed-point fractional x-advance for more accurate
character placement, and font compression improvements that reduce flash
usage.

**📝 Footnotes**
Footnote anchor navigation lets you select a footnote reference and jump
to the footnote text, then jump back. Slim footnotes support is also
available for books that use inline footnotes.

**📖 EPUB Optimizer**
A new integrated EPUB optimizer can clean up and reprocess books for
better compatibility with the reader, directly from the device.

**🔋 Battery Charging Indicator**
You can now see when your device is actively charging, with a visual
indicator on the battery icon.

**💾 Crash Diagnostics**
When something goes wrong, the firmware now dumps a crash report to the
SD card — even without USB plugged in. This makes it much easier to
report and diagnose issues.

**🌐 New Languages**
The community continues to expand language support. New in this release:
Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian,
Romanian, Catalan, Vietnamese, and Kazakh — along with significant
improvements to existing translations.

**📂 File Management**
Multi-select file deletion, BMP image viewer in the file browser, hidden
directory browsing, and long-click file deletion from the file browser.

**⚡ Performance**
Under the hood, text layout switched from `std::list` to `std::vector`,
HTML entity lookups are now O(log(n)), font rendering is faster, image
decode is 5-20% faster with per-pixel overhead eliminated, and multiple
string allocation hot paths were eliminated. Pre-indexing of the next
chapter also reduces page-turn latency at chapter boundaries.

---

Along with all of the above, there are many other additions including
**WebDAV support**, **auto page turn**, **QR code for current page**,
**split status bar settings**, **screenshot capture**, **JSON-based
settings migration**, **light/dark theme groundwork**, and a long list
of stability fixes and translation improvements.

## What's Changed
### Features
* feat: Support for kerning and ligatures by @znelson in
#873
* feat: footnote anchor navigation by @Uri-Tauber in
#1245
* feat: slim footnotes support by @Uri-Tauber in
#1031
* feat: integrated epub optimizer by @zgredex and @pablohc in
#1224
* feat: battery charging indicator (mirroring PR #537) by @jpirnay in
#1427
* feat: dump crash report to sdcard by @ngxson in
#1145
* feat: Implement silent pre-indexing for the next chapter in
EpubReaderActivity by @LSTAR1900 in
#979
* feat: upgrade platform and support webdav by @dexif in
#1047
* feat: Auto Page Turn for Epub Reader by @GenesiaW in
#1219
* feat: enhance file deletion functionality with multi-select by
@Jessica765 in
#682
* feat: Long Click for File Deletion through File Browser by @Levrk in
#909
* feat: Take screenshots by @el in
#759
* feat: Current page as QR by @el in
#1099
* feat: Download links for web server by @el in
#1039
* feat: Added BmpViewer activity for viewing .bmp images in file browser
by @Levrk in
#887
* feat: User setting for image display by @jpirnay in
#1291
* feat: Show hidden directories in browser by @jpirnay in
#1288
* feat: Prefer ".sleep" over "sleep" for custom image directory by
@jpirnay in
#948
* feat: Allow a local configuration file for custom compiles by @jpirnay
in #879
* feat: Migrate binary settings to json by @jpirnay in
#920
* feat: split status bar setting by @whyte-j in
#733
* feat: wrapped text in GfxRender, implemented in themes so far by
@iandchasse in
#1141
* feat: Themed language screen by @CaptainFrito in
#1020
* feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in
#1107
* feat: Add maxAlloc to memory information by @jpirnay in
#1152
* feat: replace picojpeg with JPEGDEC for JPEG image decoding by
@martinbrook in
#1136
* feat: Add git branch to version information on settings screen by
@jpirnay in
#1225
* feat: sort languages in selection menu by @ariel-lindemann in
#1071
* feat: Latin Extended-B European glyphs by @znelson in
#1157
* feat: Latin Extended-B European glyphs by @znelson in
#1167
* feat: Vietnamese glyphs support by @danoooob in
#1147
* feat: add Turkish translation by @barbarhan in
#1192
* feat: add full Danish translation by @hajisan in
#1146
* feat: Add Finnish translations by @plahteenlahti in
#1133
* feat: Add Polish Language by @th0m4sek in
#1155
* feat: add Dutch translation by @basvdploeg in
#1204
* feat: add Belarusian translation by @dexif in
#1120
* feat: Add full Italian translations by @andreaturchet in
#1144
* feat: add Ukrainian translation by @mirus-ua in
#1065
* feat: Add Kazakh (kk) language support by @fsocietyipa in
#1377
* feat: added Romanian strings by @ariel-lindemann in
#987
* feat: add Catalan strings by @angeldenom in
#1049
* feat: Make directories stand out more in local file browser: "[dir]"
instead of "dir" by @jpirnay in
#1339
* feat: Add Polish strings for commits #1219,#1169,#1031 +tweaks by
@th0m4sek in
#1227
* feat: Polish translation tweaks by @th0m4sek in
#1193
### Fixes
* fix: Fix img layout issue / support CSS display:none for elements and
images by @jpirnay in
#1443
* fix: Overlapping battery percentage on image pages with anti-aliasing
by @znelson in
#1452
* fix: Fix prewarm perf when a page contains many styles by
@adriancaruana in
#1451
* fix: use sleep routine from the original firmware by @ngxson in
#1298
* fix: Prevent line breaks on common English contractions by @znelson in
#1405
* fix: Build with -fno-exceptions by @znelson in
#1412
* fix: Reduce flash usage by cleaning up I18n translations by @steka in
#1401
* fix: jpeg resource cleanup by @jpirnay in
#1320
* fix: back button in settings returns to tab bar first by @Cache8063 in
#1354
* fix: Init lastSleepImage (edge case) by @jpirnay in
#1360
* fix: Add special handling for apostrophe hyphenation by @jpirnay in
#1318
* fix: Fix inter-word spacing rounding error in text layout by @znelson
in #1311
* fix: load access fault crash by @Uri-Tauber in
#1370
* fix: Fix bootloop logging crash by @jpirnay in
#1357
* fix: dump crash log without usb plugged, bump release log to INFO by
@ngxson in
#1332
* fix: avoid zip filename overflow by @jpirnay in
#1321
* fix: Hanging indent (negative text-indent) and em-unit sizing by
@jpirnay in
#1229
* fix: Use fixed-point fractional x-advance and kerning for better text
layout by @znelson in
#1168
* fix: use HTTPClient::writeToStream for downloading files from OPDS by
@osteotek in
#1207
* fix: make file system operations thread-safe (HalFile) by @ngxson in
#1212
* fix: properly implement requestUpdateAndWait() by @ngxson in
#1218
* fix: prevent infinite render loop in Calibre Wireless after file
transfer by @pablohc in
#1070
* fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader
sync by @jpirnay in
#1151
* fix: Fix coverRendered flag by @jpirnay in
#1154
* fix: Handle non-ASCII characters in sanitizeFilename by @znelson in
#1132
* fix: Update activity was missing "Back" button label by @znelson in
#1128
* fix: force auto-hinting for Bookerly to fix inconsistent stem widths
by @adriancaruana in
#1098
* fix: image centering bleed by @martinbrook in
#1096
* fix: double free WebDAVHandler by @ngxson in
#1093
* fix: Consider extra quotation styles when hyphenating quoted words by
@cbix in
#1077
* fix: acquire power lock before sleeping by @ngxson in
#1125
* fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach
in #1138
* fix: sdfat warning about redefinition of macro by @ngxson in
#1135
* fix: Close leaked file descriptors in SleepActivity and web server by
@brbla in
#869
* fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in
#1075
* fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in
#1171
* fix: Hide unusable button hints when viewing empty directory by @Levrk
in #1253
* fix: broken translations in status bar settings by @ariel-lindemann in
#1188
* fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in
#1169
* fix: Crash (Load access fault) when indexing chapters containing
characters unsupported by bold/italic font variants by @Uri-Tauber in
#997
* fix: Increase PNGdec buffer size to support wide images by @osteotek
in #995
* fix: Use HalPowerManager for battery percentage by @vjapolitzer in
#1005
* fix: Fix dangling pointer by @Uri-Tauber in
#1010
* fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk
in #1017
* fix: use double FAST_REFRESH to prevent washout on large grey images
by @martinbrook in
#957
* fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in
#1002
* fix: Strip unused CSS rules by @daveallie in
#1014
* fix: continue reading card classic theme by @pablohc in
#990
* fix: Destroy CSS Cache file when invalid by @daveallie in
#1018
* fix: Shorten "Forget Wifi" button labels to fit on button by
@lukestein in
#1045
* fix: improve Spanish translations by @pablohc in
#1054
* fix: Fixed book title in home screen by @DestinySpeaker in
#1013
* fix: Fix hyphenation and rendering of decomposed characters by
@jpirnay in
#1037
* fix: Improve and add Spanish translations by @DaniPhii in
#1338
* fix: improve and add Spanish translations by @DaniPhii in
#1254
* fix: improve and add Swedish translations by @steka in
#1317
* fix: Extend missing / amend existing German translations by @jpirnay
in #1226
* fix: update french.yaml file to have a better French translation of
the CFW by @Spigaw in
#1130
* fix: added romanian translation to new strings by @ariel-lindemann in
#1105
* fix: add missing romanian strings by @ariel-lindemann in
#1187
* fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by
@mirus-ua in
#1149
* fix: Dutch translation prefix correction by @basvdploeg in
#1223
* fix: Small typo in i18n.md regarding C++ identifiers by
@victordomingos in
#1210
* fix: typo in USER_GUIDE.md by @arnaugamez in
#1036
* fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in
#1101

### Internal
* perf: font-compression improvements by @adriancaruana in
#1056
* perf: Improve font drawing performance by @jpirnay in
#978
* perf: Replace std::list with std::vector in text layout by @znelson in
#1038
* perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in
#1194
* perf: UITheme::getMetrics const and const-ref usage by @znelson in
#1094
* perf: Avoid creating strings for file extension checks by @znelson in
#1303
* perf: Eliminate per-pixel overheads in image rendering by @martinbrook
in #1293
* perf: Update github actions for optimal performance with pioarduino by
@Jason2866 in
#1080
* style: Phase 1 - Simple light dark themes by @cdmoro in
#1006
* refactor: implement ActivityManager by @ngxson in
#1016
* refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in
#1119
* refactor: Simplify new setting introduction by @jpirnay in
#1086
* refactor: Use std binary search algorithms for font lookups by
@znelson in
#1202
* refactor: rename MyLibrary to FileBrowser by @osteotek in
#1260
* refactor: Avoid rebuilding cache path strings by @znelson in
#1300
* refactor: reader utils by @Uri-Tauber in
#1329
* chore: Remove miniz and modularise inflation logic by @daveallie in
#1073
* chore: Resolve several build warnings by @daveallie in
#1076
* chore: Removed generated language headers by @znelson in
#1156
* chore: Added generated lang headers to .gitignore by @znelson in
#1158
* chore: remove redundant xTaskCreate by @ngxson in
#1264
* chore: Removed unused PlatformIO include directory placeholder by
@znelson in
#1417
* chore: micro-optimisation: early exit on fillUncompressedSizes by
@jpirnay in
#1322
* chore: change label while on settings tab actions by @jpirnay in
#1325
* chore: add firmware size history script by @znelson in
#1235
* chore: Add powershell script for clang-formatting by @jpirnay in
#1472
* chore: Removed unused ConfirmationActivity member by @znelson in
#1234
* chore: Update russian.yaml by @madebyKir in
#1198
* chore: new Ukrainian translation lines by @mirus-ua in
#1199
* chore: new Ukrainian localization strings by @mirus-ua in
#1270
* chore: Polish localization for STR_DELETE by @JonaszPotoniec in
#1323
* chore: Image settings Polish localization by @znelson in
#1299
* chore: add missing Catalan strings by @angeldenom in
#1302
* chore: add missing translations for Romanian by @ariel-lindemann in
#1265
* chore: Add Portuguese (Portugal) translator to the list by
@victordomingos in
#1211
* chore: Reduce flash usage by cleaning up I18n translations by @steka
in #1401
* docs: Add lightweight contributor onboarding documentation by @bilalix
in #894
* docs: ActivityManager migration guide by @znelson in
#1222
* docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in
#1108
* docs: add quick KOReader sync setup guide by @wjhrdy in
#1181
* docs: image support marked as completed by @ariel-lindemann in
#1008
* feat: aiagent context definition by @jpirnay in
#922
* chore: Update SKILL.md to reflect generated i18n files are gitignored
by @znelson in
#1423
* fix: ActivityManager tweaks by @znelson in
#1220
* fix: Correct relative file paths in SKILL.md documentation by @pablohc
in #1304
* fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in
#1295

## New Contributors
* @DestinySpeaker made their first contribution in
#1002
* @arnaugamez made their first contribution in
#1036
* @angeldenom made their first contribution in
#1049
* @cdmoro made their first contribution in
#1006
* @bilalix made their first contribution in
#894
* @Jessica765 made their first contribution in
#682
* @brbla made their first contribution in
#869
* @dexif made their first contribution in
#1047
* @mirus-ua made their first contribution in
#1065
* @cbix made their first contribution in
#1077
* @divinitycove made their first contribution in
#1108
* @pepastach made their first contribution in
#1138
* @Jason2866 made their first contribution in
#1080
* @andreaturchet made their first contribution in
#1144
* @Spigaw made their first contribution in
#1130
* @iandchasse made their first contribution in
#1141
* @th0m4sek made their first contribution in
#1155
* @plahteenlahti made their first contribution in
#1133
* @hajisan made their first contribution in
#1146
* @madebyKir made their first contribution in
#1198
* @victordomingos made their first contribution in
#1210
* @basvdploeg made their first contribution in
#1204
* @wjhrdy made their first contribution in
#1181
* @DaniPhii made their first contribution in
#1254
* @steka made their first contribution in
#1317
* @barbarhan made their first contribution in
#1192
* @JonaszPotoniec made their first contribution in
#1323
* @Cache8063 made their first contribution in
#1354
* @fsocietyipa made their first contribution in
#1377
* @LSTAR1900 made their first contribution in
#979
* @zgredex made their first contribution in
#1224

**Full Changelog**:
1.1.1...release/1.2.0

---------

Co-authored-by: jpirnay <jens@pirnay.com>
Co-authored-by: Dani Poveda <daniphii@outlook.com>
Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com>
Co-authored-by: Barış Albayrak <barisa@pop-os.lan>
Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com>
Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com>
Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu>
Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru>
Co-authored-by: Mirus <mirusim@gmail.com>
Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com>
Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com>
Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com>
Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl>
Co-authored-by: martin brook <martin.brook100@googlemail.com>
Unintendedsideeffects pushed a commit to Unintendedsideeffects/ForkDrift-crosspointReader that referenced this pull request Apr 4, 2026
It's been a little while since the last release, but the community has
been incredibly busy. With 155 changes from 48 contributors (30 of which
were new!), there was a lot to cover. Here are some of the highlights:

**🔤 Kerning, Ligatures, and Font Improvements**
Text rendering gets a significant upgrade with proper kerning and
ligature support, fixed-point fractional x-advance for more accurate
character placement, and font compression improvements that reduce flash
usage.

**📝 Footnotes**
Footnote anchor navigation lets you select a footnote reference and jump
to the footnote text, then jump back. Slim footnotes support is also
available for books that use inline footnotes.

**📖 EPUB Optimizer**
A new integrated EPUB optimizer can clean up and reprocess books for
better compatibility with the reader, directly from the device.

**🔋 Battery Charging Indicator**
You can now see when your device is actively charging, with a visual
indicator on the battery icon.

**💾 Crash Diagnostics**
When something goes wrong, the firmware now dumps a crash report to the
SD card — even without USB plugged in. This makes it much easier to
report and diagnose issues.

**🌐 New Languages**
The community continues to expand language support. New in this release:
Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian,
Romanian, Catalan, Vietnamese, and Kazakh — along with significant
improvements to existing translations.

**📂 File Management**
Multi-select file deletion, BMP image viewer in the file browser, hidden
directory browsing, and long-click file deletion from the file browser.

**⚡ Performance**
Under the hood, text layout switched from `std::list` to `std::vector`,
HTML entity lookups are now O(log(n)), font rendering is faster, image
decode is 5-20% faster with per-pixel overhead eliminated, and multiple
string allocation hot paths were eliminated. Pre-indexing of the next
chapter also reduces page-turn latency at chapter boundaries.

---

Along with all of the above, there are many other additions including
**WebDAV support**, **auto page turn**, **QR code for current page**,
**split status bar settings**, **screenshot capture**, **JSON-based
settings migration**, **light/dark theme groundwork**, and a long list
of stability fixes and translation improvements.

* feat: Support for kerning and ligatures by @znelson in
crosspoint-reader#873
* feat: footnote anchor navigation by @Uri-Tauber in
crosspoint-reader#1245
* feat: slim footnotes support by @Uri-Tauber in
crosspoint-reader#1031
* feat: integrated epub optimizer by @zgredex and @pablohc in
crosspoint-reader#1224
* feat: battery charging indicator (mirroring PR crosspoint-reader#537) by @jpirnay in
crosspoint-reader#1427
* feat: dump crash report to sdcard by @ngxson in
crosspoint-reader#1145
* feat: Implement silent pre-indexing for the next chapter in
EpubReaderActivity by @LSTAR1900 in
crosspoint-reader#979
* feat: upgrade platform and support webdav by @dexif in
crosspoint-reader#1047
* feat: Auto Page Turn for Epub Reader by @GenesiaW in
crosspoint-reader#1219
* feat: enhance file deletion functionality with multi-select by
@Jessica765 in
crosspoint-reader#682
* feat: Long Click for File Deletion through File Browser by @Levrk in
crosspoint-reader#909
* feat: Take screenshots by @el in
crosspoint-reader#759
* feat: Current page as QR by @el in
crosspoint-reader#1099
* feat: Download links for web server by @el in
crosspoint-reader#1039
* feat: Added BmpViewer activity for viewing .bmp images in file browser
by @Levrk in
crosspoint-reader#887
* feat: User setting for image display by @jpirnay in
crosspoint-reader#1291
* feat: Show hidden directories in browser by @jpirnay in
crosspoint-reader#1288
* feat: Prefer ".sleep" over "sleep" for custom image directory by
@jpirnay in
crosspoint-reader#948
* feat: Allow a local configuration file for custom compiles by @jpirnay
in crosspoint-reader#879
* feat: Migrate binary settings to json by @jpirnay in
crosspoint-reader#920
* feat: split status bar setting by @whyte-j in
crosspoint-reader#733
* feat: wrapped text in GfxRender, implemented in themes so far by
@iandchasse in
crosspoint-reader#1141
* feat: Themed language screen by @CaptainFrito in
crosspoint-reader#1020
* feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in
crosspoint-reader#1107
* feat: Add maxAlloc to memory information by @jpirnay in
crosspoint-reader#1152
* feat: replace picojpeg with JPEGDEC for JPEG image decoding by
@martinbrook in
crosspoint-reader#1136
* feat: Add git branch to version information on settings screen by
@jpirnay in
crosspoint-reader#1225
* feat: sort languages in selection menu by @ariel-lindemann in
crosspoint-reader#1071
* feat: Latin Extended-B European glyphs by @znelson in
crosspoint-reader#1157
* feat: Latin Extended-B European glyphs by @znelson in
crosspoint-reader#1167
* feat: Vietnamese glyphs support by @danoooob in
crosspoint-reader#1147
* feat: add Turkish translation by @barbarhan in
crosspoint-reader#1192
* feat: add full Danish translation by @hajisan in
crosspoint-reader#1146
* feat: Add Finnish translations by @plahteenlahti in
crosspoint-reader#1133
* feat: Add Polish Language by @th0m4sek in
crosspoint-reader#1155
* feat: add Dutch translation by @basvdploeg in
crosspoint-reader#1204
* feat: add Belarusian translation by @dexif in
crosspoint-reader#1120
* feat: Add full Italian translations by @andreaturchet in
crosspoint-reader#1144
* feat: add Ukrainian translation by @mirus-ua in
crosspoint-reader#1065
* feat: Add Kazakh (kk) language support by @fsocietyipa in
crosspoint-reader#1377
* feat: added Romanian strings by @ariel-lindemann in
crosspoint-reader#987
* feat: add Catalan strings by @angeldenom in
crosspoint-reader#1049
* feat: Make directories stand out more in local file browser: "[dir]"
instead of "dir" by @jpirnay in
crosspoint-reader#1339
* feat: Add Polish strings for commits crosspoint-reader#1219,crosspoint-reader#1169,crosspoint-reader#1031 +tweaks by
@th0m4sek in
crosspoint-reader#1227
* feat: Polish translation tweaks by @th0m4sek in
crosspoint-reader#1193
* fix: Fix img layout issue / support CSS display:none for elements and
images by @jpirnay in
crosspoint-reader#1443
* fix: Overlapping battery percentage on image pages with anti-aliasing
by @znelson in
crosspoint-reader#1452
* fix: Fix prewarm perf when a page contains many styles by
@adriancaruana in
crosspoint-reader#1451
* fix: use sleep routine from the original firmware by @ngxson in
crosspoint-reader#1298
* fix: Prevent line breaks on common English contractions by @znelson in
crosspoint-reader#1405
* fix: Build with -fno-exceptions by @znelson in
crosspoint-reader#1412
* fix: Reduce flash usage by cleaning up I18n translations by @steka in
crosspoint-reader#1401
* fix: jpeg resource cleanup by @jpirnay in
crosspoint-reader#1320
* fix: back button in settings returns to tab bar first by @Cache8063 in
crosspoint-reader#1354
* fix: Init lastSleepImage (edge case) by @jpirnay in
crosspoint-reader#1360
* fix: Add special handling for apostrophe hyphenation by @jpirnay in
crosspoint-reader#1318
* fix: Fix inter-word spacing rounding error in text layout by @znelson
in crosspoint-reader#1311
* fix: load access fault crash by @Uri-Tauber in
crosspoint-reader#1370
* fix: Fix bootloop logging crash by @jpirnay in
crosspoint-reader#1357
* fix: dump crash log without usb plugged, bump release log to INFO by
@ngxson in
crosspoint-reader#1332
* fix: avoid zip filename overflow by @jpirnay in
crosspoint-reader#1321
* fix: Hanging indent (negative text-indent) and em-unit sizing by
@jpirnay in
crosspoint-reader#1229
* fix: Use fixed-point fractional x-advance and kerning for better text
layout by @znelson in
crosspoint-reader#1168
* fix: use HTTPClient::writeToStream for downloading files from OPDS by
@osteotek in
crosspoint-reader#1207
* fix: make file system operations thread-safe (HalFile) by @ngxson in
crosspoint-reader#1212
* fix: properly implement requestUpdateAndWait() by @ngxson in
crosspoint-reader#1218
* fix: prevent infinite render loop in Calibre Wireless after file
transfer by @pablohc in
crosspoint-reader#1070
* fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader
sync by @jpirnay in
crosspoint-reader#1151
* fix: Fix coverRendered flag by @jpirnay in
crosspoint-reader#1154
* fix: Handle non-ASCII characters in sanitizeFilename by @znelson in
crosspoint-reader#1132
* fix: Update activity was missing "Back" button label by @znelson in
crosspoint-reader#1128
* fix: force auto-hinting for Bookerly to fix inconsistent stem widths
by @adriancaruana in
crosspoint-reader#1098
* fix: image centering bleed by @martinbrook in
crosspoint-reader#1096
* fix: double free WebDAVHandler by @ngxson in
crosspoint-reader#1093
* fix: Consider extra quotation styles when hyphenating quoted words by
@cbix in
crosspoint-reader#1077
* fix: acquire power lock before sleeping by @ngxson in
crosspoint-reader#1125
* fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach
in crosspoint-reader#1138
* fix: sdfat warning about redefinition of macro by @ngxson in
crosspoint-reader#1135
* fix: Close leaked file descriptors in SleepActivity and web server by
@brbla in
crosspoint-reader#869
* fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in
crosspoint-reader#1075
* fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in
crosspoint-reader#1171
* fix: Hide unusable button hints when viewing empty directory by @Levrk
in crosspoint-reader#1253
* fix: broken translations in status bar settings by @ariel-lindemann in
crosspoint-reader#1188
* fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in
crosspoint-reader#1169
* fix: Crash (Load access fault) when indexing chapters containing
characters unsupported by bold/italic font variants by @Uri-Tauber in
crosspoint-reader#997
* fix: Increase PNGdec buffer size to support wide images by @osteotek
in crosspoint-reader#995
* fix: Use HalPowerManager for battery percentage by @vjapolitzer in
crosspoint-reader#1005
* fix: Fix dangling pointer by @Uri-Tauber in
crosspoint-reader#1010
* fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk
in crosspoint-reader#1017
* fix: use double FAST_REFRESH to prevent washout on large grey images
by @martinbrook in
crosspoint-reader#957
* fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in
crosspoint-reader#1002
* fix: Strip unused CSS rules by @daveallie in
crosspoint-reader#1014
* fix: continue reading card classic theme by @pablohc in
crosspoint-reader#990
* fix: Destroy CSS Cache file when invalid by @daveallie in
crosspoint-reader#1018
* fix: Shorten "Forget Wifi" button labels to fit on button by
@lukestein in
crosspoint-reader#1045
* fix: improve Spanish translations by @pablohc in
crosspoint-reader#1054
* fix: Fixed book title in home screen by @DestinySpeaker in
crosspoint-reader#1013
* fix: Fix hyphenation and rendering of decomposed characters by
@jpirnay in
crosspoint-reader#1037
* fix: Improve and add Spanish translations by @DaniPhii in
crosspoint-reader#1338
* fix: improve and add Spanish translations by @DaniPhii in
crosspoint-reader#1254
* fix: improve and add Swedish translations by @steka in
crosspoint-reader#1317
* fix: Extend missing / amend existing German translations by @jpirnay
in crosspoint-reader#1226
* fix: update french.yaml file to have a better French translation of
the CFW by @Spigaw in
crosspoint-reader#1130
* fix: added romanian translation to new strings by @ariel-lindemann in
crosspoint-reader#1105
* fix: add missing romanian strings by @ariel-lindemann in
crosspoint-reader#1187
* fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by
@mirus-ua in
crosspoint-reader#1149
* fix: Dutch translation prefix correction by @basvdploeg in
crosspoint-reader#1223
* fix: Small typo in i18n.md regarding C++ identifiers by
@victordomingos in
crosspoint-reader#1210
* fix: typo in USER_GUIDE.md by @arnaugamez in
crosspoint-reader#1036
* fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in
crosspoint-reader#1101

* perf: font-compression improvements by @adriancaruana in
crosspoint-reader#1056
* perf: Improve font drawing performance by @jpirnay in
crosspoint-reader#978
* perf: Replace std::list with std::vector in text layout by @znelson in
crosspoint-reader#1038
* perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in
crosspoint-reader#1194
* perf: UITheme::getMetrics const and const-ref usage by @znelson in
crosspoint-reader#1094
* perf: Avoid creating strings for file extension checks by @znelson in
crosspoint-reader#1303
* perf: Eliminate per-pixel overheads in image rendering by @martinbrook
in crosspoint-reader#1293
* perf: Update github actions for optimal performance with pioarduino by
@Jason2866 in
crosspoint-reader#1080
* style: Phase 1 - Simple light dark themes by @cdmoro in
crosspoint-reader#1006
* refactor: implement ActivityManager by @ngxson in
crosspoint-reader#1016
* refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in
crosspoint-reader#1119
* refactor: Simplify new setting introduction by @jpirnay in
crosspoint-reader#1086
* refactor: Use std binary search algorithms for font lookups by
@znelson in
crosspoint-reader#1202
* refactor: rename MyLibrary to FileBrowser by @osteotek in
crosspoint-reader#1260
* refactor: Avoid rebuilding cache path strings by @znelson in
crosspoint-reader#1300
* refactor: reader utils by @Uri-Tauber in
crosspoint-reader#1329
* chore: Remove miniz and modularise inflation logic by @daveallie in
crosspoint-reader#1073
* chore: Resolve several build warnings by @daveallie in
crosspoint-reader#1076
* chore: Removed generated language headers by @znelson in
crosspoint-reader#1156
* chore: Added generated lang headers to .gitignore by @znelson in
crosspoint-reader#1158
* chore: remove redundant xTaskCreate by @ngxson in
crosspoint-reader#1264
* chore: Removed unused PlatformIO include directory placeholder by
@znelson in
crosspoint-reader#1417
* chore: micro-optimisation: early exit on fillUncompressedSizes by
@jpirnay in
crosspoint-reader#1322
* chore: change label while on settings tab actions by @jpirnay in
crosspoint-reader#1325
* chore: add firmware size history script by @znelson in
crosspoint-reader#1235
* chore: Add powershell script for clang-formatting by @jpirnay in
crosspoint-reader#1472
* chore: Removed unused ConfirmationActivity member by @znelson in
crosspoint-reader#1234
* chore: Update russian.yaml by @madebyKir in
crosspoint-reader#1198
* chore: new Ukrainian translation lines by @mirus-ua in
crosspoint-reader#1199
* chore: new Ukrainian localization strings by @mirus-ua in
crosspoint-reader#1270
* chore: Polish localization for STR_DELETE by @JonaszPotoniec in
crosspoint-reader#1323
* chore: Image settings Polish localization by @znelson in
crosspoint-reader#1299
* chore: add missing Catalan strings by @angeldenom in
crosspoint-reader#1302
* chore: add missing translations for Romanian by @ariel-lindemann in
crosspoint-reader#1265
* chore: Add Portuguese (Portugal) translator to the list by
@victordomingos in
crosspoint-reader#1211
* chore: Reduce flash usage by cleaning up I18n translations by @steka
in crosspoint-reader#1401
* docs: Add lightweight contributor onboarding documentation by @bilalix
in crosspoint-reader#894
* docs: ActivityManager migration guide by @znelson in
crosspoint-reader#1222
* docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in
crosspoint-reader#1108
* docs: add quick KOReader sync setup guide by @wjhrdy in
crosspoint-reader#1181
* docs: image support marked as completed by @ariel-lindemann in
crosspoint-reader#1008
* feat: aiagent context definition by @jpirnay in
crosspoint-reader#922
* chore: Update SKILL.md to reflect generated i18n files are gitignored
by @znelson in
crosspoint-reader#1423
* fix: ActivityManager tweaks by @znelson in
crosspoint-reader#1220
* fix: Correct relative file paths in SKILL.md documentation by @pablohc
in crosspoint-reader#1304
* fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in
crosspoint-reader#1295

* @DestinySpeaker made their first contribution in
crosspoint-reader#1002
* @arnaugamez made their first contribution in
crosspoint-reader#1036
* @angeldenom made their first contribution in
crosspoint-reader#1049
* @cdmoro made their first contribution in
crosspoint-reader#1006
* @bilalix made their first contribution in
crosspoint-reader#894
* @Jessica765 made their first contribution in
crosspoint-reader#682
* @brbla made their first contribution in
crosspoint-reader#869
* @dexif made their first contribution in
crosspoint-reader#1047
* @mirus-ua made their first contribution in
crosspoint-reader#1065
* @cbix made their first contribution in
crosspoint-reader#1077
* @divinitycove made their first contribution in
crosspoint-reader#1108
* @pepastach made their first contribution in
crosspoint-reader#1138
* @Jason2866 made their first contribution in
crosspoint-reader#1080
* @andreaturchet made their first contribution in
crosspoint-reader#1144
* @Spigaw made their first contribution in
crosspoint-reader#1130
* @iandchasse made their first contribution in
crosspoint-reader#1141
* @th0m4sek made their first contribution in
crosspoint-reader#1155
* @plahteenlahti made their first contribution in
crosspoint-reader#1133
* @hajisan made their first contribution in
crosspoint-reader#1146
* @madebyKir made their first contribution in
crosspoint-reader#1198
* @victordomingos made their first contribution in
crosspoint-reader#1210
* @basvdploeg made their first contribution in
crosspoint-reader#1204
* @wjhrdy made their first contribution in
crosspoint-reader#1181
* @DaniPhii made their first contribution in
crosspoint-reader#1254
* @steka made their first contribution in
crosspoint-reader#1317
* @barbarhan made their first contribution in
crosspoint-reader#1192
* @JonaszPotoniec made their first contribution in
crosspoint-reader#1323
* @Cache8063 made their first contribution in
crosspoint-reader#1354
* @fsocietyipa made their first contribution in
crosspoint-reader#1377
* @LSTAR1900 made their first contribution in
crosspoint-reader#979
* @zgredex made their first contribution in
crosspoint-reader#1224

**Full Changelog**:
crosspoint-reader/crosspoint-reader@1.1.1...release/1.2.0

---------

Co-authored-by: jpirnay <jens@pirnay.com>
Co-authored-by: Dani Poveda <daniphii@outlook.com>
Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com>
Co-authored-by: Barış Albayrak <barisa@pop-os.lan>
Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com>
Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com>
Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu>
Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru>
Co-authored-by: Mirus <mirusim@gmail.com>
Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com>
Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com>
Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com>
Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl>
Co-authored-by: martin brook <martin.brook100@googlemail.com>
lukestein pushed a commit to lukestein/crosspoint-reader that referenced this pull request Apr 7, 2026
## Summary

It's been a little while since the last release, but the community has
been incredibly busy. With 155 changes from 48 contributors (30 of which
were new!), there was a lot to cover. Here are some of the highlights:

**🔤 Kerning, Ligatures, and Font Improvements**
Text rendering gets a significant upgrade with proper kerning and
ligature support, fixed-point fractional x-advance for more accurate
character placement, and font compression improvements that reduce flash
usage.

**📝 Footnotes**
Footnote anchor navigation lets you select a footnote reference and jump
to the footnote text, then jump back. Slim footnotes support is also
available for books that use inline footnotes.

**📖 EPUB Optimizer**
A new integrated EPUB optimizer can clean up and reprocess books for
better compatibility with the reader, directly from the device.

**🔋 Battery Charging Indicator**
You can now see when your device is actively charging, with a visual
indicator on the battery icon.

**💾 Crash Diagnostics**
When something goes wrong, the firmware now dumps a crash report to the
SD card — even without USB plugged in. This makes it much easier to
report and diagnose issues.

**🌐 New Languages**
The community continues to expand language support. New in this release:
Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian,
Romanian, Catalan, Vietnamese, and Kazakh — along with significant
improvements to existing translations.

**📂 File Management**
Multi-select file deletion, BMP image viewer in the file browser, hidden
directory browsing, and long-click file deletion from the file browser.

**⚡ Performance**
Under the hood, text layout switched from `std::list` to `std::vector`,
HTML entity lookups are now O(log(n)), font rendering is faster, image
decode is 5-20% faster with per-pixel overhead eliminated, and multiple
string allocation hot paths were eliminated. Pre-indexing of the next
chapter also reduces page-turn latency at chapter boundaries.

---

Along with all of the above, there are many other additions including
**WebDAV support**, **auto page turn**, **QR code for current page**,
**split status bar settings**, **screenshot capture**, **JSON-based
settings migration**, **light/dark theme groundwork**, and a long list
of stability fixes and translation improvements.

## What's Changed
### Features
* feat: Support for kerning and ligatures by @znelson in
crosspoint-reader#873
* feat: footnote anchor navigation by @Uri-Tauber in
crosspoint-reader#1245
* feat: slim footnotes support by @Uri-Tauber in
crosspoint-reader#1031
* feat: integrated epub optimizer by @zgredex and @pablohc in
crosspoint-reader#1224
* feat: battery charging indicator (mirroring PR crosspoint-reader#537) by @jpirnay in
crosspoint-reader#1427
* feat: dump crash report to sdcard by @ngxson in
crosspoint-reader#1145
* feat: Implement silent pre-indexing for the next chapter in
EpubReaderActivity by @LSTAR1900 in
crosspoint-reader#979
* feat: upgrade platform and support webdav by @dexif in
crosspoint-reader#1047
* feat: Auto Page Turn for Epub Reader by @GenesiaW in
crosspoint-reader#1219
* feat: enhance file deletion functionality with multi-select by
@Jessica765 in
crosspoint-reader#682
* feat: Long Click for File Deletion through File Browser by @Levrk in
crosspoint-reader#909
* feat: Take screenshots by @el in
crosspoint-reader#759
* feat: Current page as QR by @el in
crosspoint-reader#1099
* feat: Download links for web server by @el in
crosspoint-reader#1039
* feat: Added BmpViewer activity for viewing .bmp images in file browser
by @Levrk in
crosspoint-reader#887
* feat: User setting for image display by @jpirnay in
crosspoint-reader#1291
* feat: Show hidden directories in browser by @jpirnay in
crosspoint-reader#1288
* feat: Prefer ".sleep" over "sleep" for custom image directory by
@jpirnay in
crosspoint-reader#948
* feat: Allow a local configuration file for custom compiles by @jpirnay
in crosspoint-reader#879
* feat: Migrate binary settings to json by @jpirnay in
crosspoint-reader#920
* feat: split status bar setting by @whyte-j in
crosspoint-reader#733
* feat: wrapped text in GfxRender, implemented in themes so far by
@iandchasse in
crosspoint-reader#1141
* feat: Themed language screen by @CaptainFrito in
crosspoint-reader#1020
* feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in
crosspoint-reader#1107
* feat: Add maxAlloc to memory information by @jpirnay in
crosspoint-reader#1152
* feat: replace picojpeg with JPEGDEC for JPEG image decoding by
@martinbrook in
crosspoint-reader#1136
* feat: Add git branch to version information on settings screen by
@jpirnay in
crosspoint-reader#1225
* feat: sort languages in selection menu by @ariel-lindemann in
crosspoint-reader#1071
* feat: Latin Extended-B European glyphs by @znelson in
crosspoint-reader#1157
* feat: Latin Extended-B European glyphs by @znelson in
crosspoint-reader#1167
* feat: Vietnamese glyphs support by @danoooob in
crosspoint-reader#1147
* feat: add Turkish translation by @barbarhan in
crosspoint-reader#1192
* feat: add full Danish translation by @hajisan in
crosspoint-reader#1146
* feat: Add Finnish translations by @plahteenlahti in
crosspoint-reader#1133
* feat: Add Polish Language by @th0m4sek in
crosspoint-reader#1155
* feat: add Dutch translation by @basvdploeg in
crosspoint-reader#1204
* feat: add Belarusian translation by @dexif in
crosspoint-reader#1120
* feat: Add full Italian translations by @andreaturchet in
crosspoint-reader#1144
* feat: add Ukrainian translation by @mirus-ua in
crosspoint-reader#1065
* feat: Add Kazakh (kk) language support by @fsocietyipa in
crosspoint-reader#1377
* feat: added Romanian strings by @ariel-lindemann in
crosspoint-reader#987
* feat: add Catalan strings by @angeldenom in
crosspoint-reader#1049
* feat: Make directories stand out more in local file browser: "[dir]"
instead of "dir" by @jpirnay in
crosspoint-reader#1339
* feat: Add Polish strings for commits crosspoint-reader#1219,crosspoint-reader#1169,crosspoint-reader#1031 +tweaks by
@th0m4sek in
crosspoint-reader#1227
* feat: Polish translation tweaks by @th0m4sek in
crosspoint-reader#1193
### Fixes
* fix: Fix img layout issue / support CSS display:none for elements and
images by @jpirnay in
crosspoint-reader#1443
* fix: Overlapping battery percentage on image pages with anti-aliasing
by @znelson in
crosspoint-reader#1452
* fix: Fix prewarm perf when a page contains many styles by
@adriancaruana in
crosspoint-reader#1451
* fix: use sleep routine from the original firmware by @ngxson in
crosspoint-reader#1298
* fix: Prevent line breaks on common English contractions by @znelson in
crosspoint-reader#1405
* fix: Build with -fno-exceptions by @znelson in
crosspoint-reader#1412
* fix: Reduce flash usage by cleaning up I18n translations by @steka in
crosspoint-reader#1401
* fix: jpeg resource cleanup by @jpirnay in
crosspoint-reader#1320
* fix: back button in settings returns to tab bar first by @Cache8063 in
crosspoint-reader#1354
* fix: Init lastSleepImage (edge case) by @jpirnay in
crosspoint-reader#1360
* fix: Add special handling for apostrophe hyphenation by @jpirnay in
crosspoint-reader#1318
* fix: Fix inter-word spacing rounding error in text layout by @znelson
in crosspoint-reader#1311
* fix: load access fault crash by @Uri-Tauber in
crosspoint-reader#1370
* fix: Fix bootloop logging crash by @jpirnay in
crosspoint-reader#1357
* fix: dump crash log without usb plugged, bump release log to INFO by
@ngxson in
crosspoint-reader#1332
* fix: avoid zip filename overflow by @jpirnay in
crosspoint-reader#1321
* fix: Hanging indent (negative text-indent) and em-unit sizing by
@jpirnay in
crosspoint-reader#1229
* fix: Use fixed-point fractional x-advance and kerning for better text
layout by @znelson in
crosspoint-reader#1168
* fix: use HTTPClient::writeToStream for downloading files from OPDS by
@osteotek in
crosspoint-reader#1207
* fix: make file system operations thread-safe (HalFile) by @ngxson in
crosspoint-reader#1212
* fix: properly implement requestUpdateAndWait() by @ngxson in
crosspoint-reader#1218
* fix: prevent infinite render loop in Calibre Wireless after file
transfer by @pablohc in
crosspoint-reader#1070
* fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader
sync by @jpirnay in
crosspoint-reader#1151
* fix: Fix coverRendered flag by @jpirnay in
crosspoint-reader#1154
* fix: Handle non-ASCII characters in sanitizeFilename by @znelson in
crosspoint-reader#1132
* fix: Update activity was missing "Back" button label by @znelson in
crosspoint-reader#1128
* fix: force auto-hinting for Bookerly to fix inconsistent stem widths
by @adriancaruana in
crosspoint-reader#1098
* fix: image centering bleed by @martinbrook in
crosspoint-reader#1096
* fix: double free WebDAVHandler by @ngxson in
crosspoint-reader#1093
* fix: Consider extra quotation styles when hyphenating quoted words by
@cbix in
crosspoint-reader#1077
* fix: acquire power lock before sleeping by @ngxson in
crosspoint-reader#1125
* fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach
in crosspoint-reader#1138
* fix: sdfat warning about redefinition of macro by @ngxson in
crosspoint-reader#1135
* fix: Close leaked file descriptors in SleepActivity and web server by
@brbla in
crosspoint-reader#869
* fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in
crosspoint-reader#1075
* fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in
crosspoint-reader#1171
* fix: Hide unusable button hints when viewing empty directory by @Levrk
in crosspoint-reader#1253
* fix: broken translations in status bar settings by @ariel-lindemann in
crosspoint-reader#1188
* fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in
crosspoint-reader#1169
* fix: Crash (Load access fault) when indexing chapters containing
characters unsupported by bold/italic font variants by @Uri-Tauber in
crosspoint-reader#997
* fix: Increase PNGdec buffer size to support wide images by @osteotek
in crosspoint-reader#995
* fix: Use HalPowerManager for battery percentage by @vjapolitzer in
crosspoint-reader#1005
* fix: Fix dangling pointer by @Uri-Tauber in
crosspoint-reader#1010
* fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk
in crosspoint-reader#1017
* fix: use double FAST_REFRESH to prevent washout on large grey images
by @martinbrook in
crosspoint-reader#957
* fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in
crosspoint-reader#1002
* fix: Strip unused CSS rules by @daveallie in
crosspoint-reader#1014
* fix: continue reading card classic theme by @pablohc in
crosspoint-reader#990
* fix: Destroy CSS Cache file when invalid by @daveallie in
crosspoint-reader#1018
* fix: Shorten "Forget Wifi" button labels to fit on button by
@lukestein in
crosspoint-reader#1045
* fix: improve Spanish translations by @pablohc in
crosspoint-reader#1054
* fix: Fixed book title in home screen by @DestinySpeaker in
crosspoint-reader#1013
* fix: Fix hyphenation and rendering of decomposed characters by
@jpirnay in
crosspoint-reader#1037
* fix: Improve and add Spanish translations by @DaniPhii in
crosspoint-reader#1338
* fix: improve and add Spanish translations by @DaniPhii in
crosspoint-reader#1254
* fix: improve and add Swedish translations by @steka in
crosspoint-reader#1317
* fix: Extend missing / amend existing German translations by @jpirnay
in crosspoint-reader#1226
* fix: update french.yaml file to have a better French translation of
the CFW by @Spigaw in
crosspoint-reader#1130
* fix: added romanian translation to new strings by @ariel-lindemann in
crosspoint-reader#1105
* fix: add missing romanian strings by @ariel-lindemann in
crosspoint-reader#1187
* fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by
@mirus-ua in
crosspoint-reader#1149
* fix: Dutch translation prefix correction by @basvdploeg in
crosspoint-reader#1223
* fix: Small typo in i18n.md regarding C++ identifiers by
@victordomingos in
crosspoint-reader#1210
* fix: typo in USER_GUIDE.md by @arnaugamez in
crosspoint-reader#1036
* fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in
crosspoint-reader#1101

### Internal
* perf: font-compression improvements by @adriancaruana in
crosspoint-reader#1056
* perf: Improve font drawing performance by @jpirnay in
crosspoint-reader#978
* perf: Replace std::list with std::vector in text layout by @znelson in
crosspoint-reader#1038
* perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in
crosspoint-reader#1194
* perf: UITheme::getMetrics const and const-ref usage by @znelson in
crosspoint-reader#1094
* perf: Avoid creating strings for file extension checks by @znelson in
crosspoint-reader#1303
* perf: Eliminate per-pixel overheads in image rendering by @martinbrook
in crosspoint-reader#1293
* perf: Update github actions for optimal performance with pioarduino by
@Jason2866 in
crosspoint-reader#1080
* style: Phase 1 - Simple light dark themes by @cdmoro in
crosspoint-reader#1006
* refactor: implement ActivityManager by @ngxson in
crosspoint-reader#1016
* refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in
crosspoint-reader#1119
* refactor: Simplify new setting introduction by @jpirnay in
crosspoint-reader#1086
* refactor: Use std binary search algorithms for font lookups by
@znelson in
crosspoint-reader#1202
* refactor: rename MyLibrary to FileBrowser by @osteotek in
crosspoint-reader#1260
* refactor: Avoid rebuilding cache path strings by @znelson in
crosspoint-reader#1300
* refactor: reader utils by @Uri-Tauber in
crosspoint-reader#1329
* chore: Remove miniz and modularise inflation logic by @daveallie in
crosspoint-reader#1073
* chore: Resolve several build warnings by @daveallie in
crosspoint-reader#1076
* chore: Removed generated language headers by @znelson in
crosspoint-reader#1156
* chore: Added generated lang headers to .gitignore by @znelson in
crosspoint-reader#1158
* chore: remove redundant xTaskCreate by @ngxson in
crosspoint-reader#1264
* chore: Removed unused PlatformIO include directory placeholder by
@znelson in
crosspoint-reader#1417
* chore: micro-optimisation: early exit on fillUncompressedSizes by
@jpirnay in
crosspoint-reader#1322
* chore: change label while on settings tab actions by @jpirnay in
crosspoint-reader#1325
* chore: add firmware size history script by @znelson in
crosspoint-reader#1235
* chore: Add powershell script for clang-formatting by @jpirnay in
crosspoint-reader#1472
* chore: Removed unused ConfirmationActivity member by @znelson in
crosspoint-reader#1234
* chore: Update russian.yaml by @madebyKir in
crosspoint-reader#1198
* chore: new Ukrainian translation lines by @mirus-ua in
crosspoint-reader#1199
* chore: new Ukrainian localization strings by @mirus-ua in
crosspoint-reader#1270
* chore: Polish localization for STR_DELETE by @JonaszPotoniec in
crosspoint-reader#1323
* chore: Image settings Polish localization by @znelson in
crosspoint-reader#1299
* chore: add missing Catalan strings by @angeldenom in
crosspoint-reader#1302
* chore: add missing translations for Romanian by @ariel-lindemann in
crosspoint-reader#1265
* chore: Add Portuguese (Portugal) translator to the list by
@victordomingos in
crosspoint-reader#1211
* chore: Reduce flash usage by cleaning up I18n translations by @steka
in crosspoint-reader#1401
* docs: Add lightweight contributor onboarding documentation by @bilalix
in crosspoint-reader#894
* docs: ActivityManager migration guide by @znelson in
crosspoint-reader#1222
* docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in
crosspoint-reader#1108
* docs: add quick KOReader sync setup guide by @wjhrdy in
crosspoint-reader#1181
* docs: image support marked as completed by @ariel-lindemann in
crosspoint-reader#1008
* feat: aiagent context definition by @jpirnay in
crosspoint-reader#922
* chore: Update SKILL.md to reflect generated i18n files are gitignored
by @znelson in
crosspoint-reader#1423
* fix: ActivityManager tweaks by @znelson in
crosspoint-reader#1220
* fix: Correct relative file paths in SKILL.md documentation by @pablohc
in crosspoint-reader#1304
* fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in
crosspoint-reader#1295

## New Contributors
* @DestinySpeaker made their first contribution in
crosspoint-reader#1002
* @arnaugamez made their first contribution in
crosspoint-reader#1036
* @angeldenom made their first contribution in
crosspoint-reader#1049
* @cdmoro made their first contribution in
crosspoint-reader#1006
* @bilalix made their first contribution in
crosspoint-reader#894
* @Jessica765 made their first contribution in
crosspoint-reader#682
* @brbla made their first contribution in
crosspoint-reader#869
* @dexif made their first contribution in
crosspoint-reader#1047
* @mirus-ua made their first contribution in
crosspoint-reader#1065
* @cbix made their first contribution in
crosspoint-reader#1077
* @divinitycove made their first contribution in
crosspoint-reader#1108
* @pepastach made their first contribution in
crosspoint-reader#1138
* @Jason2866 made their first contribution in
crosspoint-reader#1080
* @andreaturchet made their first contribution in
crosspoint-reader#1144
* @Spigaw made their first contribution in
crosspoint-reader#1130
* @iandchasse made their first contribution in
crosspoint-reader#1141
* @th0m4sek made their first contribution in
crosspoint-reader#1155
* @plahteenlahti made their first contribution in
crosspoint-reader#1133
* @hajisan made their first contribution in
crosspoint-reader#1146
* @madebyKir made their first contribution in
crosspoint-reader#1198
* @victordomingos made their first contribution in
crosspoint-reader#1210
* @basvdploeg made their first contribution in
crosspoint-reader#1204
* @wjhrdy made their first contribution in
crosspoint-reader#1181
* @DaniPhii made their first contribution in
crosspoint-reader#1254
* @steka made their first contribution in
crosspoint-reader#1317
* @barbarhan made their first contribution in
crosspoint-reader#1192
* @JonaszPotoniec made their first contribution in
crosspoint-reader#1323
* @Cache8063 made their first contribution in
crosspoint-reader#1354
* @fsocietyipa made their first contribution in
crosspoint-reader#1377
* @LSTAR1900 made their first contribution in
crosspoint-reader#979
* @zgredex made their first contribution in
crosspoint-reader#1224

**Full Changelog**:
crosspoint-reader/crosspoint-reader@1.1.1...release/1.2.0

---------

Co-authored-by: jpirnay <jens@pirnay.com>
Co-authored-by: Dani Poveda <daniphii@outlook.com>
Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com>
Co-authored-by: Barış Albayrak <barisa@pop-os.lan>
Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com>
Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com>
Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu>
Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru>
Co-authored-by: Mirus <mirusim@gmail.com>
Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com>
Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com>
Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com>
Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl>
Co-authored-by: martin brook <martin.brook100@googlemail.com>
bdeshi pushed a commit to bdeshi/crosspoint-reader that referenced this pull request Apr 8, 2026
## Summary

It's been a little while since the last release, but the community has
been incredibly busy. With 155 changes from 48 contributors (30 of which
were new!), there was a lot to cover. Here are some of the highlights:

**🔤 Kerning, Ligatures, and Font Improvements**
Text rendering gets a significant upgrade with proper kerning and
ligature support, fixed-point fractional x-advance for more accurate
character placement, and font compression improvements that reduce flash
usage.

**📝 Footnotes**
Footnote anchor navigation lets you select a footnote reference and jump
to the footnote text, then jump back. Slim footnotes support is also
available for books that use inline footnotes.

**📖 EPUB Optimizer**
A new integrated EPUB optimizer can clean up and reprocess books for
better compatibility with the reader, directly from the device.

**🔋 Battery Charging Indicator**
You can now see when your device is actively charging, with a visual
indicator on the battery icon.

**💾 Crash Diagnostics**
When something goes wrong, the firmware now dumps a crash report to the
SD card — even without USB plugged in. This makes it much easier to
report and diagnose issues.

**🌐 New Languages**
The community continues to expand language support. New in this release:
Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian,
Romanian, Catalan, Vietnamese, and Kazakh — along with significant
improvements to existing translations.

**📂 File Management**
Multi-select file deletion, BMP image viewer in the file browser, hidden
directory browsing, and long-click file deletion from the file browser.

**⚡ Performance**
Under the hood, text layout switched from `std::list` to `std::vector`,
HTML entity lookups are now O(log(n)), font rendering is faster, image
decode is 5-20% faster with per-pixel overhead eliminated, and multiple
string allocation hot paths were eliminated. Pre-indexing of the next
chapter also reduces page-turn latency at chapter boundaries.

---

Along with all of the above, there are many other additions including
**WebDAV support**, **auto page turn**, **QR code for current page**,
**split status bar settings**, **screenshot capture**, **JSON-based
settings migration**, **light/dark theme groundwork**, and a long list
of stability fixes and translation improvements.

## What's Changed
### Features
* feat: Support for kerning and ligatures by @znelson in
crosspoint-reader#873
* feat: footnote anchor navigation by @Uri-Tauber in
crosspoint-reader#1245
* feat: slim footnotes support by @Uri-Tauber in
crosspoint-reader#1031
* feat: integrated epub optimizer by @zgredex and @pablohc in
crosspoint-reader#1224
* feat: battery charging indicator (mirroring PR crosspoint-reader#537) by @jpirnay in
crosspoint-reader#1427
* feat: dump crash report to sdcard by @ngxson in
crosspoint-reader#1145
* feat: Implement silent pre-indexing for the next chapter in
EpubReaderActivity by @LSTAR1900 in
crosspoint-reader#979
* feat: upgrade platform and support webdav by @dexif in
crosspoint-reader#1047
* feat: Auto Page Turn for Epub Reader by @GenesiaW in
crosspoint-reader#1219
* feat: enhance file deletion functionality with multi-select by
@Jessica765 in
crosspoint-reader#682
* feat: Long Click for File Deletion through File Browser by @Levrk in
crosspoint-reader#909
* feat: Take screenshots by @el in
crosspoint-reader#759
* feat: Current page as QR by @el in
crosspoint-reader#1099
* feat: Download links for web server by @el in
crosspoint-reader#1039
* feat: Added BmpViewer activity for viewing .bmp images in file browser
by @Levrk in
crosspoint-reader#887
* feat: User setting for image display by @jpirnay in
crosspoint-reader#1291
* feat: Show hidden directories in browser by @jpirnay in
crosspoint-reader#1288
* feat: Prefer ".sleep" over "sleep" for custom image directory by
@jpirnay in
crosspoint-reader#948
* feat: Allow a local configuration file for custom compiles by @jpirnay
in crosspoint-reader#879
* feat: Migrate binary settings to json by @jpirnay in
crosspoint-reader#920
* feat: split status bar setting by @whyte-j in
crosspoint-reader#733
* feat: wrapped text in GfxRender, implemented in themes so far by
@iandchasse in
crosspoint-reader#1141
* feat: Themed language screen by @CaptainFrito in
crosspoint-reader#1020
* feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in
crosspoint-reader#1107
* feat: Add maxAlloc to memory information by @jpirnay in
crosspoint-reader#1152
* feat: replace picojpeg with JPEGDEC for JPEG image decoding by
@martinbrook in
crosspoint-reader#1136
* feat: Add git branch to version information on settings screen by
@jpirnay in
crosspoint-reader#1225
* feat: sort languages in selection menu by @ariel-lindemann in
crosspoint-reader#1071
* feat: Latin Extended-B European glyphs by @znelson in
crosspoint-reader#1157
* feat: Latin Extended-B European glyphs by @znelson in
crosspoint-reader#1167
* feat: Vietnamese glyphs support by @danoooob in
crosspoint-reader#1147
* feat: add Turkish translation by @barbarhan in
crosspoint-reader#1192
* feat: add full Danish translation by @hajisan in
crosspoint-reader#1146
* feat: Add Finnish translations by @plahteenlahti in
crosspoint-reader#1133
* feat: Add Polish Language by @th0m4sek in
crosspoint-reader#1155
* feat: add Dutch translation by @basvdploeg in
crosspoint-reader#1204
* feat: add Belarusian translation by @dexif in
crosspoint-reader#1120
* feat: Add full Italian translations by @andreaturchet in
crosspoint-reader#1144
* feat: add Ukrainian translation by @mirus-ua in
crosspoint-reader#1065
* feat: Add Kazakh (kk) language support by @fsocietyipa in
crosspoint-reader#1377
* feat: added Romanian strings by @ariel-lindemann in
crosspoint-reader#987
* feat: add Catalan strings by @angeldenom in
crosspoint-reader#1049
* feat: Make directories stand out more in local file browser: "[dir]"
instead of "dir" by @jpirnay in
crosspoint-reader#1339
* feat: Add Polish strings for commits crosspoint-reader#1219,crosspoint-reader#1169,crosspoint-reader#1031 +tweaks by
@th0m4sek in
crosspoint-reader#1227
* feat: Polish translation tweaks by @th0m4sek in
crosspoint-reader#1193
### Fixes
* fix: Fix img layout issue / support CSS display:none for elements and
images by @jpirnay in
crosspoint-reader#1443
* fix: Overlapping battery percentage on image pages with anti-aliasing
by @znelson in
crosspoint-reader#1452
* fix: Fix prewarm perf when a page contains many styles by
@adriancaruana in
crosspoint-reader#1451
* fix: use sleep routine from the original firmware by @ngxson in
crosspoint-reader#1298
* fix: Prevent line breaks on common English contractions by @znelson in
crosspoint-reader#1405
* fix: Build with -fno-exceptions by @znelson in
crosspoint-reader#1412
* fix: Reduce flash usage by cleaning up I18n translations by @steka in
crosspoint-reader#1401
* fix: jpeg resource cleanup by @jpirnay in
crosspoint-reader#1320
* fix: back button in settings returns to tab bar first by @Cache8063 in
crosspoint-reader#1354
* fix: Init lastSleepImage (edge case) by @jpirnay in
crosspoint-reader#1360
* fix: Add special handling for apostrophe hyphenation by @jpirnay in
crosspoint-reader#1318
* fix: Fix inter-word spacing rounding error in text layout by @znelson
in crosspoint-reader#1311
* fix: load access fault crash by @Uri-Tauber in
crosspoint-reader#1370
* fix: Fix bootloop logging crash by @jpirnay in
crosspoint-reader#1357
* fix: dump crash log without usb plugged, bump release log to INFO by
@ngxson in
crosspoint-reader#1332
* fix: avoid zip filename overflow by @jpirnay in
crosspoint-reader#1321
* fix: Hanging indent (negative text-indent) and em-unit sizing by
@jpirnay in
crosspoint-reader#1229
* fix: Use fixed-point fractional x-advance and kerning for better text
layout by @znelson in
crosspoint-reader#1168
* fix: use HTTPClient::writeToStream for downloading files from OPDS by
@osteotek in
crosspoint-reader#1207
* fix: make file system operations thread-safe (HalFile) by @ngxson in
crosspoint-reader#1212
* fix: properly implement requestUpdateAndWait() by @ngxson in
crosspoint-reader#1218
* fix: prevent infinite render loop in Calibre Wireless after file
transfer by @pablohc in
crosspoint-reader#1070
* fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader
sync by @jpirnay in
crosspoint-reader#1151
* fix: Fix coverRendered flag by @jpirnay in
crosspoint-reader#1154
* fix: Handle non-ASCII characters in sanitizeFilename by @znelson in
crosspoint-reader#1132
* fix: Update activity was missing "Back" button label by @znelson in
crosspoint-reader#1128
* fix: force auto-hinting for Bookerly to fix inconsistent stem widths
by @adriancaruana in
crosspoint-reader#1098
* fix: image centering bleed by @martinbrook in
crosspoint-reader#1096
* fix: double free WebDAVHandler by @ngxson in
crosspoint-reader#1093
* fix: Consider extra quotation styles when hyphenating quoted words by
@cbix in
crosspoint-reader#1077
* fix: acquire power lock before sleeping by @ngxson in
crosspoint-reader#1125
* fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach
in crosspoint-reader#1138
* fix: sdfat warning about redefinition of macro by @ngxson in
crosspoint-reader#1135
* fix: Close leaked file descriptors in SleepActivity and web server by
@brbla in
crosspoint-reader#869
* fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in
crosspoint-reader#1075
* fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in
crosspoint-reader#1171
* fix: Hide unusable button hints when viewing empty directory by @Levrk
in crosspoint-reader#1253
* fix: broken translations in status bar settings by @ariel-lindemann in
crosspoint-reader#1188
* fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in
crosspoint-reader#1169
* fix: Crash (Load access fault) when indexing chapters containing
characters unsupported by bold/italic font variants by @Uri-Tauber in
crosspoint-reader#997
* fix: Increase PNGdec buffer size to support wide images by @osteotek
in crosspoint-reader#995
* fix: Use HalPowerManager for battery percentage by @vjapolitzer in
crosspoint-reader#1005
* fix: Fix dangling pointer by @Uri-Tauber in
crosspoint-reader#1010
* fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk
in crosspoint-reader#1017
* fix: use double FAST_REFRESH to prevent washout on large grey images
by @martinbrook in
crosspoint-reader#957
* fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in
crosspoint-reader#1002
* fix: Strip unused CSS rules by @daveallie in
crosspoint-reader#1014
* fix: continue reading card classic theme by @pablohc in
crosspoint-reader#990
* fix: Destroy CSS Cache file when invalid by @daveallie in
crosspoint-reader#1018
* fix: Shorten "Forget Wifi" button labels to fit on button by
@lukestein in
crosspoint-reader#1045
* fix: improve Spanish translations by @pablohc in
crosspoint-reader#1054
* fix: Fixed book title in home screen by @DestinySpeaker in
crosspoint-reader#1013
* fix: Fix hyphenation and rendering of decomposed characters by
@jpirnay in
crosspoint-reader#1037
* fix: Improve and add Spanish translations by @DaniPhii in
crosspoint-reader#1338
* fix: improve and add Spanish translations by @DaniPhii in
crosspoint-reader#1254
* fix: improve and add Swedish translations by @steka in
crosspoint-reader#1317
* fix: Extend missing / amend existing German translations by @jpirnay
in crosspoint-reader#1226
* fix: update french.yaml file to have a better French translation of
the CFW by @Spigaw in
crosspoint-reader#1130
* fix: added romanian translation to new strings by @ariel-lindemann in
crosspoint-reader#1105
* fix: add missing romanian strings by @ariel-lindemann in
crosspoint-reader#1187
* fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by
@mirus-ua in
crosspoint-reader#1149
* fix: Dutch translation prefix correction by @basvdploeg in
crosspoint-reader#1223
* fix: Small typo in i18n.md regarding C++ identifiers by
@victordomingos in
crosspoint-reader#1210
* fix: typo in USER_GUIDE.md by @arnaugamez in
crosspoint-reader#1036
* fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in
crosspoint-reader#1101

### Internal
* perf: font-compression improvements by @adriancaruana in
crosspoint-reader#1056
* perf: Improve font drawing performance by @jpirnay in
crosspoint-reader#978
* perf: Replace std::list with std::vector in text layout by @znelson in
crosspoint-reader#1038
* perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in
crosspoint-reader#1194
* perf: UITheme::getMetrics const and const-ref usage by @znelson in
crosspoint-reader#1094
* perf: Avoid creating strings for file extension checks by @znelson in
crosspoint-reader#1303
* perf: Eliminate per-pixel overheads in image rendering by @martinbrook
in crosspoint-reader#1293
* perf: Update github actions for optimal performance with pioarduino by
@Jason2866 in
crosspoint-reader#1080
* style: Phase 1 - Simple light dark themes by @cdmoro in
crosspoint-reader#1006
* refactor: implement ActivityManager by @ngxson in
crosspoint-reader#1016
* refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in
crosspoint-reader#1119
* refactor: Simplify new setting introduction by @jpirnay in
crosspoint-reader#1086
* refactor: Use std binary search algorithms for font lookups by
@znelson in
crosspoint-reader#1202
* refactor: rename MyLibrary to FileBrowser by @osteotek in
crosspoint-reader#1260
* refactor: Avoid rebuilding cache path strings by @znelson in
crosspoint-reader#1300
* refactor: reader utils by @Uri-Tauber in
crosspoint-reader#1329
* chore: Remove miniz and modularise inflation logic by @daveallie in
crosspoint-reader#1073
* chore: Resolve several build warnings by @daveallie in
crosspoint-reader#1076
* chore: Removed generated language headers by @znelson in
crosspoint-reader#1156
* chore: Added generated lang headers to .gitignore by @znelson in
crosspoint-reader#1158
* chore: remove redundant xTaskCreate by @ngxson in
crosspoint-reader#1264
* chore: Removed unused PlatformIO include directory placeholder by
@znelson in
crosspoint-reader#1417
* chore: micro-optimisation: early exit on fillUncompressedSizes by
@jpirnay in
crosspoint-reader#1322
* chore: change label while on settings tab actions by @jpirnay in
crosspoint-reader#1325
* chore: add firmware size history script by @znelson in
crosspoint-reader#1235
* chore: Add powershell script for clang-formatting by @jpirnay in
crosspoint-reader#1472
* chore: Removed unused ConfirmationActivity member by @znelson in
crosspoint-reader#1234
* chore: Update russian.yaml by @madebyKir in
crosspoint-reader#1198
* chore: new Ukrainian translation lines by @mirus-ua in
crosspoint-reader#1199
* chore: new Ukrainian localization strings by @mirus-ua in
crosspoint-reader#1270
* chore: Polish localization for STR_DELETE by @JonaszPotoniec in
crosspoint-reader#1323
* chore: Image settings Polish localization by @znelson in
crosspoint-reader#1299
* chore: add missing Catalan strings by @angeldenom in
crosspoint-reader#1302
* chore: add missing translations for Romanian by @ariel-lindemann in
crosspoint-reader#1265
* chore: Add Portuguese (Portugal) translator to the list by
@victordomingos in
crosspoint-reader#1211
* chore: Reduce flash usage by cleaning up I18n translations by @steka
in crosspoint-reader#1401
* docs: Add lightweight contributor onboarding documentation by @bilalix
in crosspoint-reader#894
* docs: ActivityManager migration guide by @znelson in
crosspoint-reader#1222
* docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in
crosspoint-reader#1108
* docs: add quick KOReader sync setup guide by @wjhrdy in
crosspoint-reader#1181
* docs: image support marked as completed by @ariel-lindemann in
crosspoint-reader#1008
* feat: aiagent context definition by @jpirnay in
crosspoint-reader#922
* chore: Update SKILL.md to reflect generated i18n files are gitignored
by @znelson in
crosspoint-reader#1423
* fix: ActivityManager tweaks by @znelson in
crosspoint-reader#1220
* fix: Correct relative file paths in SKILL.md documentation by @pablohc
in crosspoint-reader#1304
* fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in
crosspoint-reader#1295

## New Contributors
* @DestinySpeaker made their first contribution in
crosspoint-reader#1002
* @arnaugamez made their first contribution in
crosspoint-reader#1036
* @angeldenom made their first contribution in
crosspoint-reader#1049
* @cdmoro made their first contribution in
crosspoint-reader#1006
* @bilalix made their first contribution in
crosspoint-reader#894
* @Jessica765 made their first contribution in
crosspoint-reader#682
* @brbla made their first contribution in
crosspoint-reader#869
* @dexif made their first contribution in
crosspoint-reader#1047
* @mirus-ua made their first contribution in
crosspoint-reader#1065
* @cbix made their first contribution in
crosspoint-reader#1077
* @divinitycove made their first contribution in
crosspoint-reader#1108
* @pepastach made their first contribution in
crosspoint-reader#1138
* @Jason2866 made their first contribution in
crosspoint-reader#1080
* @andreaturchet made their first contribution in
crosspoint-reader#1144
* @Spigaw made their first contribution in
crosspoint-reader#1130
* @iandchasse made their first contribution in
crosspoint-reader#1141
* @th0m4sek made their first contribution in
crosspoint-reader#1155
* @plahteenlahti made their first contribution in
crosspoint-reader#1133
* @hajisan made their first contribution in
crosspoint-reader#1146
* @madebyKir made their first contribution in
crosspoint-reader#1198
* @victordomingos made their first contribution in
crosspoint-reader#1210
* @basvdploeg made their first contribution in
crosspoint-reader#1204
* @wjhrdy made their first contribution in
crosspoint-reader#1181
* @DaniPhii made their first contribution in
crosspoint-reader#1254
* @steka made their first contribution in
crosspoint-reader#1317
* @barbarhan made their first contribution in
crosspoint-reader#1192
* @JonaszPotoniec made their first contribution in
crosspoint-reader#1323
* @Cache8063 made their first contribution in
crosspoint-reader#1354
* @fsocietyipa made their first contribution in
crosspoint-reader#1377
* @LSTAR1900 made their first contribution in
crosspoint-reader#979
* @zgredex made their first contribution in
crosspoint-reader#1224

**Full Changelog**:
crosspoint-reader/crosspoint-reader@1.1.1...release/1.2.0

---------

Co-authored-by: jpirnay <jens@pirnay.com>
Co-authored-by: Dani Poveda <daniphii@outlook.com>
Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com>
Co-authored-by: Barış Albayrak <barisa@pop-os.lan>
Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com>
Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com>
Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu>
Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru>
Co-authored-by: Mirus <mirusim@gmail.com>
Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com>
Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com>
Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com>
Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl>
Co-authored-by: martin brook <martin.brook100@googlemail.com>
aBER0724 pushed a commit to aBER0724/crosspoint-reader-cjk that referenced this pull request May 7, 2026
## Summary

It's been a little while since the last release, but the community has
been incredibly busy. With 155 changes from 48 contributors (30 of which
were new!), there was a lot to cover. Here are some of the highlights:

**🔤 Kerning, Ligatures, and Font Improvements**
Text rendering gets a significant upgrade with proper kerning and
ligature support, fixed-point fractional x-advance for more accurate
character placement, and font compression improvements that reduce flash
usage.

**📝 Footnotes**
Footnote anchor navigation lets you select a footnote reference and jump
to the footnote text, then jump back. Slim footnotes support is also
available for books that use inline footnotes.

**📖 EPUB Optimizer**
A new integrated EPUB optimizer can clean up and reprocess books for
better compatibility with the reader, directly from the device.

**🔋 Battery Charging Indicator**
You can now see when your device is actively charging, with a visual
indicator on the battery icon.

**💾 Crash Diagnostics**
When something goes wrong, the firmware now dumps a crash report to the
SD card — even without USB plugged in. This makes it much easier to
report and diagnose issues.

**🌐 New Languages**
The community continues to expand language support. New in this release:
Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian,
Romanian, Catalan, Vietnamese, and Kazakh — along with significant
improvements to existing translations.

**📂 File Management**
Multi-select file deletion, BMP image viewer in the file browser, hidden
directory browsing, and long-click file deletion from the file browser.

**⚡ Performance**
Under the hood, text layout switched from `std::list` to `std::vector`,
HTML entity lookups are now O(log(n)), font rendering is faster, image
decode is 5-20% faster with per-pixel overhead eliminated, and multiple
string allocation hot paths were eliminated. Pre-indexing of the next
chapter also reduces page-turn latency at chapter boundaries.

---

Along with all of the above, there are many other additions including
**WebDAV support**, **auto page turn**, **QR code for current page**,
**split status bar settings**, **screenshot capture**, **JSON-based
settings migration**, **light/dark theme groundwork**, and a long list
of stability fixes and translation improvements.

## What's Changed
### Features
* feat: Support for kerning and ligatures by @znelson in
crosspoint-reader#873
* feat: footnote anchor navigation by @Uri-Tauber in
crosspoint-reader#1245
* feat: slim footnotes support by @Uri-Tauber in
crosspoint-reader#1031
* feat: integrated epub optimizer by @zgredex and @pablohc in
crosspoint-reader#1224
* feat: battery charging indicator (mirroring PR crosspoint-reader#537) by @jpirnay in
crosspoint-reader#1427
* feat: dump crash report to sdcard by @ngxson in
crosspoint-reader#1145
* feat: Implement silent pre-indexing for the next chapter in
EpubReaderActivity by @LSTAR1900 in
crosspoint-reader#979
* feat: upgrade platform and support webdav by @dexif in
crosspoint-reader#1047
* feat: Auto Page Turn for Epub Reader by @GenesiaW in
crosspoint-reader#1219
* feat: enhance file deletion functionality with multi-select by
@Jessica765 in
crosspoint-reader#682
* feat: Long Click for File Deletion through File Browser by @Levrk in
crosspoint-reader#909
* feat: Take screenshots by @el in
crosspoint-reader#759
* feat: Current page as QR by @el in
crosspoint-reader#1099
* feat: Download links for web server by @el in
crosspoint-reader#1039
* feat: Added BmpViewer activity for viewing .bmp images in file browser
by @Levrk in
crosspoint-reader#887
* feat: User setting for image display by @jpirnay in
crosspoint-reader#1291
* feat: Show hidden directories in browser by @jpirnay in
crosspoint-reader#1288
* feat: Prefer ".sleep" over "sleep" for custom image directory by
@jpirnay in
crosspoint-reader#948
* feat: Allow a local configuration file for custom compiles by @jpirnay
in crosspoint-reader#879
* feat: Migrate binary settings to json by @jpirnay in
crosspoint-reader#920
* feat: split status bar setting by @whyte-j in
crosspoint-reader#733
* feat: wrapped text in GfxRender, implemented in themes so far by
@iandchasse in
crosspoint-reader#1141
* feat: Themed language screen by @CaptainFrito in
crosspoint-reader#1020
* feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in
crosspoint-reader#1107
* feat: Add maxAlloc to memory information by @jpirnay in
crosspoint-reader#1152
* feat: replace picojpeg with JPEGDEC for JPEG image decoding by
@martinbrook in
crosspoint-reader#1136
* feat: Add git branch to version information on settings screen by
@jpirnay in
crosspoint-reader#1225
* feat: sort languages in selection menu by @ariel-lindemann in
crosspoint-reader#1071
* feat: Latin Extended-B European glyphs by @znelson in
crosspoint-reader#1157
* feat: Latin Extended-B European glyphs by @znelson in
crosspoint-reader#1167
* feat: Vietnamese glyphs support by @danoooob in
crosspoint-reader#1147
* feat: add Turkish translation by @barbarhan in
crosspoint-reader#1192
* feat: add full Danish translation by @hajisan in
crosspoint-reader#1146
* feat: Add Finnish translations by @plahteenlahti in
crosspoint-reader#1133
* feat: Add Polish Language by @th0m4sek in
crosspoint-reader#1155
* feat: add Dutch translation by @basvdploeg in
crosspoint-reader#1204
* feat: add Belarusian translation by @dexif in
crosspoint-reader#1120
* feat: Add full Italian translations by @andreaturchet in
crosspoint-reader#1144
* feat: add Ukrainian translation by @mirus-ua in
crosspoint-reader#1065
* feat: Add Kazakh (kk) language support by @fsocietyipa in
crosspoint-reader#1377
* feat: added Romanian strings by @ariel-lindemann in
crosspoint-reader#987
* feat: add Catalan strings by @angeldenom in
crosspoint-reader#1049
* feat: Make directories stand out more in local file browser: "[dir]"
instead of "dir" by @jpirnay in
crosspoint-reader#1339
* feat: Add Polish strings for commits crosspoint-reader#1219,crosspoint-reader#1169,crosspoint-reader#1031 +tweaks by
@th0m4sek in
crosspoint-reader#1227
* feat: Polish translation tweaks by @th0m4sek in
crosspoint-reader#1193
### Fixes
* fix: Fix img layout issue / support CSS display:none for elements and
images by @jpirnay in
crosspoint-reader#1443
* fix: Overlapping battery percentage on image pages with anti-aliasing
by @znelson in
crosspoint-reader#1452
* fix: Fix prewarm perf when a page contains many styles by
@adriancaruana in
crosspoint-reader#1451
* fix: use sleep routine from the original firmware by @ngxson in
crosspoint-reader#1298
* fix: Prevent line breaks on common English contractions by @znelson in
crosspoint-reader#1405
* fix: Build with -fno-exceptions by @znelson in
crosspoint-reader#1412
* fix: Reduce flash usage by cleaning up I18n translations by @steka in
crosspoint-reader#1401
* fix: jpeg resource cleanup by @jpirnay in
crosspoint-reader#1320
* fix: back button in settings returns to tab bar first by @Cache8063 in
crosspoint-reader#1354
* fix: Init lastSleepImage (edge case) by @jpirnay in
crosspoint-reader#1360
* fix: Add special handling for apostrophe hyphenation by @jpirnay in
crosspoint-reader#1318
* fix: Fix inter-word spacing rounding error in text layout by @znelson
in crosspoint-reader#1311
* fix: load access fault crash by @Uri-Tauber in
crosspoint-reader#1370
* fix: Fix bootloop logging crash by @jpirnay in
crosspoint-reader#1357
* fix: dump crash log without usb plugged, bump release log to INFO by
@ngxson in
crosspoint-reader#1332
* fix: avoid zip filename overflow by @jpirnay in
crosspoint-reader#1321
* fix: Hanging indent (negative text-indent) and em-unit sizing by
@jpirnay in
crosspoint-reader#1229
* fix: Use fixed-point fractional x-advance and kerning for better text
layout by @znelson in
crosspoint-reader#1168
* fix: use HTTPClient::writeToStream for downloading files from OPDS by
@osteotek in
crosspoint-reader#1207
* fix: make file system operations thread-safe (HalFile) by @ngxson in
crosspoint-reader#1212
* fix: properly implement requestUpdateAndWait() by @ngxson in
crosspoint-reader#1218
* fix: prevent infinite render loop in Calibre Wireless after file
transfer by @pablohc in
crosspoint-reader#1070
* fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader
sync by @jpirnay in
crosspoint-reader#1151
* fix: Fix coverRendered flag by @jpirnay in
crosspoint-reader#1154
* fix: Handle non-ASCII characters in sanitizeFilename by @znelson in
crosspoint-reader#1132
* fix: Update activity was missing "Back" button label by @znelson in
crosspoint-reader#1128
* fix: force auto-hinting for Bookerly to fix inconsistent stem widths
by @adriancaruana in
crosspoint-reader#1098
* fix: image centering bleed by @martinbrook in
crosspoint-reader#1096
* fix: double free WebDAVHandler by @ngxson in
crosspoint-reader#1093
* fix: Consider extra quotation styles when hyphenating quoted words by
@cbix in
crosspoint-reader#1077
* fix: acquire power lock before sleeping by @ngxson in
crosspoint-reader#1125
* fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach
in crosspoint-reader#1138
* fix: sdfat warning about redefinition of macro by @ngxson in
crosspoint-reader#1135
* fix: Close leaked file descriptors in SleepActivity and web server by
@brbla in
crosspoint-reader#869
* fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in
crosspoint-reader#1075
* fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in
crosspoint-reader#1171
* fix: Hide unusable button hints when viewing empty directory by @Levrk
in crosspoint-reader#1253
* fix: broken translations in status bar settings by @ariel-lindemann in
crosspoint-reader#1188
* fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in
crosspoint-reader#1169
* fix: Crash (Load access fault) when indexing chapters containing
characters unsupported by bold/italic font variants by @Uri-Tauber in
crosspoint-reader#997
* fix: Increase PNGdec buffer size to support wide images by @osteotek
in crosspoint-reader#995
* fix: Use HalPowerManager for battery percentage by @vjapolitzer in
crosspoint-reader#1005
* fix: Fix dangling pointer by @Uri-Tauber in
crosspoint-reader#1010
* fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk
in crosspoint-reader#1017
* fix: use double FAST_REFRESH to prevent washout on large grey images
by @martinbrook in
crosspoint-reader#957
* fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in
crosspoint-reader#1002
* fix: Strip unused CSS rules by @daveallie in
crosspoint-reader#1014
* fix: continue reading card classic theme by @pablohc in
crosspoint-reader#990
* fix: Destroy CSS Cache file when invalid by @daveallie in
crosspoint-reader#1018
* fix: Shorten "Forget Wifi" button labels to fit on button by
@lukestein in
crosspoint-reader#1045
* fix: improve Spanish translations by @pablohc in
crosspoint-reader#1054
* fix: Fixed book title in home screen by @DestinySpeaker in
crosspoint-reader#1013
* fix: Fix hyphenation and rendering of decomposed characters by
@jpirnay in
crosspoint-reader#1037
* fix: Improve and add Spanish translations by @DaniPhii in
crosspoint-reader#1338
* fix: improve and add Spanish translations by @DaniPhii in
crosspoint-reader#1254
* fix: improve and add Swedish translations by @steka in
crosspoint-reader#1317
* fix: Extend missing / amend existing German translations by @jpirnay
in crosspoint-reader#1226
* fix: update french.yaml file to have a better French translation of
the CFW by @Spigaw in
crosspoint-reader#1130
* fix: added romanian translation to new strings by @ariel-lindemann in
crosspoint-reader#1105
* fix: add missing romanian strings by @ariel-lindemann in
crosspoint-reader#1187
* fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by
@mirus-ua in
crosspoint-reader#1149
* fix: Dutch translation prefix correction by @basvdploeg in
crosspoint-reader#1223
* fix: Small typo in i18n.md regarding C++ identifiers by
@victordomingos in
crosspoint-reader#1210
* fix: typo in USER_GUIDE.md by @arnaugamez in
crosspoint-reader#1036
* fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in
crosspoint-reader#1101

### Internal
* perf: font-compression improvements by @adriancaruana in
crosspoint-reader#1056
* perf: Improve font drawing performance by @jpirnay in
crosspoint-reader#978
* perf: Replace std::list with std::vector in text layout by @znelson in
crosspoint-reader#1038
* perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in
crosspoint-reader#1194
* perf: UITheme::getMetrics const and const-ref usage by @znelson in
crosspoint-reader#1094
* perf: Avoid creating strings for file extension checks by @znelson in
crosspoint-reader#1303
* perf: Eliminate per-pixel overheads in image rendering by @martinbrook
in crosspoint-reader#1293
* perf: Update github actions for optimal performance with pioarduino by
@Jason2866 in
crosspoint-reader#1080
* style: Phase 1 - Simple light dark themes by @cdmoro in
crosspoint-reader#1006
* refactor: implement ActivityManager by @ngxson in
crosspoint-reader#1016
* refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in
crosspoint-reader#1119
* refactor: Simplify new setting introduction by @jpirnay in
crosspoint-reader#1086
* refactor: Use std binary search algorithms for font lookups by
@znelson in
crosspoint-reader#1202
* refactor: rename MyLibrary to FileBrowser by @osteotek in
crosspoint-reader#1260
* refactor: Avoid rebuilding cache path strings by @znelson in
crosspoint-reader#1300
* refactor: reader utils by @Uri-Tauber in
crosspoint-reader#1329
* chore: Remove miniz and modularise inflation logic by @daveallie in
crosspoint-reader#1073
* chore: Resolve several build warnings by @daveallie in
crosspoint-reader#1076
* chore: Removed generated language headers by @znelson in
crosspoint-reader#1156
* chore: Added generated lang headers to .gitignore by @znelson in
crosspoint-reader#1158
* chore: remove redundant xTaskCreate by @ngxson in
crosspoint-reader#1264
* chore: Removed unused PlatformIO include directory placeholder by
@znelson in
crosspoint-reader#1417
* chore: micro-optimisation: early exit on fillUncompressedSizes by
@jpirnay in
crosspoint-reader#1322
* chore: change label while on settings tab actions by @jpirnay in
crosspoint-reader#1325
* chore: add firmware size history script by @znelson in
crosspoint-reader#1235
* chore: Add powershell script for clang-formatting by @jpirnay in
crosspoint-reader#1472
* chore: Removed unused ConfirmationActivity member by @znelson in
crosspoint-reader#1234
* chore: Update russian.yaml by @madebyKir in
crosspoint-reader#1198
* chore: new Ukrainian translation lines by @mirus-ua in
crosspoint-reader#1199
* chore: new Ukrainian localization strings by @mirus-ua in
crosspoint-reader#1270
* chore: Polish localization for STR_DELETE by @JonaszPotoniec in
crosspoint-reader#1323
* chore: Image settings Polish localization by @znelson in
crosspoint-reader#1299
* chore: add missing Catalan strings by @angeldenom in
crosspoint-reader#1302
* chore: add missing translations for Romanian by @ariel-lindemann in
crosspoint-reader#1265
* chore: Add Portuguese (Portugal) translator to the list by
@victordomingos in
crosspoint-reader#1211
* chore: Reduce flash usage by cleaning up I18n translations by @steka
in crosspoint-reader#1401
* docs: Add lightweight contributor onboarding documentation by @bilalix
in crosspoint-reader#894
* docs: ActivityManager migration guide by @znelson in
crosspoint-reader#1222
* docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in
crosspoint-reader#1108
* docs: add quick KOReader sync setup guide by @wjhrdy in
crosspoint-reader#1181
* docs: image support marked as completed by @ariel-lindemann in
crosspoint-reader#1008
* feat: aiagent context definition by @jpirnay in
crosspoint-reader#922
* chore: Update SKILL.md to reflect generated i18n files are gitignored
by @znelson in
crosspoint-reader#1423
* fix: ActivityManager tweaks by @znelson in
crosspoint-reader#1220
* fix: Correct relative file paths in SKILL.md documentation by @pablohc
in crosspoint-reader#1304
* fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in
crosspoint-reader#1295

## New Contributors
* @DestinySpeaker made their first contribution in
crosspoint-reader#1002
* @arnaugamez made their first contribution in
crosspoint-reader#1036
* @angeldenom made their first contribution in
crosspoint-reader#1049
* @cdmoro made their first contribution in
crosspoint-reader#1006
* @bilalix made their first contribution in
crosspoint-reader#894
* @Jessica765 made their first contribution in
crosspoint-reader#682
* @brbla made their first contribution in
crosspoint-reader#869
* @dexif made their first contribution in
crosspoint-reader#1047
* @mirus-ua made their first contribution in
crosspoint-reader#1065
* @cbix made their first contribution in
crosspoint-reader#1077
* @divinitycove made their first contribution in
crosspoint-reader#1108
* @pepastach made their first contribution in
crosspoint-reader#1138
* @Jason2866 made their first contribution in
crosspoint-reader#1080
* @andreaturchet made their first contribution in
crosspoint-reader#1144
* @Spigaw made their first contribution in
crosspoint-reader#1130
* @iandchasse made their first contribution in
crosspoint-reader#1141
* @th0m4sek made their first contribution in
crosspoint-reader#1155
* @plahteenlahti made their first contribution in
crosspoint-reader#1133
* @hajisan made their first contribution in
crosspoint-reader#1146
* @madebyKir made their first contribution in
crosspoint-reader#1198
* @victordomingos made their first contribution in
crosspoint-reader#1210
* @basvdploeg made their first contribution in
crosspoint-reader#1204
* @wjhrdy made their first contribution in
crosspoint-reader#1181
* @DaniPhii made their first contribution in
crosspoint-reader#1254
* @steka made their first contribution in
crosspoint-reader#1317
* @barbarhan made their first contribution in
crosspoint-reader#1192
* @JonaszPotoniec made their first contribution in
crosspoint-reader#1323
* @Cache8063 made their first contribution in
crosspoint-reader#1354
* @fsocietyipa made their first contribution in
crosspoint-reader#1377
* @LSTAR1900 made their first contribution in
crosspoint-reader#979
* @zgredex made their first contribution in
crosspoint-reader#1224

**Full Changelog**:
crosspoint-reader/crosspoint-reader@1.1.1...release/1.2.0

---------

Co-authored-by: jpirnay <jens@pirnay.com>
Co-authored-by: Dani Poveda <daniphii@outlook.com>
Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com>
Co-authored-by: Barış Albayrak <barisa@pop-os.lan>
Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com>
Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com>
Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu>
Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru>
Co-authored-by: Mirus <mirusim@gmail.com>
Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com>
Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com>
Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com>
Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl>
Co-authored-by: martin brook <martin.brook100@googlemail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants