Round 2 - interaction

Five decisions per interaction, before any pixel moves

Tap a word: word sheetIntentionKnow one word now and keep reading.ObjectA content span on the card, not a button.MappingTap inside the span's response area (at least 44 pt tall, visible mark stays tight). A sheet rises from the bottom, and the card scales to about 0.7 and lifts above it.LifecyclePress marks the span at once. Release inside opens. Drag off or scroll cancels, no sheet. Tapping another word swaps the sheet content in place. Drag the sheet down or tap the card to close.InterruptSprings retarget from where the sheet is, with the finger's velocity. No queued completions.
Understand: line sheetIntentionKnow what the whole line says, then maybe go deeper.ObjectA bottom sheet that sizes to its content. It gets taller only when Dynamic Type needs it.MappingHandle drag follows 1:1. Release projects the velocity to dismiss or settle. If the content scrolls, scroll owns the drag until offset 0, then the drag moves the sheet.LifecycleButton press scales to 0.97, opens on release. Dismiss by drag, tapping the card, or the back gesture. VoiceOver focus lands on the title and returns to Understand.AffordanceVerb-red button, a handle, and a Word by word row with a chevron.
Word by word: paneIntentionStudy how the line is built.ObjectA held paper page at 70 percent width, hinged to the right edge.MappingExisting ReadGesturePolicy: draw follows the thumb with tilt, settle uses progress and velocity. The row in the line sheet opens it with the same spring.LifecycleFrom the line sheet, the sheet lowers to a 76 pt peek while the pane enters, both starting on the same frame. Closing the pane restores the sheet to its earlier detent. The 30 percent card strip closes it.InterruptA half-open pane can be grabbed and reversed. A stray lip never steals a vertical flick.
Save wordIntentionKeep this word for later.ObjectA command with one durable result and one owner: the existing shared save path.MappingPress scales to 0.97 in 120 ms. Release inside commits: the button morphs to Saved (200 ms), the state row appears, the snackbar rises.LifecycleUndo in the snackbar for 3 seconds restores the unsaved word. If the write fails, the morph reverts and an inline line says: Could not save. Try again.CancelDrag off the button or start scrolling: no save, press feedback clears. Haptic: the one existing save haptic, at commit.
Revisit answerIntentionAnswer, and know at once.ObjectA choice row (one selected) and a Check command.MappingTap selects with the ink border and 1.015 scale. Changing choice retargets. Check is off until a choice exists.LifecycleCheck opens the feedback panel with the sheet spring. Peek marks the item as supported and says so: Peeked - this one will not grow it. Leaving with the X keeps answers already given and resumes at the same item.HapticsRight: SUCCESS once. Not quite: ERROR once, never a shake or red flash.
Streak chip and avatarIntentionCheck my progress, or open my settings.ObjectTwo 44 pt buttons with two different destinations.MappingTap pushes Progress or You. The floating chrome hides on the destination, which owns one header with a back arrow.LifecycleBack returns to the same card and scroll position. One owner for destination state, so a double tap cannot push twice.FeedbackThe count changes only when a day is kept, with one number roll. The chip never pulses to nag.
Reminder ask on Day keptIntentionGet a nudge I chose, at a time I read.ObjectA pre-permission card with two buttons, shown only if permission is undetermined.MappingRemind me tomorrow opens the system prompt. Granted: the card morphs into a confirmation (200 ms). Not now: the card collapses (280 ms).LifecycleAsked once on the first Day kept. Once more after the second kept day if declined. Never a third time from the app. Default time is when the round finished, rounded to a quarter hour.InterruptLeaving during the system prompt returns to the same card state.
Rules for every surface
  • Hit areas are at least 44 pt, and the visible control matches the region that responds.
  • One owner per durable change. Visual completion never triggers a second commit or a second navigation.
  • A press that becomes a scroll or leaves the control clears its feedback and does nothing.
  • Every spring retargets from the current presentation value. Nothing waits for an animation to finish.
  • Reduce Motion: state changes cut or cross-fade in 120 ms. Outcome haptics stay, impact ticks soften (ReducedMotionHapticsPort).
  • VoiceOver: a sheet takes focus on its title and gives it back to its trigger. State pills and word marks are announced.
  • Dynamic Type: sheets grow, chips wrap, rows grow. Nothing but a hit target has a fixed height.
  • Transform and opacity only in Read. The layout of the card never animates.