refactor(theme): the look comes from halkyon_ui
All checks were successful
CI / check (push) Successful in 17m10s
CI / deploy (push) Has been skipped

The theme, Noto Sans, the window sizes and the widgets every screen is
built of move to halkyon_ui (halkyon_shared), pinned to a signed commit
as the sync fork is, so Halkyon's other apps share them. Learn keeps its
own colours (the FSRS ratings, a starred star) as LearnColors beside the
theme, the CJK fonts with their licences, and its launch screen's word
and icon. Nothing on screen changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-18 22:04:10 +02:00
commit f43b92e4db
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
219 changed files with 451 additions and 4755 deletions

File diff suppressed because one or more lines are too long

View file

@ -1,17 +1,18 @@
# Fonts # Fonts
The app brings its fonts with it and never fetches any: text looks the same on The app brings its fonts with it and never fetches any: text looks the same on
every device, whatever fonts it has. every device, whatever fonts it has. Noto Sans, its font, comes with halkyon_ui
(halkyon_shared), which bundles it with its licence and registers it; the fonts
for Japanese, Chinese and Korean are the app's own, here.
| File | Font | Source | Licence | | File | Font | Source | Licence |
|---|---|---|---| |---|---|---|---|
| `NotoSans-Variable.ttf`, `NotoSans-Italic-Variable.ttf` | Noto Sans (Latin, Greek incl. polytonic, Cyrillic), every weight | [notofonts/latin-greek-cyrillic](https://github.com/notofonts/latin-greek-cyrillic) release NotoSans-v2.015, `unhinted/slim-variable-ttf` | SIL Open Font License 1.1, `OFL-NotoSans.txt` |
| `NotoSansJP-Variable.otf`, `NotoSansSC-Variable.otf`, `NotoSansTC-Variable.otf`, `NotoSansKR-Variable.otf` | Noto Sans JP, SC, TC, KR (Japanese, Simplified and Traditional Chinese, Korean), every weight | [notofonts/noto-cjk](https://github.com/notofonts/noto-cjk) `Sans/Variable/OTF/Subset/NotoSans{JP,SC,TC,KR}-VF.otf`, commit f8d157532fbf (2026-10-08) | SIL Open Font License 1.1, `OFL-NotoSansCJK.txt` | | `NotoSansJP-Variable.otf`, `NotoSansSC-Variable.otf`, `NotoSansTC-Variable.otf`, `NotoSansKR-Variable.otf` | Noto Sans JP, SC, TC, KR (Japanese, Simplified and Traditional Chinese, Korean), every weight | [notofonts/noto-cjk](https://github.com/notofonts/noto-cjk) `Sans/Variable/OTF/Subset/NotoSans{JP,SC,TC,KR}-VF.otf`, commit f8d157532fbf (2026-10-08) | SIL Open Font License 1.1, `OFL-NotoSansCJK.txt` |
Noto Sans is the app's font; the CJK fonts fill in the glyphs it lacks, the Noto Sans is the app's font; the CJK fonts fill in the glyphs it lacks, the
one matching a studyset's language first, Japanese otherwise one matching a studyset's language first, Japanese otherwise (halkyon_ui's
(`lib/src/core/theme/app_fonts.dart`): they share most Han characters but draw `appFontFallbackFor`, which names them by the families `pubspec.yaml`
them differently. Noto Sans JP alone would not do as the app's font: it has declares): they share most Han characters but draw them differently. Noto Sans JP alone would not do as the app's font: it has
no accented or polytonic Greek. Scripts none of them covers (Arabic, Hebrew, no accented or polytonic Greek. Scripts none of them covers (Arabic, Hebrew,
Thai, Devanagari, …) come from the device's own fonts. The files are renamed Thai, Devanagari, …) come from the device's own fonts. The files are renamed
only; their glyphs are unchanged. The licences are shown in the app's licence only; their glyphs are unchanged. The licences are shown in the app's licence

View file

@ -1,93 +0,0 @@
Copyright 2022 The Noto Project Authors (https://github.com/notofonts/latin-greek-cyrillic)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View file

@ -2,7 +2,6 @@
"@@locale": "de", "@@locale": "de",
"appTitle": "Halkyon Learn", "appTitle": "Halkyon Learn",
"launchBrand": "Halkyon",
"launchProduct": "Learn", "launchProduct": "Learn",
"shellTabHome": "Startseite", "shellTabHome": "Startseite",
@ -50,8 +49,6 @@
"studysetSheetDiscardMessage": "Du hast ungespeicherte Änderungen an diesem Lernset. Verwerfen und das Formular schließen?", "studysetSheetDiscardMessage": "Du hast ungespeicherte Änderungen an diesem Lernset. Verwerfen und das Formular schließen?",
"studysetSheetDiscardConfirm": "Verwerfen", "studysetSheetDiscardConfirm": "Verwerfen",
"paletteColorName": "{name, select, carrot{Karotte} cerise{Kirschrot} cobalt{Kobalt} copper{Kupfer} enzian{Enzian} fern{Farn} forest{Wald} ocean{Ozean} olive{Olive} pacific{Pazifik} pickle{Essiggurke} pine{Kiefer} pink{Rosa} plum{Pflaume} purple{Lila} reef{Riff} sahara{Sahara} slateblue{Schieferblau} soil{Erde} strawberry{Erdbeere} other{{name}}}",
"colorPickerLabel": "Farbe: {color}",
"studysetCountFlashcards": "{count, plural, =1{1 Karteikarte} other{{count} Karteikarten}}", "studysetCountFlashcards": "{count, plural, =1{1 Karteikarte} other{{count} Karteikarten}}",
"studysetCountNotes": "{count, plural, =1{1 Notiz} other{{count} Notizen}}", "studysetCountNotes": "{count, plural, =1{1 Notiz} other{{count} Notizen}}",
@ -446,7 +443,6 @@
"languageChineseSimplified": "Chinesisch (vereinfacht)", "languageChineseSimplified": "Chinesisch (vereinfacht)",
"languageChineseTraditional": "Chinesisch (traditionell)", "languageChineseTraditional": "Chinesisch (traditionell)",
"fieldRequired": "Pflichtfeld", "fieldRequired": "Pflichtfeld",
"fieldRequiredHelper": "Pflichtfeld",
"exploreTitle": "Entdecken", "exploreTitle": "Entdecken",
"exploreEmpty": "Lernsets, die andere teilen, erscheinen hier.", "exploreEmpty": "Lernsets, die andere teilen, erscheinen hier.",
@ -1090,9 +1086,6 @@
"studySortOldestFirst": "Älteste zuerst", "studySortOldestFirst": "Älteste zuerst",
"studySortRandom": "Zufällig", "studySortRandom": "Zufällig",
"studySortNewestFirst": "Neueste zuerst", "studySortNewestFirst": "Neueste zuerst",
"studyFewer": "Verringern",
"studyMore": "Erhöhen",
"countStepperType": "Zahl eingeben",
"studyLimitNewPerDay": "Neue Karten pro Tag begrenzen", "studyLimitNewPerDay": "Neue Karten pro Tag begrenzen",
"studyLimitReviewsPerDay": "Wiederholungen pro Tag begrenzen", "studyLimitReviewsPerDay": "Wiederholungen pro Tag begrenzen",
@ -1190,7 +1183,6 @@
"commonCancel": "Abbrechen", "commonCancel": "Abbrechen",
"commonSave": "Speichern", "commonSave": "Speichern",
"commonClose": "Schließen", "commonClose": "Schließen",
"commonUndo": "Rückgängig",
"moreInfo": "Weitere Informationen", "moreInfo": "Weitere Informationen",
"moreInfoCreated": "Erstellt", "moreInfoCreated": "Erstellt",
"moreInfoModified": "Zuletzt geändert", "moreInfoModified": "Zuletzt geändert",
@ -1202,8 +1194,6 @@
"moreInfoReviews": "Wiederholungen", "moreInfoReviews": "Wiederholungen",
"moreInfoReviewCount": "Anzahl Wiederholungen", "moreInfoReviewCount": "Anzahl Wiederholungen",
"moreInfoLastReviewed": "Zuletzt wiederholt", "moreInfoLastReviewed": "Zuletzt wiederholt",
"moreInfoCopy": "Kopieren",
"copiedToClipboard": "In die Zwischenablage kopiert",
"commonTryAgain": "Erneut versuchen", "commonTryAgain": "Erneut versuchen",
"personDataFailed": "Die Daten dieses Geräts konnten nicht geöffnet werden.", "personDataFailed": "Die Daten dieses Geräts konnten nicht geöffnet werden.",
"sessionUnreachable": "Der Server war nicht erreichbar.", "sessionUnreachable": "Der Server war nicht erreichbar.",

View file

@ -2,7 +2,6 @@
"@@locale": "en", "@@locale": "en",
"appTitle": "Halkyon Learn", "appTitle": "Halkyon Learn",
"launchBrand": "Halkyon",
"launchProduct": "Learn", "launchProduct": "Learn",
"@appTitle": {"description": "The app's name, e.g. in the window title and the rail's logo."}, "@appTitle": {"description": "The app's name, e.g. in the window title and the rail's logo."},
@ -65,10 +64,6 @@
"studysetSheetDiscardMessage": "You have unsaved changes to this studyset. Discard them and close the form?", "studysetSheetDiscardMessage": "You have unsaved changes to this studyset. Discard them and close the form?",
"studysetSheetDiscardConfirm": "Discard", "studysetSheetDiscardConfirm": "Discard",
"paletteColorName": "{name, select, carrot{Carrot} cerise{Cerise} cobalt{Cobalt} copper{Copper} enzian{Enzian} fern{Fern} forest{Forest} ocean{Ocean} olive{Olive} pacific{Pacific} pickle{Pickle} pine{Pine} pink{Pink} plum{Plum} purple{Purple} reef{Reef} sahara{Sahara} slateblue{Slate blue} soil{Soil} strawberry{Strawberry} other{{name}}}",
"@paletteColorName": {"description": "A colour of the palette content can take, by its stored name.", "placeholders": {"name": {"type": "String"}}},
"colorPickerLabel": "Colour: {color}",
"@colorPickerLabel": {"placeholders": {"color": {"type": "String"}}},
"studysetCountFlashcards": "{count, plural, =1{1 flashcard} other{{count} flashcards}}", "studysetCountFlashcards": "{count, plural, =1{1 flashcard} other{{count} flashcards}}",
"@studysetCountFlashcards": {"placeholders": {"count": {"type": "int"}}}, "@studysetCountFlashcards": {"placeholders": {"count": {"type": "int"}}},
@ -505,7 +500,6 @@
"languageChineseSimplified": "Chinese (Simplified)", "languageChineseSimplified": "Chinese (Simplified)",
"languageChineseTraditional": "Chinese (Traditional)", "languageChineseTraditional": "Chinese (Traditional)",
"fieldRequired": "required", "fieldRequired": "required",
"fieldRequiredHelper": "Required",
"exploreTitle": "Explore", "exploreTitle": "Explore",
"exploreEmpty": "Studysets that others share will appear here.", "exploreEmpty": "Studysets that others share will appear here.",
@ -1240,9 +1234,6 @@
"studySortOldestFirst": "Oldest first", "studySortOldestFirst": "Oldest first",
"studySortRandom": "Random", "studySortRandom": "Random",
"studySortNewestFirst": "Newest first", "studySortNewestFirst": "Newest first",
"studyFewer": "Decrease",
"studyMore": "Increase",
"countStepperType": "Type a number",
"studyLimitNewPerDay": "Limit new cards per day", "studyLimitNewPerDay": "Limit new cards per day",
"studyLimitReviewsPerDay": "Limit reviews per day", "studyLimitReviewsPerDay": "Limit reviews per day",
@ -1350,7 +1341,6 @@
"commonCancel": "Cancel", "commonCancel": "Cancel",
"commonSave": "Save", "commonSave": "Save",
"commonClose": "Close", "commonClose": "Close",
"commonUndo": "Undo",
"moreInfo": "More info", "moreInfo": "More info",
"moreInfoCreated": "Created", "moreInfoCreated": "Created",
"moreInfoModified": "Last modified", "moreInfoModified": "Last modified",
@ -1362,8 +1352,6 @@
"moreInfoReviews": "Reviews", "moreInfoReviews": "Reviews",
"moreInfoReviewCount": "Review count", "moreInfoReviewCount": "Review count",
"moreInfoLastReviewed": "Last reviewed", "moreInfoLastReviewed": "Last reviewed",
"moreInfoCopy": "Copy",
"copiedToClipboard": "Copied to clipboard",
"commonTryAgain": "Try again", "commonTryAgain": "Try again",
"personDataFailed": "Couldn't open this device's data.", "personDataFailed": "Couldn't open this device's data.",
"sessionUnreachable": "Couldn't reach the server.", "sessionUnreachable": "Couldn't reach the server.",

View file

@ -2,7 +2,6 @@
"@@locale": "en_US", "@@locale": "en_US",
"studysetSheetColor": "Color", "studysetSheetColor": "Color",
"colorPickerLabel": "Color: {color}",
"tagSheetColor": "Color", "tagSheetColor": "Color",
"formatAlignCenter": "Center", "formatAlignCenter": "Center",
"homeCustomise": "Customize", "homeCustomise": "Customize",

View file

@ -106,12 +106,6 @@ abstract class AppLocalizations {
/// **'Halkyon Learn'** /// **'Halkyon Learn'**
String get appTitle; String get appTitle;
/// No description provided for @launchBrand.
///
/// In en, this message translates to:
/// **'Halkyon'**
String get launchBrand;
/// No description provided for @launchProduct. /// No description provided for @launchProduct.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@ -352,18 +346,6 @@ abstract class AppLocalizations {
/// **'Discard'** /// **'Discard'**
String get studysetSheetDiscardConfirm; String get studysetSheetDiscardConfirm;
/// A colour of the palette content can take, by its stored name.
///
/// In en, this message translates to:
/// **'{name, select, carrot{Carrot} cerise{Cerise} cobalt{Cobalt} copper{Copper} enzian{Enzian} fern{Fern} forest{Forest} ocean{Ocean} olive{Olive} pacific{Pacific} pickle{Pickle} pine{Pine} pink{Pink} plum{Plum} purple{Purple} reef{Reef} sahara{Sahara} slateblue{Slate blue} soil{Soil} strawberry{Strawberry} other{{name}}}'**
String paletteColorName(String name);
/// No description provided for @colorPickerLabel.
///
/// In en, this message translates to:
/// **'Colour: {color}'**
String colorPickerLabel(String color);
/// No description provided for @studysetCountFlashcards. /// No description provided for @studysetCountFlashcards.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@ -2710,12 +2692,6 @@ abstract class AppLocalizations {
/// **'required'** /// **'required'**
String get fieldRequired; String get fieldRequired;
/// No description provided for @fieldRequiredHelper.
///
/// In en, this message translates to:
/// **'Required'**
String get fieldRequiredHelper;
/// No description provided for @exploreTitle. /// No description provided for @exploreTitle.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@ -6430,24 +6406,6 @@ abstract class AppLocalizations {
/// **'Newest first'** /// **'Newest first'**
String get studySortNewestFirst; String get studySortNewestFirst;
/// No description provided for @studyFewer.
///
/// In en, this message translates to:
/// **'Decrease'**
String get studyFewer;
/// No description provided for @studyMore.
///
/// In en, this message translates to:
/// **'Increase'**
String get studyMore;
/// No description provided for @countStepperType.
///
/// In en, this message translates to:
/// **'Type a number'**
String get countStepperType;
/// No description provided for @studyLimitNewPerDay. /// No description provided for @studyLimitNewPerDay.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@ -7006,12 +6964,6 @@ abstract class AppLocalizations {
/// **'Close'** /// **'Close'**
String get commonClose; String get commonClose;
/// No description provided for @commonUndo.
///
/// In en, this message translates to:
/// **'Undo'**
String get commonUndo;
/// No description provided for @moreInfo. /// No description provided for @moreInfo.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@ -7078,18 +7030,6 @@ abstract class AppLocalizations {
/// **'Last reviewed'** /// **'Last reviewed'**
String get moreInfoLastReviewed; String get moreInfoLastReviewed;
/// No description provided for @moreInfoCopy.
///
/// In en, this message translates to:
/// **'Copy'**
String get moreInfoCopy;
/// No description provided for @copiedToClipboard.
///
/// In en, this message translates to:
/// **'Copied to clipboard'**
String get copiedToClipboard;
/// No description provided for @commonTryAgain. /// No description provided for @commonTryAgain.
/// ///
/// In en, this message translates to: /// In en, this message translates to:

View file

@ -12,9 +12,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get appTitle => 'Halkyon Learn'; String get appTitle => 'Halkyon Learn';
@override
String get launchBrand => 'Halkyon';
@override @override
String get launchProduct => 'Learn'; String get launchProduct => 'Learn';
@ -153,42 +150,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get studysetSheetDiscardConfirm => 'Verwerfen'; String get studysetSheetDiscardConfirm => 'Verwerfen';
@override
String paletteColorName(String name) {
String _temp0 = intl.Intl.selectLogic(
name,
{
'carrot': 'Karotte',
'cerise': 'Kirschrot',
'cobalt': 'Kobalt',
'copper': 'Kupfer',
'enzian': 'Enzian',
'fern': 'Farn',
'forest': 'Wald',
'ocean': 'Ozean',
'olive': 'Olive',
'pacific': 'Pazifik',
'pickle': 'Essiggurke',
'pine': 'Kiefer',
'pink': 'Rosa',
'plum': 'Pflaume',
'purple': 'Lila',
'reef': 'Riff',
'sahara': 'Sahara',
'slateblue': 'Schieferblau',
'soil': 'Erde',
'strawberry': 'Erdbeere',
'other': '$name',
},
);
return '$_temp0';
}
@override
String colorPickerLabel(String color) {
return 'Farbe: $color';
}
@override @override
String studysetCountFlashcards(int count) { String studysetCountFlashcards(int count) {
String _temp0 = intl.Intl.pluralLogic( String _temp0 = intl.Intl.pluralLogic(
@ -1672,9 +1633,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get fieldRequired => 'Pflichtfeld'; String get fieldRequired => 'Pflichtfeld';
@override
String get fieldRequiredHelper => 'Pflichtfeld';
@override @override
String get exploreTitle => 'Entdecken'; String get exploreTitle => 'Entdecken';
@ -4029,15 +3987,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get studySortNewestFirst => 'Neueste zuerst'; String get studySortNewestFirst => 'Neueste zuerst';
@override
String get studyFewer => 'Verringern';
@override
String get studyMore => 'Erhöhen';
@override
String get countStepperType => 'Zahl eingeben';
@override @override
String get studyLimitNewPerDay => 'Neue Karten pro Tag begrenzen'; String get studyLimitNewPerDay => 'Neue Karten pro Tag begrenzen';
@ -4387,9 +4336,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get commonClose => 'Schließen'; String get commonClose => 'Schließen';
@override
String get commonUndo => 'Rückgängig';
@override @override
String get moreInfo => 'Weitere Informationen'; String get moreInfo => 'Weitere Informationen';
@ -4423,12 +4369,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get moreInfoLastReviewed => 'Zuletzt wiederholt'; String get moreInfoLastReviewed => 'Zuletzt wiederholt';
@override
String get moreInfoCopy => 'Kopieren';
@override
String get copiedToClipboard => 'In die Zwischenablage kopiert';
@override @override
String get commonTryAgain => 'Erneut versuchen'; String get commonTryAgain => 'Erneut versuchen';

View file

@ -12,9 +12,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get appTitle => 'Halkyon Learn'; String get appTitle => 'Halkyon Learn';
@override
String get launchBrand => 'Halkyon';
@override @override
String get launchProduct => 'Learn'; String get launchProduct => 'Learn';
@ -151,42 +148,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get studysetSheetDiscardConfirm => 'Discard'; String get studysetSheetDiscardConfirm => 'Discard';
@override
String paletteColorName(String name) {
String _temp0 = intl.Intl.selectLogic(
name,
{
'carrot': 'Carrot',
'cerise': 'Cerise',
'cobalt': 'Cobalt',
'copper': 'Copper',
'enzian': 'Enzian',
'fern': 'Fern',
'forest': 'Forest',
'ocean': 'Ocean',
'olive': 'Olive',
'pacific': 'Pacific',
'pickle': 'Pickle',
'pine': 'Pine',
'pink': 'Pink',
'plum': 'Plum',
'purple': 'Purple',
'reef': 'Reef',
'sahara': 'Sahara',
'slateblue': 'Slate blue',
'soil': 'Soil',
'strawberry': 'Strawberry',
'other': '$name',
},
);
return '$_temp0';
}
@override
String colorPickerLabel(String color) {
return 'Colour: $color';
}
@override @override
String studysetCountFlashcards(int count) { String studysetCountFlashcards(int count) {
String _temp0 = intl.Intl.pluralLogic( String _temp0 = intl.Intl.pluralLogic(
@ -1657,9 +1618,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get fieldRequired => 'required'; String get fieldRequired => 'required';
@override
String get fieldRequiredHelper => 'Required';
@override @override
String get exploreTitle => 'Explore'; String get exploreTitle => 'Explore';
@ -3997,15 +3955,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get studySortNewestFirst => 'Newest first'; String get studySortNewestFirst => 'Newest first';
@override
String get studyFewer => 'Decrease';
@override
String get studyMore => 'Increase';
@override
String get countStepperType => 'Type a number';
@override @override
String get studyLimitNewPerDay => 'Limit new cards per day'; String get studyLimitNewPerDay => 'Limit new cards per day';
@ -4350,9 +4299,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get commonClose => 'Close'; String get commonClose => 'Close';
@override
String get commonUndo => 'Undo';
@override @override
String get moreInfo => 'More info'; String get moreInfo => 'More info';
@ -4386,12 +4332,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get moreInfoLastReviewed => 'Last reviewed'; String get moreInfoLastReviewed => 'Last reviewed';
@override
String get moreInfoCopy => 'Copy';
@override
String get copiedToClipboard => 'Copied to clipboard';
@override @override
String get commonTryAgain => 'Try again'; String get commonTryAgain => 'Try again';
@ -7826,11 +7766,6 @@ class AppLocalizationsEnUs extends AppLocalizationsEn {
@override @override
String get studysetSheetColor => 'Color'; String get studysetSheetColor => 'Color';
@override
String colorPickerLabel(String color) {
return 'Color: $color';
}
@override @override
String get studysetSheetLicense => 'License'; String get studysetSheetLicense => 'License';

View file

@ -10,12 +10,13 @@ import 'package:halkyon_learn_flutter/src/core/instance/instance.dart';
import 'package:halkyon_learn_flutter/src/core/instance/instance_checker.dart'; import 'package:halkyon_learn_flutter/src/core/instance/instance_checker.dart';
import 'package:halkyon_learn_flutter/src/core/instance/instance_choice.dart'; import 'package:halkyon_learn_flutter/src/core/instance/instance_choice.dart';
import 'package:halkyon_learn_flutter/src/core/instance/instance_store.dart'; import 'package:halkyon_learn_flutter/src/core/instance/instance_store.dart';
import 'package:halkyon_learn_flutter/src/core/theme/app_fonts.dart'; import 'package:halkyon_learn_flutter/src/core/theme/cjk_fonts.dart';
import 'package:halkyon_learn_flutter/src/feature/auth/widget/session_gate.dart'; import 'package:halkyon_learn_flutter/src/feature/auth/widget/session_gate.dart';
import 'package:halkyon_learn_flutter/src/feature/dictionary/data/mecab_license.dart'; import 'package:halkyon_learn_flutter/src/feature/dictionary/data/mecab_license.dart';
import 'package:halkyon_learn_flutter/src/feature/geo_map/data/cldr_license.dart'; import 'package:halkyon_learn_flutter/src/feature/geo_map/data/cldr_license.dart';
import 'package:halkyon_learn_flutter/src/feature/instance/data/flag_icons_license.dart'; import 'package:halkyon_learn_flutter/src/feature/instance/data/flag_icons_license.dart';
import 'package:halkyon_learn_flutter/src/feature/kanji/data/kanjivg_license.dart'; import 'package:halkyon_learn_flutter/src/feature/kanji/data/kanjivg_license.dart';
import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:serverpod_flutter/serverpod_flutter.dart'; import 'package:serverpod_flutter/serverpod_flutter.dart';
@ -23,7 +24,8 @@ import 'package:serverpod_flutter/serverpod_flutter.dart';
Future<void> main() async { Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
Bloc.observer = const AppBlocObserver(); Bloc.observer = const AppBlocObserver();
registerAppFontLicenses(); registerFontLicenses();
registerCjkFontLicenses();
registerKanjiVgLicense(); registerKanjiVgLicense();
registerFlagIconsLicense(); registerFlagIconsLicense();
registerCldrLicense(); registerCldrLicense();

View file

@ -5,11 +5,6 @@ import 'package:halkyon_learn_flutter/src/core/dependencies/person_scope.dart';
import 'package:halkyon_learn_flutter/src/core/router/app_shell.dart'; import 'package:halkyon_learn_flutter/src/core/router/app_shell.dart';
import 'package:halkyon_learn_flutter/src/core/router/route_paths.dart'; import 'package:halkyon_learn_flutter/src/core/router/route_paths.dart';
import 'package:halkyon_learn_flutter/src/core/router/tab_visibility.dart'; import 'package:halkyon_learn_flutter/src/core/router/tab_visibility.dart';
import 'package:halkyon_learn_flutter/src/core/theme/brand.dart';
import 'package:halkyon_learn_flutter/src/core/theme/palette_color.dart';
import 'package:halkyon_learn_flutter/src/core/widget/found_by_id.dart';
import 'package:halkyon_learn_flutter/src/core/widget/screen_tint.dart';
import 'package:halkyon_learn_flutter/src/core/widget/tinted_frame.dart';
import 'package:halkyon_learn_flutter/src/feature/assistant/widget/connect_claude_screen.dart'; import 'package:halkyon_learn_flutter/src/feature/assistant/widget/connect_claude_screen.dart';
import 'package:halkyon_learn_flutter/src/feature/auth/widget/profile_screen.dart'; import 'package:halkyon_learn_flutter/src/feature/auth/widget/profile_screen.dart';
import 'package:halkyon_learn_flutter/src/feature/card/bloc/card_composer_bloc.dart'; import 'package:halkyon_learn_flutter/src/feature/card/bloc/card_composer_bloc.dart';
@ -44,6 +39,7 @@ import 'package:halkyon_learn_flutter/src/feature/studyset/widget/library_screen
import 'package:halkyon_learn_flutter/src/feature/studyset/widget/studyset_language_scope.dart'; import 'package:halkyon_learn_flutter/src/feature/studyset/widget/studyset_language_scope.dart';
import 'package:halkyon_learn_flutter/src/feature/studyset/widget/studyset_screen.dart'; import 'package:halkyon_learn_flutter/src/feature/studyset/widget/studyset_screen.dart';
import 'package:halkyon_learn_flutter/src/feature/tag/bloc/jellyfin_tags_bloc.dart'; import 'package:halkyon_learn_flutter/src/feature/tag/bloc/jellyfin_tags_bloc.dart';
import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';
/// The router of one person's app: the four tabs in a shell, each with its own /// The router of one person's app: the four tabs in a shell, each with its own
@ -406,7 +402,7 @@ Widget _studysetScreen(
StudysetScreen(studyset: studyset, all: all, importOnOpen: importOnOpen), StudysetScreen(studyset: studyset, all: all, importOnOpen: importOnOpen),
wayBack: ( wayBack: (
label: AppLocalizations.of(context).studysetBackToLibrary, label: AppLocalizations.of(context).studysetBackToLibrary,
location: RoutePaths.library, onPressed: () => context.go(RoutePaths.library),
), ),
); );
@ -417,7 +413,7 @@ Widget _inStudyset(
BuildContext context, BuildContext context,
String id, String id,
Widget Function(Studyset studyset, List<Studyset> all) builder, { Widget Function(Studyset studyset, List<Studyset> all) builder, {
({String label, String location})? wayBack, ({String label, VoidCallback onPressed})? wayBack,
}) => FoundById<Studyset>( }) => FoundById<Studyset>(
id: id, id: id,
items: PersonScope.of(context).studysets.watchAll, items: PersonScope.of(context).studysets.watchAll,

View file

@ -13,8 +13,8 @@ import 'package:halkyon_learn_flutter/src/core/instance/instance_checker.dart';
import 'package:halkyon_learn_flutter/src/core/instance/instance_choice.dart'; import 'package:halkyon_learn_flutter/src/core/instance/instance_choice.dart';
import 'package:halkyon_learn_flutter/src/core/instance/instance_scope.dart'; import 'package:halkyon_learn_flutter/src/core/instance/instance_scope.dart';
import 'package:halkyon_learn_flutter/src/core/l10n/app_languages.dart'; import 'package:halkyon_learn_flutter/src/core/l10n/app_languages.dart';
import 'package:halkyon_learn_flutter/src/core/theme/app_theme.dart'; import 'package:halkyon_learn_flutter/src/core/theme/learn_theme.dart';
import 'package:halkyon_learn_flutter/src/core/widget/launch_screen.dart'; import 'package:halkyon_learn_flutter/src/core/widget/app_launch_screen.dart';
import 'package:halkyon_learn_flutter/src/feature/instance/widget/first_start_screen.dart'; import 'package:halkyon_learn_flutter/src/feature/instance/widget/first_start_screen.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';
@ -149,7 +149,7 @@ class _InstanceGateState() extends State<InstanceGate> {
), ),
), ),
// Opening, or closing the one before. // Opening, or closing the one before.
_ => _PlainApp(look: _look, home: const LaunchScreen()), _ => _PlainApp(look: _look, home: const AppLaunchScreen()),
}, },
); );
} }
@ -163,8 +163,8 @@ class const _PlainApp({
@override @override
Widget build(BuildContext context) => MaterialApp( Widget build(BuildContext context) => MaterialApp(
onGenerateTitle: (context) => AppLocalizations.of(context).appTitle, onGenerateTitle: (context) => AppLocalizations.of(context).appTitle,
theme: appTheme(Brightness.light), theme: learnTheme(Brightness.light),
darkTheme: appTheme(Brightness.dark), darkTheme: learnTheme(Brightness.dark),
themeMode: look.themeMode, themeMode: look.themeMode,
locale: look.locale, locale: look.locale,
localeListResolutionCallback: resolveAppLocale, localeListResolutionCallback: resolveAppLocale,

View file

@ -11,14 +11,14 @@ import 'package:halkyon_learn_flutter/src/core/editor/editor_blocks.dart';
import 'package:halkyon_learn_flutter/src/core/l10n/app_languages.dart'; import 'package:halkyon_learn_flutter/src/core/l10n/app_languages.dart';
import 'package:halkyon_learn_flutter/src/core/router/route_paths.dart'; import 'package:halkyon_learn_flutter/src/core/router/route_paths.dart';
import 'package:halkyon_learn_flutter/src/core/sync/bloc/sync_status_bloc.dart'; import 'package:halkyon_learn_flutter/src/core/sync/bloc/sync_status_bloc.dart';
import 'package:halkyon_learn_flutter/src/core/theme/app_theme.dart'; import 'package:halkyon_learn_flutter/src/core/theme/learn_theme.dart';
import 'package:halkyon_learn_flutter/src/core/widget/keyboard_back_on_resume.dart';
import 'package:halkyon_learn_flutter/src/feature/auth/bloc/session_bloc.dart'; import 'package:halkyon_learn_flutter/src/feature/auth/bloc/session_bloc.dart';
import 'package:halkyon_learn_flutter/src/feature/auth/model/auth_status.dart'; import 'package:halkyon_learn_flutter/src/feature/auth/model/auth_status.dart';
import 'package:halkyon_learn_flutter/src/feature/feedback/bloc/inbox_count_bloc.dart'; import 'package:halkyon_learn_flutter/src/feature/feedback/bloc/inbox_count_bloc.dart';
import 'package:halkyon_learn_flutter/src/feature/pomodoro/bloc/pomodoro_bloc.dart'; import 'package:halkyon_learn_flutter/src/feature/pomodoro/bloc/pomodoro_bloc.dart';
import 'package:halkyon_learn_flutter/src/feature/pomodoro/widget/pomodoro_presenter.dart'; import 'package:halkyon_learn_flutter/src/feature/pomodoro/widget/pomodoro_presenter.dart';
import 'package:halkyon_learn_flutter/src/feature/study/widget/study_button_block.dart'; import 'package:halkyon_learn_flutter/src/feature/study/widget/study_button_block.dart';
import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';
/// The blocks of the person's editors: the core's and the features'. /// The blocks of the person's editors: the core's and the features'.
@ -65,8 +65,8 @@ class _PersonAppState() extends State<PersonApp> {
final settings = context.watch<DeviceSettingsBloc>().state; final settings = context.watch<DeviceSettingsBloc>().state;
return MaterialApp.router( return MaterialApp.router(
onGenerateTitle: (context) => AppLocalizations.of(context).appTitle, onGenerateTitle: (context) => AppLocalizations.of(context).appTitle,
theme: appTheme(Brightness.light), theme: learnTheme(Brightness.light),
darkTheme: appTheme(Brightness.dark), darkTheme: learnTheme(Brightness.dark),
themeMode: settings.themeMode, themeMode: settings.themeMode,
locale: settings.locale, locale: settings.locale,
localeListResolutionCallback: resolveAppLocale, localeListResolutionCallback: resolveAppLocale,

View file

@ -6,8 +6,7 @@ import 'package:halkyon_learn_flutter/src/core/citation/model/citation.dart';
import 'package:halkyon_learn_flutter/src/core/citation/model/source.dart'; import 'package:halkyon_learn_flutter/src/core/citation/model/source.dart';
import 'package:halkyon_learn_flutter/src/core/citation/widget/source_sheet.dart'; import 'package:halkyon_learn_flutter/src/core/citation/widget/source_sheet.dart';
import 'package:halkyon_learn_flutter/src/core/citation/widget/source_view.dart'; import 'package:halkyon_learn_flutter/src/core/citation/widget/source_view.dart';
import 'package:halkyon_learn_flutter/src/core/widget/adaptive_sheet.dart'; import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:halkyon_learn_flutter/src/core/widget/undo_snack_bar.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';

View file

@ -1,10 +1,7 @@
import 'package:halkyon_learn_flutter/l10n/app_localizations.dart'; import 'package:halkyon_learn_flutter/l10n/app_localizations.dart';
import 'package:halkyon_learn_flutter/src/core/citation/model/source.dart'; import 'package:halkyon_learn_flutter/src/core/citation/model/source.dart';
import 'package:halkyon_learn_flutter/src/core/video/youtube_videos.dart'; import 'package:halkyon_learn_flutter/src/core/video/youtube_videos.dart';
import 'package:halkyon_learn_flutter/src/core/widget/adaptive_sheet.dart'; import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:halkyon_learn_flutter/src/core/widget/confirm_dialog.dart';
import 'package:halkyon_learn_flutter/src/core/widget/field_label.dart';
import 'package:halkyon_learn_flutter/src/core/widget/text_limits.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';

View file

@ -3,7 +3,7 @@ import 'dart:async';
import 'package:halkyon_learn_flutter/l10n/app_localizations.dart'; import 'package:halkyon_learn_flutter/l10n/app_localizations.dart';
import 'package:halkyon_learn_flutter/src/core/dependencies/dependencies_scope.dart'; import 'package:halkyon_learn_flutter/src/core/dependencies/dependencies_scope.dart';
import 'package:halkyon_learn_flutter/src/core/dependencies/person_dependencies.dart'; import 'package:halkyon_learn_flutter/src/core/dependencies/person_dependencies.dart';
import 'package:halkyon_learn_flutter/src/core/widget/launch_screen.dart'; import 'package:halkyon_learn_flutter/src/core/widget/app_launch_screen.dart';
import 'package:halkyon_learn_flutter/src/feature/auth/model/auth_status.dart'; import 'package:halkyon_learn_flutter/src/feature/auth/model/auth_status.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';
@ -77,7 +77,7 @@ class _PersonScopeState() extends State<PersonScope> {
), ),
), ),
), ),
_ => const LaunchScreen(), _ => const AppLaunchScreen(),
}, },
); );
} }

View file

@ -1,6 +1,6 @@
import 'package:halkyon_learn_flutter/l10n/app_localizations.dart'; import 'package:halkyon_learn_flutter/l10n/app_localizations.dart';
import 'package:halkyon_learn_flutter/src/core/editor/editor_blocks.dart'; import 'package:halkyon_learn_flutter/src/core/editor/editor_blocks.dart';
import 'package:halkyon_learn_flutter/src/core/widget/adaptive_sheet.dart'; import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';
/// Lets the person choose one of [blocks] to insert, listed by their /// Lets the person choose one of [blocks] to insert, listed by their

View file

@ -5,8 +5,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:halkyon_learn_flutter/l10n/app_localizations.dart'; import 'package:halkyon_learn_flutter/l10n/app_localizations.dart';
import 'package:halkyon_learn_flutter/src/core/content/content_blocks.dart'; import 'package:halkyon_learn_flutter/src/core/content/content_blocks.dart';
import 'package:halkyon_learn_flutter/src/core/editor/editor_blocks.dart'; import 'package:halkyon_learn_flutter/src/core/editor/editor_blocks.dart';
import 'package:halkyon_learn_flutter/src/core/theme/theme_extras.dart'; import 'package:halkyon_ui/halkyon_ui.dart';
import 'package:halkyon_learn_flutter/src/core/widget/text_limits.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:material_ui/material_ui.dart'; import 'package:material_ui/material_ui.dart';

Some files were not shown because too many files have changed in this diff Show more