Skip to content

fix: Added examples of individual coachmarks with UI for readme#7

Merged
FreakyAli merged 21 commits intomasterfrom
r1-gh/shell-examples
Jun 22, 2025
Merged

fix: Added examples of individual coachmarks with UI for readme#7
FreakyAli merged 21 commits intomasterfrom
r1-gh/shell-examples

Conversation

@FreakyAli
Copy link
Copy Markdown
Owner

@FreakyAli FreakyAli commented Jun 12, 2025

Summary by CodeRabbit

  • New Features

    • Introduced "FocusCoachmarkPage" with guided overlays and a dedicated view model.
    • Added reusable base content page and base view model for navigation and header customization.
    • Centralized resource constants for SVG images and external URLs.
    • Added dynamic list of animation styles in the sample app.
    • Added new "ArrowCoachmarkPage" and "SpotlightCoachmarkPage" with corresponding view models.
    • Implemented app shell with registered routes for coachmark pages.
  • Improvements

    • Upgraded to .NET 9 and latest MAUI and CommunityToolkit packages.
    • Changed coachmark tutorial presentation from modal pages to popups for smoother UX.
    • Enhanced coachmark overlay sizing, positioning, margin calculation, and animation rendering.
    • Improved cross-platform view measurement and navigation logic.
    • Refined lifecycle and navigation handling for coachmark popups.
    • Simplified coachmark positioning by removing diagonal options.
    • Updated main page UI to a dynamic CollectionView with interactive navigation.
    • Enhanced app builder to integrate Maui Community Toolkit and FreakyControls.
  • Style

    • Updated color palette with new accent colors.
    • Added new button styles and modernized UI styles.
  • Chores

    • Embedded SVG resources and updated project files for asset management.
    • Integrated Maui Community Toolkit and FreakyControls initialization in app setup.
  • Documentation

    • Added preview GIFs and installation clarifications in README.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 12, 2025

Walkthrough

This update migrates the project to .NET 9, introduces new sample infrastructure with a base page and view model, and refactors coachmark functionality to use CommunityToolkit.Maui popups instead of modal pages. It adds a new focus coachmark sample, centralizes resource constants, revises styles and colors, enhances platform-specific view measurement logic, and simplifies coachmark positioning by removing diagonal options.

Changes

File(s) / Group Change Summary
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml, .xaml.cs Changed base class from ContentPage to Popup; updated lifecycle and navigation to popup events; improved overlay measurement, positioning, margin calculation, and rendering animation; revised XAML root element and namespaces.
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/CoachmarkManager.cs Changed coachmark presentation from modal navigation to CommunityToolkit.Maui popup with custom popup options.
Maui.FreakyUXKit/Maui.FreakyUXKit/ViewExtensions.cs Added Android-specific relative bounds calculation; improved iOS/MacCatalyst handling for safe area insets in GetRelativeBoundsTo.
Maui.FreakyUXKit/Maui.FreakyUXKit/Maui.FreakyUXKit.csproj, Samples/Samples.csproj Updated target frameworks to .NET 9, upgraded and added package references, removed compatibility packages, embedded SVG resources, and cleaned platform folder entries.
Maui.FreakyUXKit/Samples/App.xaml.cs Added static property for current page; changed CreateWindow override to non-nullable parameter and return Window with AppShell.
Maui.FreakyUXKit/Samples/Constants.cs Added static class with centralized assembly, resource paths, SVG icon paths, profile image URLs, and inline SVG base64 string constants.
Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml, .xaml.cs Added base content page with header control template, navigation bar visibility disabled, and status bar styling.
Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs Added base view model with back button command to pop navigation stack asynchronously, and commands to open external URLs.
Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml, .xaml.cs, FocusCoachmarkViewModel.cs Added new focus coachmark sample page with detailed layout and coachmark overlays, and corresponding empty view model.
Maui.FreakyUXKit/Samples/MainPage.xaml, .xaml.cs, MainViewModel.cs Replaced static UI with CollectionView bound to animation types; added command to navigate to focus coachmark page; introduced new MainViewModel.
Maui.FreakyUXKit/Samples/MauiProgram.cs Integrated CommunityToolkit.Maui and FreakyControls initialization into Maui app builder.
Maui.FreakyUXKit/Samples/Resources/Styles/Colors.xaml Changed primary, secondary, tertiary colors; added new accent and overlay colors; removed unused colors; reformatted resource dictionary.
Maui.FreakyUXKit/Samples/Resources/Styles/Styles.xaml Updated styles for Button, Label, Shell, NavigationPage, TabbedPage; added new button styles; removed some label and span styles; adjusted visual states and colors.
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/CoachmarkPosition.cs Removed diagonal coachmark positions (TopLeft, TopRight, BottomLeft, BottomRight) from enum.
Maui.FreakyUXKit/Maui.FreakyUXKit/SkiaSharpExtensions.cs Removed logic supporting diagonal coachmark positions in position calculation and margin methods.
Maui.FreakyUXKit/Maui.FreakyUXKit/Hosting.cs Modified UseFreakyUXKit extension to include UseMauiCommunityToolkit() before UseSkiaSharp().
Maui.FreakyUXKit/Samples/MainPage.xaml.cs Removed unused OnAppearing override; set BindingContext to new MainViewModel in constructor.
Maui.FreakyUXKit/Samples/AppShell.xaml, .xaml.cs Added new Shell with disabled flyout and registered routes for coachmark sample pages.
Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkPage.xaml, .xaml.cs, ArrowCoachmarkViewModel.cs Added new arrow coachmark sample page with detailed UI and overlays; added corresponding empty view model.
Maui.FreakyUXKit/Samples/Spotlight/SpotlightCoachmarkPage.xaml, .xaml.cs, SpotlightViewModel.cs Added new spotlight coachmark sample page with detailed UI and overlays; added corresponding empty view model.
README.md Added "Previews" section with platform GIFs and minor textual corrections.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant MainPage
    participant MainViewModel
    participant App
    participant FocusCoachmarkPage
    participant CoachmarkManager
    participant FreakyPopupPage (Popup)
    
    User->>MainPage: Tap animation type
    MainPage->>MainViewModel: ShowNextPageCommand(selection)
    MainViewModel->>App: Navigate to FocusCoachmarkPage (if Focus)
    App->>FocusCoachmarkPage: Push page onto navigation stack
    FocusCoachmarkPage->>CoachmarkManager: Start coachmark tutorial
    CoachmarkManager->>FreakyPopupPage (Popup): ShowPopupAsync with options
    User->>FreakyPopupPage (Popup): Interact with coachmark overlays
    FreakyPopupPage (Popup)->>CoachmarkManager: NextCoachMark or ClosePopupAsync
