diff --git a/resources/screenshots/desktop-calendar-dark.png b/resources/screenshots/desktop-calendar-dark.png index 49318eb3..54fadb3d 100644 Binary files a/resources/screenshots/desktop-calendar-dark.png and b/resources/screenshots/desktop-calendar-dark.png differ diff --git a/resources/screenshots/desktop-calendar-light.png b/resources/screenshots/desktop-calendar-light.png index 08a826c9..029ef7fe 100644 Binary files a/resources/screenshots/desktop-calendar-light.png and b/resources/screenshots/desktop-calendar-light.png differ diff --git a/resources/screenshots/desktop-contacts-dark.png b/resources/screenshots/desktop-contacts-dark.png index d4fe9bd2..a343cc93 100644 Binary files a/resources/screenshots/desktop-contacts-dark.png and b/resources/screenshots/desktop-contacts-dark.png differ diff --git a/resources/screenshots/desktop-contacts-light.png b/resources/screenshots/desktop-contacts-light.png index ed9bbdb3..56b945db 100644 Binary files a/resources/screenshots/desktop-contacts-light.png and b/resources/screenshots/desktop-contacts-light.png differ diff --git a/resources/screenshots/desktop-dark.png b/resources/screenshots/desktop-dark.png index 0895caef..92909424 100644 Binary files a/resources/screenshots/desktop-dark.png and b/resources/screenshots/desktop-dark.png differ diff --git a/resources/screenshots/desktop-files-dark.png b/resources/screenshots/desktop-files-dark.png index 2b6c942b..8a80dde7 100644 Binary files a/resources/screenshots/desktop-files-dark.png and b/resources/screenshots/desktop-files-dark.png differ diff --git a/resources/screenshots/desktop-files-light.png b/resources/screenshots/desktop-files-light.png index 948edf36..e4dee676 100644 Binary files a/resources/screenshots/desktop-files-light.png and b/resources/screenshots/desktop-files-light.png differ diff --git a/resources/screenshots/desktop-green-dark.png b/resources/screenshots/desktop-green-dark.png index 36f9f672..bb6021f3 100644 Binary files a/resources/screenshots/desktop-green-dark.png and b/resources/screenshots/desktop-green-dark.png differ diff --git a/resources/screenshots/desktop-green-light.png b/resources/screenshots/desktop-green-light.png index 743dd169..9beb7810 100644 Binary files a/resources/screenshots/desktop-green-light.png and b/resources/screenshots/desktop-green-light.png differ diff --git a/resources/screenshots/desktop-light.png b/resources/screenshots/desktop-light.png index 9c248955..c87e2d53 100644 Binary files a/resources/screenshots/desktop-light.png and b/resources/screenshots/desktop-light.png differ diff --git a/resources/screenshots/desktop-minimal-dark.png b/resources/screenshots/desktop-minimal-dark.png index ac0632fc..6bb2dc2f 100644 Binary files a/resources/screenshots/desktop-minimal-dark.png and b/resources/screenshots/desktop-minimal-dark.png differ diff --git a/resources/screenshots/desktop-minimal-light.png b/resources/screenshots/desktop-minimal-light.png index 19496af9..bde2b26d 100644 Binary files a/resources/screenshots/desktop-minimal-light.png and b/resources/screenshots/desktop-minimal-light.png differ diff --git a/resources/screenshots/desktop-profiles-dark.png b/resources/screenshots/desktop-profiles-dark.png index c1cdc671..ec2fb8b9 100644 Binary files a/resources/screenshots/desktop-profiles-dark.png and b/resources/screenshots/desktop-profiles-dark.png differ diff --git a/resources/screenshots/desktop-profiles-light.png b/resources/screenshots/desktop-profiles-light.png index c8835171..f9c165b5 100644 Binary files a/resources/screenshots/desktop-profiles-light.png and b/resources/screenshots/desktop-profiles-light.png differ diff --git a/resources/screenshots/desktop-purple-dark.png b/resources/screenshots/desktop-purple-dark.png index 6ed542e1..10b69ffe 100644 Binary files a/resources/screenshots/desktop-purple-dark.png and b/resources/screenshots/desktop-purple-dark.png differ diff --git a/resources/screenshots/desktop-purple-light.png b/resources/screenshots/desktop-purple-light.png index 1d8585fd..97cfc1f7 100644 Binary files a/resources/screenshots/desktop-purple-light.png and b/resources/screenshots/desktop-purple-light.png differ diff --git a/resources/screenshots/desktop-storage-dark.png b/resources/screenshots/desktop-storage-dark.png index efa8d4c5..3ea0624f 100644 Binary files a/resources/screenshots/desktop-storage-dark.png and b/resources/screenshots/desktop-storage-dark.png differ diff --git a/resources/screenshots/desktop-storage-light.png b/resources/screenshots/desktop-storage-light.png index 6be2ca4a..3b7e683b 100644 Binary files a/resources/screenshots/desktop-storage-light.png and b/resources/screenshots/desktop-storage-light.png differ diff --git a/resources/screenshots/desktop-teal-dark.png b/resources/screenshots/desktop-teal-dark.png index 87cc1614..eeecda58 100644 Binary files a/resources/screenshots/desktop-teal-dark.png and b/resources/screenshots/desktop-teal-dark.png differ diff --git a/resources/screenshots/desktop-teal-light.png b/resources/screenshots/desktop-teal-light.png index 33dbfa56..05338d9e 100644 Binary files a/resources/screenshots/desktop-teal-light.png and b/resources/screenshots/desktop-teal-light.png differ diff --git a/resources/screenshots/desktop-thread-dark.png b/resources/screenshots/desktop-thread-dark.png index 7645ae8d..28333b40 100644 Binary files a/resources/screenshots/desktop-thread-dark.png and b/resources/screenshots/desktop-thread-dark.png differ diff --git a/resources/screenshots/desktop-thread-light.png b/resources/screenshots/desktop-thread-light.png index 95ff83ef..17151cb4 100644 Binary files a/resources/screenshots/desktop-thread-light.png and b/resources/screenshots/desktop-thread-light.png differ diff --git a/resources/screenshots/mobile-dark.png b/resources/screenshots/mobile-dark.png index ae669199..195c09a3 100644 Binary files a/resources/screenshots/mobile-dark.png and b/resources/screenshots/mobile-dark.png differ diff --git a/resources/screenshots/mobile-light.png b/resources/screenshots/mobile-light.png index 2d31d939..49cd0f19 100644 Binary files a/resources/screenshots/mobile-light.png and b/resources/screenshots/mobile-light.png differ diff --git a/scripts/generate-screenshots.sh b/scripts/generate-screenshots.sh index d70787ea..759c8159 100755 --- a/scripts/generate-screenshots.sh +++ b/scripts/generate-screenshots.sh @@ -87,6 +87,7 @@ render() { def favicon_path(address): ($favicon_dir + "/" + (address | split("@") | last | ascii_downcase) + ".png"); .theme_mode = $theme + | .["MotionSettings.enabled"] = false | .workspace_layout = $workspace_layout | .screenshot_theme_preset = $theme_preset | .active_view = $active_view @@ -188,11 +189,13 @@ render() { # screenshot deterministic without replacing editable SVG sources. SLINT_SCALE_FACTOR=2 slint-viewer \ --style "$style" \ + --size "${width}x${height}" \ --load-data "$data_file" \ --screenshot "$temporary_dir/$output_name-warmup.png" \ "$temporary_ui" SLINT_SCALE_FACTOR=2 slint-viewer \ --style "$style" \ + --size "${width}x${height}" \ --load-data "$data_file" \ --screenshot "$output_dir/$output_name.png" \ "$temporary_ui" diff --git a/ui/app.slint b/ui/app.slint index b7fd2111..897f0f19 100644 --- a/ui/app.slint +++ b/ui/app.slint @@ -11,7 +11,7 @@ import "../resources/fonts/google-sans-flex/GoogleSansFlex-VariableFont_GRAD,RON import { Palette } from "std-widgets.slint"; import { TypeScale } from "typography.slint"; -export { AppTheme, ThemeUtilities } from "design-system.slint"; +export { AppTheme, MotionSettings, ThemeUtilities } from "design-system.slint"; import { AppTheme, LayoutMetrics } from "design-system.slint"; import { Button } from "components/button.slint"; import { AccountRow, CalendarDay, CalendarEventRow, CalendarSourceRow, CalendarWeekDay, ComposeAttachment, ComposeContact, ComposeEditorTile, ContactSidebarRow, ContactRow, EmailLink, EmailRow, EmailTemplateRow, EmailTile, LocalizedMessage, MailProfileRow, SidebarRow, MailLabelRow, StorageUsageRow, ThreadMessageRow } from "models.slint"; diff --git a/ui/components/workspace-layout.slint b/ui/components/workspace-layout.slint index be23c029..bb8ce34c 100644 --- a/ui/components/workspace-layout.slint +++ b/ui/components/workspace-layout.slint @@ -1,5 +1,5 @@ import { HorizontalBox } from "std-widgets.slint"; -import { AppTheme, LayoutMetrics } from "../design-system.slint"; +import { AppTheme, LayoutMetrics, MotionSettings } from "../design-system.slint"; import { TypeScale } from "../typography.slint"; import { LineEdit, ToolbarIconButton } from "controls.slint"; @@ -18,7 +18,8 @@ export component WorkspaceFrame inherits Rectangle { in property available-height; private property base-x: root.compact ? 0px : LayoutMetrics.product-rail-width; - private property reveal-progress: 0; + private property animated-reveal-progress: 0; + private property reveal-progress: MotionSettings.enabled ? root.animated-reveal-progress : 1; private property reveal-pending: true; x: root.base-x + (1 - root.reveal-progress) * 14px; @@ -33,15 +34,15 @@ export component WorkspaceFrame inherits Rectangle { // provides a native view-transition feel while its data model hydrates. Timer { interval: 16ms; - running: root.reveal-pending; + running: MotionSettings.enabled && root.reveal-pending; triggered => { root.reveal-pending = false; - root.reveal-progress = 1; + root.animated-reveal-progress = 1; } } - animate x { duration: 240ms; easing: spring(0); } - animate height { duration: 220ms; easing: spring(0); } - animate opacity { duration: 180ms; easing: ease-out; } + animate x { duration: 240ms; easing: spring(0); enabled: MotionSettings.enabled; } + animate height { duration: 220ms; easing: spring(0); enabled: MotionSettings.enabled; } + animate opacity { duration: 180ms; easing: ease-out; enabled: MotionSettings.enabled; } @children } diff --git a/ui/components/workspace-list.slint b/ui/components/workspace-list.slint index 98172ea6..ac8d0a94 100644 --- a/ui/components/workspace-list.slint +++ b/ui/components/workspace-list.slint @@ -1,4 +1,5 @@ import { LoadingSkeletonBlock } from "loading-skeleton.slint"; +import { MotionSettings } from "../design-system.slint"; // Shared motion contract for retained item lists. Only semantic navigation // (a new scope or a completed replacement load) restarts the reveal. Model @@ -13,14 +14,20 @@ export component WorkspaceListTransition inherits Rectangle { in property scope-key: ""; in property loading: false; - private property reveal-progress: 1; + private property animated-reveal-progress: 1; + private property reveal-progress: MotionSettings.enabled ? root.animated-reveal-progress : 1; private property reveal-pending: false; clip: true; function restart() { - root.reveal-progress = 0; - root.reveal-pending = true; + if MotionSettings.enabled { + root.animated-reveal-progress = 0; + root.reveal-pending = true; + } else { + root.animated-reveal-progress = 1; + root.reveal-pending = false; + } } changed scope-key => { root.restart(); } @@ -28,10 +35,10 @@ export component WorkspaceListTransition inherits Rectangle { Timer { interval: 16ms; - running: root.reveal-pending; + running: MotionSettings.enabled && root.reveal-pending; triggered => { root.reveal-pending = false; - root.reveal-progress = 1; + root.animated-reveal-progress = 1; } } @@ -45,12 +52,12 @@ export component WorkspaceListTransition inherits Rectangle { animate x { duration: 220ms; easing: spring(0); - enabled: root.reveal-progress > 0; + enabled: MotionSettings.enabled && root.reveal-progress > 0; } animate opacity { duration: 180ms; easing: ease-out; - enabled: root.reveal-progress > 0; + enabled: MotionSettings.enabled && root.reveal-progress > 0; } @children diff --git a/ui/design-system.slint b/ui/design-system.slint index 48904935..39683137 100644 --- a/ui/design-system.slint +++ b/ui/design-system.slint @@ -32,6 +32,13 @@ export global LayoutMetrics { out property corner-radius: 8px; } +// Runtime motion stays enabled by default. Deterministic renderers such as the +// README screenshot generator can opt out so they capture the settled state +// without changing the motion users see in the application. +export global MotionSettings { + in-out property enabled: true; +} + // Mail actions and their matching sidebar destinations share one semantic // icon palette. These colors stay stable across themes so the same action is // recognizable wherever it appears. diff --git a/ui/views/mail-reading-pane.slint b/ui/views/mail-reading-pane.slint index a5da27ea..f90d0cff 100644 --- a/ui/views/mail-reading-pane.slint +++ b/ui/views/mail-reading-pane.slint @@ -10,7 +10,7 @@ import { EmailLinkContextArea } from "../components/email-link-context-area.slin import { LoadingSkeletonBlock } from "../components/loading-skeleton.slint"; import { RenderingInfoDialog } from "../dialogs/rendering-info-dialog.slint"; import { TypeScale } from "../typography.slint"; -import { AppTheme, LayoutMetrics, MailIconPalette } from "../design-system.slint"; +import { AppTheme, LayoutMetrics, MailIconPalette, MotionSettings } from "../design-system.slint"; component ReaderControl inherits ToolbarIconButton { tooltip-above: true; @@ -459,12 +459,18 @@ export component MailReadingPane inherits Rectangle { private property viewport-pending: false; private property transition-message-id: EmailReader.message-id; - private property content-reveal: 1; + private property animated-content-reveal: 1; + private property content-reveal: MotionSettings.enabled ? root.animated-content-reveal : 1; private property content-reveal-pending: false; function restart-content-reveal() { - root.content-reveal = 0; - root.content-reveal-pending = true; + if MotionSettings.enabled { + root.animated-content-reveal = 0; + root.content-reveal-pending = true; + } else { + root.animated-content-reveal = 1; + root.content-reveal-pending = false; + } } changed transition-message-id => { root.restart-content-reveal(); } @@ -493,10 +499,10 @@ export component MailReadingPane inherits Rectangle { } } Timer { interval: 16ms; - running: root.content-reveal-pending; + running: MotionSettings.enabled && root.content-reveal-pending; triggered => { root.content-reveal-pending = false; - root.content-reveal = 1; + root.animated-content-reveal = 1; } } private property selecting: false; @@ -908,7 +914,7 @@ export component MailReadingPane inherits Rectangle { animate opacity { duration: 190ms; easing: ease-out; - enabled: root.content-reveal > 0; + enabled: MotionSettings.enabled && root.content-reveal > 0; } Text {