Square every corner, enlarge the main surfaces and add a to-do list

Rounded rectangles and round controls are now square across the app; only
status dots, glows, the sun, rings and the breathing circle stay round.
Cards, rows, thumbnails, featured cards, category tiles, the standing card
and the nav are larger. Home gets a quick To-do list kept on the device
(TodoItem in InternalMemory), seeded with sample items in mock mode.

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-02 14:50:31 +03:00
parent 36bc41509d
commit 9c858b8146
38 changed files with 478 additions and 186 deletions

View File

@@ -443,8 +443,8 @@ class NewCommitmentState extends State<NewCommitment>
decoration: BoxDecoration(
color: colorSheetBackground,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
child: SingleChildScrollView(
@@ -460,7 +460,7 @@ class NewCommitmentState extends State<NewCommitment>
margin: const EdgeInsets.only(bottom: 20),
decoration: BoxDecoration(
color: colorGrey.withValues(alpha: 0.35),
borderRadius: BorderRadius.circular(999),
borderRadius: BorderRadius.zero,
),
),
),

View File

@@ -142,7 +142,7 @@ class ExcuseReportState extends State<ExcuseReport>
padding: const EdgeInsets.all(14),
decoration: BoxDecoration(
color: colorInset,
borderRadius: BorderRadius.circular(12),
borderRadius: BorderRadius.zero,
border: Border.all(color: colorBorder, width: 1),
),
child: Row(

View File

@@ -242,7 +242,7 @@ class GoalDetailState extends State<GoalDetail>
padding: const EdgeInsets.fromLTRB(16, 14, 16, 14),
decoration: BoxDecoration(
color: colorWhite.withValues(alpha: 0.08),
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.zero,
),
child: Column(
mainAxisSize: MainAxisSize.min,
@@ -405,7 +405,7 @@ class GoalDetailState extends State<GoalDetail>
width: 58,
height: 58,
child: ClipRRect(
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.zero,
child: SceneArt(
palette: scenePalette(routine.kind),
seed: sceneSeed(routine.title),
@@ -454,7 +454,6 @@ class GoalDetailState extends State<GoalDetail>
color: routine.kind == RoutineKind.MustDo
? colorPrimaryDark
: tone,
shape: BoxShape.circle,
),
child: Icon(CupertinoIcons.play_fill,
size: 15, color: colorWhite),

View File

@@ -282,7 +282,7 @@ class GoalEditorState extends State<GoalEditor> implements ConnectGoalEditor {
return Container(
padding: const EdgeInsets.all(18),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
borderRadius: BorderRadius.zero,
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
@@ -338,7 +338,6 @@ class GoalEditorState extends State<GoalEditor> implements ConnectGoalEditor {
alignment: Alignment.center,
decoration: BoxDecoration(
color: colour,
shape: BoxShape.circle,
border: Border.all(
color: selected ? colorWhite : Colors.transparent,
width: 3,

View File

@@ -117,10 +117,10 @@ class GoalsState extends State<Goals> implements ConnectGoals {
return GestureDetector(
onTap: () => _onOpenGoal(goal),
child: Container(
height: 214,
height: 260,
margin: const EdgeInsets.only(bottom: 14),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(26),
borderRadius: BorderRadius.zero,
boxShadow: const [
BoxShadow(
color: Color(0x262A3A30),
@@ -130,7 +130,7 @@ class GoalsState extends State<Goals> implements ConnectGoals {
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(26),
borderRadius: BorderRadius.zero,
child: Stack(
fit: StackFit.expand,
children: [
@@ -151,7 +151,7 @@ class GoalsState extends State<Goals> implements ConnectGoals {
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
child: text(

View File

@@ -2,6 +2,7 @@ import '../../about/external/data/Commitment.dart';
import '../../about/external/data/ExcuseCluster.dart';
import '../../about/external/data/RoutineChain.dart';
import '../../about/internal/application/Standing.dart';
import '../../about/internal/application/TodoItem.dart';
import '../../about/internal/application/UserDetails.dart';
abstract class ConnectHome {
@@ -14,6 +15,9 @@ abstract class ConnectHome {
/// The routine library, for the up-next rail.
void onRoutinesLoaded(List<RoutineChain> routines);
/// The quick to-do list, read from the device.
void onTodosLoaded(List<TodoItem> todos);
/// Standing arrives derived, with the debt it was derived from.
void onStandingResolved(Standing standing, double debtScore);

View File

@@ -13,6 +13,7 @@ import '../../about/internal/application/NotificationType.dart';
import '../../about/internal/application/RoutineKind.dart';
import '../../about/internal/application/Standing.dart';
import '../../about/internal/application/TextType.dart';
import '../../about/internal/application/TodoItem.dart';
import '../../about/internal/application/UserDetails.dart';
import '../../configs/Navigator.dart';
import '../../designs/AmbientBackground.dart';
@@ -24,6 +25,7 @@ import '../../designs/ProgressRing.dart';
import '../../designs/Responsive.dart';
import '../../designs/Shell.dart';
import '../../designs/buttons/Buttons.dart';
import '../../designs/input/InputFields.dart';
import '../../designs/scene/SceneArt.dart';
import '../../designs/text/Text.dart';
import '../../utils/Colors.dart';
@@ -55,6 +57,10 @@ class HomeState extends State<Home> implements ConnectHome {
List<RoutineChain> _routines = <RoutineChain>[];
List<TodoItem> _todos = <TodoItem>[];
final TextEditingController _todoInput = TextEditingController();
Standing _standing = Standing.Good;
double _debt = 0;
@@ -92,6 +98,12 @@ class HomeState extends State<Home> implements ConnectHome {
_model?.initialise();
}
@override
void dispose() {
_todoInput.dispose();
super.dispose();
}
// ── Derived ───────────────────────────────────────────────────────────────
bool _isDone(Commitment item) {
@@ -206,6 +218,48 @@ class HomeState extends State<Home> implements ConnectHome {
void _onNavToday() {}
void _onAddTodo(String value) {
final String title = value.trim();
if (title.isEmpty) {
return;
}
setState(() {
_todos.insert(
0,
TodoItem(
id: DateTime.now().microsecondsSinceEpoch.toString(),
title: title));
});
_todoInput.clear();
_model?.saveTodos(_todos);
}
void _onAddTodoPressed() {
_onAddTodo(_todoInput.text);
}
void _onToggleTodo(TodoItem item) {
setState(() {
item.done = !item.done;
});
_model?.saveTodos(_todos);
}
void _onRemoveTodo(TodoItem item) {
setState(() {
_todos.remove(item);
});
_model?.saveTodos(_todos);
}
void _onClearDoneTodos() {
setState(() {
_todos.removeWhere((item) => item.done);
});
_model?.saveTodos(_todos);
}
// ── Views ─────────────────────────────────────────────────────────────────
Widget _mobileView(BoxConstraints constraints) {
@@ -291,7 +345,7 @@ class HomeState extends State<Home> implements ConnectHome {
Widget _topBar() {
return Row(
children: [
_avatar(46),
_avatar(54),
const SizedBox(width: 12),
Expanded(
child: Column(
@@ -337,7 +391,6 @@ class HomeState extends State<Home> implements ConnectHome {
width: size,
height: size,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: colorWhite, width: 2),
boxShadow: const [
BoxShadow(
@@ -347,7 +400,7 @@ class HomeState extends State<Home> implements ConnectHome {
),
],
),
child: ClipOval(
child: ClipRect(
child: Stack(
fit: StackFit.expand,
children: [
@@ -417,7 +470,7 @@ class HomeState extends State<Home> implements ConnectHome {
onTap: _overdue.isEmpty ? _onOpenReportCard : _onOpenOverdue,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(28),
borderRadius: BorderRadius.zero,
boxShadow: const [
BoxShadow(
color: Color(0x142A3A30),
@@ -427,21 +480,21 @@ class HomeState extends State<Home> implements ConnectHome {
],
),
child: GlassSurface(
radius: BorderRadius.circular(28),
radius: BorderRadius.zero,
tint: colorGlassStrong,
padding: const EdgeInsets.all(18),
padding: const EdgeInsets.all(22),
child: Row(
children: [
ProgressRing(
fraction: fraction,
size: 84,
stroke: 8,
size: 104,
stroke: 9,
fill: colorPrimary,
track: colorPrimary.withValues(alpha: 0.12),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
text("$_doneCount/${_plan.length}", 19, TextType.Medium,
text("$_doneCount/${_plan.length}", 23, TextType.Medium,
color: colorInk),
text("done", 10, TextType.Regular, color: colorInkSoft),
],
@@ -477,7 +530,7 @@ class HomeState extends State<Home> implements ConnectHome {
const SizedBox(height: 6),
text(
ToneEngine.standingHeadline(_standing, _user.tone),
15,
17,
TextType.Medium,
color: colorInk,
maxLines: 2,
@@ -515,7 +568,7 @@ class HomeState extends State<Home> implements ConnectHome {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
text(value, 19, TextType.Light,
text(value, 23, TextType.Light,
color: alert ? colorStandingGrounded : colorInk),
const SizedBox(height: 2),
text(label, 10, TextType.Regular, color: colorInkSoft),
@@ -530,7 +583,7 @@ class HomeState extends State<Home> implements ConnectHome {
padding: const EdgeInsets.fromLTRB(20, 24, 20, 24),
decoration: BoxDecoration(
color: colorFrost,
borderRadius: BorderRadius.circular(28),
borderRadius: BorderRadius.zero,
border: Border.all(color: colorGlassBorder),
),
child: child,
@@ -552,7 +605,9 @@ class HomeState extends State<Home> implements ConnectHome {
sectionBreak("Your day",
trailing: _viewAll("View all", _onOpenRoutines)),
_categoryRail(),
const SizedBox(height: 26),
const SizedBox(height: 28),
_todoSection(),
const SizedBox(height: 28),
if (_upNext.isNotEmpty) ...[
sectionBreak("Up next",
caption: "${_upNext.length} routines",
@@ -647,10 +702,9 @@ class HomeState extends State<Home> implements ConnectHome {
mainAxisSize: MainAxisSize.min,
children: [
Container(
width: 60,
height: 60,
width: 74,
height: 74,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: colorWhite, width: 2.5),
boxShadow: const [
BoxShadow(
@@ -660,7 +714,7 @@ class HomeState extends State<Home> implements ConnectHome {
),
],
),
child: ClipOval(
child: ClipRect(
child: SceneArt(
palette: palette,
seed: seed,
@@ -671,7 +725,7 @@ class HomeState extends State<Home> implements ConnectHome {
),
),
const SizedBox(height: 8),
text(label, 11, TextType.Regular, color: colorInk),
text(label, 12, TextType.Regular, color: colorInk),
],
),
);
@@ -681,7 +735,7 @@ class HomeState extends State<Home> implements ConnectHome {
final List<RoutineChain> items = _upNext;
return SizedBox(
height: 236,
height: 290,
child: ListView.separated(
scrollDirection: Axis.horizontal,
clipBehavior: Clip.none,
@@ -701,9 +755,9 @@ class HomeState extends State<Home> implements ConnectHome {
return GestureDetector(
onTap: () => _onStartRoutine(routine),
child: Container(
width: 196,
width: 244,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(26),
borderRadius: BorderRadius.zero,
boxShadow: const [
BoxShadow(
color: Color(0x262A3A30),
@@ -713,7 +767,7 @@ class HomeState extends State<Home> implements ConnectHome {
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(26),
borderRadius: BorderRadius.zero,
child: Stack(
fit: StackFit.expand,
children: [
@@ -726,7 +780,7 @@ class HomeState extends State<Home> implements ConnectHome {
shade: true,
),
Padding(
padding: const EdgeInsets.all(12),
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -734,7 +788,7 @@ class HomeState extends State<Home> implements ConnectHome {
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
child: text(
@@ -749,11 +803,11 @@ class HomeState extends State<Home> implements ConnectHome {
const Spacer(),
glassCircle(CupertinoIcons.play_fill,
() => _onStartRoutine(routine),
size: 32, onDark: true),
size: 40, onDark: true),
],
),
const Spacer(),
text(routine.title, 16, TextType.Medium,
text(routine.title, 20, TextType.Medium,
color: colorWhite,
maxLines: 2,
overflow: TextOverflow.ellipsis),
@@ -799,7 +853,7 @@ class HomeState extends State<Home> implements ConnectHome {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
text(value, 20, TextType.Light, color: colorWhite),
text(value, 24, TextType.Light, color: colorWhite),
const SizedBox(height: 2),
Row(
children: [
@@ -812,6 +866,135 @@ class HomeState extends State<Home> implements ConnectHome {
);
}
/// The quick to-do list: things to remember that are not promises. No
/// window, no debt. Open items first, done ones struck through below.
Widget _todoSection() {
final List<TodoItem> open = _todos.where((item) => !item.done).toList();
final List<TodoItem> done = _todos.where((item) => item.done).toList();
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min,
children: [
sectionBreak(
"To-do",
caption: "${open.length} open, no debt",
trailing: done.isEmpty
? null
: _viewAll("Clear done", _onClearDoneTodos),
),
GlassSurface(
tint: colorGlassStrong,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(20, 6, 6, 6),
child: Row(
children: [
Icon(CupertinoIcons.pencil, size: 20, color: colorInkSoft),
const SizedBox(width: 12),
Expanded(
child: quickAddField(
_todoInput, "Add a to-do", _onAddTodo),
),
GestureDetector(
onTap: _onAddTodoPressed,
behavior: HitTestBehavior.opaque,
child: Container(
width: 48,
height: 48,
color: colorNight,
alignment: Alignment.center,
child: Icon(CupertinoIcons.add,
size: 22, color: colorLime),
),
),
],
),
),
for (TodoItem item in <TodoItem>[...open, ...done])
_todoRow(item),
if (_todos.isEmpty)
Padding(
padding: const EdgeInsets.fromLTRB(20, 4, 20, 20),
child: text(
"Nothing to remember. Jot anything here; it stays on this phone.",
13,
TextType.Regular,
color: colorInkSoft,
),
),
],
),
),
],
);
}
Widget _todoRow(TodoItem item) {
return Container(
decoration: BoxDecoration(
border: Border(top: BorderSide(color: colorGlassBorder)),
),
padding: const EdgeInsets.fromLTRB(14, 4, 4, 4),
child: Row(
children: [
GestureDetector(
onTap: () => _onToggleTodo(item),
behavior: HitTestBehavior.opaque,
child: Padding(
padding: const EdgeInsets.all(6),
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
width: 30,
height: 30,
decoration: BoxDecoration(
color: item.done ? colorPrimary : colorWhite,
border: Border.all(
color: item.done
? colorPrimary
: colorInk.withValues(alpha: 0.25),
width: 2,
),
),
child: item.done
? Icon(Icons.check_rounded, size: 20, color: colorWhite)
: null,
),
),
),
const SizedBox(width: 10),
Expanded(
child: GestureDetector(
onTap: () => _onToggleTodo(item),
behavior: HitTestBehavior.opaque,
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 14),
child: text(
item.title,
16,
TextType.Regular,
color: item.done ? colorInkSoft : colorInk,
decoration: item.done ? TextDecoration.lineThrough : null,
),
),
),
),
GestureDetector(
onTap: () => _onRemoveTodo(item),
behavior: HitTestBehavior.opaque,
child: Padding(
padding: const EdgeInsets.all(14),
child: Icon(CupertinoIcons.xmark, size: 16, color: colorInkSoft),
),
),
],
),
);
}
/// Grounded: the plan is hidden entirely and only the mess is shown.
Widget _groundedBody() {
return Column(
@@ -948,7 +1131,7 @@ class HomeState extends State<Home> implements ConnectHome {
onTap: _onOpenOverdue,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(24),
borderRadius: BorderRadius.zero,
gradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
@@ -963,15 +1146,14 @@ class HomeState extends State<Home> implements ConnectHome {
),
],
),
padding: const EdgeInsets.all(14),
padding: const EdgeInsets.all(18),
child: Row(
children: [
Container(
width: 50,
height: 50,
width: 58,
height: 58,
alignment: Alignment.center,
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: const RadialGradient(
center: Alignment(-0.3, -0.4),
colors: <Color>[colorOverdueGlow, colorStandingGrounded],
@@ -1006,7 +1188,7 @@ class HomeState extends State<Home> implements ConnectHome {
],
),
),
glassCircle(CupertinoIcons.arrow_right, _onOpenOverdue, size: 36),
glassCircle(CupertinoIcons.arrow_right, _onOpenOverdue, size: 44),
],
),
),
@@ -1019,9 +1201,9 @@ class HomeState extends State<Home> implements ConnectHome {
return GestureDetector(
onTap: _onOpenExcuses,
child: Container(
padding: const EdgeInsets.fromLTRB(20, 18, 20, 20),
padding: const EdgeInsets.fromLTRB(22, 22, 22, 24),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(26),
borderRadius: BorderRadius.zero,
gradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
@@ -1051,7 +1233,7 @@ class HomeState extends State<Home> implements ConnectHome {
],
),
const SizedBox(height: 12),
text(cluster.insight, 16, TextType.Regular,
text(cluster.insight, 18, TextType.Regular,
color: colorWhite, height: 1.5),
],
),
@@ -1085,17 +1267,17 @@ class HomeState extends State<Home> implements ConnectHome {
: classColor(item.commitmentClass);
return Container(
margin: const EdgeInsets.only(bottom: 10),
margin: const EdgeInsets.only(bottom: 12),
child: card(
padding: const EdgeInsets.fromLTRB(8, 8, 12, 8),
padding: const EdgeInsets.fromLTRB(10, 10, 14, 10),
onTap: _onOpenOverdue,
child: Row(
children: [
SizedBox(
width: 64,
height: 64,
width: 88,
height: 88,
child: ClipRRect(
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.zero,
child: Opacity(
opacity: ticked ? 0.45 : 1,
child: SceneArt(
@@ -1127,7 +1309,7 @@ class HomeState extends State<Home> implements ConnectHome {
const SizedBox(height: 3),
text(
item.title,
15,
17,
TextType.Medium,
color: ticked ? colorInkSoft : colorInk,
maxLines: 2,
@@ -1176,10 +1358,9 @@ class HomeState extends State<Home> implements ConnectHome {
child: AnimatedContainer(
duration: const Duration(milliseconds: 220),
curve: Curves.easeOutBack,
width: 38,
height: 38,
width: 44,
height: 44,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: checked ? colorPrimary : colorWhite,
border: Border.all(
color: checked ? colorPrimary : accent.withValues(alpha: 0.35),
@@ -1196,7 +1377,7 @@ class HomeState extends State<Home> implements ConnectHome {
: const [],
),
child: checked
? Icon(Icons.check_rounded, size: 20, color: colorWhite)
? Icon(Icons.check_rounded, size: 24, color: colorWhite)
: null,
),
),
@@ -1228,6 +1409,13 @@ class HomeState extends State<Home> implements ConnectHome {
});
}
@override
void onTodosLoaded(List<TodoItem> todos) {
setState(() {
_todos = todos;
});
}
@override
void onPlanLoaded(List<Commitment> plan) {
setState(() {

View File

@@ -11,6 +11,7 @@ import '../../about/external/initial/CompletionRequest.dart';
import '../../about/external/initial/ReportCardRequest.dart';
import '../../about/internal/application/CommitmentClass.dart';
import '../../about/internal/application/Standing.dart';
import '../../about/internal/application/TodoItem.dart';
import '../../about/internal/application/UserDetails.dart';
import '../../utils/DebtEngine.dart';
import '../../utils/GuardrailEngine.dart';
@@ -31,9 +32,20 @@ class ViewHome extends ParentViewModel {
final UserDetails cached = await getDataManager().getUserDetails();
connection.onUserLoaded(cached);
loadTodos();
loadPlan();
}
void loadTodos() async {
connection.onTodosLoaded(await getDataManager().getTodos());
}
/// Saves the whole list; it is small and only ever lives on the device.
void saveTodos(List<TodoItem> todos) async {
await getDataManager().setTodos(todos);
}
void loadPlan() async {
if (!await hasNetwork(() => loadPlan())) return;

View File

@@ -184,8 +184,8 @@ class LiveTaskState extends State<LiveTask>
decoration: BoxDecoration(
color: colorSheetBackground,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
child: SingleChildScrollView(

View File

@@ -107,8 +107,8 @@ class LoginState extends State<Login> implements ConnectLogin {
decoration: BoxDecoration(
color: colorPrimaryLight,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
clipBehavior: Clip.antiAlias,

View File

@@ -147,8 +147,8 @@ class OverdueQueueState extends State<OverdueQueue>
decoration: BoxDecoration(
color: colorSheetBackground,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
child: SingleChildScrollView(
@@ -166,7 +166,7 @@ class OverdueQueueState extends State<OverdueQueue>
margin: const EdgeInsets.only(bottom: 20),
decoration: BoxDecoration(
color: colorGrey.withValues(alpha: 0.35),
borderRadius: BorderRadius.circular(999),
borderRadius: BorderRadius.zero,
),
),
),
@@ -242,8 +242,8 @@ class OverdueQueueState extends State<OverdueQueue>
decoration: BoxDecoration(
color: colorSheetBackground,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
child: SingleChildScrollView(
@@ -261,7 +261,7 @@ class OverdueQueueState extends State<OverdueQueue>
margin: const EdgeInsets.only(bottom: 20),
decoration: BoxDecoration(
color: colorGrey.withValues(alpha: 0.35),
borderRadius: BorderRadius.circular(999),
borderRadius: BorderRadius.zero,
),
),
),
@@ -343,8 +343,8 @@ class OverdueQueueState extends State<OverdueQueue>
decoration: BoxDecoration(
color: colorSheetBackground,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
child: SingleChildScrollView(
@@ -360,7 +360,7 @@ class OverdueQueueState extends State<OverdueQueue>
margin: const EdgeInsets.only(bottom: 20),
decoration: BoxDecoration(
color: colorGrey.withValues(alpha: 0.35),
borderRadius: BorderRadius.circular(999),
borderRadius: BorderRadius.zero,
),
),
),
@@ -504,7 +504,7 @@ class OverdueQueueState extends State<OverdueQueue>
padding: const EdgeInsets.fromLTRB(16, 14, 16, 14),
decoration: BoxDecoration(
color: colorWhite.withValues(alpha: 0.10),
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.zero,
),
child: Row(
children: [

View File

@@ -152,7 +152,7 @@ class ParentViewModel extends ChangeNotifier {
height: 64,
decoration: BoxDecoration(
color: colorPrimaryDark,
borderRadius: BorderRadius.circular(18),
borderRadius: BorderRadius.zero,
),
child: Icon(CupertinoIcons.wifi_slash,
size: 26, color: colorWhite),
@@ -396,7 +396,7 @@ class ParentViewModel extends ChangeNotifier {
alignment: Alignment.center,
decoration: BoxDecoration(
color: colorStandingGroundedBg,
borderRadius: BorderRadius.circular(12),
borderRadius: BorderRadius.zero,
),
child: Icon(
CupertinoIcons.exclamationmark_triangle_fill,
@@ -544,8 +544,8 @@ class ParentViewModel extends ChangeNotifier {
decoration: BoxDecoration(
color: colorSheetBackground,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
child: Column(
@@ -559,7 +559,7 @@ class ParentViewModel extends ChangeNotifier {
margin: const EdgeInsets.only(top: 12, bottom: 8),
decoration: BoxDecoration(
color: colorGrey.withValues(alpha: 0.35),
borderRadius: BorderRadius.circular(999),
borderRadius: BorderRadius.zero,
),
),
),
@@ -579,7 +579,7 @@ class ParentViewModel extends ChangeNotifier {
alignment: Alignment.center,
decoration: BoxDecoration(
color: actionBgColor,
borderRadius: BorderRadius.circular(15),
borderRadius: BorderRadius.zero,
),
child: Icon(actionIconData,
size: 24, color: actionColor),

View File

@@ -99,7 +99,7 @@ class ReportCardScreenState extends State<ReportCardScreen>
padding: const EdgeInsets.fromLTRB(16, 14, 16, 14),
decoration: BoxDecoration(
color: colorWhite.withValues(alpha: 0.08),
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.zero,
),
child: Row(
children: [
@@ -128,7 +128,7 @@ class ReportCardScreenState extends State<ReportCardScreen>
alignment: Alignment.center,
decoration: BoxDecoration(
color: colorWhite,
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.zero,
),
child: text(_report.grade, 26, TextType.Light,
color: colorPrimaryDark),

View File

@@ -402,7 +402,7 @@ class RoutineBuilderState extends State<RoutineBuilder>
height: 124,
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.zero,
gradient: selected
? LinearGradient(
begin: Alignment.topLeft,
@@ -424,7 +424,6 @@ 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),
@@ -470,7 +469,7 @@ class RoutineBuilderState extends State<RoutineBuilder>
padding: const EdgeInsets.fromLTRB(14, 12, 14, 12),
decoration: BoxDecoration(
color: applied ? kindBackground(_routine.kind) : colorWhite,
borderRadius: BorderRadius.circular(14),
borderRadius: BorderRadius.zero,
border: Border.all(
color: applied
? kindColor(_routine.kind).withValues(alpha: 0.4)
@@ -515,7 +514,6 @@ 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,
@@ -576,7 +574,7 @@ class RoutineBuilderState extends State<RoutineBuilder>
alignment: Alignment.center,
decoration: BoxDecoration(
color: kindBackground(_routine.kind),
borderRadius: BorderRadius.circular(9),
borderRadius: BorderRadius.zero,
),
child: text("${index + 1}", 12, TextType.Bold, color: tone),
),

View File

@@ -457,7 +457,7 @@ class RoutineRunnerState extends State<RoutineRunner>
Widget _totalPill() {
return GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 11),
child: Row(
mainAxisSize: MainAxisSize.min,
@@ -496,7 +496,7 @@ class RoutineRunnerState extends State<RoutineRunner>
track: colorWhite.withValues(alpha: 0.22),
child: GlassSurface(
onDark: true,
radius: BorderRadius.circular(100),
radius: BorderRadius.zero,
child: SizedBox(
width: 150,
height: 150,
@@ -552,7 +552,7 @@ class RoutineRunnerState extends State<RoutineRunner>
),
GlassSurface(
onDark: true,
radius: BorderRadius.circular(200),
radius: BorderRadius.zero,
child: SizedBox(
width: 120 + 50 * t,
height: 120 + 50 * t,
@@ -588,7 +588,7 @@ class RoutineRunnerState extends State<RoutineRunner>
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 7),
child: Row(
mainAxisSize: MainAxisSize.min,
@@ -610,7 +610,7 @@ class RoutineRunnerState extends State<RoutineRunner>
const SizedBox(width: 8),
GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 7),
child: text("Left app ${_run.backgroundedCount}×", 11,
TextType.Medium,
@@ -727,7 +727,6 @@ 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(
@@ -737,7 +736,7 @@ class RoutineRunnerState extends State<RoutineRunner>
),
],
),
child: ClipOval(
child: ClipRect(
child: Stack(
fit: StackFit.expand,
children: [
@@ -794,7 +793,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.circular(999),
borderRadius: BorderRadius.zero,
),
);
}),
@@ -894,7 +893,7 @@ class RoutineRunnerState extends State<RoutineRunner>
alignment: Alignment.center,
decoration: BoxDecoration(
color: colorNight,
borderRadius: BorderRadius.circular(999),
borderRadius: BorderRadius.zero,
boxShadow: const [
BoxShadow(
color: Color(0x331A1F1C),
@@ -956,8 +955,8 @@ class RoutineRunnerState extends State<RoutineRunner>
decoration: const BoxDecoration(
color: colorSheetBackground,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
child: ListView(
@@ -985,7 +984,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.circular(14),
borderRadius: BorderRadius.zero,
border: Border.all(
color: current ? tone.withValues(alpha: 0.35) : colorBorder,
),
@@ -998,7 +997,6 @@ 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,
@@ -1072,7 +1070,7 @@ class RoutineRunnerState extends State<RoutineRunner>
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(
horizontal: 12, vertical: 7),
child: text(
@@ -1096,7 +1094,7 @@ class RoutineRunnerState extends State<RoutineRunner>
track: colorWhite.withValues(alpha: 0.3),
child: GlassSurface(
onDark: true,
radius: BorderRadius.circular(100),
radius: BorderRadius.zero,
child: SizedBox(
width: 158,
height: 158,
@@ -1128,7 +1126,7 @@ class RoutineRunnerState extends State<RoutineRunner>
),
const SizedBox(height: 22),
GlassSurface(
radius: BorderRadius.circular(24),
radius: BorderRadius.zero,
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(18, 16, 18, 16),
child: Row(

View File

@@ -330,7 +330,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
..sort((a, b) => a.startMinute.compareTo(b.startMinute));
return GlassSurface(
radius: BorderRadius.circular(24),
radius: BorderRadius.zero,
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(18, 16, 18, 16),
child: Row(
@@ -391,18 +391,17 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
onTap: () => _onSelectKind(kind),
behavior: HitTestBehavior.opaque,
child: SizedBox(
width: 74,
width: 88,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
AnimatedContainer(
duration: const Duration(milliseconds: 200),
curve: Curves.easeOut,
width: 64,
height: 64,
width: 78,
height: 78,
padding: const EdgeInsets.all(2.5),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: selected ? colorNight : colorWhite,
boxShadow: const [
BoxShadow(
@@ -412,7 +411,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
),
],
),
child: ClipOval(
child: ClipRect(
child: kind == null
? Container(
color: colorWhite,
@@ -450,7 +449,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
final List<RoutineChain> items = _upNext;
return SizedBox(
height: 240,
height: 290,
child: ListView.separated(
scrollDirection: Axis.horizontal,
clipBehavior: Clip.none,
@@ -470,9 +469,9 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
return GestureDetector(
onTap: () => _onPreview(routine),
child: Container(
width: 200,
width: 244,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(26),
borderRadius: BorderRadius.zero,
boxShadow: const [
BoxShadow(
color: Color(0x262A3A30),
@@ -482,7 +481,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(26),
borderRadius: BorderRadius.zero,
child: Stack(
fit: StackFit.expand,
children: [
@@ -503,7 +502,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
child: text(
@@ -611,10 +610,10 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
child: Row(
children: [
SizedBox(
width: 70,
height: 70,
width: 90,
height: 90,
child: ClipRRect(
borderRadius: BorderRadius.circular(18),
borderRadius: BorderRadius.zero,
child: SceneArt(
palette: scenePalette(routine.kind),
seed: sceneSeed(routine.title),
@@ -665,7 +664,6 @@ 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),
@@ -717,8 +715,8 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
decoration: const BoxDecoration(
color: colorAmbientMid,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(32),
topRight: Radius.circular(32),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
clipBehavior: Clip.antiAlias,
@@ -755,7 +753,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
height: 4,
decoration: BoxDecoration(
color: colorWhite.withValues(alpha: 0.7),
borderRadius: BorderRadius.circular(999),
borderRadius: BorderRadius.zero,
),
),
),
@@ -772,7 +770,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
children: [
GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
child: text(kindLabel(routine.kind), 10,
@@ -782,7 +780,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
const SizedBox(width: 6),
GlassSurface(
onDark: true,
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
child: text(
@@ -816,7 +814,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
const SizedBox(height: 16),
],
GlassSurface(
radius: BorderRadius.circular(22),
radius: BorderRadius.zero,
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(16, 14, 16, 14),
child: Row(
@@ -895,7 +893,7 @@ class RoutinesState extends State<Routines> implements ConnectRoutines {
padding: const EdgeInsets.fromLTRB(10, 10, 14, 10),
decoration: BoxDecoration(
color: colorWhite,
borderRadius: BorderRadius.circular(18),
borderRadius: BorderRadius.zero,
),
child: Row(
children: [
@@ -905,7 +903,6 @@ 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.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
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.circular(12),
borderRadius: BorderRadius.zero,
),
child: Row(
children: [

View File

@@ -93,8 +93,8 @@ class SettingsState extends State<Settings> implements ConnectSettings {
decoration: BoxDecoration(
color: colorSheetBackground,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(28),
topRight: Radius.circular(28),
topLeft: Radius.zero,
topRight: Radius.zero,
),
),
child: SingleChildScrollView(
@@ -112,7 +112,7 @@ class SettingsState extends State<Settings> implements ConnectSettings {
margin: const EdgeInsets.only(bottom: 20),
decoration: BoxDecoration(
color: colorGrey.withValues(alpha: 0.35),
borderRadius: BorderRadius.circular(999),
borderRadius: BorderRadius.zero,
),
),
),
@@ -222,7 +222,7 @@ class SettingsState extends State<Settings> implements ConnectSettings {
color: _amnestyRemaining > 0
? colorStandingGoodBg
: colorMuted,
borderRadius: BorderRadius.circular(14),
borderRadius: BorderRadius.zero,
),
child: Icon(
CupertinoIcons.checkmark_shield_fill,

View File

@@ -239,7 +239,7 @@ class SplashState extends State<Splash> implements ConnectSplash {
],
),
GlassSurface(
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 7),
child: Row(
mainAxisSize: MainAxisSize.min,
@@ -299,11 +299,11 @@ class SplashState extends State<Splash> implements ConnectSplash {
Widget _mark() {
return GlassSurface(
radius: BorderRadius.circular(46),
radius: BorderRadius.zero,
padding: const EdgeInsets.all(10),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(34),
borderRadius: BorderRadius.zero,
boxShadow: <BoxShadow>[
BoxShadow(
color: colorPrimary.withValues(alpha: 0.4),
@@ -342,7 +342,7 @@ class SplashState extends State<Splash> implements ConnectSplash {
alignment: alignment,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(99),
borderRadius: BorderRadius.zero,
boxShadow: const [
BoxShadow(
color: Color(0x142A3A30),
@@ -352,7 +352,7 @@ class SplashState extends State<Splash> implements ConnectSplash {
],
),
child: GlassSurface(
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(4, 4, 12, 4),
child: Row(
@@ -424,7 +424,7 @@ class SplashState extends State<Splash> implements ConnectSplash {
/// The whole idea in three beats, on glass over the valley.
Widget _howItWorks() {
return GlassSurface(
radius: BorderRadius.circular(24),
radius: BorderRadius.zero,
tint: colorGlassStrong,
padding: const EdgeInsets.fromLTRB(14, 14, 14, 14),
child: Row(
@@ -499,7 +499,7 @@ class SplashState extends State<Splash> implements ConnectSplash {
return Column(
children: [
GlassSurface(
radius: BorderRadius.circular(99),
radius: BorderRadius.zero,
padding: const EdgeInsets.all(3),
child: SizedBox(
width: 150,
@@ -510,7 +510,7 @@ class SplashState extends State<Splash> implements ConnectSplash {
width: 150,
decoration: BoxDecoration(
color: colorNight,
borderRadius: BorderRadius.circular(99),
borderRadius: BorderRadius.zero,
),
).animate().scaleX(
begin: 0.04,

View File

@@ -71,7 +71,7 @@ class SessionExpiredState extends State<SessionExpired>
alignment: Alignment.center,
decoration: BoxDecoration(
color: colorWhite.withValues(alpha: 0.10),
borderRadius: BorderRadius.circular(18),
borderRadius: BorderRadius.zero,
),
child: Icon(CupertinoIcons.lock_fill,
size: 24, color: colorWhite),

View File

@@ -68,7 +68,7 @@ class UpdateMeState extends State<UpdateMe> implements ConnectUpdateMe {
alignment: Alignment.center,
decoration: BoxDecoration(
color: colorWhite.withValues(alpha: 0.10),
borderRadius: BorderRadius.circular(18),
borderRadius: BorderRadius.zero,
),
child: Icon(CupertinoIcons.arrow_up_circle_fill,
size: 24, color: colorWhite),