Skip to content

Float the Consent Action and Rebuild the Documentation Grid - #90

Merged
lukaskollmer merged 2 commits into
questionnaire-progressfrom
consent-and-documentation-grid
Sep 21, 2026
Merged

lukaskollmer merged 2 commits into
questionnaire-progressfrom
consent-and-documentation-grid

Conversation

@PSchmiedmayer

@PSchmiedmayer PSchmiedmayer commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

♻️ 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

Read to the end and signedInteractive elementsIncomplete form
Read to the end and signedInteractive elementsIncomplete form

The documentation grid on Grove's landing page:

OnboardingAccountConsentQuestionnaire
OnboardingAccountConsentQuestionnaire
ChatSchedulePaired devicesTool call
ChatSchedulePaired devicesTool call
  • The consent page keeps "I Consent" floating over the document and scrolls to the first incomplete element when it is tapped too early.
  • A toggle, a choice or a signature the document still needs is tinted in its card with the shared BlockingMessage from Share One Page Scaffold and Blocking Feedback Across the Views #87; the eraser on the signature is tappable again on iOS 26.
  • The umbrella grid and the README table run in the order a participant meets the modules: onboarding, account setup, consent, schedule, paired devices, questionnaire, then a conversation and a tool call. The tool call stands for Grove LLM and the choice between OpenAI, Anthropic, Gemini, Apple's Foundation Models and a model on the device. The chart stays on the HealthKit page.
  • The old umbrella images and the three README images Share One Page Scaffold and Blocking Feedback Across the Views #87 kept alive are gone.

📚 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:

Copilot AI lite review requested due to automatic review settings September 7, 2026 17:53
@coderabbitai

coderabbitai Bot commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 3dfbbbec-a28f-4174-94b1-900e9d2abc2a


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

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 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 OnboardingConsentView to use a PageView + 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 .license sidecars 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.

Comment thread Sources/GroveConsent/Views/OnboardingConsentView.swift
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch from a8fc62a to ef1ad92 Compare September 7, 2026 18:07
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch from ef1ad92 to 95f253a Compare September 7, 2026 18:55
@PSchmiedmayer PSchmiedmayer changed the title Put the Consent Page on the Scaffold and Rebuild the Documentation Grid Float the Consent Action and Rebuild the Documentation Grid Sep 7, 2026
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch from 95f253a to a0b5d77 Compare September 7, 2026 21:00
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch 2 times, most recently from 769dabc to cecad51 Compare September 8, 2026 13:58
@github-project-automation github-project-automation Bot moved this to Todo in Grove Sep 8, 2026
@PSchmiedmayer PSchmiedmayer added documentation Improvements or additions to documentation enhancement New feature or request labels Sep 8, 2026
@PSchmiedmayer PSchmiedmayer self-assigned this Sep 8, 2026
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch from cecad51 to 2d6f722 Compare September 9, 2026 02:51
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch 2 times, most recently from 0877e69 to f39bea2 Compare September 9, 2026 04:36
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch from f8a5cb8 to e07bf4e Compare September 9, 2026 04:46
@PSchmiedmayer PSchmiedmayer added this to the 0.3.0 milestone Sep 9, 2026
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch from e07bf4e to 68c64ab Compare September 10, 2026 02:39
@PSchmiedmayer
PSchmiedmayer removed this pull request from stack #92 September 11, 2026 16:15
@PSchmiedmayer
PSchmiedmayer changed the base branch from questionnaire-on-the-page-scaffold to questionnaire-progress September 11, 2026 16:15
@PSchmiedmayer
PSchmiedmayer added this pull request to stack #98 September 11, 2026 16:15
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch from 68c64ab to 0bd1a47 Compare September 11, 2026 16:15
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch from 0bd1a47 to 0bb61df Compare September 11, 2026 19:12
@PSchmiedmayer
PSchmiedmayer force-pushed the consent-and-documentation-grid branch 5 times, most recently from 7ea2492 to 37245a1 Compare September 13, 2026 17:57
@PSchmiedmayer PSchmiedmayer moved this from Todo to In Progress in Grove Sep 13, 2026
Comment thread Sources/Grove/Grove.docc/Resources/AccountSetup.png
Comment thread Sources/GroveConsent/Model/ConsentDocument.swift
@lukaskollmer
lukaskollmer merged commit 9f99680 into main Sep 21, 2026
27 of 30 checks passed
@github-project-automation github-project-automation Bot moved this from In Progress to Done in Grove Sep 21, 2026
@lukaskollmer
lukaskollmer deleted the consent-and-documentation-grid branch September 21, 2026 14:48
lukaskollmer pushed a commit that referenced this pull request Sep 21, 2026
### ♻️ 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).
lukaskollmer pushed a commit that referenced this pull request Sep 21, 2026
### ♻️ 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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants