refactor ui
All checks were successful
BlockStorage/repertory/pipeline/head This commit looks good

This commit is contained in:
2025-09-05 17:38:33 -05:00
parent 6b9343371a
commit db70ad5aa0
9 changed files with 74 additions and 52 deletions

View File

@@ -15,6 +15,7 @@ const boxShadowAlpha = 0.20;
const databaseTypeList = ['rocksdb', 'sqlite']; const databaseTypeList = ['rocksdb', 'sqlite'];
const dialogAlpha = 0.95; const dialogAlpha = 0.95;
const downloadTypeList = ['default', 'direct', 'ring_buffer']; const downloadTypeList = ['default', 'direct', 'ring_buffer'];
const dropDownAlpha = 99.0;
const eventLevelList = ['critical', 'error', 'warn', 'info', 'debug', 'trace']; const eventLevelList = ['critical', 'error', 'warn', 'info', 'debug', 'trace'];
const gradientColors = [Color(0xFF0A0F1F), Color(0xFF1B1C1F)]; const gradientColors = [Color(0xFF0A0F1F), Color(0xFF1B1C1F)];
const gradientColors2 = [Color(0x07FFFFFF), Color(0x00000000)]; const gradientColors2 = [Color(0x07FFFFFF), Color(0x00000000)];
@@ -24,13 +25,15 @@ const logonWidth = 300.0;
const outlineAlpha = 0.15; const outlineAlpha = 0.15;
const padding = 16.0; const padding = 16.0;
const paddingSmall = padding / 2.0; const paddingSmall = padding / 2.0;
const primaryAlpha = 0.20; const paddingLarge = padding * 2.0;
const primaryAlpha = 0.12;
const primarySurfaceAlpha = 92.0; const primarySurfaceAlpha = 92.0;
const protocolTypeList = ['http', 'https']; const protocolTypeList = ['http', 'https'];
const providerTypeList = ['Encrypt', 'Remote', 'S3', 'Sia']; const providerTypeList = ['Encrypt', 'Remote', 'S3', 'Sia'];
const ringBufferSizeList = ['128', '256', '512', '1024', '2048']; const ringBufferSizeList = ['128', '256', '512', '1024', '2048'];
const secondaryAlpha = 0.45; const secondaryAlpha = 0.45;
const secondarySurfaceAlpha = 70.0; const secondarySurfaceAlpha = 70.0;
const smallIconSize = 18.0;
const surfaceContainerLowDark = Color(0xFF292A2D); const surfaceContainerLowDark = Color(0xFF292A2D);
const surfaceDark = Color(0xFF202124); const surfaceDark = Color(0xFF202124);

View File

