# Content Profile Review (`content-profile-01`) - SignalOS page block

> Full-page read-only block that displays an auto-generated structural content profile, organised into navigable sections with rich field rendering.

- **Version:** 0.4.2
- **Kind:** block (group: semantics-details) · **Category:** pages
- **Install:** `npx shadcn@latest add @signalos/content-profile-01`
- **Registry dependencies (pulled automatically):** @signalos/tokens, @signalos/utils, @signalos/badge, @signalos/skeleton, @signalos/tooltip, @signalos/split-panel
- **npm dependencies:** lucide-react@^0.468.0
- **Files installed:** `src/components/blocks/content-profile-01/ContentProfileReview.tsx`, `src/components/blocks/content-profile-01/ContentProfileReview.types.ts`

## Access

This is a private registry: pulling source requires a `SIGNALOS_REGISTRY_TOKEN`
(GitHub fine-grained PAT with read access to the signal-widgets repo) and an
`@signalos` entry in components.json `"registries"`. Previews and this document are public.

## Usage

```tsx
// after: npx shadcn@latest add @signalos/content-profile-01
// mount the pulled page in a route, e.g. src/app/semantics-details/page.tsx
import ContentProfileReview from "@/components/blocks/content-profile-01/ContentProfileReview"

export default function Page() {
  return <ContentProfileReview />
}
```

## Props

### `ContentProfileSection`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `key` | `string` | yes | - | Unique key for the section, used as React key and identifier. |
| `title` | `string` | yes | - | Human-readable section title. |
| `data` | `Record<string, unknown>` | yes | - | Key–value map of fields to render within the section. |

### `ContentProfileReviewProps`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `sections` | `ContentProfileSection[]` | yes | - | Sections to display in the sidebar and detail panel. |
| `completedAt` | `string \| null \| undefined` | no | - | ISO timestamp of when the stage was completed. Omit to hide the date. |
| `isConfirmed` | `boolean \| undefined` | no | `false` | When true, renders the confirmed banner and locks the view read-only. |
| `isLoading` | `boolean \| undefined` | no | `false` | Shows a full-page skeleton while profile data is loading. |
| `selectedSectionIndex` | `number \| undefined` | no | `0` | Index of the currently selected section. When omitted the component manages selection internally. |
| `onSectionChange` | `((index: number) => void) \| undefined` | no | - | Called with the new index when the user selects a section. Required to make selection fully controlled. |
| `actionButtons` | `ReactNode` | no | - | Action buttons rendered in the page header (e.g. Rerun, Reset). |
| `className` | `string \| undefined` | no | - |  |
| `data-testid` | `string \| undefined` | no | - | Test identifier rendered as `data-testid` on the root element. |

## Changelog

## 0.4.2

- Fix cross-item imports to use canonical @/components paths; add missing signalos.category to manifests.

## 0.4.1

- Fix file casing: rename shipped type files to PascalCase to match import paths.

## 0.4.0

- Add `selectedSectionIndex` and `onSectionChange` props to make section selection fully controlled. Callers that omit both props retain the previous uncontrolled behaviour (selection starts at index 0 and is managed internally). Update `ContentProfileReview.preview.tsx` scenarios to own selection state and pass it via these props.

## 0.3.0

- Replace hand-rolled sidebar/detail layout with `SplitPanel`, `SplitPanelListHeader`, and `SplitPanelListItem` widgets. Add `@signalos/split-panel` to registry dependencies.
- Derive `data-testid` values for the split panel and each section nav item from the root `data-testid` prop.

## 0.2.0

- **Breaking:** extract `ContentProfileSection` and `ContentProfileReviewProps` into `ContentProfileReview.types.ts`; update any direct interface imports to use the types file.
- Fix `registry-item.json`: correct title, description, dependency list (remove unused primitives), and point the types file entry at `.types.ts` (was `.types.tsx`).
- Add `ContentProfileReview.preview.tsx` with four catalog scenarios: default, confirmed, loading, and empty.
- Add `ContentProfileReview.test.tsx` covering default render, loading skeleton, empty state, section switching, confirmed banner, and `actionButtons` slot.

## 0.1.1

- Initial block: read-only content profile display with collapsible section sidebar, rich recursive field rendering, confirmed banner, and loading skeleton.
