style: Phase 1 - Simple light dark themes#1006
Conversation
📝 WalkthroughWalkthroughApplied 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 Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes 🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
There was a problem hiding this comment.
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 | 🟡 MinorHard-coded border color breaks dark mode consistency.
Line 99 uses
#dddinstead ofvar(--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 | 🟡 MinorInline hard-coded color breaks theming.
Line 261 uses an inline
color:#95a5a6`` which won't respond to theme changes. Use a CSS class withvar(--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 | 🟡 MinorMessage 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 | 🟡 MinorInline 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: Redundantmargin-rightwith flex gap.Line 223 adds
margin-right: 6pxbut the parent.nav-linksalready usesgap: 10px(line 57). In flexbox,gaphandles spacing between items, makingmargin-rightredundant 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-disabledvariables. 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) andwhite(line 141). Consider introducing variables like--toggle-backgroundand--toggle-knobto 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-colorand--accent-color-highlightare 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: Consideraria-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
📒 Files selected for processing (3)
src/network/html/FilesPage.htmlsrc/network/html/HomePage.htmlsrc/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.
There was a problem hiding this comment.
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 | 🟡 MinorHard-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-filesuses 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 | 🟡 MinorHard-coded border color on
.folder-inputdoesn't adapt to dark mode.Same issue as in
SettingsPage.html- the#dddborder 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 | 🟡 MinorAction 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-btnuse 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 | 🟡 MinorHard-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 | 🟡 MinorHard-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 | 🟡 MinorHard-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-10here for consistency withFilesPage.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.activelink, thea:hoverrule applies--accent-hover-colorbackground, 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
📒 Files selected for processing (3)
src/network/html/FilesPage.htmlsrc/network/html/HomePage.htmlsrc/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-bgvariable for the toggle component.The dark mode override for
--toggle-bg(#666vs#ccc) ensures the toggle remains visible in both themes.src/network/html/FilesPage.html (1)
8-29: Good addition of--accent-color-10for 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.
There was a problem hiding this comment.
🧹 Nitpick comments (8)
src/network/html/FilesPage.html (5)
253-258: Hardcoded color won't adapt to dark mode.
.no-filesuses#95a5a6which may have insufficient contrast against the dark background (#333). Consider usingvar(--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-inputuses a hardcoded#dddborder 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 withvar(--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
#AAAborder 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
#e0e0e0which 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
#dddborder should usevar(--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
📒 Files selected for processing (3)
src/network/html/FilesPage.htmlsrc/network/html/HomePage.htmlsrc/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: darkensures 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):hoverselector properly prevents hover effects on the active link.
191-193: LGTM! Table hover simplified.The previous
:has()selector concern has been addressed. The simplertr:hoverselector 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-bgfor the toggle switch component. The dark mode override correctly adjusts the toggle background to#666for 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-bgfor the inactive state and--accent-colorfor the checked state, providing good visual feedback in both light and dark modes.
230-236: LGTM! Mobile responsive fix.Using
width: unsetinstead 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.
## 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 ) - 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>
## 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 ) - 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>
## 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 ) - 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>
## 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 ) - 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>
## 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 ) - 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>
## 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 ) - 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>
## 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 ) - 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>
## 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 ) - 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>
## 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 ) - 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>
## 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>
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>
## 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>
## 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>
## 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>
Summary
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.
#6e9a82as accent color (taken from@media (prefers-color-scheme: dark))Additional Context
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:
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 >