Set app version to 1.0.0+3; share sheet and markdown viewer polish; remove demo screenshot tooling
Build App Bundle / build (push) Successful in 5m22s

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-10-01 14:50:07 -04:00
co-authored by Claude Code
parent 8aa7015c3f
commit 9c9e57ec22
30 changed files with 341 additions and 1230 deletions
+1
View File
@@ -206,6 +206,7 @@ class NooTopBar extends StatelessWidget implements PreferredSizeWidget {
style: NooText.title.copyWith(height: 1, color: colors.fg1),
),
),
const SizedBox(width: NooSpace.md),
Expanded(child: androidTitleTrailing!),
] else
Expanded(
@@ -64,6 +64,8 @@ class NooPersonAccessRow extends StatelessWidget {
final String permission;
final VoidCallback? onPermissionTap;
final String ownerLabel;
/// Replaces the owner label / permission pill (e.g. a plain search result).
final Widget? trailing;
const NooPersonAccessRow({
super.key,
@@ -74,6 +76,7 @@ class NooPersonAccessRow extends StatelessWidget {
this.permission = 'Can edit',
this.onPermissionTap,
this.ownerLabel = 'Owner',
this.trailing,
});
@override
@@ -113,7 +116,9 @@ class NooPersonAccessRow extends StatelessWidget {
),
),
const SizedBox(width: NooSpace.sm),
if (owner)
if (trailing != null)
trailing!
else if (owner)
Text(ownerLabel, style: NooText.label.copyWith(color: colors.fg3))
else
NooPermissionPill(label: permission, onTap: onPermissionTap),
+44 -33
View File
@@ -106,40 +106,51 @@ class _NooSheetBodyState extends State<_NooSheetBody> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: LayoutBuilder(
builder: (context, constraints) {
if (!_needsPeek) {
return ConstrainedBox(
constraints: BoxConstraints(
maxHeight: constraints.maxHeight * _kNooSheetPeekFraction,
),
child: _buildScrollable(null),
);
}
return DraggableScrollableSheet(
initialChildSize: _kNooSheetPeekFraction,
minChildSize: _kNooSheetMinFraction,
maxChildSize: _kNooSheetMaxFraction,
expand: false,
builder: (context, scrollController) {
// Plain `DraggableScrollableSheet` doesn't dismiss the modal
// route on its own when dragged down to its floor - it just
// stops resizing there - so pop explicitly once it's been
// dragged (near) all the way down, matching a native
// peek sheet's swipe-to-dismiss.
return NotificationListener<DraggableScrollableNotification>(
onNotification: (notification) {
if (notification.extent <= notification.minExtent + 0.01) {
Navigator.of(context).maybePop();
}
return false;
},
child: _buildScrollable(scrollController),
// A modal bottom sheet doesn't avoid the keyboard itself, so a focused
// field would be covered. Inset by the keyboard and, while it's up, let
// the content use all the space above it.
final keyboard = MediaQuery.viewInsetsOf(context).bottom;
final keyboardUp = keyboard > 0;
return Padding(
padding: EdgeInsets.only(bottom: keyboard),
child: SafeArea(
bottom: !keyboardUp,
child: LayoutBuilder(
builder: (context, constraints) {
if (!_needsPeek) {
return ConstrainedBox(
constraints: BoxConstraints(
maxHeight: keyboardUp
? constraints.maxHeight
: constraints.maxHeight * _kNooSheetPeekFraction,
),
child: _buildScrollable(null),
);
},
);
},
}
return DraggableScrollableSheet(
initialChildSize: _kNooSheetPeekFraction,
minChildSize: _kNooSheetMinFraction,
maxChildSize: _kNooSheetMaxFraction,
expand: false,
builder: (context, scrollController) {
// Plain `DraggableScrollableSheet` doesn't dismiss the modal
// route on its own when dragged down to its floor - it just
// stops resizing there - so pop explicitly once it's been
// dragged (near) all the way down, matching a native
// peek sheet's swipe-to-dismiss.
return NotificationListener<DraggableScrollableNotification>(
onNotification: (notification) {
if (notification.extent <= notification.minExtent + 0.01) {
Navigator.of(context).maybePop();
}
return false;
},
child: _buildScrollable(scrollController),
);
},
);
},
),
),
);
}