diff --git a/.metadata b/.metadata index 91e33e10e..c93322885 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled. version: - revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c + revision: c07f7888888435fd9df505aa2efc38d3cf65681b channel: stable project_type: app @@ -13,11 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c - base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c - - platform: macos - create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c - base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c + create_revision: c07f7888888435fd9df505aa2efc38d3cf65681b + base_revision: c07f7888888435fd9df505aa2efc38d3cf65681b + - platform: linux + create_revision: c07f7888888435fd9df505aa2efc38d3cf65681b + base_revision: c07f7888888435fd9df505aa2efc38d3cf65681b # User provided section diff --git a/lib/main_app.dart b/lib/main_app.dart index 9ed81c7d1..fea587813 100644 --- a/lib/main_app.dart +++ b/lib/main_app.dart @@ -152,10 +152,13 @@ class InvoiceNinjaAppState extends State { try { authenticated = await LocalAuthentication().authenticate( - localizedReason: 'Please authenticate to access the app', + localizedReason: 'Please authenticate to access the app', + options: const AuthenticationOptions( biometricOnly: true, useErrorDialogs: true, - stickyAuth: false); + stickyAuth: false, + ), + ); } catch (e) { print(e); } @@ -384,6 +387,11 @@ class InvoiceNinjaAppState extends State { ? LockScreen(onAuthenticatePressed: _authenticate) : InitScreen(), locale: locale, + /* + theme: state.prefState.enableDarkMode + ? ThemeData.dark(useMaterial3: true) + : ThemeData.light(useMaterial3: true), + */ theme: state.prefState.enableDarkMode ? ThemeData( colorScheme: ColorScheme.dark().copyWith( diff --git a/lib/ui/app/document_grid.dart b/lib/ui/app/document_grid.dart index cdb55f076..afa2cf7a2 100644 --- a/lib/ui/app/document_grid.dart +++ b/lib/ui/app/document_grid.dart @@ -14,7 +14,7 @@ import 'package:image_cropper/image_cropper.dart'; import 'package:image_picker/image_picker.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:share/share.dart'; +import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; // Project imports: @@ -227,7 +227,7 @@ class DocumentTile extends StatelessWidget { await File(filePath) .writeAsBytes(response.bodyBytes); - await Share.shareFiles([filePath]); + await Share.shareXFiles([XFile(filePath)]); } } else if (value == localization.delete) { confirmCallback( diff --git a/lib/ui/app/menu_drawer.dart b/lib/ui/app/menu_drawer.dart index 51b77e606..d2e039ebd 100644 --- a/lib/ui/app/menu_drawer.dart +++ b/lib/ui/app/menu_drawer.dart @@ -1400,7 +1400,7 @@ void _showAbout(BuildContext context) async { padding: const EdgeInsets.only(top: 4), child: AppButton( label: localization.appPlatforms.toUpperCase(), - iconData: MdiIcons.desktopMac, + iconData: MdiIcons.desktopClassic, onPressed: () { showDialog( context: context, diff --git a/lib/ui/client/client_pdf.dart b/lib/ui/client/client_pdf.dart index bbcfbcb8f..005c07165 100644 --- a/lib/ui/client/client_pdf.dart +++ b/lib/ui/client/client_pdf.dart @@ -22,7 +22,6 @@ import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:path_provider/path_provider.dart'; import 'package:printing/printing.dart'; -import 'package:share/share.dart'; // Project imports: import 'package:invoiceninja_flutter/data/models/dashboard_model.dart'; @@ -40,6 +39,7 @@ import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:invoiceninja_flutter/utils/web_stub.dart' if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart'; +import 'package:share_plus/share_plus.dart'; class ClientPdfView extends StatefulWidget { const ClientPdfView({ @@ -404,7 +404,7 @@ class _ClientPdfViewState extends State { showToast( localization.fileSavedInDownloadsFolder); } else { - await Share.shareFiles([filePath]); + await Share.shareXFiles([XFile(filePath)]); } } }, @@ -439,37 +439,39 @@ class _ClientPdfViewState extends State { callback: (_) => loadPDF(sendEmail: true)); }, ), - TextButton( - onPressed: () { - if (!state.isProPlan) { - showMessageDialog( - context: context, - message: localization.upgradeToPaidPlanToSchedule, - secondaryActions: [ - TextButton( - onPressed: () { - store.dispatch(ViewSettings( - section: kSettingsAccountManagement)); - Navigator.of(context).pop(); - }, - child: - Text(localization.upgrade.toUpperCase())), - ]); - return; - } + if (supportsSchedules()) + TextButton( + onPressed: () { + if (!state.isProPlan) { + showMessageDialog( + context: context, + message: localization.upgradeToPaidPlanToSchedule, + secondaryActions: [ + TextButton( + onPressed: () { + store.dispatch(ViewSettings( + section: kSettingsAccountManagement)); + Navigator.of(context).pop(); + }, + child: Text( + localization.upgrade.toUpperCase())), + ]); + return; + } - createEntity( - context: context, - entity: ScheduleEntity().rebuild((b) => b - ..template = ScheduleEntity.TEMPLATE_EMAIL_STATEMENT - ..parameters.clients.add(client.id) - ..parameters.showAgingTable = _showAging - ..parameters.showPaymentsTable = _showPayments - ..parameters.status = _status - ..parameters.dateRange = _dateRange.snakeCase)); - }, - child: Text(localization.schedule, - style: TextStyle(color: state.headerTextColor))), + createEntity( + context: context, + entity: ScheduleEntity().rebuild((b) => b + ..template = + ScheduleEntity.TEMPLATE_EMAIL_STATEMENT + ..parameters.clients.add(client.id) + ..parameters.showAgingTable = _showAging + ..parameters.showPaymentsTable = _showPayments + ..parameters.status = _status + ..parameters.dateRange = _dateRange.snakeCase)); + }, + child: Text(localization.schedule, + style: TextStyle(color: state.headerTextColor))), if (isDesktop(context)) TextButton( child: Text(localization.close, diff --git a/lib/ui/invoice/invoice_pdf.dart b/lib/ui/invoice/invoice_pdf.dart index 7e9382b26..99492e593 100644 --- a/lib/ui/invoice/invoice_pdf.dart +++ b/lib/ui/invoice/invoice_pdf.dart @@ -16,7 +16,7 @@ import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; import 'package:path_provider/path_provider.dart'; import 'package:printing/printing.dart'; -import 'package:share/share.dart'; +import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; // Project imports: @@ -282,7 +282,7 @@ class _InvoicePdfViewState extends State { showToast(localization .fileSavedInDownloadsFolder); } else { - await Share.shareFiles([filePath]); + await Share.shareXFiles([XFile(filePath)]); } } } diff --git a/lib/ui/reports/reports_screen_vm.dart b/lib/ui/reports/reports_screen_vm.dart index 91dcb07c9..2971da7a7 100644 --- a/lib/ui/reports/reports_screen_vm.dart +++ b/lib/ui/reports/reports_screen_vm.dart @@ -21,7 +21,6 @@ import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:memoize/memoize.dart'; import 'package:path_provider/path_provider.dart'; import 'package:redux/redux.dart'; -import 'package:share/share.dart'; // Project imports: import 'package:invoiceninja_flutter/constants.dart'; @@ -51,6 +50,7 @@ import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/money.dart'; import 'package:invoiceninja_flutter/utils/strings.dart'; +import 'package:share_plus/share_plus.dart'; import 'credit_report.dart'; import 'package:invoiceninja_flutter/utils/web_stub.dart' @@ -515,7 +515,7 @@ class ReportsScreenVM { if (isDesktopOS()) { showToast(localization.fileSavedInDownloadsFolder); } else { - await Share.shareFiles([filePath]); + await Share.shareXFiles([XFile(filePath)]); } } }); diff --git a/lib/ui/settings/device_settings_vm.dart b/lib/ui/settings/device_settings_vm.dart index 3a0738ca3..7478317f0 100644 --- a/lib/ui/settings/device_settings_vm.dart +++ b/lib/ui/settings/device_settings_vm.dart @@ -152,9 +152,10 @@ class DeviceSettingsVM { authenticated = await LocalAuthentication().authenticate( localizedReason: AppLocalization.of(context).authenticateToChangeSetting, - biometricOnly: true, - useErrorDialogs: true, - stickyAuth: false); + options: const AuthenticationOptions( + biometricOnly: true, + useErrorDialogs: true, + stickyAuth: false)); } catch (e) { print(e); } diff --git a/lib/ui/settings/settings_list.dart b/lib/ui/settings/settings_list.dart index 82f409e44..8d2d41bc6 100644 --- a/lib/ui/settings/settings_list.dart +++ b/lib/ui/settings/settings_list.dart @@ -240,10 +240,11 @@ class _SettingsListState extends State { ), */ if (showAll) ...[ - SettingsListTile( - section: kSettingsSchedules, - viewModel: widget.viewModel, - ), + if (supportsSchedules()) + SettingsListTile( + section: kSettingsSchedules, + viewModel: widget.viewModel, + ), SettingsListTile( section: kSettingsUserManagement, viewModel: widget.viewModel, @@ -623,11 +624,12 @@ class SettingsSearch extends StatelessWidget { 'subscriptions', ], ], - kSettingsSchedules: [ - [ - 'schedules#2023-02-15', + if (supportsSchedules()) + kSettingsSchedules: [ + [ + 'schedules#2023-02-15', + ], ], - ], kSettingsUserManagement: [ [ 'users', diff --git a/lib/utils/platforms.dart b/lib/utils/platforms.dart index 6cc066924..77bb23d81 100644 --- a/lib/utils/platforms.dart +++ b/lib/utils/platforms.dart @@ -31,6 +31,12 @@ bool supportsAppleOAuth() => kIsWeb || isApple(); // TODO remove this function bool supportsMicrosoftOAuth() => kIsWeb; +// TODO remove this +bool supportsSchedules() { + final store = StoreProvider.of(navigatorKey.currentContext); + return store.state.isSelfHosted; +} + bool supportsInAppPurchase() { final store = StoreProvider.of(navigatorKey.currentContext); if (store.state.isSelfHosted) { diff --git a/lib/utils/super_editor/super_editor.dart b/lib/utils/super_editor/super_editor.dart index 37c31898a..6c17a81b6 100644 --- a/lib/utils/super_editor/super_editor.dart +++ b/lib/utils/super_editor/super_editor.dart @@ -34,12 +34,20 @@ class _ExampleEditorState extends State { ScrollController _scrollController; + final _darkBackground = const Color(0xFF222222); + final _lightBackground = Colors.white; + Brightness _brightness = Brightness.light; + + SuperEditorDebugVisualsConfig _debugConfig; + OverlayEntry _textFormatBarOverlayEntry; final _textSelectionAnchor = ValueNotifier(null); OverlayEntry _imageFormatBarOverlayEntry; final _imageSelectionAnchor = ValueNotifier(null); + final _overlayController = MagnifierAndToolbarController(); + @override void initState() { super.initState(); @@ -55,8 +63,10 @@ class _ExampleEditorState extends State { _doc = deserializeMarkdownToDocument(markdown) ..addListener(_hideOrShowToolbar) ..addListener(_onChanged); + _docEditor = DocumentEditor(document: _doc as MutableDocument); - _composer = DocumentComposer()..addListener(_hideOrShowToolbar); + _composer = DocumentComposer(); + _composer.selectionNotifier.addListener(_hideOrShowToolbar); _docOps = CommonEditorOperations( editor: _docEditor, composer: _composer, @@ -169,15 +179,16 @@ class _ExampleEditorState extends State { void _showEditorToolbar() { if (_textFormatBarOverlayEntry == null) { + // Create an overlay entry to build the editor toolbar. + // TODO: add an overlay to the Editor widget to avoid using the + // application overlay _textFormatBarOverlayEntry ??= OverlayEntry(builder: (context) { - return Theme( - data: ThemeData.light(), - child: EditorToolbar( - anchor: _textSelectionAnchor, - editor: _docEditor, - composer: _composer, - closeToolbar: _hideEditorToolbar, - ), + return EditorToolbar( + anchor: _textSelectionAnchor, + editorFocusNode: _editorFocusNode, + editor: _docEditor, + composer: _composer, + closeToolbar: _hideEditorToolbar, ); }); @@ -199,7 +210,6 @@ class _ExampleEditorState extends State { _composer.selection.base, _composer.selection.extent); final docBox = _docLayoutKey.currentContext.findRenderObject() as RenderBox; - final overlayBoundingBox = Rect.fromPoints( docBox.localToGlobal(docBoundingBox.topLeft), docBox.localToGlobal(docBoundingBox.bottomRight), @@ -222,14 +232,14 @@ class _ExampleEditorState extends State { // and non-null implies the entry is in the overlay. _textFormatBarOverlayEntry.remove(); _textFormatBarOverlayEntry = null; - } - // Ensure that focus returns to the editor. - // - // I tried explicitly unfocus()'ing the URL textfield - // in the toolbar but it didn't return focus to the - // editor. I'm not sure why. - _editorFocusNode.requestFocus(); + // Ensure that focus returns to the editor. + // + // I tried explicitly unfocus()'ing the URL textfield + // in the toolbar but it didn't return focus to the + // editor. I'm not sure why. + _editorFocusNode.requestFocus(); + } } DocumentGestureMode get _gestureMode { @@ -245,29 +255,41 @@ class _ExampleEditorState extends State { return DocumentGestureMode.mouse; } - return null; + return DocumentGestureMode.mouse; } bool get _isMobile => _gestureMode != DocumentGestureMode.mouse; - DocumentInputSource get _inputSource { + TextInputSource get _inputSource { switch (defaultTargetPlatform) { case TargetPlatform.android: case TargetPlatform.iOS: - return DocumentInputSource.ime; case TargetPlatform.fuchsia: case TargetPlatform.linux: case TargetPlatform.macOS: case TargetPlatform.windows: - return DocumentInputSource.keyboard; + return TextInputSource.ime; + // return DocumentInputSource.keyboard; } - return null; + return TextInputSource.ime; + } + + void _cut() { + _docOps.cut(); + _overlayController.hideToolbar(); + } + + void _copy() { + _docOps.copy(); + _overlayController.hideToolbar(); + } + + void _paste() { + _docOps.paste(); + _overlayController.hideToolbar(); } - void _cut() => _docOps.cut(); - void _copy() => _docOps.copy(); - void _paste() => _docOps.paste(); void _selectAll() => _docOps.selectAll(); void _showImageToolbar() { @@ -277,7 +299,7 @@ class _ExampleEditorState extends State { return ImageFormatToolbar( anchor: _imageSelectionAnchor, composer: _composer, - setWidth: (dynamic nodeId, dynamic width) { + setWidth: (nodeId, width) { final node = _doc.getNodeById(nodeId); final currentStyles = SingleColumnLayoutComponentStyles.fromMetadata(node); @@ -309,10 +331,8 @@ class _ExampleEditorState extends State { final docBox = _docLayoutKey.currentContext.findRenderObject() as RenderBox; final overlayBoundingBox = Rect.fromPoints( - docBox.localToGlobal(docBoundingBox.topLeft, - ancestor: context.findRenderObject()), - docBox.localToGlobal(docBoundingBox.bottomRight, - ancestor: context.findRenderObject()), + docBox.localToGlobal(docBoundingBox.topLeft), + docBox.localToGlobal(docBoundingBox.bottomRight), ); _imageSelectionAnchor.value = overlayBoundingBox.center; @@ -332,46 +352,152 @@ class _ExampleEditorState extends State { // and non-null implies the entry is in the overlay. _imageFormatBarOverlayEntry.remove(); _imageFormatBarOverlayEntry = null; - } - // Ensure that focus returns to the editor. - _editorFocusNode.requestFocus(); + // Ensure that focus returns to the editor. + _editorFocusNode.requestFocus(); + } } @override Widget build(BuildContext context) { - return Column( - children: [ - Expanded( - child: _buildEditor(), - ), - if (_isMobile) _buildMountedToolbar(), - ], + return Theme( + data: ThemeData(brightness: _brightness), + child: Builder(builder: (themedContext) { + // This builder captures the new theme + return Stack( + children: [ + Column( + children: [ + Expanded( + child: _buildEditor(themedContext), + ), + if (_isMobile) _buildMountedToolbar(), + ], + ), + Align( + alignment: Alignment.bottomRight, + child: _buildCornerFabs(), + ), + ], + ); + }), ); } - Widget _buildEditor() { - return SuperEditor( - editor: _docEditor, - composer: _composer, - focusNode: _editorFocusNode, - scrollController: _scrollController, - documentLayoutKey: _docLayoutKey, - componentBuilders: [ - ...defaultComponentBuilders, - ], - gestureMode: _gestureMode, - inputSource: _inputSource, - androidToolbarBuilder: (_) => AndroidTextEditingFloatingToolbar( - onCutPressed: _cut, - onCopyPressed: _copy, - onPastePressed: _paste, - onSelectAllPressed: _selectAll, + Widget _buildCornerFabs() { + return Padding( + padding: const EdgeInsets.only(right: 16, bottom: 16), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildDebugVisualsToggle(), + const SizedBox(height: 16), + _buildLightAndDarkModeToggle(), + ], ), - iOSToolbarBuilder: (_) => IOSTextEditingFloatingToolbar( - onCutPressed: _cut, - onCopyPressed: _copy, - onPastePressed: _paste, + ); + } + + Widget _buildDebugVisualsToggle() { + return FloatingActionButton( + backgroundColor: + _brightness == Brightness.light ? _darkBackground : _lightBackground, + foregroundColor: + _brightness == Brightness.light ? _lightBackground : _darkBackground, + elevation: 5, + onPressed: () { + setState(() { + _debugConfig = _debugConfig != null + ? null + : SuperEditorDebugVisualsConfig( + showFocus: true, + showImeConnection: true, + ); + }); + }, + child: const Icon( + Icons.bug_report, + ), + ); + } + + Widget _buildLightAndDarkModeToggle() { + return FloatingActionButton( + backgroundColor: + _brightness == Brightness.light ? _darkBackground : _lightBackground, + foregroundColor: + _brightness == Brightness.light ? _lightBackground : _darkBackground, + elevation: 5, + onPressed: () { + setState(() { + _brightness = _brightness == Brightness.light + ? Brightness.dark + : Brightness.light; + }); + }, + child: _brightness == Brightness.light + ? const Icon( + Icons.dark_mode, + ) + : const Icon( + Icons.light_mode, + ), + ); + } + + Widget _buildEditor(BuildContext context) { + final isLight = Theme.of(context).brightness == Brightness.light; + + return ColoredBox( + color: isLight ? _lightBackground : _darkBackground, + child: SuperEditorDebugVisuals( + config: _debugConfig ?? const SuperEditorDebugVisualsConfig(), + child: SuperEditor( + editor: _docEditor, + composer: _composer, + focusNode: _editorFocusNode, + scrollController: _scrollController, + documentLayoutKey: _docLayoutKey, + documentOverlayBuilders: [ + DefaultCaretOverlayBuilder( + CaretStyle() + .copyWith(color: isLight ? Colors.black : Colors.redAccent), + ), + ], + selectionStyle: isLight + ? defaultSelectionStyle + : SelectionStyles( + selectionColor: Colors.red.withOpacity(0.3), + ), + stylesheet: defaultStylesheet.copyWith( + addRulesAfter: [ + if (!isLight) ..._darkModeStyles, + taskStyles, + ], + ), + componentBuilders: [ + TaskComponentBuilder(_docEditor), + ...defaultComponentBuilders, + ], + gestureMode: _gestureMode, + inputSource: _inputSource, + keyboardActions: _inputSource == TextInputSource.ime + ? defaultImeKeyboardActions + : defaultKeyboardActions, + androidToolbarBuilder: (_) => AndroidTextEditingFloatingToolbar( + onCutPressed: _cut, + onCopyPressed: _copy, + onPastePressed: _paste, + onSelectAllPressed: _selectAll, + ), + iOSToolbarBuilder: (_) => IOSTextEditingFloatingToolbar( + onCutPressed: _cut, + onCopyPressed: _copy, + onPastePressed: _paste, + ), + overlayController: _overlayController, + ), ), ); } @@ -398,3 +524,37 @@ class _ExampleEditorState extends State { ); } } + +// Makes text light, for use during dark mode styling. +final _darkModeStyles = [ + StyleRule( + BlockSelector.all, + (doc, docNode) { + return { + 'textStyle': const TextStyle( + color: Color(0xFFCCCCCC), + ), + }; + }, + ), + StyleRule( + const BlockSelector("header1"), + (doc, docNode) { + return { + 'textStyle': const TextStyle( + color: Color(0xFF888888), + ), + }; + }, + ), + StyleRule( + const BlockSelector("header2"), + (doc, docNode) { + return { + 'textStyle': const TextStyle( + color: Color(0xFF888888), + ), + }; + }, + ), +]; diff --git a/lib/utils/super_editor/toolbar.dart b/lib/utils/super_editor/toolbar.dart index 60c6837c8..0abeb9222 100644 --- a/lib/utils/super_editor/toolbar.dart +++ b/lib/utils/super_editor/toolbar.dart @@ -14,6 +14,7 @@ class EditorToolbar extends StatefulWidget { const EditorToolbar({ Key key, @required this.anchor, + @required this.editorFocusNode, @required this.editor, @required this.composer, @required this.closeToolbar, @@ -26,6 +27,9 @@ class EditorToolbar extends StatefulWidget { /// reposition itself as the [Offset] value changes. final ValueNotifier anchor; + /// The [FocusNode] attached to the editor to which this toolbar applies. + final FocusNode editorFocusNode; + /// The [editor] is used to alter document content, such as /// when the user selects a different block format for a /// text blob, e.g., paragraph, header, blockquote, or @@ -49,13 +53,13 @@ class EditorToolbar extends StatefulWidget { class _EditorToolbarState extends State { bool _showUrlField = false; FocusNode _urlFocusNode; - TextEditingController _urlController; + AttributedTextEditingController _urlController; @override void initState() { super.initState(); _urlFocusNode = FocusNode(); - _urlController = TextEditingController(); + _urlController = SingleLineAttributedTextEditingController(_applyLink); } @override @@ -112,7 +116,7 @@ class _EditorToolbarState extends State { /* /// Returns the text alignment of the currently selected text node. /// - /// Throws an exception if the currently selected node is not a text node. + /// Throws an exception if the currently selected node is not a text node. TextAlign _getCurrentTextAlignment() { final selectedNode = widget.editor.document .getNodeById(widget.composer.selection.extent.nodeId); @@ -352,7 +356,7 @@ class _EditorToolbarState extends State { /// Takes the text from the [urlController] and applies it as a link /// attribution to the currently selected text. void _applyLink() { - final url = _urlController.text; + final url = _urlController.text.text; final selection = widget.composer.selection; final baseOffset = (selection.base.nodePosition as TextPosition).offset; @@ -360,7 +364,7 @@ class _EditorToolbarState extends State { final selectionStart = min(baseOffset, extentOffset); final selectionEnd = max(baseOffset, extentOffset); final selectionRange = - SpanRange(start: selectionStart, end: selectionEnd - 1); + TextRange(start: selectionStart, end: selectionEnd - 1); final textNode = widget.editor.document.getNodeById(selection.extent.nodeId) as TextNode; @@ -387,7 +391,7 @@ class _EditorToolbarState extends State { /// Given [text] and a [range] within the [text], the [range] is /// shortened on both sides to remove any trailing whitespace and /// the new range is returned. - SpanRange _trimTextRangeWhitespace(AttributedText text, SpanRange range) { + SpanRange _trimTextRangeWhitespace(AttributedText text, TextRange range) { int startOffset = range.start; int endOffset = range.end; @@ -504,6 +508,9 @@ class _EditorToolbarState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + /* + // https://github.com/superlistapp/super_editor/issues/689 + // https://github.com/flutter/flutter/issues/106923 // Only allow the user to select a new type of text node if // the currently selected node can be converted. if (_isConvertibleNode()) ...[ @@ -512,7 +519,6 @@ class _EditorToolbarState extends State { child: DropdownButton<_TextType>( value: _getCurrentTextType(), items: _TextType.values - .where((element) => element != _TextType.blockquote) .map((textType) => DropdownMenuItem<_TextType>( value: textType, child: Padding( @@ -522,8 +528,10 @@ class _EditorToolbarState extends State { )) .toList(), icon: const Icon(Icons.arrow_drop_down), - style: const TextStyle( - color: Colors.black, + style: TextStyle( + color: Theme.of(context).brightness == Brightness.dark + ? Colors.white + : Colors.black, fontSize: 12, ), underline: const SizedBox(), @@ -534,6 +542,7 @@ class _EditorToolbarState extends State { ), _buildVerticalDivider(), ], + */ Center( child: IconButton( onPressed: _toggleBold, @@ -604,6 +613,15 @@ class _EditorToolbarState extends State { ), ), ], + _buildVerticalDivider(), + Center( + child: IconButton( + onPressed: () {}, + icon: const Icon(Icons.more_vert), + splashRadius: 16, + tooltip: 'More Options', + ), + ), */ ], ), @@ -623,14 +641,37 @@ class _EditorToolbarState extends State { child: Row( children: [ Expanded( - child: TextField( + child: FocusWithCustomParent( focusNode: _urlFocusNode, - controller: _urlController, - decoration: const InputDecoration( - hintText: 'enter url...', - border: InputBorder.none, + parentFocusNode: widget.editorFocusNode, + // We use a SuperTextField instead of a TextField because TextField + // automatically re-parents its FocusNode, which causes #609. Flutter + // #106923 tracks the TextField issue. + child: SuperTextField( + focusNode: _urlFocusNode, + textController: _urlController, + minLines: 1, + maxLines: 1, + inputSource: TextInputSource.ime, + hintBehavior: HintBehavior.displayHintUntilTextEntered, + hintBuilder: (context) { + return Text( + 'Enter a url...', + style: const TextStyle( + color: Colors.grey, + fontSize: 16, + ), + ); + }, + textStyleBuilder: (_) { + return TextStyle( + color: Theme.of(context).brightness == Brightness.dark + ? Colors.white + : Colors.black, + fontSize: 16, + ); + }, ), - onSubmitted: (newValue) => _applyLink(), ), ), IconButton( @@ -840,3 +881,21 @@ class _PositionedToolbar extends StatelessWidget { ); } } + +class SingleLineAttributedTextEditingController + extends AttributedTextEditingController { + SingleLineAttributedTextEditingController(this.onSubmit); + + final VoidCallback onSubmit; + + @override + void insertNewline() { + // Don't insert newline in a single-line text field. + + // Invoke callback to take action on enter. + onSubmit(); + + // TODO: this is a hack. SuperTextField shouldn't insert newlines in a single + // line field (#697). + } +} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 2830cc81d..73a14a5eb 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,12 +8,13 @@ import Foundation import in_app_purchase_storekit import in_app_review import package_info -import package_info_plus_macos -import path_provider_macos +import package_info_plus +import path_provider_foundation import printing import screen_retriever import sentry_flutter -import shared_preferences_macos +import share_plus +import shared_preferences_foundation import sign_in_with_apple import smart_auth import sqflite @@ -29,6 +30,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin")) ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) SentryFlutterPlugin.register(with: registry.registrar(forPlugin: "SentryFlutterPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SignInWithApplePlugin.register(with: registry.registrar(forPlugin: "SignInWithApplePlugin")) SmartAuthPlugin.register(with: registry.registrar(forPlugin: "SmartAuthPlugin")) diff --git a/pubspec.foss.yaml b/pubspec.foss.yaml index 012085861..fe1e1e58c 100644 --- a/pubspec.foss.yaml +++ b/pubspec.foss.yaml @@ -20,16 +20,16 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - # google_sign_in: ^5.0.7 + # google_sign_in: ^6.0.1 # in_app_review: ^2.0.4 # in_app_purchase: ^3.1.1 # pinput: ^2.2.11 - flutter_redux: ^0.8.2 + flutter_redux: ^0.10.0 redux_logging: ^0.5.0 http: ^0.13.3 path_provider: ^2.0.2 shared_preferences: ^2.0.6 - material_design_icons_flutter: ^5.0.6295 + material_design_icons_flutter: ^6.0.7096 built_value: ^8.1.2 built_collection: ^5.1.0 memoize: ^3.0.0 @@ -37,46 +37,46 @@ dependencies: url_launcher: ^6.0.20 share: ^2.0.4 intl: ^0.17.0 - flutter_slidable: ^1.1.0 + flutter_slidable: ^2.0.0 charts_flutter: ^0.12.0 #qr_flutter: ^4.0.0 qr_flutter: # https://github.com/theyakka/qr.flutter/issues/174#issuecomment-1084235757 git: url: https://github.com/theyakka/qr.flutter.git - local_auth: ^1.1.6 - sentry_flutter: ^6.5.1 - image_picker: ^0.8.3+1 + local_auth: ^2.1.5 + sentry_flutter: ^6.20.1 + image_picker: ^0.8.6+3 flutter_colorpicker: ^1.0.3 flutter_json_viewer: ^1.0.1 webview_flutter: ^3.0.4 timeago: ^3.1.0 package_info: ^2.0.2 - rounded_loading_button: ^2.0.5 - version: ^2.0.0 - flutter_launcher_icons: ^0.9.1 + rounded_loading_button: ^2.1.0 + version: ^3.0.2 + # flutter_launcher_icons: ^0.9.1 overflow_view: ^0.3.1 flutter_styled_toast: ^2.0.0 - permission_handler: ^9.2.0 - file_picker: ^4.2.3 + permission_handler: ^10.2.0 + file_picker: ^5.2.5 boardview: ^0.2.2 pointer_interceptor: ^0.9.0 - contacts_service: ^0.6.1 + contacts_service: ^0.6.3 diacritic: ^0.1.3 - states_rebuilder: ^5.2.0 - #super_editor: ^0.2.2 + states_rebuilder: ^6.2.0 + # super_editor: ^0.2.2 markdown: ^5.0.0 # REMOVE THIS super_editor: git: url: https://github.com/superlistapp/super_editor.git path: super_editor ref: 1601fdce95ebfa34bddf80cab3e58e700b0edec3 - html2md: ^1.2.5 - printing: ^5.8.0 - image_cropper: ^2.0.2 + html2md: ^1.2.6 + printing: ^5.10.1 + image_cropper: ^3.0.1 msal_js: ^2.14.0 - sign_in_with_apple: ^4.0.0 - window_manager: ^0.2.7 - # bitsdojo_window: ^0.1.2 + sign_in_with_apple: ^4.3.0 + window_manager: ^0.3.0 + # bitsdojo_window: ^0.1.5 intl_phone_field: ^3.1.0 flutter_staggered_grid_view: ^0.6.2 # quick_actions: ^0.2.1 diff --git a/pubspec.lock b/pubspec.lock index 4bf144657..4fb6d889b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,310 +5,354 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9 + url: "https://pub.dev" source: hosted - version: "38.0.0" + version: "54.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427" + url: "https://pub.dev" source: hosted - version: "3.4.1" + version: "5.6.0" archive: dependency: transitive description: name: archive - url: "https://pub.dartlang.org" + sha256: "80e5141fafcb3361653ce308776cfd7d45e6e9fbb429e14eec571382c0c5fecb" + url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.2" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" attributed_text: dependency: transitive description: name: attributed_text - url: "https://pub.dartlang.org" + sha256: "892b9517ba27f78ebee526424a91d1aba44d729e610f06a0dd9a3a43d3d81f6d" + url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.2.1" barcode: dependency: transitive description: name: barcode - url: "https://pub.dartlang.org" + sha256: "52570564684bbb0240a9f1fdb6bad12adc5e0540103c1c96d6dd550bd928b1c9" + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.2.3" + bidi: + dependency: transitive + description: + name: bidi + sha256: dc00274c7edabae2ab30c676e736ea1eb0b1b7a1b436cb5fe372e431ccb39ab0 + url: "https://pub.dev" + source: hosted + version: "2.0.6" boardview: dependency: "direct main" description: name: boardview - url: "https://pub.dartlang.org" + sha256: a3319f868baf036b6c217dc4f35c152c4432207552433d94841aa8d3059c6170 + url: "https://pub.dev" source: hosted version: "0.2.2" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf" + url: "https://pub.dev" source: hosted version: "3.1.0" build_resolvers: dependency: transitive description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 + url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.2.0" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + url: "https://pub.dev" source: hosted - version: "2.1.10" + version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + url: "https://pub.dev" source: hosted - version: "7.2.3" + version: "7.2.7" built_collection: dependency: "direct main" description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: "direct main" description: name: built_value - url: "https://pub.dartlang.org" + sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + url: "https://pub.dev" source: hosted - version: "8.1.4" + version: "8.4.3" built_value_generator: dependency: "direct dev" description: name: built_value_generator - url: "https://pub.dartlang.org" + sha256: a5b989bb5fa7c22c481c3b6f8195703818f047be0b65ca9b1358770c475709e3 + url: "https://pub.dev" source: hosted - version: "8.2.0" + version: "8.4.3" cached_network_image: dependency: "direct main" description: name: cached_network_image - url: "https://pub.dartlang.org" + sha256: ebab9f6c55a7aa8d62cdfe0877f8b5ce806c1956b0a244ba39fcadeb0e1aad85 + url: "https://pub.dev" source: hosted version: "3.0.0" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" source: hosted version: "1.3.1" charts_common: dependency: transitive description: name: charts_common - url: "https://pub.dartlang.org" + sha256: "7b8922f9b0d9b134122756a787dab1c3946ae4f3fc5022ff323ba0014998ea02" + url: "https://pub.dev" source: hosted version: "0.12.0" charts_flutter: dependency: "direct main" description: name: charts_flutter - url: "https://pub.dartlang.org" + sha256: "4172c3f4b85322fdffe1896ffbed79ae4689ae72cb6fe6690dcaaea620a9c558" + url: "https://pub.dev" source: hosted version: "0.12.0" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + url: "https://pub.dev" source: hosted - version: "2.0.1" - cli_dialog: - dependency: transitive - description: - name: cli_dialog - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.0" + version: "2.0.2" cli_util: dependency: transitive description: name: cli_util - url: "https://pub.dartlang.org" + sha256: "66f86e916d285c1a93d3b79587d94bd71984a66aac4ff74e524cfa7877f1395c" + url: "https://pub.dev" source: hosted version: "0.3.5" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" + url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.4.0" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" + console: + dependency: transitive + description: + name: console + sha256: e04e7824384c5b39389acdd6dc7d33f3efe6b232f6f16d7626f194f6a01ad69a + url: "https://pub.dev" + source: hosted + version: "4.1.0" contacts_service: dependency: "direct main" description: name: contacts_service - url: "https://pub.dartlang.org" + sha256: f6d5ea33b31dfcdcd2e65d8abdc836502e04ddb0f66a96aa726fa9891ea9671e + url: "https://pub.dev" source: hosted version: "0.6.3" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.1" coverage: dependency: transitive description: name: coverage - url: "https://pub.dartlang.org" + sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.6.3" cross_file: dependency: transitive description: name: cross_file - url: "https://pub.dartlang.org" + sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9" + url: "https://pub.dev" source: hosted - version: "0.3.2" + version: "0.3.3+4" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" csslib: dependency: transitive description: name: csslib - url: "https://pub.dartlang.org" + sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745 + url: "https://pub.dev" source: hosted - version: "0.17.1" - dart_console: - dependency: transitive - description: - name: dart_console - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" + version: "0.17.2" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.4" diacritic: dependency: "direct main" description: name: diacritic - url: "https://pub.dartlang.org" + sha256: c09a420e737dc036122121fea9f774767e95068f34a17894ee9db30c5bda3075 + url: "https://pub.dev" source: hosted version: "0.1.3" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" faker: dependency: "direct dev" description: name: faker - url: "https://pub.dartlang.org" + sha256: "746e59f91d8b06a389e74cf76e909a05ed69c12691768e2f93557fdf29200fd0" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "2.0.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" file_picker: dependency: "direct main" description: name: file_picker - url: "https://pub.dartlang.org" + sha256: d090ae03df98b0247b82e5928f44d1b959867049d18d73635e2e0bc3f49542b9 + url: "https://pub.dev" source: hosted - version: "4.5.1" + version: "5.2.5" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -318,21 +362,24 @@ packages: dependency: transitive description: name: flutter_blurhash - url: "https://pub.dartlang.org" + sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" + url: "https://pub.dev" source: hosted - version: "0.6.6" + version: "0.7.0" flutter_cache_manager: dependency: transitive description: name: flutter_cache_manager - url: "https://pub.dartlang.org" + sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" + url: "https://pub.dev" source: hosted version: "3.3.0" flutter_colorpicker: dependency: "direct main" description: name: flutter_colorpicker - url: "https://pub.dartlang.org" + sha256: "458a6ed8ea480eb16ff892aedb4b7092b2804affd7e046591fb03127e8d8ef8b" + url: "https://pub.dev" source: hosted version: "1.0.3" flutter_driver: @@ -344,16 +391,10 @@ packages: dependency: "direct main" description: name: flutter_json_viewer - url: "https://pub.dartlang.org" + sha256: "3acc20693c3e6465ff2e2a7884269e362cb8acc2b11e7caa9b283872f854e7bf" + url: "https://pub.dev" source: hosted version: "1.0.1" - flutter_launcher_icons: - dependency: "direct main" - description: - name: flutter_launcher_icons - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.2" flutter_localizations: dependency: "direct main" description: flutter @@ -363,37 +404,42 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: "4bef634684b2c7f3468c77c766c831229af829a0cd2d4ee6c1b99558bd14e5d2" + url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.8" flutter_redux: dependency: "direct main" description: name: flutter_redux - url: "https://pub.dartlang.org" + sha256: "3b20be9e08d0038e1452fbfa1fdb1ea0a7c3738c997734530b3c6d0bb5fcdbdc" + url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.10.0" flutter_slidable: dependency: "direct main" description: name: flutter_slidable - url: "https://pub.dartlang.org" + sha256: "6c68e1fad129b4b807b2218ef4cf7f7f6f61c5ec8861c990dc2278d9d03cb09f" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "2.0.0" flutter_staggered_grid_view: dependency: "direct main" description: name: flutter_staggered_grid_view - url: "https://pub.dartlang.org" + sha256: "1312314293acceb65b92754298754801b0e1f26a1845833b740b30415bbbcf07" + url: "https://pub.dev" source: hosted version: "0.6.2" flutter_styled_toast: dependency: "direct main" description: name: flutter_styled_toast - url: "https://pub.dartlang.org" + sha256: cc32aed2a49ce77a1ed5844073c6c0f5e381c81fd6d694e0ba3c5dc2a645963d + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.3" flutter_test: dependency: "direct dev" description: flutter @@ -403,9 +449,10 @@ packages: dependency: transitive description: name: flutter_test_robots - url: "https://pub.dartlang.org" + sha256: e43d82bce5c17813b1b47b8228a2369936cfe7d73981002bc919b510de350d08 + url: "https://pub.dev" source: hosted - version: "0.0.17" + version: "0.0.18" flutter_web_plugins: dependency: transitive description: flutter @@ -415,9 +462,10 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "3.2.0" fuchsia_remote_debug_protocol: dependency: transitive description: flutter @@ -427,597 +475,689 @@ packages: dependency: transitive description: name: get_it - url: "https://pub.dartlang.org" + sha256: "290fde3a86072e4b37dbb03c07bec6126f0ecc28dad403c12ffe2e5a2d751ab7" + url: "https://pub.dev" source: hosted version: "7.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.1" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d9af2f1fa192f2629a266d038ee9307b0abe729a4f1b454dd21b414f5e7d381" + url: "https://pub.dev" + source: hosted + version: "0.2.0" google_sign_in: dependency: "direct main" description: name: google_sign_in - url: "https://pub.dartlang.org" + sha256: "71c5311a19a2406498028a54fcac81351827297fa8cf5abbf51b7e0fa1bc64f5" + url: "https://pub.dev" source: hosted - version: "5.3.0" + version: "6.0.1" google_sign_in_android: dependency: transitive description: name: google_sign_in_android - url: "https://pub.dartlang.org" + sha256: f27bd56527c567594167bd0a46f7ceb93122ed064d2eee612413d6af0bb2e2e5 + url: "https://pub.dev" source: hosted - version: "5.2.5" + version: "6.1.7" google_sign_in_ios: dependency: transitive description: name: google_sign_in_ios - url: "https://pub.dartlang.org" + sha256: eca3433737cfe8b231127d43a3e6527e07d5f8e4a0c00ce593aaaf7bc92bb135 + url: "https://pub.dev" source: hosted - version: "5.2.5" + version: "5.5.2" google_sign_in_platform_interface: dependency: transitive description: name: google_sign_in_platform_interface - url: "https://pub.dartlang.org" + sha256: fece762f0d2dd762ebde43ad70662a209ff6ee034111976549c392f7763d9264 + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.3.1" google_sign_in_web: dependency: transitive description: name: google_sign_in_web - url: "https://pub.dartlang.org" + sha256: "824b42c0a0b01c062bf3b1d555432d84c8b1dd0c5bbf0773514e574f02be9f95" + url: "https://pub.dev" source: hosted - version: "0.10.1" + version: "0.11.0+1" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" html: dependency: transitive description: name: html - url: "https://pub.dartlang.org" + sha256: d9793e10dbe0e6c364f4c59bf3e01fb33a9b2a674bc7a1081693dba0614b6269 + url: "https://pub.dev" source: hosted - version: "0.15.0" + version: "0.15.1" html2md: dependency: "direct main" description: name: html2md - url: "https://pub.dartlang.org" + sha256: efa0a8e8544108734338dbb614821045aa118bcea3d4f14b3da41cf29659e6de + url: "https://pub.dev" source: hosted - version: "1.2.5" + version: "1.2.6" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted - version: "0.13.4" + version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.2" image: dependency: transitive description: name: image - url: "https://pub.dartlang.org" + sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227" + url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "4.0.15" image_cropper: dependency: "direct main" description: name: image_cropper - url: "https://pub.dartlang.org" + sha256: "85324928ee8a8be35a529446435ca53067865b9353c8681983472eeec66d780f" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.0.1" image_cropper_for_web: dependency: transitive description: name: image_cropper_for_web - url: "https://pub.dartlang.org" + sha256: "09e93a8ec0435adcaa23622ac090442872f18145d70b9ff605ffedcf97d56255" + url: "https://pub.dev" source: hosted - version: "0.0.3" + version: "1.0.3" image_cropper_platform_interface: dependency: transitive description: name: image_cropper_platform_interface - url: "https://pub.dartlang.org" + sha256: "62349e3aab63873ea9b9ab9f69d036ab8a0d74b3004beec4303981386cb9273f" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.3" image_picker: dependency: "direct main" description: name: image_picker - url: "https://pub.dartlang.org" + sha256: "22207768556b82d55ec70166824350fee32298732d5efa4d6e756f848f51f66a" + url: "https://pub.dev" source: hosted - version: "0.8.5" + version: "0.8.6+3" image_picker_android: dependency: transitive description: name: image_picker_android - url: "https://pub.dartlang.org" + sha256: "68d067baf7f6e401b1124ee83dd6967e67847314250fd68012aab34a69beb344" + url: "https://pub.dev" source: hosted - version: "0.8.4+11" + version: "0.8.5+7" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - url: "https://pub.dartlang.org" + sha256: "66fc6e3877bbde82c33d122f3588777c3784ac5bd7d1cdd79213ef7aecb85b34" + url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.1.11" image_picker_ios: dependency: transitive description: name: image_picker_ios - url: "https://pub.dartlang.org" + sha256: "39aa70b5f1e5e7c94585b9738632d5fdb764a5655e40cd9e7b95fbd2fc50c519" + url: "https://pub.dev" source: hosted - version: "0.8.4+11" + version: "0.8.6+9" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - url: "https://pub.dartlang.org" + sha256: "1991219d9dbc42a99aff77e663af8ca51ced592cd6685c9485e3458302d3d4f8" + url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.6.3" import_sorter: dependency: "direct dev" description: name: import_sorter - url: "https://pub.dartlang.org" + sha256: eb15738ccead84e62c31e0208ea4e3104415efcd4972b86906ca64a1187d0836 + url: "https://pub.dev" source: hosted version: "4.6.0" in_app_purchase: dependency: "direct main" description: name: in_app_purchase - url: "https://pub.dartlang.org" + sha256: af00db44f0314eda24f5e7ff18a6b445ab95e11fcf49c53e4b7c6bef005eeecf + url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.5" in_app_purchase_android: dependency: transitive description: name: in_app_purchase_android - url: "https://pub.dartlang.org" + sha256: "55b71810734239a2fcb9b7443d9f232ac09dc99953f02b24cc4567dbb05b4bdb" + url: "https://pub.dev" source: hosted - version: "0.2.3" + version: "0.2.4+2" in_app_purchase_platform_interface: dependency: transitive description: name: in_app_purchase_platform_interface - url: "https://pub.dartlang.org" + sha256: ba5d4d7059ba512907382dce363eabab53c0826ecb23cfb40c58cec6141ea105 + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" in_app_purchase_storekit: dependency: transitive description: name: in_app_purchase_storekit - url: "https://pub.dartlang.org" + sha256: b0b88545831becc1c08717476d9f10f56f2911273dd797a4c281da4b612d0322 + url: "https://pub.dev" source: hosted - version: "0.3.4+1" + version: "0.3.6+1" in_app_review: dependency: "direct main" description: name: in_app_review - url: "https://pub.dartlang.org" + sha256: "16328b8202d36522322b95804ae5d975577aa9f584d634985849ba1099645850" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.6" in_app_review_platform_interface: dependency: transitive description: name: in_app_review_platform_interface - url: "https://pub.dartlang.org" + sha256: b12ec9aaf6b34d3a72aa95895eb252b381896246bdad4ef378d444affe8410ef + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" source: hosted version: "0.17.0" intl_phone_field: dependency: "direct main" description: name: intl_phone_field - url: "https://pub.dartlang.org" + sha256: "0d2b35d148ed28a454d50797e6c2fb297f0a295feab84641b02d3dd32294b3f3" + url: "https://pub.dev" source: hosted version: "3.1.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.8.0" linkify: dependency: transitive description: name: linkify - url: "https://pub.dartlang.org" + sha256: bdfbdafec6cdc9cd0ebb333a868cafc046714ad508e48be8095208c54691d959 + url: "https://pub.dev" source: hosted version: "4.1.0" local_auth: dependency: "direct main" description: name: local_auth - url: "https://pub.dartlang.org" + sha256: "1625a217c599db02044df992509eb52584cfdaa8219958d516b74f644ef2c626" + url: "https://pub.dev" source: hosted - version: "1.1.11" + version: "2.1.5" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: "9106024549f411fea2543630582ae7937fcb97ce197755a6d985b23b980410c7" + url: "https://pub.dev" + source: hosted + version: "1.0.19" + local_auth_ios: + dependency: transitive + description: + name: local_auth_ios + sha256: "14e7822264fbb6842240e09ff32a60e2ca2b1c3207de8adf2f56c149cccd49fd" + url: "https://pub.dev" + source: hosted + version: "1.0.13" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: "9e160d59ef0743e35f1b50f4fb84dc64f55676b1b8071e319ef35e7f3bc13367" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: "69c4a6b1201e7b5467e7180c7dd84cf96c308982680cc1778984552bea84b0bc" + url: "https://pub.dev" + source: hosted + version: "1.0.6" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "293ae2d49fd79d4c04944c3a26dfd313382d5f52e821ec57119230ae16031ad4" + url: "https://pub.dev" source: hosted version: "1.0.2" markdown: dependency: "direct main" description: name: markdown - url: "https://pub.dartlang.org" + sha256: "39caf989ccc72c63e87b961851a74257141938599ed2db45fbd9403fee0db423" + url: "https://pub.dev" source: hosted version: "5.0.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" material_design_icons_flutter: dependency: "direct main" description: name: material_design_icons_flutter - url: "https://pub.dartlang.org" + sha256: "8ef8562d16e747b2d93e5da5c2508931588939c5c00ebc8e2768e803db7dfd3c" + url: "https://pub.dev" source: hosted - version: "5.0.6595" + version: "6.0.7096" memoize: dependency: "direct main" description: name: memoize - url: "https://pub.dartlang.org" + sha256: "51481d328c86cbdc59711369179bac88551ca0556569249be5317e66fc796cac" + url: "https://pub.dev" source: hosted version: "3.0.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.4" msal_js: dependency: "direct main" description: name: msal_js - url: "https://pub.dartlang.org" + sha256: "9800af5d1d4b389572803e8331bd9e57a55c1b9dd2b6ca83aacf98ef9ed81f44" + url: "https://pub.dev" source: hosted version: "2.14.0" msix: dependency: "direct dev" description: name: msix - url: "https://pub.dartlang.org" + sha256: "765e6b4d9f571956014d85062614468993d9e4b998bb57f2b727845b6d99c6f1" + url: "https://pub.dev" source: hosted - version: "3.5.1" + version: "3.8.2" + navigation_builder: + dependency: transitive + description: + name: navigation_builder + sha256: cbf966253e1f5b1798f3fbcae571fb6d452e5c7a606a5c451e2b9a3d343920f0 + url: "https://pub.dev" + source: hosted + version: "0.0.2+4" node_preamble: dependency: transitive description: name: node_preamble - url: "https://pub.dartlang.org" + sha256: "8ebdbaa3b96d5285d068f80772390d27c21e1fa10fb2df6627b1b9415043608d" + url: "https://pub.dev" source: hosted version: "2.0.1" octo_image: dependency: transitive description: name: octo_image - url: "https://pub.dartlang.org" + sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" overflow_view: dependency: "direct main" description: name: overflow_view - url: "https://pub.dartlang.org" + sha256: "46741be6ccc3d10ac4e14907c1a0e1799857ac4bbea8a485ac803e32637cc326" + url: "https://pub.dev" source: hosted version: "0.3.1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.0" package_info: dependency: "direct main" description: name: package_info - url: "https://pub.dartlang.org" + sha256: "6c07d9d82c69e16afeeeeb6866fe43985a20b3b50df243091bfc4a4ad2b03b75" + url: "https://pub.dev" source: hosted version: "2.0.2" package_info_plus: dependency: transitive description: name: package_info_plus - url: "https://pub.dartlang.org" + sha256: "8df5ab0a481d7dc20c0e63809e90a588e496d276ba53358afc4c4443d0a00697" + url: "https://pub.dev" source: hosted - version: "1.4.2" - package_info_plus_linux: - dependency: transitive - description: - name: package_info_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" - package_info_plus_macos: - dependency: transitive - description: - name: package_info_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "3.0.3" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - url: "https://pub.dartlang.org" + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" source: hosted - version: "1.0.2" - package_info_plus_web: - dependency: transitive - description: - name: package_info_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" - package_info_plus_windows: - dependency: transitive - description: - name: package_info_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" + version: "2.0.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" path_parsing: dependency: transitive description: name: path_parsing - url: "https://pub.dartlang.org" + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9" + url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.0.13" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: "7623b7d4be0f0f7d9a8b5ee6879fc13e4522d4c875ab86801dee4af32b54b83e" + url: "https://pub.dev" source: hosted - version: "2.0.12" - path_provider_ios: + version: "2.0.23" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: eec003594f19fe2456ea965ae36b3fc967bc5005f508890aafe31fa75e41d972 + url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.1.2" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: "525ad5e07622d19447ad740b1ed5070031f7a5437f44355ae915ff56e986429a" + url: "https://pub.dev" source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" + version: "2.1.9" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.6" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d" + url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.1.4" pdf: dependency: transitive description: name: pdf - url: "https://pub.dartlang.org" + sha256: "6cd57e8e6d052bd1078f18e0dc7cd6701fad6288231c1ce99d66ef5034d14e61" + url: "https://pub.dev" source: hosted - version: "3.7.4" + version: "3.9.0" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.dartlang.org" + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.dev" source: hosted version: "1.11.1" permission_handler: dependency: "direct main" description: name: permission_handler - url: "https://pub.dartlang.org" + sha256: "33c6a1253d1f95fd06fa74b65b7ba907ae9811f9d5c1d3150e51417d04b8d6a8" + url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "10.2.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - url: "https://pub.dartlang.org" + sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" + url: "https://pub.dev" source: hosted - version: "9.0.2+1" + version: "10.2.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - url: "https://pub.dartlang.org" + sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" + url: "https://pub.dev" source: hosted - version: "9.0.4" + version: "9.0.7" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - url: "https://pub.dartlang.org" + sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" + url: "https://pub.dev" source: hosted - version: "3.7.0" + version: "3.9.0" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - url: "https://pub.dartlang.org" + sha256: f67cab14b4328574938ecea2db3475dad7af7ead6afab6338772c5f88963e38b + url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "0.1.2" petitparser: dependency: transitive description: name: petitparser - url: "https://pub.dartlang.org" + sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "5.1.0" photo_view: dependency: "direct overridden" description: path: "." ref: master - resolved-ref: "23063d535909027b8e198c2cffa83bf8f0480c96" + resolved-ref: b1a315a2fb546f7b52dd04490d3257ac452f2a6b url: "https://github.com/bluefireteam/photo_view" source: git - version: "0.13.0" + version: "0.14.0" pinput: dependency: "direct main" description: name: pinput - url: "https://pub.dartlang.org" + sha256: "1773743c188cdd2f8d0398ea708ec72645bb41ac9311755c4f7bb03a4184bdcf" + url: "https://pub.dev" source: hosted - version: "2.2.21" + version: "2.2.31" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" pointer_interceptor: dependency: "direct main" description: name: pointer_interceptor - url: "https://pub.dartlang.org" + sha256: "6aa680b30d96dccef496933d00208ad25f07e047f644dc98ce03ec6141633a9a" + url: "https://pub.dev" source: hosted - version: "0.9.3" + version: "0.9.3+4" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.5.1" printing: dependency: "direct main" description: name: printing - url: "https://pub.dartlang.org" + sha256: fe654363cd0114b50a0815b24e96957c7e9a60eb4e3b7ccfe71cf3f2b7114cb2 + url: "https://pub.dev" source: hosted - version: "5.8.0" + version: "5.10.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted version: "4.2.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" qr: dependency: transitive description: name: qr - url: "https://pub.dartlang.org" + sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3" + url: "https://pub.dev" source: hosted version: "3.0.1" qr_flutter: @@ -1033,168 +1173,192 @@ packages: dependency: transitive description: name: quiver - url: "https://pub.dartlang.org" + sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 + url: "https://pub.dev" source: hosted - version: "3.0.1+1" + version: "3.2.1" redux: dependency: transitive description: name: redux - url: "https://pub.dartlang.org" + sha256: "1e86ed5b1a9a717922d0a0ca41f9bf49c1a587d50050e9426fc65b14e85ec4d7" + url: "https://pub.dev" source: hosted version: "5.0.0" redux_logging: dependency: "direct main" description: name: redux_logging - url: "https://pub.dartlang.org" + sha256: "235c68dee0bfa403d0e840db0358ca5abeba39ab32733897eb6122bfcdc82d92" + url: "https://pub.dev" source: hosted version: "0.5.0" rounded_loading_button: dependency: "direct main" description: name: rounded_loading_button - url: "https://pub.dartlang.org" + sha256: ec4af194330ba688527749059b7c1a3d1ddda6c18794ec4b0696f0cb3b9784ff + url: "https://pub.dev" source: hosted version: "2.1.0" rxdart: dependency: transitive description: name: rxdart - url: "https://pub.dartlang.org" + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" source: hosted - version: "0.27.3" + version: "0.27.7" screen_retriever: dependency: transitive description: name: screen_retriever - url: "https://pub.dartlang.org" + sha256: "4931f226ca158123ccd765325e9fbf360bfed0af9b460a10f960f9bb13d58323" + url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "0.1.6" sentry: dependency: transitive description: name: sentry - url: "https://pub.dartlang.org" + sha256: "81c1f32496ff04476d6ddfe5894215b1034d185301d2e3dffd272853392c5ea7" + url: "https://pub.dev" source: hosted - version: "6.9.1" + version: "6.20.1" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - url: "https://pub.dartlang.org" + sha256: "5ca2c8d86c220f7ad3109bedceb2c51b0e90bac5218e732be98ea2cba8006461" + url: "https://pub.dev" source: hosted - version: "6.9.1" - share: + version: "6.20.1" + share_plus: dependency: "direct main" description: - name: share - url: "https://pub.dartlang.org" + name: share_plus + sha256: "8c6892037b1824e2d7e8f59d54b3105932899008642e6372e5079c6939b4b625" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "6.3.1" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" + url: "https://pub.dev" + source: hosted + version: "3.2.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - url: "https://pub.dartlang.org" + sha256: ee6257848f822b8481691f20c3e6d2bfee2e9eccb2a3d249907fcfb198c55b41 + url: "https://pub.dev" source: hosted - version: "2.0.13" + version: "2.0.18" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - url: "https://pub.dartlang.org" + sha256: a51a4f9375097f94df1c6e0a49c0374440d31ab026b59d58a7e7660675879db4 + url: "https://pub.dev" source: hosted - version: "2.0.11" - shared_preferences_ios: + version: "2.0.16" + shared_preferences_foundation: dependency: transitive description: - name: shared_preferences_ios - url: "https://pub.dartlang.org" + name: shared_preferences_foundation + sha256: "6b84fdf06b32bb336f972d373cd38b63734f3461ba56ac2ba01b56d052796259" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - url: "https://pub.dartlang.org" + sha256: d7fb71e6e20cd3dfffcc823a28da3539b392e53ed5fc5c2b90b55fdaa8a7e8fa + url: "https://pub.dev" source: hosted - version: "2.1.0" - shared_preferences_macos: - dependency: transitive - description: - name: shared_preferences_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" + version: "2.1.4" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - url: "https://pub.dartlang.org" + sha256: "824bfd02713e37603b2bdade0842e47d56e7db32b1dcdd1cae533fb88e2913fc" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - url: "https://pub.dartlang.org" + sha256: "6737b757e49ba93de2a233df229d0b6a87728cea1684da828cbc718b65dcf9d7" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.5" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - url: "https://pub.dartlang.org" + sha256: bd014168e8484837c39ef21065b78f305810ceabc1d4f90be6e3b392ce81b46d + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - url: "https://pub.dartlang.org" + sha256: aef74dc9195746a384843102142ab65b6a4735bb3beea791e63527b88cc83306 + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" shelf_static: dependency: transitive description: name: shelf_static - url: "https://pub.dartlang.org" + sha256: e792b76b96a36d4a41b819da593aff4bdd413576b3ba6150df5d8d9996d2e74c + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.3" sign_in_with_apple: dependency: "direct main" description: name: sign_in_with_apple - url: "https://pub.dartlang.org" + sha256: ac3b113767dfdd765078c507dad9d4d9fe96b669cc7bd88fc36fc15376fb3400 + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.3.0" sign_in_with_apple_platform_interface: dependency: transitive description: name: sign_in_with_apple_platform_interface - url: "https://pub.dartlang.org" + sha256: a5883edee09ed6be19de19e7d9f618a617fe41a6fa03f76d082dfb787e9ea18d + url: "https://pub.dev" source: hosted version: "1.0.0" sign_in_with_apple_web: dependency: transitive description: name: sign_in_with_apple_web - url: "https://pub.dartlang.org" + sha256: "44b66528f576e77847c14999d5e881e17e7223b7b0625a185417829e5306f47a" + url: "https://pub.dev" source: hosted version: "1.0.1" sky_engine: @@ -1206,354 +1370,411 @@ packages: dependency: transitive description: name: smart_auth - url: "https://pub.dartlang.org" + sha256: "8cfaec55b77d5930ed1666bb7ae70db5bade099bb1422401386853b400962113" + url: "https://pub.dev" source: hosted version: "1.0.8" source_gen: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 + url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.7" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - url: "https://pub.dartlang.org" + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" source_maps: dependency: transitive description: name: source_maps - url: "https://pub.dartlang.org" + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" source: hosted - version: "0.10.10" + version: "0.10.12" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" sqflite: dependency: transitive description: name: sqflite - url: "https://pub.dartlang.org" + sha256: "78324387dc81df14f78df06019175a86a2ee0437624166c382e145d0a7fd9a4f" + url: "https://pub.dev" source: hosted - version: "2.0.2+1" + version: "2.2.4+1" sqflite_common: dependency: transitive description: name: sqflite_common - url: "https://pub.dartlang.org" + sha256: bfd6973aaeeb93475bc0d875ac9aefddf7965ef22ce09790eb963992ffc5183f + url: "https://pub.dev" source: hosted - version: "2.2.1+1" + version: "2.4.2+2" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" states_rebuilder: dependency: "direct main" description: name: states_rebuilder - url: "https://pub.dartlang.org" + sha256: e8612993e97a5caeb9d983f6081304ef10868ba436ae49a723ee089ab51e2d12 + url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "6.2.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" super_editor: dependency: "direct main" description: path: super_editor - ref: "1601fdce95ebfa34bddf80cab3e58e700b0edec3" - resolved-ref: "1601fdce95ebfa34bddf80cab3e58e700b0edec3" + ref: HEAD + resolved-ref: e4eceea4a72706410a1e910ad0ce01b815c63a8e url: "https://github.com/superlistapp/super_editor.git" source: git - version: "0.2.2" + version: "0.2.3-dev.1" super_text_layout: dependency: transitive description: name: super_text_layout - url: "https://pub.dartlang.org" + sha256: "6cf41a07780d7e40cec56ed3dcde59b527968a4e282b78e2d7e9a0134b26685c" + url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "0.1.4" sync_http: dependency: transitive description: name: sync_http - url: "https://pub.dartlang.org" + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" source: hosted version: "0.3.1" synchronized: dependency: transitive description: name: synchronized - url: "https://pub.dartlang.org" + sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" + url: "https://pub.dev" source: hosted - version: "3.0.0+2" + version: "3.0.1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test: dependency: "direct dev" description: name: test - url: "https://pub.dartlang.org" + sha256: a5fcd2d25eeadbb6589e80198a47d6a464ba3e2049da473943b8af9797900c2d + url: "https://pub.dev" source: hosted - version: "1.21.4" + version: "1.22.0" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" test_core: dependency: transitive description: name: test_core - url: "https://pub.dartlang.org" + sha256: "0ef9755ec6d746951ba0aabe62f874b707690b5ede0fecc818b138fcc9b14888" + url: "https://pub.dev" source: hosted - version: "0.4.16" + version: "0.4.20" timeago: dependency: "direct main" description: name: timeago - url: "https://pub.dartlang.org" + sha256: "46c128312ab0ea144b146c0ac6426ddd96810efec2de3fccc425d00179cd8254" + url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.3.0" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" tint: dependency: transitive description: name: tint - url: "https://pub.dartlang.org" + sha256: "9652d9a589f4536d5e392cf790263d120474f15da3cf1bee7f1fdb31b4de5f46" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted version: "1.3.1" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc + url: "https://pub.dev" + source: hosted + version: "1.0.0+1" url_launcher: dependency: "direct main" description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" + url: "https://pub.dev" source: hosted - version: "6.1.5" + version: "6.1.10" url_launcher_android: dependency: transitive description: name: url_launcher_android - url: "https://pub.dartlang.org" + sha256: "1f4d9ebe86f333c15d318f81dcdc08b01d45da44af74552608455ebdc08d9732" + url: "https://pub.dev" source: hosted - version: "6.0.15" + version: "6.0.24" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - url: "https://pub.dartlang.org" + sha256: c9cd648d2f7ab56968e049d4e9116f96a85517f1dd806b96a86ea1018a3a82e5 + url: "https://pub.dev" source: hosted - version: "6.0.15" + version: "6.1.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: e29039160ab3730e42f3d811dc2a6d5f2864b90a70fb765ea60144b03307f682 + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.3" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: "2dddb3291a57b074dade66b5e07e64401dd2487caefd4e9e2f467138d8c7eb06" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.3" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "574cfbe2390666003c3a1d129bdc4574aaa6728f0c00a4829a81c316de69dd9b" + url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.0.15" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: "97c9067950a0d09cbd93e2e3f0383d1403989362b97102fbf446473a48079a4b" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.4" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" value_layout_builder: dependency: transitive description: name: value_layout_builder - url: "https://pub.dartlang.org" + sha256: "98202ec1807e94ac72725b7f0d15027afde513c55c69ff3f41bcfccb950831bc" + url: "https://pub.dev" source: hosted version: "0.3.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" version: dependency: "direct main" description: name: version - url: "https://pub.dartlang.org" + sha256: "3d4140128e6ea10d83da32fef2fa4003fccbf6852217bb854845802f04191f94" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.2" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: e7fb6c2282f7631712b69c19d1bff82f3767eea33a2321c14fa59ad67ea391c7 + url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "9.4.0" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.3.0" webdriver: dependency: transitive description: name: webdriver - url: "https://pub.dartlang.org" + sha256: ef67178f0cc7e32c1494645b11639dd1335f1d18814aa8435113a92e9ef9d841 + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - url: "https://pub.dartlang.org" + sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.2.0" webview_flutter: dependency: "direct main" description: name: webview_flutter - url: "https://pub.dartlang.org" + sha256: "392c1d83b70fe2495de3ea2c84531268d5b8de2de3f01086a53334d8b6030a88" + url: "https://pub.dev" source: hosted version: "3.0.4" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - url: "https://pub.dartlang.org" + sha256: "8b3b2450e98876c70bfcead876d9390573b34b9418c19e28168b74f6cb252dbd" + url: "https://pub.dev" source: hosted - version: "2.8.5" + version: "2.10.4" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - url: "https://pub.dartlang.org" + sha256: "812165e4e34ca677bdfbfa58c01e33b27fd03ab5fa75b70832d4b7d4ca1fa8cf" + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.9.5" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - url: "https://pub.dartlang.org" + sha256: a5364369c758892aa487cbf59ea41d9edd10f9d9baf06a94e80f1bd1b4c7bbc0 + url: "https://pub.dev" source: hosted - version: "2.7.2" + version: "2.9.5" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 + url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "3.1.3" window_manager: dependency: "direct main" description: name: window_manager - url: "https://pub.dartlang.org" + sha256: "5bdd29dc5f1f3185fc90696373a571d77968e03e5e820fb1ecdbdade3f5d8fff" + url: "https://pub.dev" source: hosted - version: "0.2.7" + version: "0.3.0" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 + url: "https://pub.dev" source: hosted - version: "0.2.0+1" + version: "1.0.0" xml: dependency: transitive description: name: xml - url: "https://pub.dartlang.org" + sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + url: "https://pub.dev" source: hosted - version: "5.3.1" + version: "6.2.2" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.10.0" + dart: ">=2.19.0 <3.0.0" + flutter: ">=3.7.0" diff --git a/pubspec.next.yaml b/pubspec.next.yaml index 6b0accfad..50a03f2dd 100644 --- a/pubspec.next.yaml +++ b/pubspec.next.yaml @@ -44,39 +44,39 @@ dependencies: git: url: https://github.com/theyakka/qr.flutter.git local_auth: ^1.1.6 - sentry_flutter: ^6.5.1 - image_picker: ^0.8.3+1 + sentry_flutter: ^6.20.1 + image_picker: ^0.8.6+3 flutter_colorpicker: ^1.0.3 flutter_json_viewer: ^1.0.1 webview_flutter: ^2.0.10 timeago: ^3.1.0 package_info: ^2.0.2 - rounded_loading_button: ^2.0.5 + rounded_loading_button: ^2.1.0 version: ^2.0.0 - flutter_launcher_icons: ^0.9.1 + # flutter_launcher_icons: ^0.9.1 overflow_view: ^0.3.1 flutter_styled_toast: ^2.0.0 permission_handler: ^9.2.0 - file_picker: ^4.2.3 + file_picker: ^5.2.5 boardview: ^0.2.2 pointer_interceptor: ^0.9.0 - contacts_service: ^0.6.1 + contacts_service: ^0.6.3 diacritic: ^0.1.3 states_rebuilder: ^5.2.0 - #super_editor: ^0.2.0 + # super_editor: ^0.2.0 markdown: ^5.0.0 # REMOVE THIS super_editor: git: url: https://github.com/superlistapp/super_editor.git path: super_editor ref: 1601fdce95ebfa34bddf80cab3e58e700b0edec3 - html2md: ^1.2.5 - printing: ^5.8.0 - image_cropper: ^2.0.2 + html2md: ^1.2.6 + printing: ^5.10.1 + image_cropper: ^3.0.1 msal_js: ^2.14.0 - sign_in_with_apple: ^4.0.0 - window_manager: ^0.2.5 - bitsdojo_window: ^0.1.2 + sign_in_with_apple: ^4.3.0 + window_manager: ^0.3.0 + # bitsdojo_window: ^0.1.5 intl_phone_field: ^3.1.0 flutter_staggered_grid_view: ^0.6.2 # quick_actions: ^0.2.1 diff --git a/pubspec.yaml b/pubspec.yaml index fba836825..45462c919 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - google_sign_in: ^5.0.7 + google_sign_in: ^6.0.1 in_app_review: ^2.0.4 in_app_purchase: ^3.1.1 pinput: ^2.2.11 @@ -29,59 +29,59 @@ dependencies: # git: # url: https://github.com/Tkko/Flutter_Pinput # ref: dev - flutter_redux: ^0.8.2 + flutter_redux: ^0.10.0 redux_logging: ^0.5.0 http: ^0.13.3 path_provider: ^2.0.2 shared_preferences: ^2.0.6 - material_design_icons_flutter: ^5.0.6295 + material_design_icons_flutter: ^6.0.7096 built_value: ^8.1.2 built_collection: ^5.1.0 memoize: ^3.0.0 cached_network_image: 3.0.0 # imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet, url_launcher: ^6.0.20 - share: ^2.0.4 + share_plus: ^6.3.1 intl: ^0.17.0 - flutter_slidable: ^1.1.0 + flutter_slidable: ^2.0.0 charts_flutter: ^0.12.0 #qr_flutter: ^4.0.0 qr_flutter: # https://github.com/theyakka/qr.flutter/issues/174#issuecomment-1084235757 git: url: https://github.com/theyakka/qr.flutter.git - local_auth: ^1.1.6 - sentry_flutter: ^6.9.1 - image_picker: ^0.8.3+1 + local_auth: ^2.1.5 + sentry_flutter: ^6.20.1 + image_picker: ^0.8.6+3 flutter_colorpicker: ^1.0.3 flutter_json_viewer: ^1.0.1 webview_flutter: ^3.0.4 timeago: ^3.1.0 package_info: ^2.0.2 - rounded_loading_button: ^2.0.5 - version: ^2.0.0 - flutter_launcher_icons: ^0.9.1 + rounded_loading_button: ^2.1.0 + version: ^3.0.2 + # flutter_launcher_icons: ^0.9.1 overflow_view: ^0.3.1 flutter_styled_toast: ^2.0.0 - permission_handler: ^9.2.0 - file_picker: ^4.2.3 + permission_handler: ^10.2.0 + file_picker: ^5.2.5 boardview: ^0.2.2 pointer_interceptor: ^0.9.0 - contacts_service: ^0.6.1 + contacts_service: ^0.6.3 diacritic: ^0.1.3 - states_rebuilder: ^5.2.0 - #super_editor: ^0.2.2 + states_rebuilder: ^6.2.0 + # super_editor: ^0.2.2 markdown: ^5.0.0 # REMOVE THIS super_editor: git: url: https://github.com/superlistapp/super_editor.git path: super_editor - ref: 1601fdce95ebfa34bddf80cab3e58e700b0edec3 - html2md: ^1.2.5 - printing: ^5.8.0 - image_cropper: ^2.0.2 + #ref: 1601fdce95ebfa34bddf80cab3e58e700b0edec3 + html2md: ^1.2.6 + printing: ^5.10.1 + image_cropper: ^3.0.1 msal_js: ^2.14.0 - sign_in_with_apple: ^4.0.0 - window_manager: ^0.2.7 - # bitsdojo_window: ^0.1.2 + sign_in_with_apple: ^4.3.0 + window_manager: ^0.3.0 + # bitsdojo_window: ^0.1.5 intl_phone_field: ^3.1.0 flutter_staggered_grid_view: ^0.6.2 # quick_actions: ^0.2.1 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 01d24e64b..947155643 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,15 +6,19 @@ #include "generated_plugin_registrant.h" +#include #include #include #include #include +#include #include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + LocalAuthPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LocalAuthPlugin")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); PrintingPluginRegisterWithRegistrar( @@ -23,6 +27,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); SentryFlutterPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("SentryFlutterPlugin")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); SmartAuthPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("SmartAuthPlugin")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 28fa06825..987a04944 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,10 +3,12 @@ # list(APPEND FLUTTER_PLUGIN_LIST + local_auth_windows permission_handler_windows printing screen_retriever sentry_flutter + share_plus smart_auth url_launcher_windows window_manager diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt index b9e550fba..394917c05 100644 --- a/windows/runner/CMakeLists.txt +++ b/windows/runner/CMakeLists.txt @@ -20,12 +20,20 @@ add_executable(${BINARY_NAME} WIN32 # that need different build settings. apply_standard_settings(${BINARY_NAME}) +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + # Disable Windows macros that collide with C++ standard library functions. target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") # Add dependency libraries and include directories. Add any application-specific # dependencies here. target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") # Run the Flutter tool portions of the build. This must not be removed. diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index c6f4f3d93..2f402cd23 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -60,14 +60,14 @@ IDI_APP_ICON ICON "resources\\app_icon.ico" // Version // -#ifdef FLUTTER_BUILD_NUMBER -#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD #else -#define VERSION_AS_NUMBER 1,0,0 +#define VERSION_AS_NUMBER 1,0,0,0 #endif -#ifdef FLUTTER_BUILD_NAME -#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION #else #define VERSION_AS_STRING "1.0.0" #endif @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "Invoice Ninja" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "invoiceninja" "\0" - VALUE "LegalCopyright", "Copyright (C) 2021 Invoice Ninja. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2023 Invoice Ninja. All rights reserved." "\0" VALUE "OriginalFilename", "invoiceninja.exe" "\0" VALUE "ProductName", "invoiceninja" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp index b43b9095e..b25e363ef 100644 --- a/windows/runner/flutter_window.cpp +++ b/windows/runner/flutter_window.cpp @@ -26,6 +26,11 @@ bool FlutterWindow::OnCreate() { } RegisterPlugins(flutter_controller_->engine()); SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + return true; } diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index 54ca92a44..b12ea185e 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -1,6 +1,3 @@ -//#include -//auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP); - #include #include #include @@ -30,7 +27,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); - if (!window.CreateAndShow(L"Invoice Ninja", origin, size)) { + if (!window.Create(L"Invoice Ninja", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest index c977c4a42..a42ea7687 100644 --- a/windows/runner/runner.exe.manifest +++ b/windows/runner/runner.exe.manifest @@ -7,7 +7,7 @@ - + diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index c10f08dc7..041a38554 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -1,13 +1,31 @@ #include "win32_window.h" +#include #include #include "resource.h" namespace { +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + // The number of Win32Window objects that currently exist. static int g_active_window_count = 0; @@ -31,8 +49,8 @@ void EnableFullDpiSupportIfAvailable(HWND hwnd) { GetProcAddress(user32_module, "EnableNonClientDpiScaling")); if (enable_non_client_dpi_scaling != nullptr) { enable_non_client_dpi_scaling(hwnd); - FreeLibrary(user32_module); } + FreeLibrary(user32_module); } } // namespace @@ -102,9 +120,9 @@ Win32Window::~Win32Window() { Destroy(); } -bool Win32Window::CreateAndShow(const std::wstring& title, - const Point& origin, - const Size& size) { +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { Destroy(); const wchar_t* window_class = @@ -117,7 +135,7 @@ bool Win32Window::CreateAndShow(const std::wstring& title, double scale_factor = dpi / 96.0; HWND window = CreateWindow( - window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), Scale(size.width, scale_factor), Scale(size.height, scale_factor), nullptr, nullptr, GetModuleHandle(nullptr), this); @@ -126,9 +144,15 @@ bool Win32Window::CreateAndShow(const std::wstring& title, return false; } + UpdateTheme(window); + return OnCreate(); } +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + // static LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message, @@ -188,6 +212,10 @@ Win32Window::MessageHandler(HWND hwnd, SetFocus(child_content_); } return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; } return DefWindowProc(window_handle_, message, wparam, lparam); @@ -243,3 +271,18 @@ bool Win32Window::OnCreate() { void Win32Window::OnDestroy() { // No-op; provided for subclasses. } + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h index 17ba43112..c86632d8a 100644 --- a/windows/runner/win32_window.h +++ b/windows/runner/win32_window.h @@ -28,15 +28,16 @@ class Win32Window { Win32Window(); virtual ~Win32Window(); - // Creates and shows a win32 window with |title| and position and size using + // Creates a win32 window with |title| that is positioned and sized using // |origin| and |size|. New windows are created on the default monitor. Window // sizes are specified to the OS in physical pixels, hence to ensure a - // consistent size to will treat the width height passed in to this function - // as logical pixels and scale to appropriate for the default monitor. Returns - // true if the window was created successfully. - bool CreateAndShow(const std::wstring& title, - const Point& origin, - const Size& size); + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); // Release OS resources associated with window. void Destroy(); @@ -86,6 +87,9 @@ class Win32Window { // Retrieves a class instance pointer for |window| static Win32Window* GetThisFromHandle(HWND const window) noexcept; + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + bool quit_on_close_ = false; // window handle for top level window.