@@ -18,9 +18,10 @@ Future doShowDialog(BuildContext context, Widget child) => showDialog(
return Theme( return Theme(
data: theme.copyWith( data: theme.copyWith(
dialogTheme: DialogThemeData( dialogTheme: DialogThemeData(
backgroundColor: scheme.surfaceDim.withValues( backgroundColor: darken(
alpha: constants.dialogAlpha, scheme.primary,
), 0.95,
).withValues(alpha: constants.dropDownAlpha),
surfaceTintColor: Colors.transparent, surfaceTintColor: Colors.transparent,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(constants.borderRadius), borderRadius: BorderRadius.circular(constants.borderRadius),
@@ -492,3 +493,11 @@ SettingsThemeData createSettingsTheme(ColorScheme scheme) {
), ),
); );
} }
Color darken(Color color, [double percentage = 0.1]) {
final hsl = HSLColor.fromColor(color);
final hslDark = hsl.withLightness(
(hsl.lightness - (hsl.lightness * percentage)).clamp(0.0, 1.0),
);
return hslDark.toColor();
}

View File

@@ -8,7 +8,7 @@ import 'package:repertory/models/auth.dart';
class Settings with ChangeNotifier { class Settings with ChangeNotifier {
final Auth _auth; final Auth _auth;
bool _autoStart = false; bool _autoStart = false;
bool _enableAnimations = false; bool _enableAnimations = true;
Settings(this._auth) { Settings(this._auth) {
_auth.addListener(() { _auth.addListener(() {

View File

@@ -151,7 +151,7 @@ class _AuthScreenState extends State<AuthScreen> {
), ),
child: Padding( child: Padding(
padding: const EdgeInsets.all( padding: const EdgeInsets.all(
constants.padding * 2.0, constants.paddingLarge,
), ),
child: Form( child: Form(
key: _formKey, key: _formKey,
@@ -187,7 +187,7 @@ class _AuthScreenState extends State<AuthScreen> {
], ],
), ),
padding: const EdgeInsets.all( padding: const EdgeInsets.all(
constants.borderRadiusSmall, constants.borderRadius,
), ),
child: Image.asset( child: Image.asset(
'assets/images/repertory.png', 'assets/images/repertory.png',
@@ -196,7 +196,7 @@ class _AuthScreenState extends State<AuthScreen> {
return Icon( return Icon(
Icons.folder, Icons.folder,
color: scheme.primary, color: scheme.primary,
size: 40, size: constants.largeIconSize,
); );
}, },
), ),
@@ -225,7 +225,7 @@ class _AuthScreenState extends State<AuthScreen> {
?.copyWith(color: scheme.onSurface), ?.copyWith(color: scheme.onSurface),
), ),
const SizedBox( const SizedBox(
height: constants.padding * 2.0, height: constants.paddingLarge,
), ),
AppTextField( AppTextField(
autofocus: true, autofocus: true,
@@ -275,9 +275,7 @@ class _AuthScreenState extends State<AuthScreen> {
doLogin(auth); doLogin(auth);
}, },
), ),
const SizedBox( const SizedBox(height: constants.padding),
height: constants.padding * 2.0,
),
SizedBox( SizedBox(
height: 46, height: 46,
child: ElevatedButton( child: ElevatedButton(

View File

@@ -62,7 +62,9 @@ class _HomeScreeState extends State<HomeScreen> {
child: const SizedBox( child: const SizedBox(
width: 56, width: 56,
height: 56, height: 56,
child: Center(child: Icon(Icons.add, size: 28)), child: Center(
child: Icon(Icons.add, size: constants.largeIconSize),
),
), ),
), ),
), ),

View File

@@ -78,7 +78,7 @@ class AppDropdown<T> extends StatelessWidget {
final pad = contentPadding ?? const EdgeInsets.all(constants.paddingSmall); final pad = contentPadding ?? const EdgeInsets.all(constants.paddingSmall);
final padW = (pad is EdgeInsets) final padW = (pad is EdgeInsets)
? (pad.left + pad.right) ? (pad.left + pad.right)
: constants.paddingSmall * 2; : constants.padding;
final base = labelW + prefixW + arrowW + padW; final base = labelW + prefixW + arrowW + padW;
@@ -93,7 +93,8 @@ class AppDropdown<T> extends StatelessWidget {
final scheme = theme.colorScheme; final scheme = theme.colorScheme;
final effectiveFill = final effectiveFill =
fillColor ?? scheme.primary.withValues(alpha: constants.primaryAlpha); fillColor ??
darken(scheme.primary, 0.95).withValues(alpha: constants.dropDownAlpha);
final effectiveTextStyle = final effectiveTextStyle =
textStyle ?? textStyle ??

View File

@@ -0,0 +1,43 @@
// app_edit_path_button.dart
import 'package:flutter/material.dart';
import 'package:repertory/constants.dart' as constants;
class AppEditPathButton extends StatelessWidget {
final bool enabled;
final VoidCallback onPressed;
const AppEditPathButton({
super.key,
required this.enabled,
required this.onPressed,
});
@override
Widget build(BuildContext context) {
final scheme = Theme.of(context).colorScheme;
return Opacity(
opacity: enabled ? 1.0 : constants.secondaryAlpha,
child: OutlinedButton.icon(
onPressed: enabled ? onPressed : null,
icon: const Icon(Icons.edit, size: constants.smallIconSize),
label: const Text('Edit path'),
style: OutlinedButton.styleFrom(
foregroundColor: scheme.primary,
side: BorderSide(
color: scheme.primary.withValues(alpha: constants.secondaryAlpha),
width: 1.2,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(constants.borderRadiusSmall),
),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10),
backgroundColor: scheme.primary.withValues(
alpha: constants.outlineAlpha,
),
),
),
);
}
}

View File

@@ -74,7 +74,7 @@ class AppScaffold extends StatelessWidget {
return Icon( return Icon(
Icons.folder, Icons.folder,
color: scheme.primary, color: scheme.primary,
size: 32, size: constants.largeIconSize,
); );
}, },
), ),

View File

@@ -7,6 +7,7 @@ import 'package:repertory/constants.dart' as constants;
import 'package:repertory/helpers.dart'; import 'package:repertory/helpers.dart';
import 'package:repertory/models/mount.dart'; import 'package:repertory/models/mount.dart';
import 'package:repertory/utils/safe_set_state_mixin.dart'; import 'package:repertory/utils/safe_set_state_mixin.dart';
import 'package:repertory/widgets/app_edit_path_button.dart';
import 'package:repertory/widgets/app_icon_button_framed.dart'; import 'package:repertory/widgets/app_icon_button_framed.dart';
import 'package:repertory/widgets/app_toggle_button_framed.dart'; import 'package:repertory/widgets/app_toggle_button_framed.dart';
@@ -93,7 +94,7 @@ class _MountWidgetState extends State<MountWidget>
const SizedBox(height: constants.padding), const SizedBox(height: constants.padding),
Row( Row(
children: [ children: [
_EditPathButton( AppEditPathButton(
enabled: mount.mounted == false, enabled: mount.mounted == false,
onPressed: () async { onPressed: () async {
if (!_editEnabled) { if (!_editEnabled) {
@@ -240,38 +241,3 @@ class _MountWidgetState extends State<MountWidget>
super.dispose(); super.dispose();
} }
} }
class _EditPathButton extends StatelessWidget {
final bool enabled;
final VoidCallback onPressed;
const _EditPathButton({required this.enabled, required this.onPressed});
@override
Widget build(BuildContext context) {
final scheme = Theme.of(context).colorScheme;
return Opacity(
opacity: enabled ? 1.0 : constants.secondaryAlpha,
child: OutlinedButton.icon(
onPressed: enabled ? onPressed : null,
icon: const Icon(Icons.edit, size: 18),
label: const Text('Edit path'),
style: OutlinedButton.styleFrom(
foregroundColor: scheme.primary,
side: BorderSide(
color: scheme.primary.withValues(alpha: constants.secondaryAlpha),
width: 1.2,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(constants.borderRadiusSmall),
),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10),
backgroundColor: scheme.primary.withValues(
alpha: constants.outlineAlpha,
),
),
),
);
}
}