| Filename | Latest commit message | Latest commit date |
|---|---|---|
The developer's list of 9 Nov 2026, Todo's part: - Quick add: the down arrow and Tab move into the description, with its cursor (halkyon_editor's fix); Escape closes the projects or labels suggested first, then closes quick add, what was typed discarded; the project's chip shows the project's colour. - A project without a colour of its own shows its parent's, the nearest ancestor's with one (colorOfProject, TodoCubit.colorOf), wherever a project's colour shows; the project editor's "Same colour as its parent" keeps it so, and the parent picker shows each project in its colour. A project of its own always has one. - The task pane's x closes it, always; Close left the ⋮ menu. - A task's row opens its menu on a right click: Mark as done, Date, Move to, Labels, Priority, Deadline, Duplicate and Delete, the selection's actions for that one task. - Delete completed tasks, in the ⋮ of the Inbox, Today, Upcoming and a project, with Undo: the tasks leave the list at once and are deleted once the snack bar goes without its Undo (halkyon_ui's showUndoSnackBar gains onKept). Whats-New: Quick add: the arrow keys and Tab reach the description, and Escape closes it without saving. Whats-New-De: Schnell hinzufügen: Pfeiltasten und Tab erreichen die Beschreibung, und Escape schließt es, ohne zu speichern. Whats-New: Sub-projects take their parent's colour unless they have their own. Whats-New-De: Unterprojekte übernehmen die Farbe ihres übergeordneten Projekts, wenn sie keine eigene haben. Whats-New: A right click on a task opens its menu, with Move to and more; Delete completed tasks clears a list, with Undo. Whats-New-De: Ein Rechtsklick auf eine Aufgabe öffnet ihr Menü, mit Verschieben nach und mehr; Erledigte Aufgaben löschen räumt eine Liste auf, mit Rückgängig. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me> |
||
| .. | ||
| assets/fonts | ||
| example | ||
| lib | ||
| test | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| CHANGELOG.md | ||
| l10n.yaml | ||
| LICENSE | ||
| pubspec.yaml | ||
| README.md | ||
halkyon_ui
Halkyon's look, shared by its apps (Learn, Todo, Train): one theme around the kingfisher's cobalt and copper, the bundled Noto Sans, Material 3's window sizes, and the widgets every app's screens are built of, with their texts in British English, American English and German.
Written as the apps are: Dart 3.13's primary constructors, Material from
package:material_ui (never package:flutter/material.dart), Lucide icons,
LeanCode's lints.
What it holds
- Theme (
lib/src/theme/):appTheme(brightness, extensions: …), Material 3 with hand-written light and dark schemes (primary cobalt, tertiary copper, cobalt-tinted neutrals), Material 3 Expressive's 64 dp navigation bar, flat app bars, floating snack bars;Brand;ThemeExtras, the status colours Material has no role for (Theme.of(context).extras);PaletteColor, the 20 colours a person can give content, each with a text colour held to WCAG AA by a test;FittedSnackBars. - Fonts: Noto Sans for Latin, Greek and Cyrillic, every weight in one
variable file, as
appFontFamily(packages/halkyon_ui/Noto Sans). Chinese, Japanese and Korean fall back toNoto Sans JP,SC,TCandKR, which an app bundles itself if it needs them (appFontFallbackForputs a language's own first). - Layout (
lib/src/layout/):WindowSize(context.windowSize) andreadableContentMaxWidth. - Widgets (
lib/src/widget/):showAdaptiveSheetwithSheetScaffold;TopGradient,ScreenTint,ScreenColor,TintFrame,FramedScreenandTabVisibility;FlushNavigationBar, andNavigationFrame, every app's frame around its tabs (the rail with the app's icon, the bar flush with the foot with a fade above it, its rounded top corners and the wave a tap sends over it in the colour of the screen in view, the tab chosen in that colour made legible (readableTone), without Material's ripple or the indicator growing, on the bar's neutral surface (decided 8 Nov 2026, ADR 0030's amendment of D60), a tick on every choice, a status such as a recording under way above the bar), whichever router drives it;AppLoadingIndicator,ButtonLoadingIndicator,AppRefreshIndicator;SectionCard,SliverCentered,EmptyListMessage,CountBadge,TitleWithKicker,CollapsingRow,ScrollHidingFab,ShimmerandSkeletonBox,liftWhileDragged,ReorderToggle,ReorderGrip;ChevronField,requiredDecoration,FieldInfoButton,CountStepper,PaletteColorPicker,TextLimitswithnearLimitCounter;confirmDestructiveAction,showUndoSnackBar,showMoreInfoSheet;FoundById;KeyboardBackOnResume;BrandWordmarkandLaunchScreen, which take the app's word and icon.
What belongs to one app stays in it: its own colours (an extension passed to
appTheme), routes, repositories, editors and texts.
Using it in an app
Depend on it by path, within the repository's workspace (an app's packages sit in
apps/<app>/), so a change to the package and to the apps using it is one commit:
dependencies:
halkyon_ui:
path: ../../../packages/halkyon_ui
Then set the app up as example/lib/main.dart does:
MaterialApp(
theme: appTheme(Brightness.light, extensions: [MyColors.light]),
darkTheme: appTheme(Brightness.dark, extensions: [MyColors.dark]),
localizationsDelegates: const [
AppLocalizations.delegate,
HalkyonUiLocalizations.delegate,
// material_ui's: flutter_localizations' serve only the SDK's Material.
...GlobalMaterialLocalizations.delegates,
],
supportedLocales: AppLocalizations.supportedLocales,
builder: (context, child) => FittedSnackBars(child: child!),
…
);
and call registerFontLicenses() at start. An app bundling the CJK fonts
declares them in its own pubspec.yaml under exactly the names
appFontFallback lists (no packages/ prefix) and registers their licence
itself.
Texts
lib/l10n/halkyon_ui_en.arb is the template (British English, also the
fallback); halkyon_ui_de.arb German, informal "du"; halkyon_ui_en_US.arb
only what American English spells differently; halkyon_ui_en_GB.arb empty. A
new text goes into the template and German together (test/l10n/ fails
otherwise). flutter pub get writes lib/l10n/halkyon_ui_localizations*.dart,
which are committed and never edited or
formatted by hand.
Checks
From the workspace root: dart analyze --fatal-infos; then flutter test in
packages/halkyon_ui and in packages/halkyon_ui/example, whose tests check
what only an app sees (the font under the name an app finds it by, its
licence).