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
Build App Bundle / build (push) Successful in 6m2s
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -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,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),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user