feat: color a site from its address, and offer a failed web page to the system browser

This commit is contained in:
randogoth 2026-10-11 22:32:44 +03:00
parent 56db479df0
commit 9d9f09ebc7
24 changed files with 597 additions and 25 deletions

View file

@ -166,9 +166,6 @@ class _ThemedApp extends StatelessWidget {
// Read so the whole app rebuilds when the reader changes language.
settings.language.value;
final page = deps.browser.currentPage.value;
final variant = settings.variant.value == 'site'
? (page?.variant ?? MewsVariant.plain)
: pageVariantFromName(settings.variant.value);
// Flutter's own widgets and the text direction follow the same
// language, so a right-to-left interface mirrors without us asking.
@ -188,17 +185,25 @@ class _ThemedApp extends StatelessWidget {
GlobalCupertinoLocalizations.delegate,
],
themeMode: mode,
theme: _themeFor(
paletteFor(pageVariant: variant, readerVariant: 'site', dark: false),
font),
darkTheme: _themeFor(
paletteFor(pageVariant: variant, readerVariant: 'site', dark: true),
font),
theme: _themeFor(_chromePalette(settings, page, dark: false), font),
darkTheme: _themeFor(_chromePalette(settings, page, dark: true), font),
home: const ReaderScreen(),
);
});
}
/// The interface wears the current page's palette, so the chrome around a
/// page matches it.
MewsPalette _chromePalette(ReaderSettingsController settings, MewsPage? page,
{required bool dark}) {
return paletteFor(
pageVariant: page?.variant ?? MewsVariant.plain,
readerVariant: settings.variant.value,
dark: dark,
url: page?.url,
);
}
ThemeData _themeFor(MewsPalette palette, String fontFamily) {
final dark = palette.background.computeLuminance() < 0.5;
final scheme = ColorScheme(