Skip to content

Commit 341f410

Browse files
richardthe3rdclaude
andcommitted
Merge main, keep updated goldens for new style descriptions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 parents a521535 + 776c9f5 commit 341f410

12 files changed

Lines changed: 542 additions & 142 deletions

AGENTS.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ MISE_ENV=dev ./bin/mise tasks ls
2121
| Task | Command | Notes |
2222
|------|---------|-------|
2323
| **Discover tasks** | `./bin/mise tasks ls` | Run this first! |
24-
| Install dependencies | `./bin/mise run install` | Required after checkout |
2524
| Generate code (mocks) | `./bin/mise run generate` | After model changes |
2625
| Analyze code | `./bin/mise run analyze` | **Must pass before commit** |
2726
| Run tests | `./bin/mise run test` | All unit/widget tests |
@@ -42,7 +41,8 @@ MISE_ENV=dev ./bin/mise tasks ls
4241
This project has two mise configurations:
4342

4443
1. **Base (`mise.toml`)**: Core tools and tasks - use `./bin/mise`
45-
- Available: install, generate, test, coverage, analyze
44+
- Available: generate, test, coverage, analyze
45+
- Flutter deps (`flutter pub get`) run automatically via `mise deps`
4646

4747
2. **Developer (`mise.dev.toml`)**: Additional dev tools - use `MISE_ENV=dev ./bin/mise`
4848
- Additional tasks: dev, build:web, build:web:prod, serve:release, playwright-setup
@@ -71,7 +71,7 @@ The CI pipeline (`.github/workflows/ci.yml`) runs these commands. Here's how to
7171

7272
| CI Command | Mise Equivalent | When to Use |
7373
|------------|-----------------|-------------|
74-
| `flutter pub get` | `./bin/mise run install` | After checkout, pubspec changes |
74+
| `flutter pub get` | automatic (`mise deps`) | Runs before tasks when pubspec changes |
7575
| `dart run build_runner build --delete-conflicting-outputs` | `./bin/mise run generate` | After model changes, before tests |
7676
| `flutter analyze --no-fatal-infos` | `./bin/mise run analyze` | Before committing |
7777
| `flutter test --coverage` | `./bin/mise run coverage` | Testing with coverage |
@@ -84,16 +84,15 @@ The CI pipeline (`.github/workflows/ci.yml`) runs these commands. Here's how to
8484

8585
### ❌ Don't Do This
8686
```bash
87-
flutter pub get # Bypasses version management
87+
flutter pub get # Bypasses version management (runs automatically via mise deps)
8888
flutter test # May use wrong Flutter version
8989
flutter build web # Missing mise environment setup
9090
mise run build:web # Missing MISE_ENV=dev (will fail)
9191
```
9292

9393
### ✅ Do This Instead
9494
```bash
95-
./bin/mise run install # Correct: uses ./bin/mise
96-
./bin/mise run test # Correct: proper environment
95+
./bin/mise run test # Correct: flutter pub get runs automatically
9796
MISE_ENV=dev ./bin/mise run build:web # Correct: has MISE_ENV
9897
./bin/mise tasks ls # Correct: discover first
9998
```

CLAUDE.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ Quick reference (always check `./bin/mise tasks ls` for latest):
3434
MISE_ENV=dev ./bin/mise tasks ls # Developer tasks
3535

3636
# Common tasks
37-
./bin/mise run install # Install dependencies
3837
./bin/mise run generate # Generate code (mocks)
3938
./bin/mise run analyze # Code analysis (REQUIRED before commit)
4039
./bin/mise run test # Run tests
@@ -147,7 +146,6 @@ git clone https://github.com/mise-plugins/mise-flutter.git .mise/plugins/flutter
147146
MISE_ENV=dev ./bin/mise tasks ls # List all tasks (includes dev)
148147

149148
# Essential tasks
150-
./bin/mise run install # Install dependencies
151149
./bin/mise run generate # Generate code (mocks)
152150
./bin/mise run analyze # Code analysis
153151
./bin/mise run test # All tests