Loading

Poem

A hop to .NET 9, so spry and bright,
New popups leap in the shimmering light.
Coachmarks now float, not modal and stuck—
With Focus and flair, we’re hopping amok!
Colors refreshed, and styles anew,
This rabbit’s code garden just beautifully grew.
🐇✨

✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🔭 Outside diff range comments (1)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (1)

67-74: 🛠️ Refactor suggestion

Avoid repeated IEnumerable enumeration

_views.Count() & ElementAtOrDefault re-enumerate every call.
Convert once to a List<View> for O(1) access.

-        _views = coachMarkViews;
+        _views = coachMarkViews?.ToList() ?? new List<View>();

Then update field type to IReadOnlyList<View> (or List<View>) and replace Count() with .Count.

🧹 Nitpick comments (13)
Maui.FreakyUXKit/Samples/Resources/Styles/Colors.xaml (2)

8-8: Spelling inconsistency: “Quarternary” → “Quaternary”

The term is normally spelled Quaternary. Keeping resource keys typo-free avoids future lookup errors.

-<Color x:Key="Quarternary">#F5F5F5</Color>
+<Color x:Key="Quaternary">#F5F5F5</Color>

21-33: Missing matching brush for the new colour

All base colours except Quaternary have an accompanying brush, which breaks the established convention and forces consumers to create their own.

+<SolidColorBrush x:Key="QuaternaryBrush" Color="{StaticResource Quaternary}" />
Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkViewModel.cs (1)

1-6: Empty ViewModel – opportunity to seal intent

Right now the class adds no behaviour beyond FreakyBaseViewModel.
If it is merely a marker, mark it sealed and add an XML summary so future contributors know it is intentionally blank.

-public class FocusCoachmarkViewModel : FreakyBaseViewModel
+/// <summary>
+/// View-model for <see cref="FocusCoachmarkPage"/>.  
+/// Currently inherits navigation helpers from <see cref="FreakyBaseViewModel"/>.
+/// </summary>
+public sealed class FocusCoachmarkViewModel : FreakyBaseViewModel
Maui.FreakyUXKit/Samples/MauiProgram.cs (1)

2-3: Using directives can be file-scoped

Minor: you can convert the using statements to file-scoped (global using) in a central file to reduce repetition across sample projects.

Maui.FreakyUXKit/Samples/AppShell.xaml.cs (1)

1-9: No navigation route registration

If additional pages will be pushed from code, register routes in the constructor:

Routing.RegisterRoute(nameof(FocusCoachmarkPage), typeof(FocusCoachmarkPage));

Helps avoid magic strings in future navigation calls.

Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml.cs (1)

5-9: Inject ViewModel via DI instead of manually new-ing it up

Hard-wiring the ViewModel (new FocusCoachmarkViewModel()) couples the page to a concrete implementation and complicates unit‐testing or later replacement. Resolve the VM from IServiceProvider (MAUI supports constructor injection) or assign it in XAML to keep the code-behind clean.

-public FocusCoachmarkPage()
-{
-    InitializeComponent();
-    BindingContext = new FocusCoachmarkViewModel();
-}
+public FocusCoachmarkPage(FocusCoachmarkViewModel vm)
+{
+    InitializeComponent();
+    BindingContext = vm;
+}

Then register the VM in MauiProgram:

builder.Services.AddTransient<FocusCoachmarkViewModel>();
Maui.FreakyUXKit/Samples/AppShell.xaml (1)

8-11: Route naming mismatch might confuse deep-linking

Route="MainPage" points to FocusCoachmarkPage. Because a different page called “MainPage” often exists, this can cause ambiguity when using URI-based navigation. Prefer a route that reflects the actual target, e.g. focus-coachmark.

-Route="MainPage"
+Route="focus-coachmark"
Maui.FreakyUXKit/Samples/Samples.csproj (1)

56-60: Embedded SVGs duplicated as MauiImage?

The same SVGs appear to live under Resources/Images. They’re now embedded resources, but if they’re also picked up by the <MauiImage Include="Resources\Images\*"/> glob you’ll ship each file twice, increasing app size. Either:

  1. Exclude them from the image glob, or
  2. Reference them only as images and drop the explicit EmbeddedResource.

Verify which mechanism the controls expect.

Maui.FreakyUXKit/Maui.FreakyUXKit/ViewExtensions.cs (1)

35-58: Cache density & reduce property-lookups

nativeView.Context.Resources.DisplayMetrics.Density is queried four times.
Caching it once improves readability and avoids redundant JNI hops.

-        double width = nativeView.Width / nativeView.Context.Resources.DisplayMetrics.Density;
-        double height = nativeView.Height / nativeView.Context.Resources.DisplayMetrics.Density;
-
-        x /= nativeView.Context.Resources.DisplayMetrics.Density;
-        y /= nativeView.Context.Resources.DisplayMetrics.Density;
+        var density = nativeView.Context.Resources.DisplayMetrics.Density;
+
+        double width = nativeView.Width / density;
+        double height = nativeView.Height / density;
+
+        x /= density;
+        y /= density;

(While you’re here: the class name ViewExntensions is miss-spelt; consider correcting to ViewExtensions in a follow-up PR.)

Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (1)

45-51: Double-checking Loaded subscription logic

Loaded is unsubscribed in OnDisappearing().
If the same page instance is ever re-used (e.g., with Shell’s caching), the coach-mark will no longer display.
Consider either:

  • keep the subscription for the lifetime of the page (most common), or
  • resubscribe in OnAppearing() instead.

Optional but worth validating against your navigation flow.

Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml (1)

36-61: Add accessibility labels to interactive header buttons

Screen-reader users currently receive no description for the back/menu buttons.
Attach AutomationProperties.Name (and optionally HelpText) for better a11y:

-                                <controls:FreakySvgImageView
+                                <controls:FreakySvgImageView
+                                AutomationProperties.Name="Back"
                                 ImageColor="White"
@@
-                                <controls:FreakySvgImageView
+                                <controls:FreakySvgImageView
+                                AutomationProperties.Name="Context menu"
                                 ImageColor="White"
Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml (1)

70-157: Three nearly-identical metric panels ⇒ extract to a DataTemplate
Students, Content, Followers blocks are copy-pasted. This violates DRY and inflates XAML compile time.

Refactor to:

  1. An ObservableCollection<MetricVm> on the VM.
  2. A CollectionView with a reusable MetricTemplate.

This keeps layout consistent and makes future changes (icon size, font) one-liner updates.

Maui.FreakyUXKit/Samples/Resources/Styles/Styles.xaml (1)

404-407: Page Padding set to zero may overlap iOS status bar
Removing padding everywhere looks fine on Android but pushes content under the notch on iOS/macOS Catalyst.

Consider:

-<Setter Property="Padding" Value="0" />
+<Setter Property="Padding" Value="{OnPlatform iOS='0,20,0,0', Default='0'}" />

Or leverage SafeAreaInsets to keep headers readable.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 18aa785 and 8066e3d.

