fix(ui): visible ∆ pulse + drop internal codename from version line
Two issues from live feedback: 1. The version label said "v0.7.1 · warm-minimalism". The suffix is an internal design-direction codename, not user-facing. Drop it — the line now just reads "v0.7.2". 2. The ∆ pulse in live mode used only alpha + blur, which is too subtle to register at first glance. Replace with a real scale-pulse: the whole mark grows from 0.85x → 1.15x → 0.85x over 1.6s. Glow halo blur range expanded (8→22) and alpha range widened. The triangle also gets a soft fill on the up-beat. Easy to spot from across the room. Bumps fai_studio 0.7.1 -> 0.7.2. Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
parent
d5631177e0
commit
20230684a9
3 changed files with 23 additions and 11 deletions
|
|
@ -19,7 +19,7 @@ import 'widgets/widgets.dart';
|
||||||
/// Studio's own build version. Bump on every UI commit so the
|
/// Studio's own build version. Bump on every UI commit so the
|
||||||
/// running app self-identifies — visible in the sidebar header
|
/// running app self-identifies — visible in the sidebar header
|
||||||
/// and quick-glance proof that you're seeing the current build.
|
/// and quick-glance proof that you're seeing the current build.
|
||||||
const String kStudioVersion = '0.7.1';
|
const String kStudioVersion = '0.7.2';
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
@ -225,7 +225,7 @@ class _Sidebar extends StatelessWidget {
|
||||||
),
|
),
|
||||||
const SizedBox(height: 2),
|
const SizedBox(height: 2),
|
||||||
Text(
|
Text(
|
||||||
'v$kStudioVersion · warm-minimalism',
|
'v$kStudioVersion',
|
||||||
style: FaiTheme.mono(
|
style: FaiTheme.mono(
|
||||||
size: 10,
|
size: 10,
|
||||||
color: theme.colorScheme.primary,
|
color: theme.colorScheme.primary,
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,11 @@ class _DeltaPainter extends CustomPainter {
|
||||||
void paint(Canvas canvas, Size size) {
|
void paint(Canvas canvas, Size size) {
|
||||||
final cx = size.width / 2;
|
final cx = size.width / 2;
|
||||||
final cy = size.height / 2;
|
final cy = size.height / 2;
|
||||||
final r = size.width * 0.42;
|
|
||||||
|
// In live mode: scale the whole mark between 0.85 and 1.15
|
||||||
|
// so the pulse is visible without staring. Idle stays at 1.0.
|
||||||
|
final scale = mode == FaiDeltaMode.live ? 0.85 + 0.30 * t : 1.0;
|
||||||
|
final r = size.width * 0.36 * scale;
|
||||||
|
|
||||||
canvas.save();
|
canvas.save();
|
||||||
canvas.translate(cx, cy);
|
canvas.translate(cx, cy);
|
||||||
|
|
@ -127,31 +131,39 @@ class _DeltaPainter extends CustomPainter {
|
||||||
..lineTo(-r * cos(pi / 6), r * sin(pi / 6))
|
..lineTo(-r * cos(pi / 6), r * sin(pi / 6))
|
||||||
..close();
|
..close();
|
||||||
|
|
||||||
// Glow halo for live / busy mode.
|
// Glow halo. In live mode the glow ring grows with the pulse
|
||||||
|
// and the alpha breathes harder.
|
||||||
if (mode != FaiDeltaMode.idle) {
|
if (mode != FaiDeltaMode.idle) {
|
||||||
final pulseStrength = mode == FaiDeltaMode.live ? t : 1.0;
|
final pulseStrength = mode == FaiDeltaMode.live ? t : 1.0;
|
||||||
final glow = Paint()
|
final glow = Paint()
|
||||||
..color = color.withValues(alpha: 0.25 + 0.25 * pulseStrength)
|
..color = color.withValues(alpha: 0.30 + 0.40 * pulseStrength)
|
||||||
..maskFilter =
|
..maskFilter =
|
||||||
MaskFilter.blur(BlurStyle.normal, 6 + 6 * pulseStrength)
|
MaskFilter.blur(BlurStyle.normal, 8 + 14 * pulseStrength)
|
||||||
..style = PaintingStyle.fill;
|
..style = PaintingStyle.fill;
|
||||||
canvas.drawPath(path, glow);
|
canvas.drawPath(path, glow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filled triangle, brighter on the up-beat for live mode.
|
||||||
|
final fillAlpha = mode == FaiDeltaMode.live ? 0.15 + 0.20 * t : 0.18;
|
||||||
|
final fill = Paint()
|
||||||
|
..color = color.withValues(alpha: fillAlpha)
|
||||||
|
..style = PaintingStyle.fill;
|
||||||
|
canvas.drawPath(path, fill);
|
||||||
|
|
||||||
// Outline stroke.
|
// Outline stroke.
|
||||||
final stroke = Paint()
|
final stroke = Paint()
|
||||||
..color = color
|
..color = color
|
||||||
..strokeWidth = 2
|
..strokeWidth = 2.2
|
||||||
..style = PaintingStyle.stroke
|
..style = PaintingStyle.stroke
|
||||||
..strokeJoin = StrokeJoin.round;
|
..strokeJoin = StrokeJoin.round;
|
||||||
canvas.drawPath(path, stroke);
|
canvas.drawPath(path, stroke);
|
||||||
|
|
||||||
// Inner accent dot — pulses opacity in live mode.
|
// Inner accent dot.
|
||||||
final dotAlpha = mode == FaiDeltaMode.live ? 0.4 + 0.6 * t : 1.0;
|
final dotAlpha = mode == FaiDeltaMode.live ? 0.55 + 0.45 * t : 1.0;
|
||||||
final dot = Paint()
|
final dot = Paint()
|
||||||
..color = color.withValues(alpha: dotAlpha)
|
..color = color.withValues(alpha: dotAlpha)
|
||||||
..style = PaintingStyle.fill;
|
..style = PaintingStyle.fill;
|
||||||
canvas.drawCircle(Offset(0, r * 0.15), r * 0.14, dot);
|
canvas.drawCircle(Offset(0, r * 0.18), r * 0.16, dot);
|
||||||
|
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
name: fai_studio
|
name: fai_studio
|
||||||
description: "F∆I Studio — desktop GUI for the F∆I hub"
|
description: "F∆I Studio — desktop GUI for the F∆I hub"
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
version: 0.7.1
|
version: 0.7.2
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.11.0-200.1.beta
|
sdk: ^3.11.0-200.1.beta
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue