Media viewer details panel, Upload FAB size setting, PDF zoom/viewport fixes, avatar menu account switcher; bump to 1.0.2+5
Build App Bundle / build (push) Successful in 6m2s

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-10-01 18:41:51 -04:00
co-authored by Claude Code
parent 0b7df833f6
commit 4611bc2142
22 changed files with 846 additions and 94 deletions
@@ -22,6 +22,9 @@ class NooGroupedList extends StatefulWidget {
final String? aside;
final List<Widget> children;
final Widget? footer;
/// Shown between [label] and the card (e.g. a `NooInfoNote`).
final Widget? notice;
final bool collapsible;
final bool initiallyExpanded;
@@ -31,6 +34,7 @@ class NooGroupedList extends StatefulWidget {
this.aside,
required this.children,
this.footer,
this.notice,
this.collapsible = false,
this.initiallyExpanded = true,
});
@@ -58,6 +62,10 @@ class _NooGroupedListState extends State<NooGroupedList> {
),
const SizedBox(height: 8),
],
if (widget.notice != null) ...[
widget.notice!,
const SizedBox(height: NooSpace.md),
],
AnimatedCrossFade(
duration: NooMotion.fast,
sizeCurve: NooMotion.ease,
+34 -5
View File
@@ -34,7 +34,10 @@ class NooShareSection extends StatelessWidget {
Row(
children: [
Expanded(
child: Text(title, style: NooText.sectionTitle.copyWith(color: colors.fg1)),
child: Text(
title,
style: NooText.sectionTitle.copyWith(color: colors.fg1),
),
),
?trailing,
],
@@ -60,10 +63,13 @@ class NooPersonAccessRow extends StatelessWidget {
final String name;
final String? subtitle;
final bool owner;
/// Pill label for non-owners, e.g. "Can edit" / "Can view".
final String permission;
final VoidCallback? onPermissionTap;
final bool permissionLoading;
final String ownerLabel;
/// Replaces the owner label / permission pill (e.g. a plain search result).
final Widget? trailing;
@@ -75,6 +81,7 @@ class NooPersonAccessRow extends StatelessWidget {
this.owner = false,
this.permission = 'Can edit',
this.onPermissionTap,
this.permissionLoading = false,
this.ownerLabel = 'Owner',
this.trailing,
});
@@ -121,7 +128,11 @@ class NooPersonAccessRow extends StatelessWidget {
else if (owner)
Text(ownerLabel, style: NooText.label.copyWith(color: colors.fg3))
else
NooPermissionPill(label: permission, onTap: onPermissionTap),
NooPermissionPill(
label: permission,
onTap: onPermissionTap,
loading: permissionLoading,
),
],
),
);
@@ -133,8 +144,14 @@ class NooPersonAccessRow extends StatelessWidget {
class NooPermissionPill extends StatelessWidget {
final String label;
final VoidCallback? onTap;
final bool loading;
const NooPermissionPill({super.key, required this.label, this.onTap});
const NooPermissionPill({
super.key,
required this.label,
this.onTap,
this.loading = false,
});
@override
Widget build(BuildContext context) {
@@ -152,9 +169,21 @@ class NooPermissionPill extends StatelessWidget {
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(label, style: NooText.label.copyWith(height: 1, color: colors.fg1)),
Text(
label,
style: NooText.label.copyWith(height: 1, color: colors.fg1),
),
const SizedBox(width: NooSpace.xxs),
Icon(LucideIcons.chevronDown, size: 14, color: colors.fg2),
loading
? SizedBox(
width: 14,
height: 14,
child: CircularProgressIndicator(
strokeWidth: 2,
color: colors.fg2,
),
)
: Icon(LucideIcons.chevronDown, size: 14, color: colors.fg2),
],
),
),
+5
View File
@@ -64,6 +64,10 @@ class _NooSheetBody extends StatefulWidget {
class _NooSheetBodyState extends State<_NooSheetBody> {
bool _needsPeek = false;
// Keeps the sheet's content (and its State) alive when the body swaps
// between the plain and draggable layouts, instead of rebuilding it.
final _contentKey = GlobalKey();
void _handleOverflow(ScrollMetrics metrics) {
if (_needsPeek || metrics.maxScrollExtent <= 0) return;
// `ScrollMetricsNotification` is dispatched mid-layout; deferring avoids
@@ -84,6 +88,7 @@ class _NooSheetBodyState extends State<_NooSheetBody> {
controller: scrollController,
padding: const EdgeInsets.fromLTRB(20, 10, 20, 20),
child: Column(
key: _contentKey,
mainAxisSize: MainAxisSize.min,
children: [
Container(