⛔ Files ignored due to path filters (5)
  • Maui.FreakyUXKit/Samples/Resources/Images/back_button.svg is excluded by !**/*.svg
  • Maui.FreakyUXKit/Samples/Resources/Images/bar_chart.svg is excluded by !**/*.svg
  • Maui.FreakyUXKit/Samples/Resources/Images/briefcase.png is excluded by !**/*.png
  • Maui.FreakyUXKit/Samples/Resources/Images/meatball_icon.svg is excluded by !**/*.svg
  • Maui.FreakyUXKit/Samples/Resources/Images/play.svg is excluded by !**/*.svg
📒 Files selected for processing (19)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Maui.FreakyUXKit.csproj (1 hunks)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/ViewExtensions.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/App.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/AppShell.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/AppShell.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Constants.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/MainPage.xaml (0 hunks)
  • Maui.FreakyUXKit/Samples/MainPage.xaml.cs (0 hunks)
  • Maui.FreakyUXKit/Samples/MauiProgram.cs (2 hunks)
  • Maui.FreakyUXKit/Samples/Resources/Styles/Colors.xaml (2 hunks)
  • Maui.FreakyUXKit/Samples/Resources/Styles/Styles.xaml (13 hunks)
  • Maui.FreakyUXKit/Samples/Samples.csproj (1 hunks)
💤 Files with no reviewable changes (2)
  • Maui.FreakyUXKit/Samples/MainPage.xaml.cs
  • Maui.FreakyUXKit/Samples/MainPage.xaml
🧰 Additional context used
🧬 Code Graph Analysis (3)
Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkViewModel.cs (1)
Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs (2)
  • FreakyBaseViewModel (6-20)
  • FreakyBaseViewModel (10-13)
Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml.cs (1)
Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkViewModel.cs (1)
  • FocusCoachmarkViewModel (3-6)
Maui.FreakyUXKit/Samples/App.xaml.cs (1)
Maui.FreakyUXKit/Samples/AppShell.xaml.cs (2)
  • AppShell (3-9)
  • AppShell (5-8)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci
🔇 Additional comments (11)
Maui.FreakyUXKit/Samples/Resources/Styles/Colors.xaml (1)

5-10: Use 6- or 8-digit ARGB notation for better MAUI compatibility

MAUI reliably recognises #RRGGBB and #AARRGGBB literals.
#000 / #FFF rely on shorthand parsing that is not guaranteed across all targets and colour pickers.
Consider expanding them to explicit 24-bit (or 32-bit) representations, e.g.​:

-<Color x:Key="Primary">#000</Color>
-<Color x:Key="Secondary">#FFF</Color>
+<Color x:Key="Primary">#000000</Color>
+<Color x:Key="Secondary">#FFFFFF</Color>
Maui.FreakyUXKit/Maui.FreakyUXKit/Maui.FreakyUXKit.csproj (1)

34-44: Confirm removal of <Folder> items doesn’t break linker trimming

The deleted <Folder> declarations only serve IntelliSense; however, if embedded resources or platform-specific partial classes were previously kept alive by their presence, the linker might now remove them. Please verify that:

  1. Any *.axml, *.storyboard, SVG, etc., that relied on those folders are still marked with the correct BuildAction.
  2. Platform-specific partials continue to compile after the physical folder move.
Maui.FreakyUXKit/Samples/MauiProgram.cs (1)

15-17: Order of builder extensions – verify toolkit initialisation

Some MAUI extensions expect UseMauiCommunityToolkit() to run before custom libraries that register handlers (e.g. media element). If FreakyUXKit internally registers handlers that rely on the toolkit, swap the calls:

-        .UseFreakyUXKit()
-        .UseMauiCommunityToolkit()
+        .UseMauiCommunityToolkit()
+        .UseFreakyUXKit()

Please confirm the required order, otherwise runtime handler registration could fail silently.

Maui.FreakyUXKit/Samples/App.xaml.cs (1)

8-8: Confirm Shell meets multi-window requirements

Replacing CreateWindow() with a direct MainPage = new AppShell(); is fine for single-window scenarios, but .NET MAUI on macOS/Windows supports multi-window via CreateWindow. If the sample is ever expected to open additional windows, consider retaining/overriding CreateWindow and returning a Window that hosts AppShell to avoid future refactors.

Maui.FreakyUXKit/Samples/Samples.csproj (1)

49-55: Align MAUI & toolkit package versions

CommunityToolkit.Maui 9.1.1 targets MAUI 8.0.82+, so the versions are compatible, but if you update MAUI in one place (8.0.82) remember to bump the Microsoft.Maui.Extensions.* meta-packages too (if present) to keep transitive dependencies consistent. A skew can lead to binding/runtime warnings.

Maui.FreakyUXKit/Samples/Constants.cs (1)

5-20: Centralised constants look good

The constant set is clear and self-explanatory. No issues spotted.

Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml.cs (1)

1-96: Bindable-property scaffold looks solid

No functional issues observed; defaults make sense and naming is consistent.

Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml (2)

268-282: Coachmark overlay is missing DisplayOrder / OwningPage – may never show
fc:FreakyCoachmark.OverlayView usually requires DisplayOrder and sometimes OwningPage to participate in the coachmark sequence. Only the image (lines 333-336) declares these.

If the intention is that this card participates in the same flow, add:

<fc:FreakyCoachmark.OverlayView
+    fc:FreakyCoachmark.DisplayOrder="2"
+    fc:FreakyCoachmark.OwningPage="{Reference page}">

Otherwise the overlay is ignored by the coachmark engine.


333-336: 👍 Correct usage of animation & ordering attributes
The image correctly sets CoachmarkAnimation, DisplayOrder, and OwningPage; this will compile-time validate thanks to x:DataType.

Maui.FreakyUXKit/Samples/Resources/Styles/Styles.xaml (2)

48-62: Verify colour key spelling – “Quarternary” vs “Quaternary”
SecondaryButtonStyle / QuarternaryButtonStyle reference Quarternary (with an extra ‘r’). If your Colors.xaml defines Quaternary, this will throw a XAML parse exception at run-time.

Please ensure the resource exists or rename consistently.


410-419: Shell foreground/background contrast in Light theme
Shell.BackgroundColor uses Primary (likely dark) while Shell.ForegroundColor falls back to white on most platforms, resulting in low contrast if Primary is light. Double-check WCAG contrast ratios or swap colours to maintain 4.5:1.

Comment thread Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs
Comment thread Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs
Comment thread Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml Outdated
Comment thread Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (1)

57-60: Remove ConfigureAwait(false) – still risks UI-thread violations
This was flagged previously and remains unresolved. NextCoachMark() touches UI elements; continuation must stay on the main thread.

-        await NextCoachMark().ConfigureAwait(false);
+        await NextCoachMark();
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cbe1a5f and 2be26ef.

📒 Files selected for processing (5)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/CoachmarkManager.cs (1 hunks)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml (2 hunks)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (3 hunks)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Maui.FreakyUXKit.csproj (2 hunks)
  • Maui.FreakyUXKit/Samples/Samples.csproj (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Maui.FreakyUXKit.csproj
🧰 Additional context used
🧬 Code Graph Analysis (1)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/CoachmarkManager.cs (3)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (2)
  • FreakyPopupPage (9-578)
  • FreakyPopupPage (43-49)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyCoachmark.cs (2)
  • FreakyCoachmark (5-268)
  • GetDisplayOrder (208-209)
Maui.FreakyUXKit/Maui.FreakyUXKit/Constants.cs (1)
  • Constants (4-14)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci
🔇 Additional comments (3)
Maui.FreakyUXKit/Samples/Samples.csproj (2)

4-4: Targeting .NET 9 preview – verify toolchain readiness

net9.0-android;net9.0-ios requires the .NET 9 preview SDK + matching MAUI workload.
Please confirm CI agents / local dev boxes use the same preview; otherwise builds will fail.


48-52: Confirm upgraded package set & transitive toolkit usage

Upgrading to Microsoft.Maui.Controls 9.0.80 and adding FreakyControls / CommunityToolkit.Mvvm is fine, but be sure:

  1. Any removed Compatibility API calls were really eliminated.
  2. The CommunityToolkit.Maui package (needed for Popup) is available transitively; if not, add it explicitly to avoid missing-type compile errors.

A quick restore/build run will surface any gaps.

Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml (1)

2-8: XAML root update looks good

The conversion to toolkit:Popup with proper namespaces is correct; no further action needed.

Comment thread Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/CoachmarkManager.cs
Comment thread Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (2)

56-59: Remove ConfigureAwait(false) — causes UI-thread violations

NextCoachMark() manipulates Navigation and UI elements and must execute on the main thread.

-        await NextCoachMark().ConfigureAwait(false);
+        await NextCoachMark();

42-47: Materialise _views to avoid repeated enumeration

_views.Count() and multiple ElementAtOrDefault calls re-enumerate the source each time.

-        _views = coachMarkViews;
+        _views = coachMarkViews.ToList();
🧹 Nitpick comments (1)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (1)

1-10: Fix PR title typo

The PR title contains a typo: "shell exampels" should be "shell examples". Additionally, no Shell-related changes are visible in the reviewed files.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3ea1ec1 and ded69cb.

📒 Files selected for processing (8)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (13 hunks)
  • Maui.FreakyUXKit/Samples/App.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/MainPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/MainPage.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/MainViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Samples.csproj (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs
  • Maui.FreakyUXKit/Samples/Samples.csproj
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci
🔇 Additional comments (2)
Maui.FreakyUXKit/Samples/MainPage.xaml.cs (1)

1-10: LGTM!

The simplified implementation with direct BindingContext assignment is clean and appropriate.

Maui.FreakyUXKit/Samples/MainPage.xaml (1)

1-39: LGTM!

The CollectionView implementation with proper data binding and command handling is well-structured.

Comment thread Maui.FreakyUXKit/Samples/MainViewModel.cs
Comment thread Maui.FreakyUXKit/Samples/App.xaml.cs
@FreakyAli FreakyAli changed the title fix: shell exampels fix: shell examples Jun 20, 2025
@FreakyAli FreakyAli changed the title fix: shell examples fix: Added examples of individual coachmarks with UI for readme Jun 22, 2025
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
README.md (1)

20-23: Remove trailing punctuation and reconsider heading usage
The ## Previews: heading has a trailing colon (MD026) and the ### Note: ... line is formatted as a heading ending with a period (also flagged by MD026).

  • Change ## Previews: to ## Previews
  • Convert the note into a plain paragraph or italic block without trailing punctuation
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c817ca7 and 5c3b187.

📒 Files selected for processing (1)
  • README.md (2 hunks)
🧰 Additional context used
🪛 LanguageTool
README.md

[style] ~22-~22: Consider using a less common alternative to make your writing sound more unique and professional.
Context: ...don't represent the actual performance. Please feel free to clone the repository and check the perf...

(FEEL_FREE_TO_STYLE_ME)

🪛 markdownlint-cli2 (0.17.2)
README.md

20-20: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


22-22: Trailing punctuation in heading
Punctuation: '.'

(MD026, no-trailing-punctuation)


26-26: Images should have alternate text (alt text)
null

(MD045, no-alt-text)


26-26: Images should have alternate text (alt text)
null

(MD045, no-alt-text)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci
🔇 Additional comments (2)
README.md (2)

46-47: Installation command wording is clear
The instruction to "Run the following command to add our NuGet to your .NET MAUI app:" uses correct casing for NuGet and .NET MAUI and reads clearly.


50-51: Using statement initialization is accurate
The prose “Add the following using statement and initialization in your MauiProgram:” correctly directs users and matches the code snippet below.

Comment thread README.md
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (2)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (2)

56-59: Remove ConfigureAwait(false) — causes UI-thread violations

This is the same issue identified in previous reviews. NextCoachMark() manipulates Navigation and UI elements and must execute on the main thread. ConfigureAwait(false) detaches the continuation from the UI context, risking InvalidOperationException on some platforms.

-        await NextCoachMark().ConfigureAwait(false);
+        await NextCoachMark();

42-47: Materialise _views to avoid repeated enumeration

The same issue from previous reviews persists. _views.Count() and multiple ElementAtOrDefault calls re-enumerate the source each time. Convert to a list once in the constructor:

-        _views = coachMarkViews;
+        _views = coachMarkViews.ToList();

This guarantees stable ordering and O(1) count/look-ups.

🧹 Nitpick comments (2)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (2)

493-563: Optimize overlay measurement with caching

The MeasureOverlayView() method performs complex calculations every time it's called. Consider caching the measurement result since the overlay view and container dimensions typically don't change between calls during the same coachmark display.

+    private Size? _cachedOverlaySize;
+    private View _lastMeasuredOverlay;
+    
     private Size MeasureOverlayView()
     {
         if (OverlayView == null) return new Size(200, 100);
+        
+        // Return cached size if overlay hasn't changed
+        if (_cachedOverlaySize.HasValue && _lastMeasuredOverlay == OverlayView)
+            return _cachedOverlaySize.Value;
         
         // ... existing measurement logic ...
         
+        // Cache the result
+        _cachedOverlaySize = finalSize;
+        _lastMeasuredOverlay = OverlayView;
+        
         return finalSize;
     }

739-806: Consider extracting complex measurement logic

The MeasureOverlayViewWithScreenConstraints method is quite long and handles multiple responsibilities. Consider extracting the constraint calculation logic into separate methods for better maintainability.

 private Size MeasureOverlayViewWithScreenConstraints()
 {
     if (OverlayView == null) return new Size(200, 100);
     
-    // Get actual container/screen dimensions
-    var containerWidth = container.Width > 0 ? container.Width : Constants.Width;
-    var containerHeight = container.Height > 0 ? container.Height : Constants.Height;
-    
-    // Add some padding to prevent overlay from touching screen edges
-    var screenPadding = 10;
-    var maxScreenWidth = containerWidth - (screenPadding * 2);
-    var maxScreenHeight = containerHeight - (screenPadding * 2);
+    var screenConstraints = CalculateScreenConstraints();
     
     // ... rest of method using screenConstraints ...
 }
 
+private (double maxWidth, double maxHeight, double containerWidth, double containerHeight) CalculateScreenConstraints()
+{
+    var containerWidth = container.Width > 0 ? container.Width : Constants.Width;
+    var containerHeight = container.Height > 0 ? container.Height : Constants.Height;
+    var screenPadding = 10;
+    
+    return (
+        containerWidth - (screenPadding * 2),
+        containerHeight - (screenPadding * 2),
+        containerWidth,
+        containerHeight
+    );
+}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5c3b187 and a4036df.

📒 Files selected for processing (2)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (10 hunks)
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci
🔇 Additional comments (2)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (2)

208-236: Enhanced animation rendering structure

The refactored RenderFocusAnimation method shows improved organization with clearer phase separation and better drawing order. The logic ensures base elements are always drawn before adding effects, which prevents rendering artifacts.


483-491: Verify animation timer disposal in all scenarios

The StopFocusAnimation method properly disposes the timer, but ensure this is called in all cleanup scenarios including unexpected popup closure.

#!/bin/bash
# Description: Verify that StopFocusAnimation is called in all cleanup paths

# Search for all methods that might need to call StopFocusAnimation
ast-grep --pattern $'class $_ {
  $$$
  StopFocusAnimation() {
    $$$
  }
  $$$
}'

# Look for potential cleanup methods that should call StopFocusAnimation
rg -A 5 -B 2 "StopFocusAnimation|StopAnimation|Cleanup|Dispose|Close"

Comment thread Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
README.md (1)

26-27: Add descriptive alt text to preview images.
The <img> tags in the previews table lack alt attributes, which is required for accessibility (MD045).

Apply this diff to include meaningful alt text:

-| <img src="https://github.com/user-attachments/assets/c060fc82-ecef-48af-84b4-e07a963e65d5" width="250" height="550"/>
+| <img src="https://github.com/user-attachments/assets/c060fc82-ecef-48af-84b4-e07a963e65d5" alt="iOS coachmark preview" width="250" height="550"/>

-| <img src="https://github.com/user-attachments/assets/6eabce77-dcf3-46fc-b404-391a4778a6b5" width="250" height="550"/>
+| <img src="https://github.com/user-attachments/assets/6eabce77-dcf3-46fc-b404-391a4778a6b5" alt="Android coachmark preview" width="250" height="550"/>

-| <img src="https://github.com/user-attachments/assets/402b57d1-a264-4aff-a91b-d0b9e21e81e6" width="250" height="550"/>
+| <img src="https://github.com/user-attachments/assets/402b57d1-a264-4aff-a91b-d0b9e21e81e6" alt="iOS coachmark sample 2" width="250" height="550"/>

-| <img src="https://github.com/user-attachments/assets/e076fca2-2b31-4e18-a568-ec62ea2d42ee" width="250" height="550"/>
+| <img src="https://github.com/user-attachments/assets/e076fca2-2b31-4e18-a568-ec62ea2d42ee" alt="Android coachmark sample 2" width="250" height="550"/>
🧹 Nitpick comments (3)
README.md (3)

20-20: Remove trailing punctuation in heading.
The colon at the end of the ## Previews: heading should be dropped to comply with Markdown style (MD026).


22-22: Remove trailing punctuation in subheading.
The period at the end of the ### Note: … heading should be removed to comply with Markdown style (MD026).


37-37: Remove duplicate empty "Previews" section.
There’s a second ## Previews: heading with no content below it—please remove this redundant section.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a4036df and 98bdbb6.

📒 Files selected for processing (1)
  • README.md (2 hunks)
🧰 Additional context used
🪛 LanguageTool
README.md

[style] ~22-~22: Consider using a less common alternative to make your writing sound more unique and professional.
Context: ...don't represent the actual performance. Please feel free to clone the repository and check the perf...

(FEEL_FREE_TO_STYLE_ME)

🪛 markdownlint-cli2 (0.17.2)
README.md

20-20: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


22-22: Trailing punctuation in heading
Punctuation: '.'

(MD026, no-trailing-punctuation)


26-26: Images should have alternate text (alt text)
null

(MD045, no-alt-text)


26-26: Images should have alternate text (alt text)
null

(MD045, no-alt-text)


27-27: Images should have alternate text (alt text)
null

(MD045, no-alt-text)


27-27: Images should have alternate text (alt text)
null

(MD045, no-alt-text)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🔭 Outside diff range comments (1)
Maui.FreakyUXKit/Samples/Spotlight/SpotlightCoachmarkPage.xaml (1)

1-395: Consider refactoring to reduce code duplication.

This page is nearly identical to ArrowCoachmarkPage.xaml with only the animation type changed. Consider extracting the common layout structure into a shared template or base class to improve maintainability and reduce duplication.

Potential approaches:

  • Create a shared ControlTemplate for the common layout
  • Use a base page class with configurable coachmark properties
  • Implement a single page that switches animation types based on a parameter
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 98bdbb6 and dac2ea2.

📒 Files selected for processing (14)
  • Maui.FreakyUXKit/Samples/App.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/AppShell.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/AppShell.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkPage.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/MainViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightCoachmarkPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightCoachmarkPage.xaml.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightViewModel.cs (1 hunks)
✅ Files skipped from review due to trivial changes (5)
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightViewModel.cs
  • Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkViewModel.cs
  • Maui.FreakyUXKit/Samples/AppShell.xaml
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightCoachmarkPage.xaml.cs
  • Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkPage.xaml.cs
🚧 Files skipped from review as they are similar to previous changes (6)
  • Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs
  • Maui.FreakyUXKit/Samples/App.xaml.cs
  • Maui.FreakyUXKit/Samples/MainViewModel.cs
  • Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml.cs
  • Maui.FreakyUXKit/Samples/FreakyBaseContentPage.xaml
  • Maui.FreakyUXKit/Samples/Focus/FocusCoachmarkPage.xaml
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci
🔇 Additional comments (2)
Maui.FreakyUXKit/Samples/AppShell.xaml.cs (1)

1-15: Clean routing implementation following MAUI best practices.

The AppShell implementation is well-structured with const route names preventing magic strings and proper route registration. The code follows standard MAUI Shell patterns correctly.

Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkPage.xaml (1)

1-400: Comprehensive coachmark demonstration with good XAML structure.

The XAML implementation effectively demonstrates various arrow coachmark configurations with proper:

  • Data binding and view model integration
  • Resource usage and styling consistency
  • Coachmark property configuration with different arrow styles
  • Complex but well-organized layout hierarchy

The page serves as an excellent example for arrow-style coachmarks.

Comment thread Maui.FreakyUXKit/Samples/Spotlight/SpotlightCoachmarkPage.xaml Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs (1)

27-32: Add error handling for browser operations.

Same as the previous method, this also needs error handling for the Browser.Default.OpenAsync call.

🧹 Nitpick comments (2)
Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs (2)

9-11: Consider using more specific command types.

While the current implementation works correctly, consider using IAsyncRelayCommand instead of ICommand for better type safety and IntelliSense support.

-    public ICommand BackButtonCommand { get; }
-    public ICommand HireCommand { get; }
-    public ICommand FollowCommand { get; }
+    public IAsyncRelayCommand BackButtonCommand { get; }
+    public IAsyncRelayCommand HireCommand { get; }
+    public IAsyncRelayCommand FollowCommand { get; }

22-22: Consider making URLs configurable.

The hardcoded URLs could be made configurable through constants or configuration to improve maintainability and testability.

Consider creating a constants class:

public static class ProfileUrls
{
    public const string LinkedIn = "https://www.linkedin.com/in/freakyali/";
    public const string GitHub = "https://github.com/FreakyAli";
}

Then reference these constants in the methods.

Also applies to: 29-29

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between dac2ea2 and b863a0a.

📒 Files selected for processing (3)
  • Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Platforms/Android/AndroidManifest.xml (1 hunks)
  • Maui.FreakyUXKit/Samples/Resources/Styles/Styles.xaml (13 hunks)
✅ Files skipped from review due to trivial changes (1)
  • Maui.FreakyUXKit/Samples/Platforms/Android/AndroidManifest.xml
🚧 Files skipped from review as they are similar to previous changes (1)
  • Maui.FreakyUXKit/Samples/Resources/Styles/Styles.xaml
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci
🔇 Additional comments (1)
Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs (1)

15-17: Good implementation of previous feedback.

The implementation correctly uses AsyncRelayCommand with async Task methods, addressing the previous review comment about avoiding async void and using proper MVVM patterns.

Comment thread Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs
Comment thread Maui.FreakyUXKit/Samples/FreakyBaseViewModel.cs
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (1)

850-904: Add error handling for complex coachmark operations.

This method performs extensive UI calculations and container manipulations but lacks error handling. Based on past review feedback, edge cases like invalid bounds, measurement failures, or container issues should be handled gracefully.

The previous review comment about adding error handling to ShowCurrentCoachMark is still valid and should be addressed to prevent crashes during complex overlay positioning operations.

🧹 Nitpick comments (2)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (2)

10-10: Update field type for consistency with constructor parameter.

The constructor now accepts List<View> but the field _views is still typed as IEnumerable<View>. This creates an unnecessary type mismatch.

- private readonly IEnumerable<View> _views;
+ private readonly List<View> _views;

This change would also address the past review comment about repeated enumeration since List<T>.Count and indexing are O(1) operations.

Also applies to: 42-46


493-563: Consider breaking down this complex measurement method.

The MeasureOverlayView method is quite long and handles multiple responsibilities: temporary container management, constraint calculations, position determination, and re-measurement logic.

Consider extracting helper methods:

  • EnsureOverlayInContainer() for temporary container management
  • CalculateInitialConstraints() for container dimension logic
  • GetConstrainedSize() for the re-measurement logic

This would improve readability and testability of the positioning logic.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b863a0a and 102929e.

📒 Files selected for processing (5)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/CoachmarkManager.cs (1 hunks)
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (10 hunks)
  • Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkViewModel.cs (1 hunks)
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightCoachmarkPage.xaml (1 hunks)
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightViewModel.cs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • Maui.FreakyUXKit/Samples/Arrow/ArrowCoachmarkViewModel.cs
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightViewModel.cs
  • Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/CoachmarkManager.cs
  • Maui.FreakyUXKit/Samples/Spotlight/SpotlightCoachmarkPage.xaml
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build-plugin-ci
🔇 Additional comments (2)
Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs (2)

56-59: LGTM - ConfigureAwait issue resolved.

Good fix! The previous ConfigureAwait(false) call has been removed, ensuring UI operations continue on the main thread.


208-237: Approve animation rendering improvements.

The enhanced focus animation rendering with proper phase management and pulse scaling looks well-implemented. The logic clearly separates the different animation phases and provides smooth transitions.

Comment thread Maui.FreakyUXKit/Maui.FreakyUXKit/Coachmark/FreakyPopupPage.xaml.cs
@FreakyAli FreakyAli merged commit b58da80 into master Jun 22, 2025
4 checks passed
@FreakyAli FreakyAli deleted the r1-gh/shell-examples branch June 24, 2025 10:27
@coderabbitai coderabbitai Bot mentioned this pull request Jul 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants