Klarhimmel UI

Review, summary

Review, summary preview

Install

npx shadcn add @klarhimmel/review-summary

Usage

import { Theme } from '@/components/klarhimmel/theme/style';
import { BlockSurface } from '@/components/klarhimmel/blocks/surface';
import ReviewSummary from '@/components/klarhimmel/blocks/review-summary';

export default function Section() {
  return (
    <Theme theme="brand">
      <BlockSurface>
        <ReviewSummary props={{
          "eyebrow": "Site review",
          "siteName": "Exempel AB",
          "siteUrl": "https://exempel.example",
          "reviewedOn": "9 October 2026",
          "pagesRead": "14 pages read",
          "verdictTitle": "Our verdict",
          "verdict": "The site says clearly what you do and the services page is strong. Three things hold it back: the contact route is hard to find, the references are buried, and the mobile menu hides the booking link. We would keep the structure and fix those three.",
          "findingsTitle": "What we found",
          "severityWords": {
            "high": "Fix first",
            "medium": "Worth fixing",
            "low": "Nice to have",
            "good": "Works well"
          },
          "findings": [
            {
              "title": "The contact page is four clicks away",
              "detail": "A visitor who wants to book has to go through the services menu. A button in the header would remove three of the four clicks.",
              "severity": "high",
              "page": "Start",
              "pageHref": ""
            },
            {
              "title": "References sit at the bottom of the about page",
              "detail": "Customers are your best argument, and they are the last thing a visitor sees. They deserve a page of their own and a place on the start page.",
              "severity": "medium",
              "page": "Om oss",
              "pageHref": ""
            },
            {
              "title": "The mobile menu hides the booking link",
              "detail": "On a phone the only way to book is inside the menu, behind two taps.",
              "severity": "medium",
              "page": "Start",
              "pageHref": ""
            },
            {
              "title": "The services page is clear and honest",
              "detail": "Each service has a plain description, a price range and one next step. We would keep it as it is.",
              "severity": "good",
              "page": "Tjänster",
              "pageHref": ""
            }
          ],
          "noFindings": "No findings in this review.",
          "buildTitle": "What we would build",
          "build": "The same structure with a clearer front page, a references page and a booking button on every page. About two days of work, with a preview you can click through first.",
          "buildPoints": [
            "A start page that leads with the outcome",
            "A references page with three cases",
            "A booking button in the header on every page",
            "The services page kept as it is"
          ],
          "goAhead": {
            "label": "Go ahead",
            "href": "#go-ahead"
          },
          "question": {
            "label": "Ask a question",
            "href": "#question"
          },
          "note": "Nothing is built until you say go."
        }} />
      </BlockSurface>
    </Theme>
  );
}

Install

Import

import Block from '@/components/klarhimmel/blocks/review-summary';
Also called
  • review/summary
About
The front of a site review: which site, when, how many pages were read, the verdict in a few plain sentences, up to five findings with a severity said in words and the page each is about, what we would build, and two actions (go ahead…
Category
A site review for a customer: the verdict with findings, and a note per page with what to keep, change, add or remove.

Notes

When to use it

The front of a site review: the site, the verdict, up to five findings with a severity, what we would build, and two buttons. Use `review-page-note` after it for the page-by-page detail.

Writing for it

- The verdict holds 600 characters, so give two to four plain sentences. It is set large in an accent box and is the part most readers will actually read. - Findings are limited to five, each with a required title (100 characters), a detail (400) and a severity of high, medium, low or good. Order them with the worst first, since the list is shown in the order given. - Fill noFindings (120 characters) when the review found nothing. Without it, an empty findings list leaves the heading and the list out completely.

Watch out for

Like the page note it is strict, and invalid props give a notice rather than sample copy. The goAhead and question buttons are always drawn, so give both a real label and address.

Usage

The block in a page, with its default content (long lists shortened). Every prop is in the table below.

section.tsx
import { Theme } from '@/components/klarhimmel/theme/style';
import { BlockSurface } from '@/components/klarhimmel/blocks/surface';
import ReviewSummary from '@/components/klarhimmel/blocks/review-summary';

export default function Section() {
  return (
    <Theme theme="brand">
      <BlockSurface>
        <ReviewSummary props={{
          "eyebrow": "Site review",
          "siteName": "Exempel AB",
          "siteUrl": "https://exempel.example",
          "reviewedOn": "9 October 2026",
          "pagesRead": "14 pages read",
          "verdictTitle": "Our verdict",
          "verdict": "The site says clearly what you do and the services page is strong. Three things…",
          "findingsTitle": "What we found",
          "severityWords": {
            "high": "Fix first",
            "medium": "Worth fixing",
            "low": "Nice to have",
            "good": "Works well"
          },
          "findings": [
            {
              "title": "The contact page is four clicks away",
              "detail": "A visitor who wants to book has to go through the services menu. A button in th…",
              "severity": "high",
              "page": "Start",
              "pageHref": ""
            }
          ],
          "noFindings": "No findings in this review.",
          "buildTitle": "What we would build",
          "build": "The same structure with a clearer front page, a references page and a booking b…",
          "buildPoints": [
            "A start page that leads with the outcome"
          ],
          "goAhead": {
            "label": "Go ahead",
            "href": "#go-ahead"
          },
          "question": {
            "label": "Ask a question",
            "href": "#question"
          },
          "note": "Nothing is built until you say go."
        }} />
      </BlockSurface>
    </Theme>
  );
}

Props

The type, default and text limit of every prop. On a real page, over-limit text is kept and checkSections flags it (Installation, Check a page before you ship); this live preview shows the default until it fits. The panel above edits all props.

PropTypeDefaultDescription
eyebrowstring'Site review'Text, up to 60 characters.
siteNamestring'Exempel AB'Text, up to 80 characters.
siteUrlstring'https://exempel.example'Text, up to 200 characters.
reviewedOnstring'9 October 2026'Text, up to 40 characters.
pagesReadstring'14 pages read'Text, up to 40 characters.
verdictTitlestring'Our verdict'Text, up to 60 characters.
verdictstring'The site says clearly what you do a…'Text, up to 600 characters.
findingsTitlestring'What we found'Text, up to 60 characters.
severityWords{ high, medium, low, good }{…}Fields: high, medium, low, good.
findings{ title, detail, severity, page, pageHref }[]4 itemsList of up to 5. Each item: title, detail, severity ('high' | 'medium' | 'low' | 'good' | ''), page, pageHref.
noFindingsstring'No findings in this review.'Text, up to 120 characters.
buildTitlestring'What we would build'Text, up to 60 characters.
buildstring'The same structure with a clearer f…'Text, up to 600 characters.
buildPointsstring[]4 itemsList of up to 5.
goAheadLink{…}See the type.
questionLink{…}See the type.
notestring'Nothing is built until you say go.'Text, up to 200 characters.
headingLevel'1' | '2'-One of '1', '2'. Optional; empty is not rendered.