Skip to content

DAY-190: Make portrait layouts content-size resilient#271

Draft
FleetAdmiralJakob wants to merge 8 commits into
mainfrom
codex/day-190-content-size-resilience
Draft

DAY-190: Make portrait layouts content-size resilient#271
FleetAdmiralJakob wants to merge 8 commits into
mainfrom
codex/day-190-content-size-resilience

Conversation

@FleetAdmiralJakob

@FleetAdmiralJakob FleetAdmiralJakob commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

What changed

Makes Dayova's full portrait experience resilient across iOS and Android system text sizes and display/visualisation sizes, including portrait tablets, while preserving the existing/Figma composition at default sizes.

  • adds a shared bounded portrait-content layout contract and deterministic layout helpers
  • lets meaningful copy, inputs, cards, buttons, headers, sheets, and actions grow, wrap, stack, or scroll vertically
  • keeps intentionally horizontal components horizontal without using screen-level horizontal scrolling as a workaround
  • centers a restrained phone-style composition on portrait tablets
  • preserves the default-size paths and visible baseline, including the original auth, header, timeline, card, badge, and footer geometry, except for the explicitly approved optical correction inside the range ring
  • fixes the DAY-159/DAY-190 reproduction paths, including enlarged Home, settings, onboarding, learning-plan, schedule, picker, modal, and success states
  • fixes the combined-maximum auth landing so fully scaled copy and actions remain readable, non-overlapping, and vertically reachable while only decorative branding is capped
  • keeps default and enlarged range values optically centered inside their circular progress ring while preserving the authored 88 px default ring geometry
  • documents the content-size resilience contract for future work

Root cause: many screens combined authored fixed heights/absolute offsets with unbounded system-scaled text, and shared containers did not provide a consistent readable-width or reflow contract.

Linear: DAY-190 · DAY-159

Before / after

iPadOS — default RangeSelector optical centering

Controlled comparison: the same iPad (A16) simulator, default iPadOS text/display settings, portrait viewport, onboarding step, selected value, and 88 px ring. Only the JavaScript bundle changes—from ad52c5a to 95e9c20.

Before — ad52c5a After — 95e9c20
Before: 30 and min sit visibly low inside the default iPad range ring After: 30 and min form a compact optically centered group inside the unchanged default ring

Pixel-bound analysis reduced the visible text-group center error from 2.25 pt to 0.25 pt. The ring stays exactly 88 px; this is a deliberate correction to the previously buggy default text placement, not a general default-layout redesign.

RangeSelector and selected-chip extremes after 95e9c20

iPad AXXXL range value Android font 2.0 + density 540 range value Android combined-max selected chip
After: iPad AXXXL 30 and min remain compact and centered in the enlarged ring After: Android combined maximum 30 and min remain centered in the enlarged ring After: Android combined maximum selected Geschichte chip retains the intended pill radius

The measured iPad AXXXL text-group center error is 0.75 pt after the fix (previously 7 pt). Android was also exercised through the fact screen, scrollable strengths list, selection interaction, and selected-state rendering rather than screenshot-only launch coverage.

iOS — iPhone 16, Accessibility Medium, Home

Controlled comparison: the same authenticated simulator, account, Home data, portrait viewport, top scroll position, and fixed 09:41 status bar. Only the JavaScript bundle changes—from origin/main (a161766) to this PR at b2021ea.

Before — origin/main After — b2021ea
Before: Home at Accessibility Medium clips the notification control, collides the date and time, and overflows the calendar strip After: Home at Accessibility Medium keeps controls in bounds, separates the date and time, and grows vertically

Before, the notification control is cut by the right edge, the date and time collide, and the calendar row escapes both sides of its card. After, controls stay in bounds, the date and time separate cleanly, and the summary remains readable; larger content consumes more vertical space and continues by vertical scrolling instead of being compressed.

Android — display size 560, Settings

Before After
Before: Settings rows clip at display size 560 After: Settings rows wrap and remain usable

Complete size-matrix evidence

iOS — all 12 selectable text sizes, iPhone 13 mini portrait

iOS iPhone 13 mini full 12-step text-size matrix

