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:
@@ -443,8 +443,8 @@ class NewCommitmentState extends State<NewCommitment>
|
||||
decoration: BoxDecoration(
|
||||
color: colorSheetBackground,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
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.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -142,7 +142,7 @@ class ExcuseReportState extends State<ExcuseReport>
|
||||
padding: const EdgeInsets.all(14),
|
||||
decoration: BoxDecoration(
|
||||
color: colorInset,
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(color: colorBorder, width: 1),
|
||||
),
|
||||
child: Row(
|
||||
|
||||
@@ -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.zero,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
@@ -405,7 +405,7 @@ class GoalDetailState extends State<GoalDetail>
|
||||
width: 58,
|
||||
height: 58,
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
child: SceneArt(
|
||||
palette: scenePalette(routine.kind),
|
||||
seed: sceneSeed(routine.title),
|
||||
@@ -454,6 +454,7 @@ class GoalDetailState extends State<GoalDetail>
|
||||
color: routine.kind == RoutineKind.MustDo
|
||||
? colorPrimaryDark
|
||||
: tone,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Icon(CupertinoIcons.play_fill,
|
||||
size: 15, color: colorWhite),
|
||||
|
||||
@@ -282,7 +282,7 @@ class GoalEditorState extends State<GoalEditor> implements ConnectGoalEditor {
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(18),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
@@ -338,6 +338,7 @@ 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,
|
||||
|
||||
@@ -3,7 +3,11 @@ import 'package:flutter/material.dart';
|
||||
import 'GoalsState.dart';
|
||||
|
||||
class Goals extends StatefulWidget {
|
||||
const Goals({super.key});
|
||||
/// Shown as a tab inside Home: no back arrow, and room at the bottom
|
||||
/// for the nav.
|
||||
final bool tab;
|
||||
|
||||
const Goals({super.key, this.tab = false});
|
||||
|
||||
@override
|
||||
State<Goals> createState() => GoalsState();
|
||||
|
||||
@@ -74,7 +74,8 @@ class GoalsState extends State<Goals> implements ConnectGoals {
|
||||
return Sheet(
|
||||
eyebrow: "Grounded",
|
||||
title: "Goals",
|
||||
onBack: _onBack,
|
||||
onBack: widget.tab ? null : _onBack,
|
||||
bottomSpace: widget.tab ? 130 : 40,
|
||||
action: chromeAction(CupertinoIcons.add, _onNewGoal),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
@@ -120,7 +121,7 @@ class GoalsState extends State<Goals> implements ConnectGoals {
|
||||
height: 260,
|
||||
margin: const EdgeInsets.only(bottom: 14),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
color: Color(0x262A3A30),
|
||||
@@ -130,7 +131,7 @@ class GoalsState extends State<Goals> implements ConnectGoals {
|
||||
],
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
child: Stack(
|
||||
fit: StackFit.expand,
|
||||
children: [
|
||||
@@ -151,7 +152,7 @@ class GoalsState extends State<Goals> implements ConnectGoals {
|
||||
children: [
|
||||
GlassSurface(
|
||||
onDark: true,
|
||||
radius: BorderRadius.zero,
|
||||
radius: BorderRadius.circular(14),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 10, vertical: 5),
|
||||
child: text(
|
||||
|
||||
@@ -119,8 +119,8 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
final GroupMessage? older = index + 1 < newestFirst.length
|
||||
? newestFirst[index + 1]
|
||||
: null;
|
||||
final bool newDay = older == null ||
|
||||
!_sameDay(older.sentAt, message.sentAt);
|
||||
final bool newDay =
|
||||
older == null || !_sameDay(older.sentAt, message.sentAt);
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
@@ -145,6 +145,7 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
@@ -198,9 +199,12 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
child: Center(
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
|
||||
color: colorWhite.withValues(alpha: 0.7),
|
||||
child: text(_dayName(moment), 11, TextType.Medium,
|
||||
color: colorInkSoft),
|
||||
decoration: BoxDecoration(
|
||||
color: colorWhite.withValues(alpha: 0.7),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child:
|
||||
text(_dayName(moment), 11, TextType.Medium, color: colorInkSoft),
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -241,7 +245,10 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
alignment: Alignment.centerRight,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.fromLTRB(14, 11, 14, 10),
|
||||
color: colorNight,
|
||||
decoration: BoxDecoration(
|
||||
color: colorNight,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
@@ -273,6 +280,7 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
child: Container(
|
||||
padding: const EdgeInsets.fromLTRB(14, 10, 14, 10),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
color: colorWhite,
|
||||
border: Border.all(color: colorGlassBorder),
|
||||
),
|
||||
@@ -308,6 +316,7 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
child: Container(
|
||||
padding: const EdgeInsets.fromLTRB(12, 12, 14, 12),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
color: checkIn ? colorStandingGoodBg : colorOverdueWarmEnd,
|
||||
border: Border(
|
||||
left: BorderSide(
|
||||
@@ -357,7 +366,10 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
|
||||
Widget _composer() {
|
||||
return Container(
|
||||
color: colorWhite,
|
||||
decoration: BoxDecoration(
|
||||
color: colorWhite,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
padding: EdgeInsets.fromLTRB(
|
||||
0, 10, 0, MediaQuery.of(context).padding.bottom + 10),
|
||||
child: Column(
|
||||
@@ -375,7 +387,10 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 14),
|
||||
alignment: Alignment.center,
|
||||
color: colorAmbientMid,
|
||||
decoration: BoxDecoration(
|
||||
color: colorAmbientMid,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: text(_quickReplies[index], 13, TextType.Regular,
|
||||
color: colorInk),
|
||||
),
|
||||
@@ -396,7 +411,10 @@ class GroupChatState extends State<GroupChat> implements ConnectGroupChat {
|
||||
child: Container(
|
||||
width: 50,
|
||||
height: 50,
|
||||
color: colorNight,
|
||||
decoration: BoxDecoration(
|
||||
color: colorNight,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Icon(CupertinoIcons.paperplane_fill,
|
||||
size: 20, color: colorLime),
|
||||
),
|
||||
|
||||
@@ -137,8 +137,8 @@ class GroupDetailState extends State<GroupDetail>
|
||||
_amount.text = formatAmount(value).replaceAll(",", "");
|
||||
}
|
||||
|
||||
void _onSubmitLog(BuildContext sheetContext, GroupGoal goal,
|
||||
GroupObjective objective) {
|
||||
void _onSubmitLog(
|
||||
BuildContext sheetContext, GroupGoal goal, GroupObjective objective) {
|
||||
final double amount = double.tryParse(_amount.text.trim()) ?? 0;
|
||||
if (amount <= 0) {
|
||||
return;
|
||||
@@ -258,7 +258,10 @@ class GroupDetailState extends State<GroupDetail>
|
||||
behavior: HitTestBehavior.opaque,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
|
||||
color: colorAmbientMid,
|
||||
decoration: BoxDecoration(
|
||||
color: colorAmbientMid,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
@@ -292,6 +295,7 @@ class GroupDetailState extends State<GroupDetail>
|
||||
child: Container(
|
||||
padding: const EdgeInsets.fromLTRB(20, 18, 16, 18),
|
||||
decoration: const BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
@@ -317,16 +321,18 @@ class GroupDetailState extends State<GroupDetail>
|
||||
Icon(CupertinoIcons.chat_bubble_2_fill,
|
||||
size: 16, color: colorLime),
|
||||
const SizedBox(width: 8),
|
||||
text("Group chat", 14, TextType.Medium,
|
||||
color: colorLime),
|
||||
text("Group chat", 14, TextType.Medium, color: colorLime),
|
||||
if (_group.unread > 0) ...[
|
||||
const SizedBox(width: 10),
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 7, vertical: 3),
|
||||
color: colorLime,
|
||||
child: text("${_group.unread} new", 10,
|
||||
TextType.Medium,
|
||||
decoration: BoxDecoration(
|
||||
color: colorLime,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(8)),
|
||||
),
|
||||
child: text(
|
||||
"${_group.unread} new", 10, TextType.Medium,
|
||||
color: colorNight),
|
||||
),
|
||||
],
|
||||
@@ -351,9 +357,12 @@ class GroupDetailState extends State<GroupDetail>
|
||||
Container(
|
||||
width: 46,
|
||||
height: 46,
|
||||
color: colorWhite.withValues(alpha: 0.12),
|
||||
child: Icon(CupertinoIcons.arrow_right,
|
||||
size: 20, color: colorWhite),
|
||||
decoration: BoxDecoration(
|
||||
color: colorWhite.withValues(alpha: 0.12),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child:
|
||||
Icon(CupertinoIcons.arrow_right, size: 20, color: colorWhite),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -409,7 +418,9 @@ class GroupDetailState extends State<GroupDetail>
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
meter(goal.progress,
|
||||
fill: tone, track: tone.withValues(alpha: 0.14), height: 6),
|
||||
fill: tone,
|
||||
track: tone.withValues(alpha: 0.14),
|
||||
height: 6),
|
||||
const SizedBox(height: 8),
|
||||
],
|
||||
),
|
||||
@@ -426,6 +437,7 @@ class GroupDetailState extends State<GroupDetail>
|
||||
return Container(
|
||||
padding: const EdgeInsets.fromLTRB(20, 14, 14, 16),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
border: Border(top: BorderSide(color: colorBorder)),
|
||||
),
|
||||
child: Row(
|
||||
@@ -472,7 +484,10 @@ class GroupDetailState extends State<GroupDetail>
|
||||
onTap: () => _onLog(goal, objective),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12),
|
||||
color: colorNight,
|
||||
decoration: BoxDecoration(
|
||||
color: colorNight,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
@@ -560,7 +575,10 @@ class GroupDetailState extends State<GroupDetail>
|
||||
child: Container(
|
||||
width: 44,
|
||||
height: 44,
|
||||
color: nudged ? colorAmbientMid : colorNight,
|
||||
decoration: BoxDecoration(
|
||||
color: nudged ? colorAmbientMid : colorNight,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Icon(
|
||||
nudged
|
||||
? CupertinoIcons.checkmark
|
||||
@@ -579,13 +597,13 @@ class GroupDetailState extends State<GroupDetail>
|
||||
|
||||
/// Log progress: an amount (with one-tap presets that suit the unit) and
|
||||
/// an optional note that rides along into the chat.
|
||||
Widget _logSheet(BuildContext sheetContext, GroupGoal goal,
|
||||
GroupObjective objective) {
|
||||
Widget _logSheet(
|
||||
BuildContext sheetContext, GroupGoal goal, GroupObjective objective) {
|
||||
final List<double> presets = _presets(objective.unit);
|
||||
|
||||
return Padding(
|
||||
padding: EdgeInsets.fromLTRB(20, 16, 20,
|
||||
MediaQuery.of(sheetContext).viewInsets.bottom + 28),
|
||||
padding: EdgeInsets.fromLTRB(
|
||||
20, 16, 20, MediaQuery.of(sheetContext).viewInsets.bottom + 28),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
@@ -612,9 +630,12 @@ class GroupDetailState extends State<GroupDetail>
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 14),
|
||||
alignment: Alignment.center,
|
||||
color: colorAmbientMid,
|
||||
child: text("+${formatAmount(preset)}", 15,
|
||||
TextType.Medium,
|
||||
decoration: BoxDecoration(
|
||||
color: colorAmbientMid,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: text(
|
||||
"+${formatAmount(preset)}", 15, TextType.Medium,
|
||||
color: colorInk),
|
||||
),
|
||||
),
|
||||
@@ -636,8 +657,8 @@ class GroupDetailState extends State<GroupDetail>
|
||||
const SizedBox(height: 14),
|
||||
inputField("Note", _note, hint: "Optional: posted with the check-in"),
|
||||
const SizedBox(height: 22),
|
||||
roundedCornerButton("Log it",
|
||||
() => _onSubmitLog(sheetContext, goal, objective),
|
||||
roundedCornerButton(
|
||||
"Log it", () => _onSubmitLog(sheetContext, goal, objective),
|
||||
icon: CupertinoIcons.checkmark),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -99,7 +99,8 @@ class GroupEditorState extends State<GroupEditor>
|
||||
}
|
||||
|
||||
if (_joining) {
|
||||
_model?.join(JoinGroupRequest(inviteCode: _code.text.trim().toUpperCase()));
|
||||
_model
|
||||
?.join(JoinGroupRequest(inviteCode: _code.text.trim().toUpperCase()));
|
||||
} else {
|
||||
_model?.create(GroupRequest(
|
||||
name: _name.text.trim(),
|
||||
@@ -130,9 +131,8 @@ class GroupEditorState extends State<GroupEditor>
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
displayTitle(_joining
|
||||
? "Got a code?"
|
||||
: "Who's keeping\nyou honest?"),
|
||||
displayTitle(
|
||||
_joining ? "Got a code?" : "Who's keeping\nyou honest?"),
|
||||
const SizedBox(height: 22),
|
||||
segmentedSelector<String>(
|
||||
options: const <String>["Create", "Join"],
|
||||
@@ -221,6 +221,7 @@ class GroupEditorState extends State<GroupEditor>
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(20),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
@@ -237,8 +238,7 @@ class GroupEditorState extends State<GroupEditor>
|
||||
size: 16, color: colorWhite.withValues(alpha: 0.7)),
|
||||
const SizedBox(width: 8),
|
||||
text("1 MEMBER", 9, TextType.Bold,
|
||||
color: colorWhite.withValues(alpha: 0.6),
|
||||
letterSpacing: 1.2),
|
||||
color: colorWhite.withValues(alpha: 0.6), letterSpacing: 1.2),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 14),
|
||||
@@ -266,6 +266,7 @@ class GroupEditorState extends State<GroupEditor>
|
||||
height: 40,
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
color: colour,
|
||||
border: Border.all(
|
||||
color: selected ? colorWhite : Colors.transparent,
|
||||
|
||||
@@ -195,8 +195,7 @@ class GroupGoalEditorState extends State<GroupGoalEditor>
|
||||
maxLines: 2,
|
||||
),
|
||||
const SizedBox(height: 28),
|
||||
sectionBreak("Objectives",
|
||||
caption: "what everyone logs toward"),
|
||||
sectionBreak("Objectives", caption: "what everyone logs toward"),
|
||||
text(
|
||||
"Break the goal into numbers people can add to: kilometres, sessions, pages, hours. Each member logs their share and the totals add up.",
|
||||
12,
|
||||
@@ -288,7 +287,8 @@ class GroupGoalEditorState extends State<GroupGoalEditor>
|
||||
keyboard: const TextInputType.numberWithOptions(
|
||||
decimal: true),
|
||||
formatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.allow(RegExp(r"[0-9.]")),
|
||||
FilteringTextInputFormatter.allow(
|
||||
RegExp(r"[0-9.]")),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -3,7 +3,11 @@ import 'package:flutter/material.dart';
|
||||
import 'GroupsState.dart';
|
||||
|
||||
class Groups extends StatefulWidget {
|
||||
const Groups({super.key});
|
||||
/// Shown as a tab inside Home: no back arrow, and room at the bottom
|
||||
/// for the nav.
|
||||
final bool tab;
|
||||
|
||||
const Groups({super.key, this.tab = false});
|
||||
|
||||
@override
|
||||
State<Groups> createState() => GroupsState();
|
||||
|
||||
@@ -86,7 +86,8 @@ class GroupsState extends State<Groups> implements ConnectGroups {
|
||||
return Sheet(
|
||||
eyebrow: "Grounded",
|
||||
title: "Groups",
|
||||
onBack: _onBack,
|
||||
onBack: widget.tab ? null : _onBack,
|
||||
bottomSpace: widget.tab ? 130 : 40,
|
||||
action: chromeAction(CupertinoIcons.add, _onNewGroup),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
@@ -133,6 +134,7 @@ class GroupsState extends State<Groups> implements ConnectGroups {
|
||||
height: 250,
|
||||
margin: const EdgeInsets.only(bottom: 14),
|
||||
decoration: const BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Color(0x262A3A30),
|
||||
@@ -141,6 +143,7 @@ class GroupsState extends State<Groups> implements ConnectGroups {
|
||||
),
|
||||
],
|
||||
),
|
||||
clipBehavior: Clip.antiAlias,
|
||||
child: Stack(
|
||||
fit: StackFit.expand,
|
||||
children: [
|
||||
@@ -175,7 +178,10 @@ class GroupsState extends State<Groups> implements ConnectGroups {
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 10, vertical: 6),
|
||||
color: colorLime,
|
||||
decoration: BoxDecoration(
|
||||
color: colorLime,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(8)),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
|
||||
@@ -23,7 +23,8 @@ class ViewGroupChat extends ParentViewModel {
|
||||
|
||||
connection.onMessagesLoaded(getGroupMessageList(response.data));
|
||||
} catch (e) {
|
||||
handleError(e, () => loadMessages(groupId), () => dismissError(), "Retry");
|
||||
handleError(
|
||||
e, () => loadMessages(groupId), () => dismissError(), "Retry");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,8 +42,8 @@ class ViewGroupDetail extends ParentViewModel {
|
||||
|
||||
connection.onProgressLogged(Group.fromJson(response.data), summary);
|
||||
} catch (e) {
|
||||
handleError(e, () => logProgress(request, summary),
|
||||
() => dismissError(), "Retry");
|
||||
handleError(e, () => logProgress(request, summary), () => dismissError(),
|
||||
"Retry");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -81,6 +81,10 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
|
||||
bool _weekly = false;
|
||||
|
||||
/// The open tab, and the tabs built so far.
|
||||
int _tab = 0;
|
||||
|
||||
final Set<int> _opened = <int>{0};
|
||||
|
||||
Standing _standing = Standing.Good;
|
||||
|
||||
@@ -183,28 +187,14 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
_model?.tick(item);
|
||||
}
|
||||
|
||||
void _onOpenProgress() {
|
||||
GroundedNavigation().navigateToPageWithData(const Progress(), context);
|
||||
}
|
||||
|
||||
void _onOpenReportCard() {
|
||||
GroundedNavigation().navigateToPage(
|
||||
NavigatorType.justOpen, const ReportCardScreen(), context);
|
||||
}
|
||||
|
||||
void _onOpenGoals() async {
|
||||
final result = await GroundedNavigation()
|
||||
.navigateToPageWithData(const Goals(), context);
|
||||
void _onOpenGoals() => _onNavGoals();
|
||||
|
||||
if (result == true) {
|
||||
_model?.loadPlan();
|
||||
}
|
||||
}
|
||||
|
||||
void _onOpenGroups() async {
|
||||
await GroundedNavigation().navigateToPageWithData(const Groups(), context);
|
||||
_model?.loadGroups();
|
||||
}
|
||||
void _onOpenGroups() => _onNavGroups();
|
||||
|
||||
void _onOpenGroupChat(Group group) async {
|
||||
await GroundedNavigation()
|
||||
@@ -224,11 +214,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
.navigateToPage(NavigatorType.justOpen, const Training(), context);
|
||||
}
|
||||
|
||||
void _onOpenRoutines() async {
|
||||
await GroundedNavigation()
|
||||
.navigateToPageWithData(const Routines(), context);
|
||||
_model?.loadRoutines();
|
||||
}
|
||||
void _onOpenRoutines() => _onNavRoutines();
|
||||
|
||||
void _onOpenKind(RoutineKind kind) async {
|
||||
await GroundedNavigation()
|
||||
@@ -260,7 +246,39 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
.navigateToPage(NavigatorType.justOpen, const ExcuseReport(), context);
|
||||
}
|
||||
|
||||
void _onNavToday() {}
|
||||
/// The nav switches tabs in place; nothing is pushed. A tab is built the
|
||||
/// first time it is opened and then kept, so it holds its scroll and data.
|
||||
void _onSelectTab(int index) {
|
||||
if (index == _tab) {
|
||||
return;
|
||||
}
|
||||
setState(() {
|
||||
_tab = index;
|
||||
_opened.add(index);
|
||||
});
|
||||
|
||||
// Back on Today: pick up whatever changed in the other tabs.
|
||||
if (index == 0) {
|
||||
_model?.loadRoutines();
|
||||
_model?.loadGroups();
|
||||
}
|
||||
}
|
||||
|
||||
void _onNavToday() => _onSelectTab(0);
|
||||
|
||||
void _onNavRoutines() => _onSelectTab(1);
|
||||
|
||||
void _onNavGoals() => _onSelectTab(2);
|
||||
|
||||
void _onNavGroups() => _onSelectTab(3);
|
||||
|
||||
void _onNavProgress() => _onSelectTab(4);
|
||||
|
||||
void _onBackToToday(bool didPop, Object? result) {
|
||||
if (!didPop) {
|
||||
_onSelectTab(0);
|
||||
}
|
||||
}
|
||||
|
||||
void _onShowToday() {
|
||||
setState(() {
|
||||
@@ -288,9 +306,9 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
return FadeTransition(
|
||||
opacity: curve,
|
||||
child: SlideTransition(
|
||||
position: Tween<Offset>(
|
||||
begin: const Offset(0, 0.12), end: Offset.zero)
|
||||
.animate(curve),
|
||||
position:
|
||||
Tween<Offset>(begin: const Offset(0, 0.12), end: Offset.zero)
|
||||
.animate(curve),
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
@@ -389,85 +407,112 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
final bool queueIsHome =
|
||||
StandingEngine.showsOverdueQueueAsHome(_standing) && !_distressed;
|
||||
|
||||
return AnnotatedRegion<SystemUiOverlayStyle>(
|
||||
value: SystemUiOverlayStyle.light,
|
||||
child: Scaffold(
|
||||
backgroundColor: colorAmbientMid,
|
||||
body: AmbientBackground(
|
||||
child: Stack(
|
||||
children: [
|
||||
SingleChildScrollView(
|
||||
padding: const EdgeInsets.only(bottom: 130),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
_header(),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(20, 24, 20, 0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
if (_distressed)
|
||||
_frosted(_distressBody())
|
||||
else if (queueIsHome)
|
||||
_frosted(_groundedBody())
|
||||
else
|
||||
_planBody(),
|
||||
],
|
||||
),
|
||||
),
|
||||
// Back on another tab returns to Today rather than leaving the app.
|
||||
return PopScope(
|
||||
canPop: _tab == 0,
|
||||
onPopInvokedWithResult: _onBackToToday,
|
||||
child: AnnotatedRegion<SystemUiOverlayStyle>(
|
||||
value: SystemUiOverlayStyle.light,
|
||||
child: Scaffold(
|
||||
backgroundColor: colorAmbientMid,
|
||||
body: AmbientBackground(
|
||||
child: Stack(
|
||||
children: [
|
||||
IndexedStack(
|
||||
index: _tab,
|
||||
children: <Widget>[
|
||||
_todayView(queueIsHome),
|
||||
_opened.contains(1)
|
||||
? const Routines(tab: true)
|
||||
: const SizedBox.shrink(),
|
||||
_opened.contains(2)
|
||||
? const Goals(tab: true)
|
||||
: const SizedBox.shrink(),
|
||||
_opened.contains(3)
|
||||
? const Groups(tab: true)
|
||||
: const SizedBox.shrink(),
|
||||
_opened.contains(4)
|
||||
? const Progress(tab: true)
|
||||
: const SizedBox.shrink(),
|
||||
],
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
child: FloatingNav(
|
||||
selected: 0,
|
||||
entries: <NavEntry>[
|
||||
(
|
||||
icon: CupertinoIcons.house_fill,
|
||||
label: "Today",
|
||||
onTap: _onNavToday
|
||||
),
|
||||
(
|
||||
icon: CupertinoIcons.square_stack_3d_up_fill,
|
||||
label: "Routines",
|
||||
onTap: _onOpenRoutines
|
||||
),
|
||||
(
|
||||
icon: CupertinoIcons.flag_fill,
|
||||
label: "Goals",
|
||||
onTap: _onOpenGoals
|
||||
),
|
||||
(
|
||||
icon: CupertinoIcons.person_3_fill,
|
||||
label: "Groups",
|
||||
onTap: _onOpenGroups
|
||||
),
|
||||
(
|
||||
icon: CupertinoIcons.chart_bar_alt_fill,
|
||||
label: "Progress",
|
||||
onTap: _onOpenProgress
|
||||
),
|
||||
],
|
||||
).animate().fadeIn(duration: 400.ms, delay: 250.ms).slideY(
|
||||
begin: 0.4,
|
||||
end: 0,
|
||||
duration: 500.ms,
|
||||
delay: 250.ms,
|
||||
curve: Curves.easeOutCubic),
|
||||
),
|
||||
],
|
||||
Positioned(
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
child: FloatingNav(
|
||||
selected: _tab,
|
||||
entries: <NavEntry>[
|
||||
(
|
||||
icon: CupertinoIcons.house_fill,
|
||||
label: "Today",
|
||||
onTap: _onNavToday
|
||||
),
|
||||
(
|
||||
icon: CupertinoIcons.square_stack_3d_up_fill,
|
||||
label: "Routines",
|
||||
onTap: _onNavRoutines
|
||||
),
|
||||
(
|
||||
icon: CupertinoIcons.flag_fill,
|
||||
label: "Goals",
|
||||
onTap: _onNavGoals
|
||||
),
|
||||
(
|
||||
icon: CupertinoIcons.person_3_fill,
|
||||
label: "Groups",
|
||||
onTap: _onNavGroups
|
||||
),
|
||||
(
|
||||
icon: CupertinoIcons.chart_bar_alt_fill,
|
||||
label: "Progress",
|
||||
onTap: _onNavProgress
|
||||
),
|
||||
],
|
||||
).animate().fadeIn(duration: 400.ms, delay: 250.ms).slideY(
|
||||
begin: 0.4,
|
||||
end: 0,
|
||||
duration: 500.ms,
|
||||
delay: 250.ms,
|
||||
curve: Curves.easeOutCubic),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// The Today tab: the forest header and the day under it.
|
||||
Widget _todayView(bool queueIsHome) {
|
||||
return SingleChildScrollView(
|
||||
padding: const EdgeInsets.only(bottom: 130),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
_header(),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(20, 24, 20, 0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
if (_distressed)
|
||||
_frosted(_distressBody())
|
||||
else if (queueIsHome)
|
||||
_frosted(_groundedBody())
|
||||
else
|
||||
_planBody(),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// ── Header ────────────────────────────────────────────────────────────────
|
||||
|
||||
/// The deep forest block: who you are, the week as a streak, and the day
|
||||
@@ -475,6 +520,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
Widget _header() {
|
||||
return Container(
|
||||
decoration: const BoxDecoration(
|
||||
borderRadius: BorderRadius.vertical(bottom: Radius.circular(20)),
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
@@ -568,6 +614,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(4),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
color: colorHeaderPanel,
|
||||
border: Border.all(color: colorHeaderLine),
|
||||
),
|
||||
@@ -589,7 +636,12 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
curve: Curves.easeOutCubic,
|
||||
padding: const EdgeInsets.symmetric(vertical: 13),
|
||||
alignment: Alignment.center,
|
||||
color: active ? colorHeaderSelected : colorHeaderSelected.withValues(alpha: 0),
|
||||
decoration: BoxDecoration(
|
||||
color: active
|
||||
? colorHeaderSelected
|
||||
: colorHeaderSelected.withValues(alpha: 0),
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: text(label, 16, active ? TextType.Medium : TextType.Regular,
|
||||
color: active ? colorWhite : colorHeaderMuted),
|
||||
),
|
||||
@@ -603,12 +655,19 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
final DateTime first = DateTime(now.year, now.month, now.day)
|
||||
.subtract(const Duration(days: 6));
|
||||
const List<String> days = <String>[
|
||||
"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
|
||||
"Mon",
|
||||
"Tue",
|
||||
"Wed",
|
||||
"Thu",
|
||||
"Fri",
|
||||
"Sat",
|
||||
"Sun"
|
||||
];
|
||||
|
||||
return Container(
|
||||
padding: const EdgeInsets.fromLTRB(18, 16, 18, 18),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
color: colorHeaderPanel,
|
||||
border: Border.all(color: colorHeaderLine),
|
||||
),
|
||||
@@ -621,8 +680,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
children: [
|
||||
text("${_streak()}", 28, TextType.Medium, color: colorWhite),
|
||||
const SizedBox(width: 8),
|
||||
text("day streak", 16, TextType.Regular,
|
||||
color: colorHeaderMuted),
|
||||
text("day streak", 16, TextType.Regular, color: colorHeaderMuted),
|
||||
const Spacer(),
|
||||
Icon(Icons.eco, size: 32, color: colorLime),
|
||||
],
|
||||
@@ -733,10 +791,10 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
|
||||
/// The week in numbers: the average kept, a bar per day, and the classes.
|
||||
Widget _weeklyNumbers() {
|
||||
final Map<int, double> byDay = _week?.completionByWeekday ?? <int, double>{};
|
||||
final double average = byDay.isEmpty
|
||||
? 0
|
||||
: byDay.values.reduce((a, b) => a + b) / byDay.length;
|
||||
final Map<int, double> byDay =
|
||||
_week?.completionByWeekday ?? <int, double>{};
|
||||
final double average =
|
||||
byDay.isEmpty ? 0 : byDay.values.reduce((a, b) => a + b) / byDay.length;
|
||||
const List<String> letters = <String>["M", "T", "W", "T", "F", "S", "S"];
|
||||
final DateTime now = DateTime.now();
|
||||
final List<int> order = <int>[
|
||||
@@ -781,12 +839,17 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
duration: const Duration(milliseconds: 400),
|
||||
curve: Curves.easeOutCubic,
|
||||
height: 90 * (byDay[day] ?? 0).clamp(0.04, 1.0),
|
||||
color: (byDay[day] ?? 0) >= _keptFloor
|
||||
? colorBarElective
|
||||
: colorHeaderLine,
|
||||
decoration: BoxDecoration(
|
||||
color: (byDay[day] ?? 0) >= _keptFloor
|
||||
? colorBarElective
|
||||
: colorHeaderLine,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
text(letters[day - 1], 13,
|
||||
text(
|
||||
letters[day - 1],
|
||||
13,
|
||||
day == now.weekday
|
||||
? TextType.Medium
|
||||
: TextType.Regular,
|
||||
@@ -834,7 +897,9 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
return Container(
|
||||
width: 74,
|
||||
height: 74,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(16)),
|
||||
border: Border.all(color: colorWhite, width: 2),
|
||||
),
|
||||
child: Opacity(
|
||||
@@ -899,7 +964,10 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
const SizedBox(height: 9),
|
||||
Container(
|
||||
height: 7,
|
||||
color: colorHeaderLine,
|
||||
decoration: BoxDecoration(
|
||||
color: colorHeaderLine,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
alignment: Alignment.centerLeft,
|
||||
child: FractionallySizedBox(
|
||||
widthFactor: fraction.clamp(0.0, 1.0),
|
||||
@@ -978,23 +1046,29 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
child: Container(
|
||||
width: 54,
|
||||
height: 54,
|
||||
color: colorWhite,
|
||||
decoration: BoxDecoration(
|
||||
color: colorWhite,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Icon(CupertinoIcons.xmark, size: 22, color: colorInk),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
color: colorWhite,
|
||||
padding: EdgeInsets.fromLTRB(
|
||||
18, 14, 18, MediaQuery.of(sheetContext).padding.bottom + 22),
|
||||
decoration: BoxDecoration(
|
||||
color: colorWhite,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
padding: EdgeInsets.fromLTRB(18, 14, 18,
|
||||
MediaQuery.of(sheetContext).padding.bottom + 22),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Center(
|
||||
child: Container(
|
||||
width: 40, height: 4, color: colorGrabber),
|
||||
child:
|
||||
Container(width: 40, height: 4, color: colorGrabber),
|
||||
),
|
||||
const SizedBox(height: 18),
|
||||
text("Add to today", 24, TextType.Medium,
|
||||
@@ -1023,12 +1097,12 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
"Must-do", _onAddPickMustDo)),
|
||||
const SizedBox(width: 10),
|
||||
Expanded(
|
||||
child: _addTile(CupertinoIcons.flag,
|
||||
"Goal", _onAddPickGoal)),
|
||||
child: _addTile(
|
||||
CupertinoIcons.flag, "Goal", _onAddPickGoal)),
|
||||
const SizedBox(width: 10),
|
||||
Expanded(
|
||||
child: _addTile(CupertinoIcons.person_3,
|
||||
"Group", _onAddPickGroup)),
|
||||
child: _addTile(CupertinoIcons.person_3, "Group",
|
||||
_onAddPickGroup)),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
@@ -1049,7 +1123,10 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
onTap: onTap,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 22),
|
||||
color: colorAmbientMid,
|
||||
decoration: BoxDecoration(
|
||||
color: colorAmbientMid,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
@@ -1067,7 +1144,10 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
onTap: onTap,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 22),
|
||||
color: colorAmbientMid,
|
||||
decoration: BoxDecoration(
|
||||
color: colorAmbientMid,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
@@ -1093,7 +1173,9 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
return Container(
|
||||
width: size,
|
||||
height: size,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
border: Border.all(color: colorWhite, width: 2),
|
||||
),
|
||||
child: Stack(
|
||||
@@ -1101,8 +1183,8 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
children: [
|
||||
SceneArt(palette: sceneWorkout, seed: sceneSeed(_user.name)),
|
||||
Center(
|
||||
child: text(initial, size * 0.4, TextType.Medium,
|
||||
color: colorWhite),
|
||||
child:
|
||||
text(initial, size * 0.4, TextType.Medium, color: colorWhite),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -1195,7 +1277,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
padding: const EdgeInsets.fromLTRB(20, 24, 20, 24),
|
||||
decoration: BoxDecoration(
|
||||
color: colorFrost,
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
border: Border.all(color: colorGlassBorder),
|
||||
),
|
||||
child: child,
|
||||
@@ -1300,12 +1382,12 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
children: [
|
||||
_category(sceneWorkout, kindIcon(RoutineKind.Workout), "Workout", 3,
|
||||
() => _onOpenKind(RoutineKind.Workout)),
|
||||
_category(sceneMeditation, kindIcon(RoutineKind.Meditation),
|
||||
"Meditate", 5, () => _onOpenKind(RoutineKind.Meditation)),
|
||||
_category(sceneMeditation, kindIcon(RoutineKind.Meditation), "Meditate",
|
||||
5, () => _onOpenKind(RoutineKind.Meditation)),
|
||||
_category(sceneMustDo, kindIcon(RoutineKind.MustDo), "Must-do", 8,
|
||||
() => _onOpenKind(RoutineKind.MustDo)),
|
||||
_category(goalScene(goalAccents[4]), CupertinoIcons.flag_fill,
|
||||
"Goals", 13, _onOpenGoals),
|
||||
_category(goalScene(goalAccents[4]), CupertinoIcons.flag_fill, "Goals",
|
||||
13, _onOpenGoals),
|
||||
_category(goalScene(goalAccents[2]), CupertinoIcons.flame_fill,
|
||||
"Training", 21, _onOpenTraining),
|
||||
],
|
||||
@@ -1324,6 +1406,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
width: 74,
|
||||
height: 74,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
border: Border.all(color: colorWhite, width: 2.5),
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
@@ -1333,7 +1416,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
),
|
||||
],
|
||||
),
|
||||
child: ClipRect(
|
||||
child: ClipOval(
|
||||
child: SceneArt(
|
||||
palette: palette,
|
||||
seed: seed,
|
||||
@@ -1376,7 +1459,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
child: Container(
|
||||
width: 244,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
color: Color(0x262A3A30),
|
||||
@@ -1386,7 +1469,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
],
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
child: Stack(
|
||||
fit: StackFit.expand,
|
||||
children: [
|
||||
@@ -1407,7 +1490,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
children: [
|
||||
GlassSurface(
|
||||
onDark: true,
|
||||
radius: BorderRadius.zero,
|
||||
radius: BorderRadius.all(Radius.circular(14)),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 10, vertical: 5),
|
||||
child: text(
|
||||
@@ -1515,7 +1598,9 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
onTap: () => _onOpenGroupChat(group),
|
||||
child: Container(
|
||||
width: 250,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
color: colorWhite,
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
@@ -1550,9 +1635,13 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8, vertical: 4),
|
||||
color: colorLime,
|
||||
child: text("${group.unread} new", 10,
|
||||
TextType.Medium,
|
||||
decoration: BoxDecoration(
|
||||
color: colorLime,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: text(
|
||||
"${group.unread} new", 10, TextType.Medium,
|
||||
color: colorNight),
|
||||
),
|
||||
const Spacer(),
|
||||
@@ -1618,9 +1707,8 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
sectionBreak(
|
||||
"To-do",
|
||||
caption: "${open.length} open, no debt",
|
||||
trailing: done.isEmpty
|
||||
? null
|
||||
: _viewAll("Clear done", _onClearDoneTodos),
|
||||
trailing:
|
||||
done.isEmpty ? null : _viewAll("Clear done", _onClearDoneTodos),
|
||||
),
|
||||
GlassSurface(
|
||||
tint: colorGlassStrong,
|
||||
@@ -1645,7 +1733,10 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
child: Container(
|
||||
width: 48,
|
||||
height: 48,
|
||||
color: colorNight,
|
||||
decoration: BoxDecoration(
|
||||
color: colorNight,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
child: Icon(CupertinoIcons.add,
|
||||
size: 22, color: colorLime),
|
||||
@@ -1691,6 +1782,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
width: 30,
|
||||
height: 30,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.all(Radius.circular(8)),
|
||||
color: item.done ? colorPrimary : colorWhite,
|
||||
border: Border.all(
|
||||
color: item.done
|
||||
@@ -1794,11 +1886,14 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
"Your standing will recover as the debt decays.",
|
||||
)
|
||||
else
|
||||
..._overdue.take(_standing == Standing.Lockdown ? 1 : _overdue.length)
|
||||
..._overdue
|
||||
.take(_standing == Standing.Lockdown ? 1 : _overdue.length)
|
||||
.map(_commitmentRow),
|
||||
const SizedBox(height: 24),
|
||||
roundedCornerButton(
|
||||
_standing == Standing.Lockdown ? "Deal with this one" : "Open the queue",
|
||||
_standing == Standing.Lockdown
|
||||
? "Deal with this one"
|
||||
: "Open the queue",
|
||||
_onOpenOverdue,
|
||||
background: standingColor(_standing),
|
||||
icon: CupertinoIcons.arrow_right,
|
||||
@@ -1853,8 +1948,8 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
const SizedBox(height: 24),
|
||||
sectionBreak("Three things", caption: "that actually matter"),
|
||||
..._plan
|
||||
.where((item) =>
|
||||
item.commitmentClass == CommitmentClass.NonNegotiable)
|
||||
.where(
|
||||
(item) => item.commitmentClass == CommitmentClass.NonNegotiable)
|
||||
.take(3)
|
||||
.map(_commitmentRow),
|
||||
const SizedBox(height: 24),
|
||||
@@ -1871,7 +1966,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
onTap: _onOpenOverdue,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
gradient: const LinearGradient(
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
@@ -1894,6 +1989,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
height: 58,
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
gradient: const RadialGradient(
|
||||
center: Alignment(-0.3, -0.4),
|
||||
colors: <Color>[colorOverdueGlow, colorStandingGrounded],
|
||||
@@ -1943,7 +2039,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
child: Container(
|
||||
padding: const EdgeInsets.fromLTRB(22, 22, 22, 24),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||
gradient: const LinearGradient(
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
@@ -1967,8 +2063,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
const SizedBox(width: 6),
|
||||
text("Pattern spotted", 12, TextType.Medium, color: colorLime),
|
||||
const Spacer(),
|
||||
text("${cluster.occurrences}× this month", 11,
|
||||
TextType.Regular,
|
||||
text("${cluster.occurrences}× this month", 11, TextType.Regular,
|
||||
color: colorWhite.withValues(alpha: 0.5)),
|
||||
],
|
||||
),
|
||||
@@ -2017,7 +2112,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
width: 88,
|
||||
height: 88,
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.all(Radius.circular(12)),
|
||||
child: Opacity(
|
||||
opacity: ticked ? 0.45 : 1,
|
||||
child: SceneArt(
|
||||
@@ -2059,8 +2154,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
const SizedBox(height: 5),
|
||||
Row(
|
||||
children: [
|
||||
Icon(CupertinoIcons.clock, size: 11,
|
||||
color: colorInkSoft),
|
||||
Icon(CupertinoIcons.clock, size: 11, color: colorInkSoft),
|
||||
const SizedBox(width: 4),
|
||||
Flexible(
|
||||
child: text(formatWindow(item), 11, TextType.Regular,
|
||||
@@ -2069,11 +2163,9 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
overflow: TextOverflow.ellipsis),
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
Icon(CupertinoIcons.timer, size: 11,
|
||||
color: colorInkSoft),
|
||||
Icon(CupertinoIcons.timer, size: 11, color: colorInkSoft),
|
||||
const SizedBox(width: 4),
|
||||
text(formatMinutes(item.estMinutes), 11,
|
||||
TextType.Regular,
|
||||
text(formatMinutes(item.estMinutes), 11, TextType.Regular,
|
||||
color: colorInkSoft),
|
||||
],
|
||||
),
|
||||
@@ -2101,6 +2193,7 @@ class HomeState extends State<Home> implements ConnectHome {
|
||||
width: 44,
|
||||
height: 44,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: checked ? colorPrimary : colorWhite,
|
||||
border: Border.all(
|
||||
color: checked ? colorPrimary : accent.withValues(alpha: 0.35),
|
||||
|
||||
@@ -184,8 +184,8 @@ class LiveTaskState extends State<LiveTask>
|
||||
decoration: BoxDecoration(
|
||||
color: colorSheetBackground,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
|
||||
@@ -107,8 +107,8 @@ class LoginState extends State<Login> implements ConnectLogin {
|
||||
decoration: BoxDecoration(
|
||||
color: colorPrimaryLight,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
clipBehavior: Clip.antiAlias,
|
||||
|
||||
@@ -147,8 +147,8 @@ class OverdueQueueState extends State<OverdueQueue>
|
||||
decoration: BoxDecoration(
|
||||
color: colorSheetBackground,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
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.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -242,8 +242,8 @@ class OverdueQueueState extends State<OverdueQueue>
|
||||
decoration: BoxDecoration(
|
||||
color: colorSheetBackground,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
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.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -343,8 +343,8 @@ class OverdueQueueState extends State<OverdueQueue>
|
||||
decoration: BoxDecoration(
|
||||
color: colorSheetBackground,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
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.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -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.zero,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
|
||||
@@ -152,7 +152,7 @@ class ParentViewModel extends ChangeNotifier {
|
||||
height: 64,
|
||||
decoration: BoxDecoration(
|
||||
color: colorPrimaryDark,
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
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.zero,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
child: Icon(
|
||||
CupertinoIcons.exclamationmark_triangle_fill,
|
||||
@@ -544,8 +544,8 @@ class ParentViewModel extends ChangeNotifier {
|
||||
decoration: BoxDecoration(
|
||||
color: colorSheetBackground,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
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.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -579,7 +579,7 @@ class ParentViewModel extends ChangeNotifier {
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
color: actionBgColor,
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
),
|
||||
child: Icon(actionIconData,
|
||||
size: 24, color: actionColor),
|
||||
|
||||
@@ -3,7 +3,11 @@ import 'package:flutter/material.dart';
|
||||
import 'ProgressState.dart';
|
||||
|
||||
class Progress extends StatefulWidget {
|
||||
const Progress({super.key});
|
||||
/// Shown as a tab inside Home: no back arrow, and room at the bottom
|
||||
/// for the nav.
|
||||
final bool tab;
|
||||
|
||||
const Progress({super.key, this.tab = false});
|
||||
|
||||
@override
|
||||
State<Progress> createState() => ProgressState();
|
||||
|
||||
@@ -33,7 +33,13 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
bool _loaded = false;
|
||||
|
||||
static const List<String> _weekLetters = <String>[
|
||||
"M", "T", "W", "T", "F", "S", "S"
|
||||
"M",
|
||||
"T",
|
||||
"W",
|
||||
"T",
|
||||
"F",
|
||||
"S",
|
||||
"S"
|
||||
];
|
||||
|
||||
@override
|
||||
@@ -130,7 +136,8 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
return Sheet(
|
||||
eyebrow: "Over time",
|
||||
title: "Progress",
|
||||
onBack: _onBack,
|
||||
onBack: widget.tab ? null : _onBack,
|
||||
bottomSpace: widget.tab ? 130 : 40,
|
||||
action: chromeAction(CupertinoIcons.slider_horizontal_3, _onOpenTargets),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
@@ -175,7 +182,6 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
"Weekly report card",
|
||||
_onOpenReportCard,
|
||||
icon: CupertinoIcons.doc_text,
|
||||
radius: 0,
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
],
|
||||
@@ -190,7 +196,10 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
onTap: _onOpenTargets,
|
||||
child: Container(
|
||||
padding: const EdgeInsets.fromLTRB(18, 16, 14, 16),
|
||||
color: colorNight,
|
||||
decoration: BoxDecoration(
|
||||
color: colorNight,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(CupertinoIcons.scope, size: 22, color: colorLime),
|
||||
@@ -226,8 +235,7 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
/// and the bars underneath.
|
||||
Widget _headline() {
|
||||
final int held = ProgressEngine.held(_current);
|
||||
final int target =
|
||||
ProgressEngine.routineTarget(_targets, _period, _start);
|
||||
final int target = ProgressEngine.routineTarget(_targets, _period, _start);
|
||||
final int delta = held - ProgressEngine.held(_previous);
|
||||
|
||||
return card(
|
||||
@@ -270,14 +278,16 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
}
|
||||
|
||||
Widget _deltaChip(int delta) {
|
||||
final Color tone = delta > 0
|
||||
? colorPositive
|
||||
: (delta < 0 ? colorNegative : colorInkSoft);
|
||||
final Color tone =
|
||||
delta > 0 ? colorPositive : (delta < 0 ? colorNegative : colorInkSoft);
|
||||
final String sign = delta > 0 ? "+" : "";
|
||||
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 9, vertical: 5),
|
||||
color: tone.withValues(alpha: 0.12),
|
||||
decoration: BoxDecoration(
|
||||
color: tone.withValues(alpha: 0.12),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(8)),
|
||||
),
|
||||
child: text("$sign$delta vs $_previousNoun", 11, TextType.Medium,
|
||||
color: tone),
|
||||
);
|
||||
@@ -319,9 +329,12 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
const SizedBox(height: 4),
|
||||
Container(
|
||||
height: future ? 4 : 6 + 84 * fraction,
|
||||
color: isCurrent
|
||||
? colorNight
|
||||
: (future ? colorMuted : colorChartGrid),
|
||||
decoration: BoxDecoration(
|
||||
color: isCurrent
|
||||
? colorNight
|
||||
: (future ? colorMuted : colorChartGrid),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(4)),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
text(
|
||||
@@ -343,8 +356,7 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
|
||||
Widget _activeTile() {
|
||||
final int minutes = ProgressEngine.minutes(_current);
|
||||
final int target =
|
||||
ProgressEngine.minuteTarget(_targets, _period, _start);
|
||||
final int target = ProgressEngine.minuteTarget(_targets, _period, _start);
|
||||
|
||||
return _tile(
|
||||
CupertinoIcons.clock,
|
||||
@@ -396,14 +408,20 @@ class ProgressState extends State<Progress> implements ConnectProgress {
|
||||
return Container(
|
||||
margin: const EdgeInsets.only(bottom: 10),
|
||||
padding: const EdgeInsets.fromLTRB(14, 12, 16, 12),
|
||||
color: colorCard,
|
||||
decoration: BoxDecoration(
|
||||
color: colorCard,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 42,
|
||||
height: 42,
|
||||
alignment: Alignment.center,
|
||||
color: kindColor(kind).withValues(alpha: 0.14),
|
||||
decoration: BoxDecoration(
|
||||
color: kindColor(kind).withValues(alpha: 0.14),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Icon(kindIcon(kind), size: 20, color: kindColor(kind)),
|
||||
),
|
||||
const SizedBox(width: 14),
|
||||
|
||||
@@ -166,7 +166,6 @@ class TargetSetupState extends State<TargetSetup>
|
||||
"Save targets",
|
||||
_onSave,
|
||||
icon: CupertinoIcons.checkmark,
|
||||
radius: 0,
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
],
|
||||
@@ -225,8 +224,8 @@ class TargetSetupState extends State<TargetSetup>
|
||||
if (_scheduled != _targets.routinesPerWeek)
|
||||
GestureDetector(
|
||||
onTap: _onMatchSchedule,
|
||||
child: text("Match it", 12, TextType.Medium,
|
||||
color: colorInk),
|
||||
child:
|
||||
text("Match it", 12, TextType.Medium, color: colorInk),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -243,7 +242,10 @@ class TargetSetupState extends State<TargetSetup>
|
||||
width: 48,
|
||||
height: 48,
|
||||
alignment: Alignment.center,
|
||||
color: enabled ? colorNight : colorMuted,
|
||||
decoration: BoxDecoration(
|
||||
color: enabled ? colorNight : colorMuted,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||
),
|
||||
child: Icon(icon, size: 20, color: enabled ? colorLime : colorGrey),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -17,11 +17,9 @@ class ViewProgress extends ParentViewModel {
|
||||
/// The runs and targets are on the device, so there is no network guard
|
||||
/// or spinner. Until a target is saved, the schedule stands in for it.
|
||||
void initialise() async {
|
||||
final List<RoutineRunRecord> records =
|
||||
await getDataManager().getRunLog();
|
||||
final List<RoutineRunRecord> records = await getDataManager().getRunLog();
|
||||
|
||||
final ProgressTargets targets =
|
||||
await getDataManager().getProgressTargets();
|
||||
final ProgressTargets targets = await getDataManager().getProgressTargets();
|
||||
|
||||
if (!targets.set) {
|
||||
try {
|
||||
@@ -31,8 +29,8 @@ class ViewProgress extends ParentViewModel {
|
||||
page: Pageable(0, 0, 50, 0),
|
||||
),
|
||||
));
|
||||
final int scheduled = ProgressEngine.scheduledPerWeek(
|
||||
getRoutineChainList(response.data));
|
||||
final int scheduled =
|
||||
ProgressEngine.scheduledPerWeek(getRoutineChainList(response.data));
|
||||
if (scheduled > 0) {
|
||||
targets.routinesPerWeek = scheduled;
|
||||
}
|
||||
|
||||
@@ -20,8 +20,7 @@ class ViewTargetSetup extends ParentViewModel {
|
||||
/// Targets are on the device; the routines are only needed to count the
|
||||
/// schedule and to place reminders, so their failure is quiet.
|
||||
void initialise() async {
|
||||
final ProgressTargets targets =
|
||||
await getDataManager().getProgressTargets();
|
||||
final ProgressTargets targets = await getDataManager().getProgressTargets();
|
||||
|
||||
try {
|
||||
final response = await getDataManager().getMyRoutines(HistoryRequest(
|
||||
|
||||
@@ -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.zero,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
@@ -128,7 +128,7 @@ class ReportCardScreenState extends State<ReportCardScreen>
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
color: colorWhite,
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: text(_report.grade, 26, TextType.Light,
|
||||
color: colorPrimaryDark),
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -99,8 +99,8 @@ class SettingsState extends State<Settings> implements ConnectSettings {
|
||||
decoration: BoxDecoration(
|
||||
color: colorSheetBackground,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
@@ -118,7 +118,7 @@ class SettingsState extends State<Settings> implements ConnectSettings {
|
||||
margin: const EdgeInsets.only(bottom: 20),
|
||||
decoration: BoxDecoration(
|
||||
color: colorGrey.withValues(alpha: 0.35),
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -228,7 +228,7 @@ class SettingsState extends State<Settings> implements ConnectSettings {
|
||||
color: _amnestyRemaining > 0
|
||||
? colorStandingGoodBg
|
||||
: colorMuted,
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: Icon(
|
||||
CupertinoIcons.checkmark_shield_fill,
|
||||
|
||||
@@ -239,7 +239,7 @@ class SplashState extends State<Splash> implements ConnectSplash {
|
||||
],
|
||||
),
|
||||
GlassSurface(
|
||||
radius: BorderRadius.zero,
|
||||
radius: BorderRadius.circular(14),
|
||||
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.zero,
|
||||
radius: BorderRadius.circular(16),
|
||||
padding: const EdgeInsets.all(10),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
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.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
color: Color(0x142A3A30),
|
||||
@@ -352,7 +352,7 @@ class SplashState extends State<Splash> implements ConnectSplash {
|
||||
],
|
||||
),
|
||||
child: GlassSurface(
|
||||
radius: BorderRadius.zero,
|
||||
radius: BorderRadius.circular(14),
|
||||
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.zero,
|
||||
radius: BorderRadius.circular(16),
|
||||
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.zero,
|
||||
radius: BorderRadius.circular(14),
|
||||
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.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
).animate().scaleX(
|
||||
begin: 0.04,
|
||||
|
||||
@@ -71,7 +71,7 @@ class SessionExpiredState extends State<SessionExpired>
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
color: colorWhite.withValues(alpha: 0.10),
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
child: Icon(CupertinoIcons.lock_fill,
|
||||
size: 24, color: colorWhite),
|
||||
|
||||
@@ -68,7 +68,7 @@ class UpdateMeState extends State<UpdateMe> implements ConnectUpdateMe {
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
color: colorWhite.withValues(alpha: 0.10),
|
||||
borderRadius: BorderRadius.zero,
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
),
|
||||
child: Icon(CupertinoIcons.arrow_up_circle_fill,
|
||||
size: 24, color: colorWhite),
|
||||
|
||||
Reference in New Issue
Block a user