# 2026-07-17 — P1-4 modal migration: admin/Library.tsx (3 of 3)

Branch: `feat/p1-4-modals-library`
Worktree: `.worktrees/feat-p1-4-modals-library`

## Why

P1-4 from the readiness audit asks for every inline modal to use the
shared `<Modal>` component. Continues the sweep with
`admin/Library.tsx`.

## Changes

### `client/src/pages/admin/Library.tsx`

Migrated 3 of 3 modals to `<Modal>` + `<ModalBody>`:

- **Register / Update Book** — multi-section form (title, author,
  ISBN, publisher, year, category, shelf location, total copies,
  image URL, status)
- **Circulate Asset** (issue) — borrower dropdown, due-date,
  notes
- **Finalize Circulation** (return) — condition, return notes

Each modal's inline `bg-card rounded-[2.5rem]` shell + custom header
+ × close button are removed; `<Modal>` injects its own header /
close. Body content is wrapped in `<ModalBody>`.

## Verification

- `node scripts/lint-no-inline-modals.js` → `admin/Library.tsx` count
  dropped 3 → 0.