Steps covered: XS, S, M, L, XL, XXL, XXXL, AXM, AXL, AXXL, AXXXL, AXXXXL.

Android — all 7 selectable font sizes, Pixel 9 portrait

Android Pixel 9 full 7-step font-size matrix

Font scales covered: 0.85, 1.0, 1.15, 1.30, 1.50, 1.80, 2.0.

Android — all 5 selectable display sizes, Pixel 9 portrait

Android Pixel 9 full 5-step display-size matrix

Display densities covered: 356, 420 (default), 460, 500, 540.

Android — 360×640dp small portrait, font scale 2.0

Android small portrait at maximum font scale

Android — portrait-tablet compatibility, default versus combined maximum sizing

Android portrait tablet default and maximum-size comparison

Android — empty validation and selection-clears-error at combined maximum sizing

Android combined maximum validation behavior

Screen recordings

Android Pixel 9 — font scale 2.0 + display density 540

Android Pixel 9 combined maximum text and display sizing, full interaction timeline

Full-timeline observations: auth landing and footer scrolling; registration; all intro screens; range question and CTA; fact-card scrolling and CTA; long choice list; empty validation. Selection-clears-error is shown separately in the comparison above.

Coverage: full 0.0–46.5s timeline sampled every 2.5s (19 frames), with the 43.0–46.4s validation interval inspected at sub-1s/1s detail; 1080×2424 H.264 source; no audio stream. The uploaded asset is a 360×808, 46.5-second animated rendering of the same complete timeline.

iOS iPad AXXXL — full 96.1-second timeline

iOS iPad AXXXL full timeline recording

iOS iPad AXXXL — condensed highlight

iOS iPad AXXXL condensed recording

Updated full-timeline observations at 95e9c20: 0–24s auth choice; 25–48s intro 1; 49–70s intro 2; 71–92s intro 3; 93–96.1s range question. The final state now shows 30 min compact and optically centered inside the circular progress ring, with no clipping or overflow.

Coverage of the uploaded full GIF: 96.10-second timeline; 96 full-timeline frames sampled at 1 fps across 6 contact sheets, plus 16 focused frames from 92.0–96.1s at 4 fps; no audio stream. Coverage of the uploaded condensed GIF: 8.01-second timeline; 16 full-timeline frames sampled at 2 fps, plus 12 focused frames from 5.0–8.0s at 4 fps; no audio stream. Every generated contact sheet was inspected.

Validation

  • iPhone 13 mini simulator: fresh default-size relaunch confirms the original/Figma auth composition; all 12 selectable text sizes on the auth landing; at AXXXXL, auth scrolling, registration, all intro screens, range/fact/choice states, empty validation, and selection-clears-error
  • iPhone 16 simulator: default and AXXXL across Home, plans, settings, notifications, learning-time flows, picker/sheet states
  • iPad (A16) portrait: default and AXXXL across auth, all intro slides, range/choice/goal/plan-fit onboarding states
  • Android Pixel 9 emulator: fresh default-size relaunch confirms the original auth composition; all 7 selectable font scales and all 5 selectable display densities; combined maximum font 2.0 + density 540 interaction and scroll-reachability pass
  • Android 360×640dp portrait: maximum font scale 2.0 across auth, intro navigation/scrolling, and range question
  • Android portrait-tablet compatibility: 1600×2560 at density 320/font 1.0, and combined density 400/font 2.0
  • verified default-size Home parity after the responsive branches were added
  • pnpm check
  • pnpm test — 33 files, 142 tests
  • pnpm format:check
  • git diff --check
  • pnpm check:unused — only the unchanged main baseline theme exports remain
  • Matt Pocock Standards re-review after the final default-parity and combined-maximum auth fixes: clean
  • Matt Pocock Spec re-review after the final default-parity and combined-maximum auth fixes: clean
  • CodeRabbit light review: one major Home handle hit-testing finding; fixed with an in-bounds wrapper and two ≥44×44 targets; independently re-reviewed clean
  • full CodeRabbit review: five findings verified and fixed in 1eeb6ae — tablet handle centering, tablet sheet centering, sticky-footer alignment, creation-loader scrolling, and enlarged/compact range-carousel sizing while preserving default geometry
  • CodeRabbit incremental re-review completed for 1eeb6ae: all three inline threads confirmed addressed and resolved; no new findings
  • CodeRabbit CLI 0.6.5: full agent review of the committed branch against main; 41 changed files reviewed, 0 findings (coderabbit doctor: 9 passed, 0 warnings, 0 failed)
  • CodeRabbit CLI final-delta review before 15fec9e: 12 changed files reviewed; two minor suggestions were rejected after direct comparison with main because they would alter the required default header composition
  • GitHub CodeRabbit incremental review of 15fec9e: responsive review-footer padding, stacked minimum touch height, and overclaimed OTP test wording were corrected in cdbe40c; the inline thread is resolved
  • Final Matt Pocock Spec review caught an inline-style/default-padding precedence risk and b2021ea now omits that override entirely in default mode; final Standards and Spec reviews are clean
  • GitHub CodeRabbit incremental re-reviews after cdbe40c and b2021ea: completed with no new findings; all checks green
  • follow-up range-ring regression at ad52c5a: exact iPad AXXXL after evidence plus Android default, font scale 2.0, and display density 560 passes; default 88 px geometry unchanged
  • CodeRabbit CLI 0.6.5 follow-up review of the two-file delta: 0 issues
  • Matt Pocock follow-up Standards and Spec reviews of the range-ring delta: 0 findings on both axes
  • optical-centering and selected-chip follow-up at 95e9c20: controlled iPad default before/after, iPad AXXXL, Android combined-maximum range, and Android combined-maximum selected-state evidence above
  • CodeRabbit CLI 0.6.5 final uncommitted review: 5 changed files, 0 issues
  • final Matt Pocock Standards review: 0 findings after 4 px rhythm and NativeWind cleanup
  • final Matt Pocock Spec review: no implementation mismatch or scope creep; the physical-device acceptance gate below remains open
  • final local validation: pnpm check, pnpm format:check, git diff --check, and 33 files / 142 tests all pass

Draft gate

No physical iPhone or Android device was connected. Per the agreed quality gate, this PR stays draft until both physical-device passes are completed and recorded. Gamius00's approval is already recorded. iOS Display Zoom is not exposed by the current simulator, so that remains part of the physical iPhone pass. Dedicated tablet composition, landscape, split-screen, foldables, desktop, and Windows remain in the linked follow-up Linear work rather than expanding this change.

Summary by CodeRabbit

  • New Features
    • Added a content-size resilience standard for portrait and system-scaled text layouts.
    • Introduced responsive “portrait content” sizing to improve stacking, reflow, scrolling, and bounded spacing across home, learning plans, quizzes, entry/edit flows, and settings/notifications.
    • Enhanced modal/bottom-sheet sizing and centered presentation for better readability.
    • Learning-path graphics and notched cards now resize to available space.
  • Bug Fixes
    • Reduced clipping and inaccessible truncation; stabilized empty states and timeline/card measurements.
  • Tests
    • Added automated coverage for responsive layout calculations and card/learning-path sizing.

@linear-code

linear-code Bot commented Jul 16, 2026

Copy link
Copy Markdown

DAY-190

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds centralized content-size calculations and applies viewport- and font-scale-aware padding, stacking, text wrapping, scrolling, and geometry updates across shared UI components, app screens, learning-plan flows, and authentication onboarding.

Changes

Responsive content-size layout rollout

Layer / File(s) Summary
Layout foundation and shared primitives
src/lib/content-size-layout.ts, src/components/ui/portrait-content.tsx, src/components/ui/screen.tsx, src/components/ui/*
Adds centralized layout calculations, portrait wrappers, adaptive shared components, scroll-safe sheets, measured notched-card sizing, and supporting tests.
Application screen reflow
src/app/(app)/*, src/app/entry/*, src/app/learning-plans/*, src/app/learning-times/*, src/app/notifications.tsx, src/app/notification-settings.tsx, src/app/validation/overview.tsx
Applies responsive padding, max-width constraints, stacked controls, adaptive truncation, soft-hyphenated copy, and responsive action placement.
Home and learning-plan geometry
src/app/(app)/home.tsx, src/app/learning-plans/[planId]/index.tsx
Scales learning-path and schedule geometry, measures decorative content height, and reflows cards, navigation, timeline labels, and empty states.
Authentication and onboarding flow
src/features/auth/dayova-auth-flow.tsx, src/features/auth/auth-content-size-layout.ts
Adds responsive authentication and onboarding layouts, adaptive inputs, picker sizing, stacked actions, and answer-change error clearing.
Learning-plan cards and supporting contract
src/features/learning-plans/learning-plan-ui.tsx, src/app/(app)/learning-plans.tsx, docs/contexts/design-system/CONTEXT.md
Updates cards, tabs, list viewports, quiz inputs, and the design-system content-size resilience contract.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related issues

Possibly related PRs

Suggested labels: ready-for-agent

Suggested reviewers: gamius00

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is clear, concise, and accurately summarizes the main change: making portrait layouts resilient to content size and scaling.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/day-190-content-size-resilience

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.

@FleetAdmiralJakob FleetAdmiralJakob self-assigned this Jul 16, 2026
@FleetAdmiralJakob

FleetAdmiralJakob commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator Author

Visual evidence

Home — controlled iPhone 16 Accessibility Medium comparison

Same authenticated simulator, account, Home data, portrait viewport, top scroll position, and fixed 09:41 status bar. Only the JavaScript bundle changes from origin/main (a161766) to PR head b2021ea.

Before — origin/main After — b2021ea
Before: Home clips the notification control, collides the date and time, and overflows the calendar strip After: Home keeps controls in bounds, separates the date and time, and grows vertically

Before, the notification control is cut by the right edge, the date and time collide, and the calendar row escapes both sides of its card. After, controls stay in bounds, the date and time separate cleanly, and larger content continues by vertical scrolling instead of being compressed.

Android Settings — before

clipboard

Android Settings — after

clipboard

iOS iPad AXXXL — full 96.1-second timeline

clipboard

iOS iPad AXXXL — condensed highlight

clipboard

@FleetAdmiralJakob

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/app/entry/new.tsx (1)

903-908: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Align sticky footer padding with scrollable content.

Both PortraitContent wrappers use a hardcoded px-6 (24px padding) rather than the dynamically computed horizontalPadding used by the ScrollView. This causes the action buttons to be misaligned with the form fields.

  • src/app/entry/new.tsx#L903-L908: Remove className="px-6" and add paddingHorizontal: horizontalPadding to the style object.
  • src/app/entry/new.tsx#L937-L942: Make the same change for the non-homework branch.
💡 Proposed fix
-					<PortraitContent
-						className="px-6"
-						style={{
-							paddingBottom: Math.max(insets.bottom + 10, 24),
-						}}
-					>
+					<PortraitContent
+						style={{
+							paddingHorizontal: horizontalPadding,
+							paddingBottom: Math.max(insets.bottom + 10, 24),
+						}}
+					>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/app/entry/new.tsx` around lines 903 - 908, Update both PortraitContent
wrappers in src/app/entry/new.tsx at lines 903-908 and 937-942: remove the
hardcoded className="px-6" and add paddingHorizontal: horizontalPadding to each
style object, preserving the existing paddingBottom behavior.
src/features/auth/dayova-auth-flow.tsx (1)

1964-1989: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Make the creation state scrollable for enlarged text.

This fixed View can overflow on short devices when the system font enlarges the multiline message. Use a ScrollView so the loader remains reachable instead of clipping content.

Proposed fix
-			<View
+			<ScrollView
+				bounces={false}
+				showsVerticalScrollIndicator={false}
 				style={{
-					flex: 1,
 					alignSelf: "center",
 					maxWidth: contentSizeLayout.containerMaxWidth,
+					width: "100%",
+				}}
+				contentContainerStyle={{
+					flexGrow: 1,
 					paddingTop: Math.max(topInset + 24, 36),
 					paddingBottom: Math.max(bottomInset + 22, 32),
 					paddingHorizontal: contentSizeLayout.horizontalPadding,
 					alignItems: "center",
 					justifyContent: "center",
-					width: "100%",
 				}}
 			>
 				<AnimatedFlower />
 				<Text ...>
 					Dein persönliches Lernprofil{"\n"}wird nun für dich erstellt.
 				</Text>
-			</View>
+			</ScrollView>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/features/auth/dayova-auth-flow.tsx` around lines 1964 - 1989, The
Lernprofil creation-state container around AnimatedFlower and the multiline Text
is not scrollable, so enlarged fonts can clip its content. Replace the fixed
inner View with a ScrollView while preserving its safe-area, width, alignment,
and spacing styles, ensuring the loader and message remain reachable on short
devices.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/app/`(app)/home.tsx:
- Around line 1677-1684: Update the DayNavigationHandle style in the
shouldStackInlineContent branch so its horizontal position includes the outer
centering offset used by the capped 480-point portrait tablet composition,
rather than anchoring at left: 0. Preserve the existing top positioning, scale,
and navigation callbacks.

In `@src/components/ui/select-sheet.tsx`:
- Around line 100-101: Update the BottomSheetModal style near the sheetWidth
usage so the absolutely positioned BottomSheetBody receives symmetric horizontal
insets, centering the fixed tablet width; do not rely on alignSelf alone.
Preserve the existing sheetWidth sizing and vertical behavior.

In `@src/features/auth/dayova-auth-flow.tsx`:
- Around line 2290-2297: Update the carousel sizing logic near valueBadgeSize to
derive carouselWidth from the onboarding container’s usable width after
horizontal padding, rather than directly from the full viewport width. Ensure
the resulting width is capped at 360px and that sidePadding and snapping remain
centered without clipping.

---

Outside diff comments:
In `@src/app/entry/new.tsx`:
- Around line 903-908: Update both PortraitContent wrappers in
src/app/entry/new.tsx at lines 903-908 and 937-942: remove the hardcoded
className="px-6" and add paddingHorizontal: horizontalPadding to each style
object, preserving the existing paddingBottom behavior.

In `@src/features/auth/dayova-auth-flow.tsx`:
- Around line 1964-1989: The Lernprofil creation-state container around
AnimatedFlower and the multiline Text is not scrollable, so enlarged fonts can
clip its content. Replace the fixed inner View with a ScrollView while
preserving its safe-area, width, alignment, and spacing styles, ensuring the
loader and message remain reachable on short devices.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 02694a1f-cd44-4a74-a29e-58d97ccb3109

📥 Commits

Reviewing files that changed from the base of the PR and between a161766 and 33679f5.

📒 Files selected for processing (41)
  • docs/contexts/design-system/CONTEXT.md
  • src/app/(app)/home.tsx
  • src/app/(app)/learning-plans.tsx
  • src/app/(app)/plans.tsx
  • src/app/(app)/settings.tsx
  • src/app/entry/[id].tsx
  • src/app/entry/new.tsx
  • src/app/learning-plans/[planId]/analysis.tsx
  • src/app/learning-plans/[planId]/generating.tsx
  • src/app/learning-plans/[planId]/index.tsx
  • src/app/learning-plans/[planId]/quiz/[questionIndex].tsx
  • src/app/learning-plans/[planId]/review.tsx
  • src/app/learning-plans/[planId]/sessions/[sessionId]/edit.tsx
  • src/app/learning-plans/[planId]/sessions/[sessionId]/index.tsx
  • src/app/learning-plans/new.tsx
  • src/app/learning-times/edit.tsx
  • src/app/learning-times/index.tsx
  • src/app/notification-settings.tsx
  • src/app/notifications.tsx
  • src/app/profile.tsx
  • src/app/validation/overview.tsx
  • src/components/screen-header.tsx
  • src/components/ui/bottom-modal.tsx
  • src/components/ui/button.tsx
  • src/components/ui/date-time-picker-sheet.tsx
  • src/components/ui/list-row.tsx
  • src/components/ui/notched-action-card-layout.test.ts
  • src/components/ui/notched-action-card-layout.ts
  • src/components/ui/notched-action-card.tsx
  • src/components/ui/portrait-content.tsx
  • src/components/ui/screen.tsx
  • src/components/ui/select-sheet.tsx
  • src/components/ui/success-confirmation-screen.tsx
  • src/components/ui/warning-banner.tsx
  • src/features/auth/dayova-auth-flow.tsx
  • src/features/learning-plans/learning-plan-ui.tsx
  • src/features/learning-plans/quiz-step.tsx
  • src/lib/content-size-layout.test.ts
  • src/lib/content-size-layout.ts
  • src/lib/learning-path-layout.test.ts
  • src/lib/learning-path-layout.ts

Comment thread src/app/(app)/home.tsx
Comment thread src/components/ui/select-sheet.tsx Outdated
Comment thread src/features/auth/dayova-auth-flow.tsx
@FleetAdmiralJakob

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@FleetAdmiralJakob

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/app/learning-plans/[planId]/review.tsx (1)

280-288: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Replace hardcoded padding with the computed layout padding.

The hardcoded px-10 class (40px) on the bottom action container bypasses the responsive horizontalPadding layout contract used on the ScrollView above. This will cause the footer actions to misalign with the main content horizontally on smaller devices or when accessibility font scaling adjustments are active.

Pass horizontalPadding via the style prop to ensure consistent alignment.

🐛 Proposed fix
 				<PortraitContent
 					className={cn(
-						"gap-3 px-10",
+						"gap-3",
 						shouldStackInlineContent
 							? "items-stretch"
 							: "flex-row items-center",
 					)}
 					// Safe-area padding is runtime device data.
-					style={{ paddingBottom: Math.max(insets.bottom + 24, 36) }}
+					style={{
+						paddingHorizontal: horizontalPadding,
+						paddingBottom: Math.max(insets.bottom + 24, 36),
+					}}
 				>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/app/learning-plans/`[planId]/review.tsx around lines 280 - 288, Update
the PortraitContent container’s styling to remove the hardcoded px-10 horizontal
padding and include the computed horizontalPadding in its style alongside the
existing safe-area paddingBottom. Preserve the current gap, alignment, and
conditional flex classes while reusing the horizontalPadding contract from the
surrounding ScrollView.
🧹 Nitpick comments (1)
src/app/learning-plans/[planId]/review.tsx (1)

306-309: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Ensure a minimum touch target height when stacked.

When shouldStackInlineContent is true, the primary action button correctly loses the h-14 fixed height constraint so it can expand vertically if the text wraps. However, adding min-h-14 guarantees a minimum 56px touch target size for accessibility, preventing the button from potentially shrinking below standard interaction thresholds.

♻️ Proposed refactor
 						className={cn(
 							"min-w-0",
-							shouldStackInlineContent ? "w-full" : "h-14 flex-1",
+							shouldStackInlineContent ? "w-full min-h-14" : "h-14 flex-1",
 						)}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/app/learning-plans/`[planId]/review.tsx around lines 306 - 309, Update
the className conditional for the primary action button so the stacked
shouldStackInlineContent branch includes min-h-14 while remaining vertically
expandable, preserving the existing h-14 behavior for the non-stacked branch.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/features/auth/auth-content-size-layout.test.ts`:
- Around line 24-32: Rename the test describing getOtpCellLayout to state that
the maximum-size OTP geometry exceeds the available width, rather than claiming
the row is scrollable. Keep the existing width calculation assertion, and add or
update a component test to render the OTP row and assert its horizontal
scrolling behavior.

---

Outside diff comments:
In `@src/app/learning-plans/`[planId]/review.tsx:
- Around line 280-288: Update the PortraitContent container’s styling to remove
the hardcoded px-10 horizontal padding and include the computed
horizontalPadding in its style alongside the existing safe-area paddingBottom.
Preserve the current gap, alignment, and conditional flex classes while reusing
the horizontalPadding contract from the surrounding ScrollView.

---

Nitpick comments:
In `@src/app/learning-plans/`[planId]/review.tsx:
- Around line 306-309: Update the className conditional for the primary action
button so the stacked shouldStackInlineContent branch includes min-h-14 while
remaining vertically expandable, preserving the existing h-14 behavior for the
non-stacked branch.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6fa8f8cc-0cd1-4f54-b54b-af6ff0226e4d

📥 Commits

Reviewing files that changed from the base of the PR and between 1eeb6ae and 15fec9e.

📒 Files selected for processing (12)
  • src/app/(app)/home.tsx
  • src/app/(app)/learning-plans.tsx
  • src/app/entry/new.tsx
  • src/app/learning-plans/[planId]/index.tsx
  • src/app/learning-plans/[planId]/review.tsx
  • src/app/notifications.tsx
  • src/app/validation/overview.tsx
  • src/components/screen-header.tsx
  • src/components/ui/list-row.tsx
  • src/features/auth/auth-content-size-layout.test.ts
  • src/features/auth/auth-content-size-layout.ts
  • src/features/auth/dayova-auth-flow.tsx
🚧 Files skipped from review as they are similar to previous changes (9)
  • src/components/ui/list-row.tsx
  • src/components/screen-header.tsx
  • src/app/validation/overview.tsx
  • src/app/learning-plans/[planId]/index.tsx
  • src/app/notifications.tsx
  • src/app/(app)/learning-plans.tsx
  • src/app/entry/new.tsx
  • src/app/(app)/home.tsx
  • src/features/auth/dayova-auth-flow.tsx

Comment thread src/features/auth/auth-content-size-layout.test.ts Outdated
@FleetAdmiralJakob

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@FleetAdmiralJakob

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@FleetAdmiralJakob
FleetAdmiralJakob marked this pull request as ready for review July 17, 2026 22:15
@FleetAdmiralJakob

Copy link
Copy Markdown
Collaborator Author

Follow-up: iPad AXXXL range-ring fix

The earlier iPad recording exposed one remaining defect: the min unit escaped the circular progress ring. Commit ad52c5a preserves the 88 px default ring and increases only enlarged/stacked states so the full value + unit stack clears the stroke.

After — iPad (A16), portrait, iOS AXXXL:

After: iPad AXXXL keeps 30 and min fully inside the circular progress ring

Regression checks: iPhone/iPad/Android default ring unchanged; Android font scale 2.0 and display density 560 pass; 140 tests, lint/typecheck, formatting, Matt Pocock standards/spec review, and CodeRabbit CLI all pass.

@FleetAdmiralJakob
FleetAdmiralJakob marked this pull request as draft July 18, 2026 16:56

Copy link
Copy Markdown
Collaborator Author

Follow-up complete in 95e9c20.

  • Corrected the shared RangeSelector text stack instead of adding an iPad-only offset.
  • Default iPad text-group center error: 2.25 pt → 0.25 pt; the ring remains 88 px.
  • iPad AXXXL text-group center error: 7 pt → 0.75 pt.
  • Android font 2.0 + density 540 passes the range screen and selected Geschichte state; the selected gradient now retains the semantic pill radius.
  • Cleaned the final responsive spacing to the repo’s 4 px rhythm and moved new static layout values to NativeWind where supported.

The PR description now contains a controlled default iPad before/after pair plus iPad AXXXL and Android combined-maximum evidence.

Validation:

  • 33 test files / 142 tests
  • pnpm check
  • pnpm format:check
  • git diff --check
  • CodeRabbit CLI 0.6.5 final review: 0 issues
  • Matt Pocock Standards final review: 0 findings
  • Matt Pocock Spec final review: no implementation mismatch or scope creep

The PR is back in draft because DAY-190 still requires the final physical iPhone and physical Android acceptance matrix. @Gamius00 has been re-requested for the new commit.

@FleetAdmiralJakob
FleetAdmiralJakob marked this pull request as ready for review July 19, 2026 09:17
@FleetAdmiralJakob

Copy link
Copy Markdown
Collaborator Author

@Gamius00 Please re review the latest commits

@Gamius00
Gamius00 marked this pull request as draft July 20, 2026 00:09
@Gamius00

Copy link
Copy Markdown
Member

I will try to test it tomorrow on my physical device. Can you test it on your Android please?

Copy link
Copy Markdown
Collaborator Author

Merge-order coordination for PR #316: DAY-109 is the next intended atomic change to main. Keep this PR draft and do not merge it before #316. After #316 lands, rebuild this branch on the resulting main, re-resolve the overlapping content-size changes, and rerun CI, CodeRabbit, iOS/Android native builds, and accessibility QA.

The current #271 head is preserved by remote tag checkpoint/pr-271-pre-day-109-2026-07-21.

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.

2 participants