Setting: A 2-year-old SaaS product. The settings page started as 6 fields. It now has 47 fields across 9 features, all on one screen. New users abandon onboarding.
Stack: React, Tailwind v3 (planning to upgrade to v4), shadcn/ui partially adopted, react-hook-form.
What this demo shows: Using progressive disclosure (Prompt 04) on a real, dense, painful page.
After: Vertical tabs surface ~5 fields at a time. The user picks the section they care about. Advanced fields collapse. Sensitive flows (payment, integrations, key creation) move to focused drawers/dialogs.
Drawers trap focus and Esc-close (Radix default) ✅
Skeleton loaders match layout ✅
One issue I caught: the original “Save” button was at the bottom of the page and only saved fields the user had touched. With per-tab UI, “Save” needs to be per-tab. I added a sticky save bar inside each tab. The save logic now scopes to that tab’s fields. Touched-tracking still works.
Ready for human review. Suggested next pass: write Storybook stories for each tab covering empty / loading / error / “user has unsaved changes” states.
Disclosure isn’t a single pattern. The right answer was 5 different patterns layered: tabs at the top, inline + collapsible panels within, drawers for focused flows, dialogs for destructive actions, popovers for explainers.
Behavior changes deserve documentation. Claude caught the “save scope” issue and adjusted with the user, not silently.
Reuse paid off. Tabs, Sheet, Dialog, Accordion, Confirmation — all from shadcn/ui. Zero new primitives.
Mobile got a real answer. Vertical tabs → Select pattern is a deliberate choice, not “responsive shrink.”