diff --git a/lib/dev_config.dart b/lib/dev_config.dart index b8feb49..7221603 100644 --- a/lib/dev_config.dart +++ b/lib/dev_config.dart @@ -36,10 +36,10 @@ const double kAddPinYOffset = 0.0; // Client name and version for OSM uploads ("created_by" tag) const String kClientName = 'DeFlock'; -const String kClientVersion = '0.9.15'; +const String kClientVersion = '0.9.16'; // Development/testing features - set to false for production builds -const bool kEnableDevelopmentModes = false; // Set to false to hide sandbox/simulate modes and force production mode +const bool kEnableDevelopmentModes = true; // Set to false to hide sandbox/simulate modes and force production mode // Marker/node interaction const int kCameraMinZoomLevel = 10; // Minimum zoom to show nodes (Overpass) diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index ac285e2..cc8ebfe 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -165,6 +165,24 @@ class _HomeScreenState extends State with TickerProviderStateMixin { _selectedNodeId = node.id; // Track selected node for highlighting }); + // Start smooth centering animation simultaneously with sheet opening + // Use the same duration as SheetAwareMap (300ms) for coordinated animation + try { + _mapController.animateTo( + dest: node.coord, + zoom: _mapController.mapController.camera.zoom, + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + ); + } catch (_) { + // Map controller not ready, fallback to immediate move + try { + _mapController.mapController.move(node.coord, _mapController.mapController.camera.zoom); + } catch (_) { + // Controller really not ready, skip centering + } + } + final controller = _scaffoldKey.currentState!.showBottomSheet( (ctx) => MeasuredSheet( onHeightChanged: (height) { diff --git a/lib/widgets/map/camera_markers.dart b/lib/widgets/map/camera_markers.dart index 60f096a..99131f0 100644 --- a/lib/widgets/map/camera_markers.dart +++ b/lib/widgets/map/camera_markers.dart @@ -32,9 +32,7 @@ class _CameraMapMarkerState extends State { void _onTap() { _tapTimer = Timer(tapTimeout, () { - // Center on the node when opening the tag sheet - // This prevents jumping when transitioning to edit mode - widget.mapController.move(widget.node.coord, widget.mapController.camera.zoom); + // Don't center immediately - let the sheet opening handle the coordinated animation // Use callback if provided, otherwise fallback to direct modal if (widget.onNodeTap != null) {