halkyon/packages/halkyon_app/lib/halkyon_app.dart
Tizian 「ティツィアーン」 23d3bcb4ca
feat(app,learn): the device's appearance and language, halkyon_app's, as Learn's Settings show them
The developer asked for Todo, Train and Meditate to offer Learn's
Appearance and Language (ADR 0014's amendment of 4 Nov 2026). Their
model, store, cubit and card move into halkyon_app: Appearance and Look
(a BCP 47 tag, null for the device's language), FileLookStore keeping it
in the app's support folder as JSON written by rename (per device, not
synced, read before the first frame), LookCubit for the apps to provide
above InstanceGate, and LookSettingsCard / DeviceLookCard with the texts
moved from Learn's arbs (look*, the same words). Each app passes the
languages it speaks, named in their own language.

Learn keeps its stored choice where it was, among its DeviceSettings,
and feeds the shared card from them: no migration, so nobody's language
or appearance moves, and nothing changes on its screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-05 08:58:40 +01:00

200 lines
10 KiB
Dart

/// What every Halkyon app is built around, on an instance's halkyon_base:
///
/// - **Instances**: the ones a device keeps an account on, one in use at a
/// time (`InstanceChoice`), chosen at first start (`FirstStartScreen`) or
/// added later (`showAccountSwitcher`), each checked before the app moves
/// there (`InstanceChecker`) and saying where it keeps people's data.
/// - **Gates**: `InstanceGate` opens the app's dependencies on the instance
/// in use (`AppDependencies`, `AppScope`); `SessionGate` keeps a person
/// signed in and asks how to start once signed out (`StartScreen`);
/// `PersonScope` opens each person's own dependencies. While an account
/// waits for the instance's operator, `WaitScreen` shows where its wait
/// stands (Halkyon Learn's ADR 0021, D31).
/// - **The look**: the device's appearance and language (`Look`), kept on
/// it (`FileLookStore`) and applied before anyone signs in (`LookCubit`),
/// chosen in Settings (`DeviceLookCard`, `LookSettingsCard`; ADR 0014's
/// amendment of 4 Nov 2026).
/// - **The account and About**: `AccountTiles` for an app's settings,
/// `showAppAbout` with the source of what the instance runs, and
/// `resolveAppLocale`, the language every Halkyon app picks.
/// - **The instance's operators**: `InstanceOperatorCard` (or
/// `InstanceOperatorTiles`) and `WaitingAccountsBadge` for whoever
/// operates the instance, on `OperatingCubit`, leading to
/// `InstanceOperatorScreen`, an overview whose screens approve, refuse and
/// suspend accounts and name operators (Halkyon Learn's ADR 0021, D21 to
/// D24, D61, D62).
/// - **Assistants**: `AssistantsCard` for an app's settings, what the
/// operator grants a person and their own keys where allowed, on
/// `AssistantRepository`; `AssistantGrantsScreen` from the operator's
/// screen, on `AssistantOperatorRepository` (Halkyon Learn's ADR 0021,
/// step 2, D57 to D63).
/// `package:halkyon_app/assistant_models.dart` holds the models alone.
/// - **Signing in**: with SimpleLogin (ADR 0020: `SimpleLoginRepository`,
/// its sheet and `SimpleLoginSection`), with a password and TOTP (ADR
/// 0017: `PasswordRepository`, its sheets and `AccountSecuritySection`),
/// the session on `AuthRepository` and `ServerpodAuthGateway`, the
/// account's keys on the device. Every account has a way in: there are no
/// anonymous ones (ADR 0020, D4).
/// - **What's new**: `WhatsNew` reads what each release changed from the
/// app's `assets/whats_new/` (`tool/release.dart` drafts it), and
/// `WhatsNewOnUpdate` shows it once after an update, `WhatsNewTile` in
/// Settings again, both under the app's `WhatsNewScope`.
/// - **Sync**: `SyncService` on triggers, the changes still waiting, and
/// where it stands (`SyncStatusBloc`, `SyncStatusCard`, `AppMismatchBanner`,
/// `SyncTroubleBadge`).
///
/// An app gives its name, look and own words as an `AppFrame`, and installs
/// `HalkyonAppLocalizations.delegate` beside its own.
library;
export 'l10n/halkyon_app_localizations.dart';
export 'src/app/about.dart';
export 'src/app/app_frame.dart' show AppFrame, AppFrameScope, LookSettings;
export 'src/app/app_locale.dart';
export 'src/app/app_scope.dart';
export 'src/app/instance_gate.dart';
export 'src/app/person_scope.dart';
export 'src/assistant/bloc/assistant_grant_cubit.dart';
export 'src/assistant/bloc/assistant_use_cubit.dart';
export 'src/assistant/bloc/assistants_cubit.dart';
export 'src/assistant/data/assistant_gateway.dart';
export 'src/assistant/data/assistant_messages.dart'
show
eventsOf,
failureOf,
llmMessageOf,
messageOf,
ownKeyFailureOf,
questionOf;
export 'src/assistant/data/assistant_repository.dart';
export 'src/assistant/data/serverpod_assistant_gateway.dart';
export 'src/assistant/model/assistant_amount.dart';
export 'src/assistant/model/assistant_failed.dart';
export 'src/assistant/model/assistant_grant.dart';
export 'src/assistant/model/assistant_offer.dart';
export 'src/assistant/model/assistant_provider.dart';
export 'src/assistant/model/own_assistant.dart';
export 'src/assistant/model/provider_terms.dart';
export 'src/assistant/widget/assistant_grants_screen.dart';
export 'src/assistant/widget/assistant_provider_view.dart';
export 'src/assistant/widget/assistant_use_view.dart';
export 'src/assistant/widget/assistant_words.dart';
export 'src/assistant/widget/assistants_card.dart';
export 'src/async/delayed_deletions.dart';
export 'src/auth/bloc/session_bloc.dart';
export 'src/auth/bloc/sign_in_ways_cubit.dart';
export 'src/auth/bloc/wait_cubit.dart';
export 'src/auth/data/account_wait_store.dart';
export 'src/auth/data/auth_gateway.dart';
export 'src/auth/data/auth_repository.dart';
export 'src/auth/data/serverpod_auth_gateway.dart';
export 'src/auth/data/sign_in_addresses.dart';
export 'src/auth/model/account_wait.dart';
export 'src/auth/model/auth_status.dart';
export 'src/auth/model/session_grant.dart';
export 'src/auth/model/sign_in_ways.dart';
export 'src/auth/model/sign_ups.dart';
export 'src/auth/widget/account_tiles.dart';
export 'src/auth/widget/session_gate.dart';
export 'src/auth/widget/start_screen.dart';
export 'src/auth/widget/wait_screen.dart';
export 'src/base/base_client.dart';
export 'src/files/file_picker.dart';
export 'src/files/file_saver.dart';
export 'src/handle/bloc/handle_check_cubit.dart';
export 'src/handle/model/handle_problem.dart';
export 'src/handle/widget/handle_field.dart';
export 'src/instance/cldr_license.dart';
export 'src/instance/country_names.dart';
export 'src/instance/european_union.dart';
export 'src/instance/flag_icons_license.dart';
export 'src/instance/instance.dart';
export 'src/instance/instance_checker.dart';
export 'src/instance/instance_choice.dart';
export 'src/instance/instance_locations.dart';
export 'src/instance/instance_scope.dart';
export 'src/instance/instance_storage.dart';
export 'src/instance/instance_store.dart';
export 'src/instance/subdivision_names.dart';
export 'src/instance/widget/account_switcher_sheet.dart';
export 'src/instance/widget/first_start_screen.dart';
export 'src/instance/widget/instance_location.dart';
export 'src/instance/widget/instance_location_words.dart';
export 'src/instance/widget/instance_step.dart';
export 'src/instance/widget/instance_tile.dart';
export 'src/look/bloc/look_cubit.dart';
export 'src/look/data/look_store.dart';
export 'src/look/model/look.dart';
export 'src/look/widget/look_settings_card.dart';
export 'src/operator/bloc/account_suggestions_cubit.dart';
export 'src/operator/bloc/operating_cubit.dart';
export 'src/operator/bloc/operator_list_cubit.dart';
export 'src/operator/bloc/operator_overview_cubit.dart';
export 'src/operator/data/instance_operator_gateway.dart';
export 'src/operator/data/instance_operator_repository.dart';
export 'src/operator/data/serverpod_instance_operator_gateway.dart';
export 'src/operator/model/operated_account.dart';
export 'src/operator/widget/instance_operator_card.dart';
export 'src/operator/widget/instance_operator_screen.dart';
export 'src/password/bloc/account_recovery_cubit.dart';
export 'src/password/bloc/account_security_cubit.dart';
export 'src/password/bloc/account_setup_cubit.dart';
export 'src/password/bloc/password_sign_in_cubit.dart';
export 'src/password/data/account_crypto.dart';
export 'src/password/data/account_key_store.dart';
export 'src/password/data/password_gateway.dart';
export 'src/password/data/password_repository.dart';
export 'src/password/data/serverpod_password_gateway.dart';
export 'src/password/data/sodium_account_crypto.dart';
export 'src/password/model/account_authenticator.dart';
export 'src/password/model/account_security.dart';
export 'src/password/model/mail_code_purpose.dart';
export 'src/password/model/password_failed.dart';
export 'src/password/model/phrase_check.dart';
export 'src/password/model/unlocked_account_keys.dart';
export 'src/password/widget/account_recovery_sheet.dart';
export 'src/password/widget/account_security_section.dart';
export 'src/password/widget/account_setup_sheet.dart';
export 'src/password/widget/password_sign_in_sheet.dart';
export 'src/password/widget/password_texts.dart';
export 'src/password/widget/password_widgets.dart';
export 'src/password/widget/secret_clipboard.dart';
export 'src/password/widget/secret_screen.dart';
export 'src/person/person_folders.dart';
export 'src/privacy/content_cipher.dart';
export 'src/privacy/payload_envelope.dart';
export 'src/profile/bloc/public_profile_bloc.dart';
export 'src/profile/data/avatar_image.dart';
export 'src/profile/data/base_public_profile_gateway.dart';
export 'src/profile/data/public_profile_gateway.dart';
export 'src/profile/data/public_profile_repository.dart';
export 'src/profile/model/public_profile.dart';
export 'src/profile/widget/halkyon_profile.dart';
export 'src/profile/widget/profile_sheet.dart';
export 'src/profile/widget/public_profile_section.dart';
export 'src/simplelogin/bloc/simplelogin_cubit.dart';
export 'src/simplelogin/bloc/simplelogin_standing_cubit.dart';
export 'src/simplelogin/data/serverpod_simplelogin_gateway.dart';
export 'src/simplelogin/data/simplelogin_gateway.dart';
export 'src/simplelogin/data/simplelogin_repository.dart';
export 'src/simplelogin/model/simplelogin_arrival.dart';
export 'src/simplelogin/model/simplelogin_failed.dart';
export 'src/simplelogin/model/simplelogin_standing.dart';
export 'src/simplelogin/widget/keys_reset.dart';
export 'src/simplelogin/widget/simplelogin_section.dart';
export 'src/simplelogin/widget/simplelogin_sheet.dart';
export 'src/simplelogin/widget/simplelogin_standing_scope.dart';
export 'src/simplelogin/widget/simplelogin_texts.dart';
export 'src/speech/dictation.dart';
export 'src/speech/speech_input.dart';
export 'src/sync/app_compatibility.dart';
export 'src/sync/bloc/sync_status_bloc.dart';
export 'src/sync/pending_changes_store.dart';
export 'src/sync/sync_service.dart';
export 'src/sync/sync_status.dart';
export 'src/sync/widget/app_mismatch_banner.dart';
export 'src/sync/widget/sync_and_wait.dart';
export 'src/sync/widget/sync_status_card.dart';
export 'src/sync/widget/sync_trouble_badge.dart';
export 'src/whats_new/whats_new.dart';
export 'src/whats_new/whats_new_view.dart';