Add Trash/Shares/Recent tabs, file sharing, Details sheet, and rebrand to Noo
Major additions since the initial rebuild: - New tabs: Trash, Shares, Recent, configurable tab visibility/order/default - Nextcloud sharing: search users/teams, internal link, email shares, public links, "others with access" - in its own Share bottom sheet - Details bottom sheet (Info/Versions/Activity) with a persistent peek panel in the media viewer, reachable from selection, swipe, and the media viewer - Files/Photos: tap-and-hold multi-select with a sticky selection toolbar, swipe actions (favorite/delete/share), sticky sort/filter controls, list/grid views, breadcrumb chips, whole-account Photos view - Media viewer: pinch/double-tap zoom on images, predictive-back support, fixed PDF zoom-out floor - Settings: Material You theming incl. AMOLED black, configurable bottom bar tabs, swipe actions, media seek bar style, and folder-listing cache policy (never/periodic/manual) to cut down on refetching - Login flow moved to an in-app Chrome Custom Tab with retry-tolerant polling - Replaced ad hoc widgets with native Material 3 equivalents (toggle IconButtons, SliverAppBar selection toolbar, SearchBar, drag handles) - Rebrand: app renamed to Noo throughout, package id -> dev.ayushya.noo, new adaptive launcher icon Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
/// A single icon button that fills with a solid circle when active —
|
||||
/// the building block for Drive-style toggle controls.
|
||||
/// the building block for Drive-style toggle controls. Thin wrapper around
|
||||
/// the native Material 3 toggle `IconButton` (its `isSelected` constructor
|
||||
/// param, not a hand-rolled Material+InkWell) so every call site here gets
|
||||
/// the built-in selected/unselected treatment for free.
|
||||
class ToggleIconButton extends StatelessWidget {
|
||||
final IconData icon;
|
||||
final bool isSelected;
|
||||
@@ -20,26 +23,26 @@ class ToggleIconButton extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
|
||||
final button = Material(
|
||||
color: isSelected ? colorScheme.primaryContainer : Colors.transparent,
|
||||
shape: const CircleBorder(),
|
||||
child: InkWell(
|
||||
onTap: onTap,
|
||||
customBorder: const CircleBorder(),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: Icon(
|
||||
icon,
|
||||
size: 20,
|
||||
color: isSelected
|
||||
? colorScheme.onPrimaryContainer
|
||||
: colorScheme.onSurfaceVariant,
|
||||
),
|
||||
return IconButton(
|
||||
isSelected: isSelected,
|
||||
icon: Icon(icon, size: 20),
|
||||
tooltip: tooltip,
|
||||
onPressed: onTap,
|
||||
visualDensity: VisualDensity.compact,
|
||||
style: ButtonStyle(
|
||||
shape: const WidgetStatePropertyAll(CircleBorder()),
|
||||
foregroundColor: WidgetStateProperty.resolveWith(
|
||||
(states) => states.contains(WidgetState.selected)
|
||||
? colorScheme.onPrimaryContainer
|
||||
: colorScheme.onSurfaceVariant,
|
||||
),
|
||||
backgroundColor: WidgetStateProperty.resolveWith(
|
||||
(states) => states.contains(WidgetState.selected)
|
||||
? colorScheme.primaryContainer
|
||||
: Colors.transparent,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
return tooltip != null ? Tooltip(message: tooltip!, child: button) : button;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user