---
id: w5/m12/t005
title: Detail page — status, plan, connection-info reveal + copy
worker: worker5
status: done
estimate: 60m
depends_on: [w5/m12/t003]
---

## Objective

The `/keyvalue/$id` detail page per the t001 capture: header with name/status/plan, and the Connect panel showing the 3-part connection info — internal `redis://` string, external `rediss://` (only when public; otherwise the captured "internal only" presentation), and the CLI command — password masked until revealed, copy buttons throughout, plus the destructive delete action (and suspend/resume if the capture shows them in the KV detail UI).

## Context

- m8's database detail + connection-info reveal (`databases.$databaseId.tsx`, credentials components) is the direct template, including the mask/reveal state and `useCopyToClipboard`.
- Connection-info comes from the dedicated query (t002) — fetched on reveal, not eagerly, matching the m8 security posture.
- Delete confirms with the store name (Render's type-to-confirm pattern if captured).

## Steps

1. Route + header/status per capture; wire get/connection-info hooks.
2. Connect panel with mask/reveal/copy for all three fields; public/internal-only variants.
3. Delete (+ suspend/resume per capture) actions with confirm; list cache updates.

## Files

- `dashboard/src/routes/keyvalue.$keyValueId.tsx` (new)
- `dashboard/src/features/keyvalue/components/` (detail, connect panel)
- `dashboard/src/features/keyvalue/locales/{en,zh}.ts`

## Acceptance criteria

- [ ] Detail renders both stub stores correctly (available with credentials; creating without).
- [ ] Password never rendered before reveal; copy buttons work; external string only when public.
- [ ] Delete removes the store from the list; en+zh; lint/typecheck green.

## Out of scope

- Metrics/graphs tab (Render KV has one — file as a follow-up note if captured; not this milestone).
