Switch to Inter, round the corners softly and make the nav switch tabs

Inter replaces General Sans (Inter Display for titles and big numbers).
Corners come back from before the squaring commit, scaled to a soft set
(16 cards, 14 buttons, 12 rows, 8 chips) and applied to the screens built
since. The nav is now a cluster of round frosted buttons that switches
Today, Routines, Goals, Groups and Progress in place inside Home: no
pushed pages, no back arrows, and Android back returns to Today.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhQh614DMeYoQEH9SoMRUw
This commit is contained in:
alvocool
2026-11-09 07:08:46 +03:00
parent add94f621c
commit d3431ca5de
54 changed files with 736 additions and 518 deletions

View File

@@ -402,7 +402,7 @@ class RoutineBuilderState extends State<RoutineBuilder>
height: 124,
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(12),
gradient: selected
? LinearGradient(
begin: Alignment.topLeft,
@@ -424,6 +424,7 @@ class RoutineBuilderState extends State<RoutineBuilder>
color: selected
? colorWhite.withValues(alpha: 0.16)
: kindBackground(kind),
shape: BoxShape.circle,
),
child: Icon(kindIcon(kind),
size: 17, color: selected ? colorWhite : tone),
@@ -469,7 +470,7 @@ class RoutineBuilderState extends State<RoutineBuilder>
padding: const EdgeInsets.fromLTRB(14, 12, 14, 12),
decoration: BoxDecoration(
color: applied ? kindBackground(_routine.kind) : colorWhite,
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: applied
? kindColor(_routine.kind).withValues(alpha: 0.4)
@@ -514,6 +515,7 @@ class RoutineBuilderState extends State<RoutineBuilder>
alignment: Alignment.center,
decoration: BoxDecoration(
color: on ? tone : colorWhite,
shape: BoxShape.circle,
border: Border.all(color: on ? tone : colorBorder),
),
child: text(weekdayInitial(day), 13,
@@ -574,7 +576,7 @@ class RoutineBuilderState extends State<RoutineBuilder>
alignment: Alignment.center,
decoration: BoxDecoration(
color: kindBackground(_routine.kind),
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(10),
),
child: text("${index + 1}", 12, TextType.Bold, color: tone),
),

View File

@@ -462,7 +462,7 @@ class RoutineRunnerState extends State<RoutineRunner>
Widget _totalPill() {
return GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 11),
child: Row(
mainAxisSize: MainAxisSize.min,
@@ -501,7 +501,7 @@ class RoutineRunnerState extends State<RoutineRunner>
track: colorWhite.withValues(alpha: 0.22),
child: GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
child: SizedBox(
width: 150,
height: 150,
@@ -557,7 +557,7 @@ class RoutineRunnerState extends State<RoutineRunner>
),
GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(200),
child: SizedBox(
width: 120 + 50 * t,
height: 120 + 50 * t,
@@ -593,7 +593,7 @@ class RoutineRunnerState extends State<RoutineRunner>
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 7),
child: Row(
mainAxisSize: MainAxisSize.min,
@@ -615,7 +615,7 @@ class RoutineRunnerState extends State<RoutineRunner>
const SizedBox(width: 8),
GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 7),
child: text("Left app ${_run.backgroundedCount}×", 11,
TextType.Medium,
@@ -732,6 +732,7 @@ class RoutineRunnerState extends State<RoutineRunner>
height: size,
padding: const EdgeInsets.all(2.5),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: isCurrent ? colorNight : colorWhite,
boxShadow: const [
BoxShadow(
@@ -741,7 +742,7 @@ class RoutineRunnerState extends State<RoutineRunner>
),
],
),
child: ClipRect(
child: ClipOval(
child: Stack(
fit: StackFit.expand,
children: [
@@ -798,7 +799,7 @@ class RoutineRunnerState extends State<RoutineRunner>
margin: const EdgeInsets.only(right: 4),
decoration: BoxDecoration(
color: filled || active ? tone : tone.withValues(alpha: 0.15),
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(14),
),
);
}),
@@ -898,7 +899,7 @@ class RoutineRunnerState extends State<RoutineRunner>
alignment: Alignment.center,
decoration: BoxDecoration(
color: colorNight,
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(14),
boxShadow: const [
BoxShadow(
color: Color(0x331A1F1C),
@@ -960,8 +961,8 @@ class RoutineRunnerState extends State<RoutineRunner>
decoration: const BoxDecoration(
color: colorSheetBackground,
borderRadius: BorderRadius.only(
topLeft: Radius.zero,
topRight: Radius.zero,
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
),
),
child: ListView(
@@ -989,7 +990,7 @@ class RoutineRunnerState extends State<RoutineRunner>
padding: const EdgeInsets.fromLTRB(12, 12, 14, 12),
decoration: BoxDecoration(
color: current ? kindBackground(_run.chain.kind) : colorWhite,
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: current ? tone.withValues(alpha: 0.35) : colorBorder,
),
@@ -1002,6 +1003,7 @@ class RoutineRunnerState extends State<RoutineRunner>
alignment: Alignment.center,
decoration: BoxDecoration(
color: step.completed ? tone : colorSecondary,
shape: BoxShape.circle,
),
child: step.completed
? Icon(Icons.check_rounded,
@@ -1075,7 +1077,7 @@ class RoutineRunnerState extends State<RoutineRunner>
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
padding: const EdgeInsets.symmetric(
horizontal: 12, vertical: 7),
child: text(
@@ -1099,7 +1101,7 @@ class RoutineRunnerState extends State<RoutineRunner>
track: colorWhite.withValues(alpha: 0.3),
child: GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
child: SizedBox(
width: 158,
height: 158,
@@ -1131,7 +1133,7 @@ class RoutineRunnerState extends State<RoutineRunner>
),
const SizedBox(height: 22),
GlassSurface(
radius: BorderRadius.zero,
radius: BorderRadius.circular(16),
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(18, 16, 18, 16),
child: Row(
@@ -1200,7 +1202,7 @@ class RoutineRunnerState extends State<RoutineRunner>
final int streak = ProgressEngine.streak(withThis, now);
return GlassSurface(
radius: BorderRadius.zero,
radius: BorderRadius.circular(16),
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(18, 14, 18, 14),
child: Row(

View File

@@ -7,7 +7,11 @@ class Routines extends StatefulWidget {
/// Opens pre-filtered to one kind; null shows the whole library.
final RoutineKind? kind;
const Routines({super.key, this.kind});
/// Shown as a tab inside Home: no back arrow, and room at the bottom
/// for the nav.
final bool tab;
const Routines({super.key, this.kind, this.tab = false});
@override
State<Routines> createState() => RoutinesState();

View File

@@ -158,7 +158,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
backgroundColor: colorAmbientMid,
body: AmbientBackground(
child: SingleChildScrollView(
padding: const EdgeInsets.only(bottom: 40),
padding: EdgeInsets.only(bottom: widget.tab ? 130 : 40),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min,
@@ -265,7 +265,8 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
padding: const EdgeInsets.fromLTRB(16, 6, 16, 0),
child: Row(
children: [
glassCircle(CupertinoIcons.arrow_left, _onBack),
if (!widget.tab)
glassCircle(CupertinoIcons.arrow_left, _onBack),
const Spacer(),
glassCircle(CupertinoIcons.add, _onBuild),
],
@@ -330,7 +331,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
..sort((a, b) => a.startMinute.compareTo(b.startMinute));
return GlassSurface(
radius: BorderRadius.zero,
radius: BorderRadius.circular(16),
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(18, 16, 18, 16),
child: Row(
@@ -402,6 +403,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
height: 78,
padding: const EdgeInsets.all(2.5),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: selected ? colorNight : colorWhite,
boxShadow: const [
BoxShadow(
@@ -411,7 +413,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
),
],
),
child: ClipRect(
child: ClipOval(
child: kind == null
? Container(
color: colorWhite,
@@ -471,7 +473,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
child: Container(
width: 244,
decoration: BoxDecoration(
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(16),
boxShadow: const [
BoxShadow(
color: Color(0x262A3A30),
@@ -481,7 +483,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
],
),
child: ClipRRect(
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(16),
child: Stack(
fit: StackFit.expand,
children: [
@@ -502,7 +504,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
child: text(
@@ -613,7 +615,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
width: 90,
height: 90,
child: ClipRRect(
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(14),
child: SceneArt(
palette: scenePalette(routine.kind),
seed: sceneSeed(routine.title),
@@ -664,6 +666,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
alignment: Alignment.center,
decoration: BoxDecoration(
color: tone,
shape: BoxShape.circle,
),
child: Icon(Icons.check_rounded,
size: 22, color: colorWhite),
@@ -715,8 +718,8 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
decoration: const BoxDecoration(
color: colorAmbientMid,
borderRadius: BorderRadius.only(
topLeft: Radius.zero,
topRight: Radius.zero,
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
),
),
clipBehavior: Clip.antiAlias,
@@ -753,7 +756,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
height: 4,
decoration: BoxDecoration(
color: colorWhite.withValues(alpha: 0.7),
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(14),
),
),
),
@@ -770,7 +773,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
child: text(kindLabel(routine.kind), 10,
@@ -780,7 +783,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
const SizedBox(width: 6),
GlassSurface(
onDark: true,
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
child: text(
@@ -814,7 +817,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
const SizedBox(height: 16),
],
GlassSurface(
radius: BorderRadius.zero,
radius: BorderRadius.circular(14),
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(16, 14, 16, 14),
child: Row(
@@ -893,7 +896,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
padding: const EdgeInsets.fromLTRB(10, 10, 14, 10),
decoration: BoxDecoration(
color: colorWhite,
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(14),
),
child: Row(
children: [
@@ -903,6 +906,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
alignment: Alignment.center,
decoration: BoxDecoration(
color: tone.withValues(alpha: 0.10),
shape: BoxShape.circle,
),
child: text("${index + 1}", 12, TextType.Medium, color: tone),
),

View File

@@ -67,8 +67,8 @@ class StepEditorState extends State<StepEditor> {
decoration: const BoxDecoration(
color: colorSheetBackground,
borderRadius: BorderRadius.only(
topLeft: Radius.zero,
topRight: Radius.zero,
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
),
),
child: SingleChildScrollView(
@@ -234,7 +234,7 @@ class StepEditorState extends State<StepEditor> {
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12),
decoration: BoxDecoration(
color: kindBackground(widget.kind),
borderRadius: BorderRadius.zero,
borderRadius: BorderRadius.circular(10),
),
child: Row(
children: [