Float the Consent Action and Rebuild the Documentation Grid - #90
Conversation
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: 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. Comment |
There was a problem hiding this comment.
🟡 Changes recommended
OnboardingConsentView.confirm(scrollingWith:) can currently call the continuation action() when consentDocument is nil, which risks advancing the flow unexpectedly in edge cases.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR updates the consent onboarding experience so the primary “I Consent” action remains reachable while scrolling, and refreshes the DocC/README documentation grids and screenshots to match the intended module flow.
Changes:
- Reworks
OnboardingConsentViewto use aPageView+ floating footer action that can scroll to the first incomplete element and provide haptic/a11y feedback. - Adds/updates UI-test-driven documentation screenshot flows for GroveConsent and adjusts the TestApp presentation to better match real app fullscreen flow.
- Reorders and refreshes documentation/README image grids, and removes now-unneeded per-image
.licensesidecars for DocC resources.
File summaries
| File | Description |
|---|---|
| Tests/GroveConsentTests/UITests/TestAppUITests/DocumentationScreenshots.swift | Adds the GroveConsent documentation screenshot capture flow and markers for the screenshot script. |
| Tests/GroveConsentTests/UITests/TestApp/ContentView.swift | Presents the screenshot flow fullscreen (non-macOS) to match real app presentation for documentation captures. |
| Tests/GroveConsentTests/UITests/TestApp/Consent/ScreenshotView.swift | Updates consent screenshot copy and the displayed title to “Study Consent”. |
| Sources/GroveLLMLocal/GroveLLMLocal.docc/Resources/ChatView~dark.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/GroveLLMLocal/GroveLLMLocal.docc/Resources/ChatView.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/GroveContact/GroveContact.docc/Resources/Overview~dark.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/GroveContact/GroveContact.docc/Resources/Overview.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/GroveConsent/Views/OnboardingConsentView.swift | Implements floating consent action button with scroll-to-incomplete + a11y/haptic feedback behavior. |
| Sources/GroveConsent/GroveConsent.docc/GroveConsent.md | Updates the consent documentation grid to the new screenshot set and adds an “incomplete form” example. |
| Sources/Grove/Grove.docc/Resources/Validation.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/Grove/Grove.docc/Resources/QuestionnaireOverview.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/Grove/Grove.docc/Resources/PairedDevices.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/Grove/Grove.docc/Resources/Consent1.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/Grove/Grove.docc/Resources/ChatView.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/Grove/Grove.docc/Resources/AccountSetup.png.license | Removes DocC resource sidecar license file (DocC resources covered by REUSE annotations). |
| Sources/Grove/Grove.docc/Grove.md | Rebuilds/reorders the umbrella documentation grid to match the participant’s module flow. |
| README.md | Rebuilds/reorders the README module screenshot table and updates the supporting text. |
Review details
- Files reviewed: 17/55 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
a8fc62a to
ef1ad92
Compare
ef1ad92 to
95f253a
Compare
95f253a to
a0b5d77
Compare
769dabc to
cecad51
Compare
cecad51 to
2d6f722
Compare
0877e69 to
f39bea2
Compare
f8a5cb8 to
e07bf4e
Compare
e07bf4e to
68c64ab
Compare
68c64ab to
0bd1a47
Compare
0bd1a47 to
0bb61df
Compare
7ea2492 to
37245a1
Compare
37245a1 to
56e3078
Compare
### ♻️ Current situation & Problem Onboarding, account setup, consent and the questionnaire each built their own page: their own title, their own footer, their own idea of what a missing answer looks like. Validation drew a red box inside the grey card it sat on, the questionnaire and consent tinted their cards each in their own way, and a page that had to be read to the end looked nothing like a page with a button. The documentation showed screenshots from different eras, and the walks that regenerate them ran inside the CI suites. ### ⚙️ Release Notes <table><tr><td align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveViews/GroveViews.docc/Resources/Welcome~dark.png"><img src="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveViews/GroveViews.docc/Resources/Welcome.png" width="200" alt="Page with floating actions"></picture></td><td align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveViews/GroveViews.docc/Resources/ImageHeader~dark.png"><img src="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveViews/GroveViews.docc/Resources/ImageHeader.png" width="200" alt="Header with a symbol"></picture></td><td align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveOnboarding/GroveOnboarding.docc/Resources/ScrolledTitle~dark.png"><img src="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveOnboarding/GroveOnboarding.docc/Resources/ScrolledTitle.png" width="200" alt="Title risen into the bar"></picture></td><td align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveViews/GroveViews.docc/Resources/Validation~dark.png"><img src="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveViews/GroveViews.docc/Resources/Validation.png" width="200" alt="Blocking feedback"></picture></td><td align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveLLMOpenAI/GroveLLMOpenAI.docc/Resources/APITokenStep~dark.png"><img src="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveLLMOpenAI/GroveLLMOpenAI.docc/Resources/APITokenStep.png" width="200" alt="LLM setup step"></picture></td><td align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveViews/GroveViews.docc/Resources/Tiles~dark.png"><img src="https://raw.githubusercontent.com/SchmiedmayerLab/Grove/page-scaffold/Sources/GroveViews/GroveViews.docc/Resources/Tiles.png" width="200" alt="Tiles"></picture></td></tr><tr><td align="center"><sub>Page with floating actions</sub></td><td align="center"><sub>Header with a symbol</sub></td><td align="center"><sub>Title risen into the bar</sub></td><td align="center"><sub>Blocking feedback</sub></td><td align="center"><sub>LLM setup step</sub></td><td align="center"><sub>Tiles</sub></td></tr></table> - GroveViews gets the page scaffold every full-page step uses: `PageView` with a header, scrolling content and a footer that floats over it, `PageHeader` with an optional symbol and a `spacing` option for a header under a navigation bar, and `PageActions` with `ActionButtonRole` and `actionButtonStyle(_:)`. The pieces are modifiers too: `floatingActions`, `fadesIntoBottomEdge`, `risesIntoNavigationBar` with `acceptsRisingTitle` (measured in global coordinates, so it also works on a form that recycles its rows), and `softScrollEdge` for lists under a bar. GroveOnboarding keeps `OnboardingInformationView` and `SequentialOnboardingView`; `OnboardingView` is an alias of `PageView` with the areas initialiser. The LLM setup steps move over here; account, consent and the questionnaire follow in #88, #90 and #89. - One language for something that still needs the participant: `BlockingMessage`, and `reportsBlocking` on the control with `highlightsBlockingContent` on its row or card, so the red is painted in the container's own shape. `VerifiableTextField` uses it here; the questionnaire and consent cards adopt it in #89 and #90. - `Scripts/documentation-screenshots.sh` captures through RocketSim and a `snapshot` directive installs a snapshot-test reference for views only a snapshot renders. The walks skip themselves unless the script runs them. Every catalogue except chat, LLM, account, consent and the questionnaire is regenerated here, with inline images on the public views. - Textual 0.6.4, `ProgressiveBlur` moves from the chat to GroveViews, and lists under a bar get the soft edge. - The questionnaire navigator taps a row only once it is reachable below the bar, and the consent test helper drags a picker back out from under it: with a floating footer both used to tap the bar instead. - `ListHeader` stays until #88 removes its last users, the consent view only picks up the new names, the chat keeps its own blur until #91, and three images the README still shows leave with #90. ### 📚 Documentation GroveViews' page gets a Pages and a Blocking Feedback topic, GroveOnboarding describes onboarding on top of the scaffold, and the Documentation Guide covers the script's directives. ### ✅ Testing UI suites for Views, Onboarding, Chat, LLM, Scheduler, Contact, License, AccessGuard, Devices and HealthKit on an iPhone 17 Pro with iOS 26.5, the iOS and macOS unit legs, the floor build and the documentation build. The chat, LLM, account, consent and questionnaire suites were run on the full stack. ### Code of Conduct & Contributing Guidelines By creating and submitting this pull request, you agree to follow our [Code of Conduct](https://github.com/SchmiedmayerLab/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/SchmiedmayerLab/.github/blob/main/CONTRIBUTING.md): - [x] I agree to follow the [Code of Conduct](https://github.com/SchmiedmayerLab/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/SchmiedmayerLab/.github/blob/main/CONTRIBUTING.md).
### ♻️ Current situation & Problem `testOnboardingConsent` failed on healthy runners across the stack (#87, #88, #90, #97). In every captured failure the share sheet was still on screen: the tap on its close button had landed while the sheet was sliding in or out and was swallowed, so the test either timed out waiting for the sheet to go or tapped "I Consent" behind it and then waited in vain for the rendered PDF. ### ⚙️ Release Notes - The consent UI test waits for the share sheet's close button to be hittable, taps it, and taps it again, up to three times, until the sheet is gone. No change outside the test target. ### 📚 Documentation None. ### ✅ Testing `testOnboardingConsent` ran five times in a row on an iPhone 17 Pro simulator. CI only runs the GroveConsent legs for this change. ### Code of Conduct & Contributing Guidelines By creating and submitting this pull request, you agree to follow our [Code of Conduct](https://github.com/SchmiedmayerLab/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/SchmiedmayerLab/.github/blob/main/CONTRIBUTING.md): - [x] I agree to follow the [Code of Conduct](https://github.com/SchmiedmayerLab/.github/blob/main/CODE_OF_CONDUCT.md) and [Contributing Guidelines](https://github.com/SchmiedmayerLab/.github/blob/main/CONTRIBUTING.md).
♻️ Current situation & Problem
"I Consent" ended the consent page instead of staying in reach, and the umbrella page and README mixed a bare chart snapshot into a grid of framed screenshots, in no particular order.
⚙️ Release Notes
The documentation grid on Grove's landing page:
BlockingMessagefrom Share One Page Scaffold and Blocking Feedback Across the Views #87; the eraser on the signature is tappable again on iOS 26.📚 Documentation
The consent page shows a longer document read to its end and signed, the interactive elements, and an incomplete form.
✅ Testing
The consent UI suite and unit legs on iOS, the macOS unit leg, the documentation build and the link check.
Code of Conduct & Contributing Guidelines
By creating and submitting this pull request, you agree to follow our Code of Conduct and Contributing Guidelines: