Files
famapp/docs/superpowers/plans/2026-06-13-react-shadcn-fixes.md
T
ginnoir a312d4ce39
CI / checks (push) Successful in 12m55s
CI / build (push) Successful in 15m16s
fix: tighten sharing and shadcn composition
2026-06-13 05:20:01 -05:00

4.2 KiB

React and shadcn Fixes Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Fix the security-sensitive share-link authorization gap and the highest-confidence shadcn Base UI composition issues from the audit.

Architecture: Add registry-level share authorization callbacks and require them in the generic share service before token creation and shared data loading. Update current modules to provide household/user-scoped authorization and share loaders, then align selected UI call sites with shadcn Base API.

Tech Stack: Next.js 15 App Router, TypeScript, Drizzle, shadcn/ui Base UI, Tailwind v4, Node test runner via tsx --test.


Task 1: Share Authorization Helper

Files:

  • Create: tests/unit/share-authorization.test.ts

  • Create: src/modules/_core/share-authorization.ts

  • Modify: src/modules/_core/module.ts

  • Step 1: Write the failing test

Create tests for missing callbacks, denied callbacks, and allowed callbacks.

  • Step 2: Run test to verify it fails

Run: pnpm exec tsx --test tests/unit/share-authorization.test.ts Expected: failure because share-authorization.ts does not exist.

  • Step 3: Implement the helper and registry types

Add ShareContext, ensureEntityShareAuthorized, EntityTypeRegistration.canShareEntity, and scoped loadForShare context typing.

  • Step 4: Run test to verify it passes

Run: pnpm exec tsx --test tests/unit/share-authorization.test.ts Expected: all tests pass.

Task 2: Wire Authorization Into Share Service

Files:

  • Modify: src/modules/_core/share.ts

  • Modify: src/app/s/[token]/page.tsx

  • Step 1: Call ensureEntityShareAuthorized in createShareLink

Require the active user and household to be authorized before token insertion.

  • Step 2: Pass household context into public share loading

Call entityReg.loadForShare(resolved.entityId, { householdId: resolved.householdId }).

  • Step 3: Run typecheck

Run: pnpm typecheck Expected: type errors until module adapters are updated.

Task 3: Add Module Share Adapters

Files:

  • Modify: src/modules/calendar/manifest.tsx

  • Modify: src/modules/calendar/server/share-queries.ts

  • Modify: src/modules/lists/manifest.tsx

  • Modify: src/modules/lists/server/share-queries.ts

  • Modify: src/modules/notes/manifest.tsx

  • Modify: src/modules/notes/server/share-queries.ts

  • Modify: src/modules/garden/manifest.tsx

  • Modify: src/modules/garden/server/share-queries.ts

  • Step 1: Implement canShareEntity for every shareable entity

Use household scoping and existing private-calendar rules.

  • Step 2: Scope loadForShare queries by token household

Require the public token household to match the entity household.

  • Step 3: Run typecheck

Run: pnpm typecheck Expected: pass.

Task 4: Fix Base UI Select Composition

Files:

  • Modify: src/modules/calendar/components/calendar-shell.tsx

  • Modify: src/components/theme-picker.tsx

  • Step 1: Add items arrays and SelectGroup wrappers

Keep existing labels and values; do not redesign layout.

  • Step 2: Run typecheck

Run: pnpm typecheck Expected: pass.

Task 5: Targeted shadcn Menu and Icon Cleanup

Files:

  • Modify: src/components/dashboard-switcher.tsx

  • Modify: src/components/dashboard-editor.tsx

  • Modify: src/components/share-button.tsx

  • Step 1: Wrap dropdown items in DropdownMenuGroup

Preserve menu behavior.

  • Step 2: Replace icon sizing inside shadcn buttons/menu items

Use data-icon where icons sit in Button; remove explicit size-4 mr-* from dropdown item icons.

  • Step 3: Run lint

Run: pnpm lint Expected: no new errors; existing warnings may remain.

Task 6: Final Verification

Files:

  • No direct edits.

  • Step 1: Run targeted test

Run: pnpm exec tsx --test tests/unit/share-authorization.test.ts Expected: pass.

  • Step 2: Run typecheck

Run: pnpm typecheck Expected: pass.

  • Step 3: Run lint

Run: pnpm lint Expected: exit 0; warnings only if pre-existing.