bin/mise

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ __mise_bootstrap() {
88
export MISE_CONFIG_DIR="$localized_dir"
99
export MISE_CACHE_DIR="$localized_dir/cache"
1010
export MISE_STATE_DIR="$localized_dir/state"
11-
export MISE_INSTALL_PATH="$localized_dir/mise-2025.11.10"
11+
export MISE_INSTALL_PATH="$localized_dir/mise-2026.5.4"
1212
export MISE_TRUSTED_CONFIG_PATHS="$project_dir${MISE_TRUSTED_CONFIG_PATHS:+:$MISE_TRUSTED_CONFIG_PATHS}"
1313
export MISE_IGNORED_CONFIG_PATHS="$HOME/.config/mise${MISE_IGNORED_CONFIG_PATHS:+:$MISE_IGNORED_CONFIG_PATHS}"
1414
install() {
@@ -90,18 +90,19 @@ __mise_bootstrap() {
9090
echo "tar.gz"
9191
elif tar_supports_zstd; then
9292
echo "tar.zst"
93-
elif command -v zstd >/dev/null 2>&1; then
94-
echo "tar.zst"
9593
else
9694
echo "tar.gz"
9795
fi
9896
}
9997

10098
tar_supports_zstd() {
101-
# tar is bsdtar or version is >= 1.31
102-
if tar --version | grep -q 'bsdtar' && command -v zstd >/dev/null 2>&1; then
99+
if ! command -v zstd >/dev/null 2>&1; then
100+
false
101+
# tar is bsdtar
102+
elif tar --version | grep -q 'bsdtar'; then
103103
true
104-
elif tar --version | grep -q '1\.(3[1-9]|[4-9][0-9]'; then
104+
# tar version is >= 1.31
105+
elif tar --version | grep -q '1\.\(3[1-9]\|[4-9][0-9]\)'; then
105106
true
106107
else
107108
false
@@ -124,26 +125,28 @@ __mise_bootstrap() {
124125
arch=$3
125126
ext=$4
126127
url="https://github.com/jdx/mise/releases/download/v${version}/SHASUMS256.txt"
128+
current_version="v2026.5.4"
129+
current_version="${current_version#v}"
127130

128131
# For current version use static checksum otherwise
129132
# use checksum from releases
130-
if [ "$version" = "v2025.11.10" ]; then
131-
checksum_linux_x86_64="388a4cec14dfc81887853d9680eb0a135fcdbc1f09be24a1e1a74b71edb013f1 ./mise-v2025.11.10-linux-x64.tar.gz"
132-
checksum_linux_x86_64_musl="2e3c28d1aaa6f71f4a4a2385baaeb0688522a4171b40a9ce0cacd5c90793cffd ./mise-v2025.11.10-linux-x64-musl.tar.gz"
133-
checksum_linux_arm64="0d3fcc6c2bd29e3f73e983d20a8bd7b671f8c18f6c6d86c1c077c1dfc9cdb27f ./mise-v2025.11.10-linux-arm64.tar.gz"
134-
checksum_linux_arm64_musl="abf347e4f5d4ebc5f1a833888035cc80883323623eea976e9735ba404fe5dca7 ./mise-v2025.11.10-linux-arm64-musl.tar.gz"
135-
checksum_linux_armv7="5a2429773b3bd53d7375511e496d6a61a909bf1856441a34bba520f6bc164a09 ./mise-v2025.11.10-linux-armv7.tar.gz"
136-
checksum_linux_armv7_musl="e7ef9991a385593e31108a8a5a4925e4f00a1b3eae0d619a8b7decf200094490 ./mise-v2025.11.10-linux-armv7-musl.tar.gz"
137-
checksum_macos_x86_64="9002923135d513740d3f152ea3fea228f993e70e213f63de7ed6c7ed3d18d7eb ./mise-v2025.11.10-macos-x64.tar.gz"
138-
checksum_macos_arm64="f26444cf0872c7f51d71f5f5dbe284c4bf0b1d39d8271d0d717144545d16509d ./mise-v2025.11.10-macos-arm64.tar.gz"
139-
checksum_linux_x86_64_zstd="ca98ec77b908763868d8b684091436e2b5b5157c9fa82fe454ce9c653cfd6580 ./mise-v2025.11.10-linux-x64.tar.zst"
140-
checksum_linux_x86_64_musl_zstd="674b48a14691315ebe49afe8bb234c955bd4e2e1218a4af26bcdf8a3affa798e ./mise-v2025.11.10-linux-x64-musl.tar.zst"
141-
checksum_linux_arm64_zstd="65018939eae6506fe0eb0c8f5ef143141ca2114bcd75f3d1087a634b1f82279c ./mise-v2025.11.10-linux-arm64.tar.zst"
142-
checksum_linux_arm64_musl_zstd="b5900c7c204f2c2ab46d1173d7b6a683a09659b6f57a2120aa0aeb822d3e6237 ./mise-v2025.11.10-linux-arm64-musl.tar.zst"
143-
checksum_linux_armv7_zstd="2b6a1b61070a1008979d69d679d48cfc092916e489a571026d375fcf9fc9331d ./mise-v2025.11.10-linux-armv7.tar.zst"
144-
checksum_linux_armv7_musl_zstd="7e2aa374c6b04103cfc827479d9df8fc33880941302ae7d13a2f9eb8d0b074fd ./mise-v2025.11.10-linux-armv7-musl.tar.zst"
145-
checksum_macos_x86_64_zstd="99e08994f757c5594c601c08deded81cd791190008448052f567d68be1e87951 ./mise-v2025.11.10-macos-x64.tar.zst"
146-
checksum_macos_arm64_zstd="2c65517621370fbf295ca8893fcd7faf305da9ddfed48aa20d4b74128ee4f374 ./mise-v2025.11.10-macos-arm64.tar.zst"
133+
if [ "$version" = "$current_version" ]; then
134+
checksum_linux_x86_64="f234c6b87755bfeb020183c47d5481bae7a0f04a1c0ffe490168c1b21c2b6429 ./mise-v2026.5.4-linux-x64.tar.gz"
135+
checksum_linux_x86_64_musl="96aaa896d9d3c02a7f72ff92f85b879afb7e9dcf92d81f72d873aa4d330b2615 ./mise-v2026.5.4-linux-x64-musl.tar.gz"
136+
checksum_linux_arm64="edf7be738484c2f7d005c9a7ce1341b852d1ff3f445622088998d18b994a4416 ./mise-v2026.5.4-linux-arm64.tar.gz"
137+
checksum_linux_arm64_musl="3c2ec2ee50066c731d4c4492409ed234a2275f9836df02807637c1ea72c96ce9 ./mise-v2026.5.4-linux-arm64-musl.tar.gz"
138+
checksum_linux_armv7="c40f53dc5194418715c3d58b4273b379fe008dbce913f159d7b2e9bd17268867 ./mise-v2026.5.4-linux-armv7.tar.gz"
139+
checksum_linux_armv7_musl="f2976a927de859ce7d66084d73dd0bbc22b0ec6ff8ad6fdf4b3530bf26db5577 ./mise-v2026.5.4-linux-armv7-musl.tar.gz"
140+
checksum_macos_x86_64="301b5f875b9ac34d5535126aec6400c2c2b540761f137cec874fcb73d577e116 ./mise-v2026.5.4-macos-x64.tar.gz"
141+
checksum_macos_arm64="740210925b3dd87de72b0e6dc428176716a9870c16831f762916567dbb9252f4 ./mise-v2026.5.4-macos-arm64.tar.gz"
142+
checksum_linux_x86_64_zstd="5518ccaedbebed48bfb54d6ce06ae0013384555c590369813d8210dd170da4a5 ./mise-v2026.5.4-linux-x64.tar.zst"
143+
checksum_linux_x86_64_musl_zstd="6b8097171dba7092a6e16863d8ba5c7eff9c934f892366ce62dd5c1eefb55529 ./mise-v2026.5.4-linux-x64-musl.tar.zst"
144+
checksum_linux_arm64_zstd="b1b9c5ae9741a984edd5bcba4c179d9ca9a7a4f8cdc8b4bc9af2410c5a94b4ab ./mise-v2026.5.4-linux-arm64.tar.zst"
145+
checksum_linux_arm64_musl_zstd="617512f946b01addeddce5d4d201b5c0b7b3be2f931013f61150900007606cd5 ./mise-v2026.5.4-linux-arm64-musl.tar.zst"
146+
checksum_linux_armv7_zstd="070f82d84c09d56d3230946822614887ca1d35e236181b9e6610954cca83d603 ./mise-v2026.5.4-linux-armv7.tar.zst"
147+
checksum_linux_armv7_musl_zstd="2b18ce9c54bcacf3eedf20603acebc95b2742d87eafdc9ba84dab86af4623914 ./mise-v2026.5.4-linux-armv7-musl.tar.zst"
148+
checksum_macos_x86_64_zstd="3b6f2702d117ee7674e33de1b85f9203205cdb3a2d2ae75eaad4219c8d61284e ./mise-v2026.5.4-macos-x64.tar.zst"
149+
checksum_macos_arm64_zstd="f64dbb2fd7c0acbd228a5b1478165fe358ab123105a8df86ce194660f1c4f2f4 ./mise-v2026.5.4-macos-arm64.tar.zst"
147150

148151
# TODO: refactor this, it's a bit messy
149152
if [ "$ext" = "tar.zst" ]; then
@@ -254,20 +257,22 @@ __mise_bootstrap() {
254257
}
255258

256259
install_mise() {
257-
version="${MISE_VERSION:-v2025.11.10}"
260+
version="${MISE_VERSION:-v2026.5.4}"
258261
version="${version#v}"
262+
current_version="v2026.5.4"
263+
current_version="${current_version#v}"
259264
os="${MISE_INSTALL_OS:-$(get_os)}"
260265
arch="${MISE_INSTALL_ARCH:-$(get_arch)}"
261266
ext="${MISE_INSTALL_EXT:-$(get_ext)}"
262267
install_path="${MISE_INSTALL_PATH:-$HOME/.local/bin/mise}"
263268
install_dir="$(dirname "$install_path")"
264269
install_from_github="${MISE_INSTALL_FROM_GITHUB:-}"
265-
if [ "$version" != "v2025.11.10" ] || [ "$install_from_github" = "1" ] || [ "$install_from_github" = "true" ]; then
270+
if [ "$version" != "$current_version" ] || [ "$install_from_github" = "1" ] || [ "$install_from_github" = "true" ]; then
266271
tarball_url="https://github.com/jdx/mise/releases/download/v${version}/mise-v${version}-${os}-${arch}.${ext}"
267272
elif [ -n "${MISE_TARBALL_URL-}" ]; then
268273
tarball_url="$MISE_TARBALL_URL"
269274
else
270-
tarball_url="https://mise.jdx.dev/v${version}/mise-v${version}-${os}-${arch}.${ext}"
275+
tarball_url="https://mise.en.dev/v${version}/mise-v${version}-${os}-${arch}.${ext}"
271276
fi
272277

273278
download_dir="$(mktemp -d)"
@@ -278,8 +283,11 @@ __mise_bootstrap() {
278283
cd "$(dirname "$cache_file")" && get_checksum "$version" "$os" "$arch" "$ext" | "$(shasum_bin)" -c >/dev/null
279284

280285
# extract tarball
286+
if [ -d "$install_path" ]; then
287+
error "MISE_INSTALL_PATH '$install_path' is a directory. Please set it to a file path, e.g. '$install_path/mise'."
288+
fi
281289
mkdir -p "$install_dir"
282-
rm -rf "$install_path"
290+
rm -f "$install_path"
283291
extract_dir="$(mktemp -d)"
284292
cd "$extract_dir"
285293
if [ "$ext" = "tar.zst" ] && ! tar_supports_zstd; then
@@ -303,19 +311,19 @@ __mise_bootstrap() {
303311
info "mise: run the following to activate mise in your shell:"
304312
info "echo \"eval \\\"\\\$($install_path activate zsh)\\\"\" >> \"${ZDOTDIR-$HOME}/.zshrc\""
305313
info ""
306-
info "mise: run \`mise doctor\` to verify this is setup correctly"
314+
info "mise: run \`mise doctor\` to verify this is set up correctly"
307315
;;
308316
*/bash)
309317
info "mise: run the following to activate mise in your shell:"
310318
info "echo \"eval \\\"\\\$($install_path activate bash)\\\"\" >> ~/.bashrc"
311319
info ""
312-
info "mise: run \`mise doctor\` to verify this is setup correctly"
320+
info "mise: run \`mise doctor\` to verify this is set up correctly"
313321
;;
314322
*/fish)
315323
info "mise: run the following to activate mise in your shell:"
316324
info "echo \"$install_path activate fish | source\" >> ~/.config/fish/config.fish"
317325
info ""
318-
info "mise: run \`mise doctor\` to verify this is setup correctly"
326+
info "mise: run \`mise doctor\` to verify this is set up correctly"
319327
;;
320328
*)
321329
info "mise: run \`$install_path --help\` to get started"
@@ -334,4 +342,4 @@ __mise_bootstrap() {
334342
test -f "$MISE_INSTALL_PATH" || install
335343
}
336344
__mise_bootstrap
337-
exec "$MISE_INSTALL_PATH" "$@"
345+
exec -a "$0" "$MISE_INSTALL_PATH" "$@"

lib/app_theme.dart

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:google_fonts/google_fonts.dart';
3+
4+
const Color appSeedColor = Color(0xFF2B3170); // CBF 2026: poster navy blue
5+
6+
TextTheme buildAppTextTheme(ColorScheme colorScheme) {
7+
final base = GoogleFonts.nunitoSansTextTheme();
8+
return base.copyWith(
9+
displayLarge: GoogleFonts.playfairDisplay(
10+
fontSize: 57,
11+
fontWeight: FontWeight.w700,
12+
color: colorScheme.onSurface,
13+
),
14+
displayMedium: GoogleFonts.playfairDisplay(
15+
fontSize: 45,
16+
fontWeight: FontWeight.w700,
17+
color: colorScheme.onSurface,
18+
),
19+
displaySmall: GoogleFonts.playfairDisplay(
20+
fontSize: 36,
21+
fontWeight: FontWeight.w600,
22+
color: colorScheme.onSurface,
23+
),
24+
headlineLarge: GoogleFonts.playfairDisplay(
25+
fontSize: 32,
26+
fontWeight: FontWeight.w600,
27+
color: colorScheme.onSurface,
28+
),
29+
headlineMedium: GoogleFonts.playfairDisplay(
30+
fontSize: 28,
31+
fontWeight: FontWeight.w600,
32+
color: colorScheme.onSurface,
33+
),
34+
headlineSmall: GoogleFonts.playfairDisplay(
35+
fontSize: 24,
36+
fontWeight: FontWeight.w600,
37+
color: colorScheme.onSurface,
38+
),
39+
titleLarge: GoogleFonts.playfairDisplay(
40+
fontSize: 22,
41+
fontWeight: FontWeight.w600,
42+
color: colorScheme.onSurface,
43+
),
44+
titleMedium: GoogleFonts.nunitoSans(
45+
fontSize: 16,
46+
fontWeight: FontWeight.w700,
47+
color: colorScheme.onSurface,
48+
),
49+
titleSmall: GoogleFonts.nunitoSans(
50+
fontSize: 14,
51+
fontWeight: FontWeight.w600,
52+
color: colorScheme.onSurface,
53+
),
54+
bodyLarge: GoogleFonts.nunitoSans(
55+
fontSize: 16,
56+
color: colorScheme.onSurface,
57+
),
58+
bodyMedium: GoogleFonts.nunitoSans(
59+
fontSize: 14,
60+
color: colorScheme.onSurface,
61+
),
62+
bodySmall: GoogleFonts.nunitoSans(
63+
fontSize: 12,
64+
color: colorScheme.onSurfaceVariant,
65+
),
66+
labelLarge: GoogleFonts.nunitoSans(
67+
fontSize: 14,
68+
fontWeight: FontWeight.w600,
69+
color: colorScheme.onSurface,
70+
),
71+
labelMedium: GoogleFonts.nunitoSans(
72+
fontSize: 12,
73+
fontWeight: FontWeight.w600,
74+
color: colorScheme.onSurface,
75+
),
76+
labelSmall: GoogleFonts.nunitoSans(
77+
fontSize: 11,
78+
fontWeight: FontWeight.w500,
79+
color: colorScheme.onSurfaceVariant,
80+
),
81+
);
82+
}
83+
84+
ThemeData buildAppTheme(Brightness brightness) {
85+
final colorScheme = ColorScheme.fromSeed(
86+
seedColor: appSeedColor,
87+
brightness: brightness,
88+
primary: brightness == Brightness.light ? appSeedColor : const Color(0xFF8FA3E8),
89+
onPrimary: Colors.white,
90+
);
91+
final textTheme = buildAppTextTheme(colorScheme);
92+
return ThemeData(
93+
colorScheme: colorScheme,
94+
textTheme: textTheme,
95+
useMaterial3: true,
96+
appBarTheme: AppBarTheme(
97+
backgroundColor: brightness == Brightness.light ? appSeedColor : colorScheme.surface,
98+
foregroundColor: brightness == Brightness.light ? Colors.white : colorScheme.onSurface,
99+
elevation: 0,
100+
centerTitle: false,
101+
titleTextStyle: GoogleFonts.playfairDisplay(
102+
fontSize: 20,
103+
fontWeight: FontWeight.w700,
104+
color: brightness == Brightness.light ? Colors.white : colorScheme.onSurface,
105+
),
106+
),
107+
navigationBarTheme: NavigationBarThemeData(
108+
indicatorColor: brightness == Brightness.light
109+
? appSeedColor.withValues(alpha: 0.15)
110+
: colorScheme.primaryContainer,
111+
),
112+
);
113+
}

lib/main.dart

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:firebase_core/firebase_core.dart';
55
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
66
import 'package:go_router/go_router.dart';
77
import 'package:provider/provider.dart';
8+
import 'app_theme.dart';
89
import 'providers/providers.dart';
910
import 'router.dart';
1011
import 'services/services.dart';
@@ -46,7 +47,6 @@ void main() async {
4647
runApp(const BeerFestivalApp());
4748
}
4849

49-
const _seedColor = Color(0xFF2B3170); // CBF 2026: poster navy blue
5050

5151
class BeerFestivalApp extends StatelessWidget {
5252
const BeerFestivalApp({super.key});
@@ -61,20 +61,8 @@ class BeerFestivalApp extends StatelessWidget {
6161
return MaterialApp.router(
6262
title: 'Cambridge Beer Festival',
6363
debugShowCheckedModeBanner: false,
64-
theme: ThemeData(
65-
colorScheme: ColorScheme.fromSeed(
66-
seedColor: _seedColor,
67-
brightness: Brightness.light,
68-
),
69-
useMaterial3: true,
70-
),
71-
darkTheme: ThemeData(
72-
colorScheme: ColorScheme.fromSeed(
73-
seedColor: _seedColor,
74-
brightness: Brightness.dark,
75-
),
76-
useMaterial3: true,
77-
),
64+
theme: buildAppTheme(Brightness.light),
65+
darkTheme: buildAppTheme(Brightness.dark),
7866
themeMode: themeMode,
7967
routerConfig: appRouter,
8068
);

0 commit comments

Comments
 (0)