# Types: PersonalizationState to ReviewsBy (/themes/sdk/reference/product/types-7)

```ts
import { … } from '@poltura/theme-sdk/product';
```

## `PersonalizationState` [#personalizationstate]

The personalisation texts of the product page's item and what the shopper has typed.

<TypeTable type={{"fields":{"description":"The fields to fill in, in the merchant's order.","type":"readonly PersonalizationField[]","required":true},"values":{"description":"What the shopper typed, by field key.","type":"Readonly<Record<string, string>>","required":true},"setValue":{"description":"Sets the text of a field.","type":"(key: string, value: string) => void","required":true},"issues":{"description":"What is wrong with a field, by field key; shown once the shopper tries to add the item.","type":"Readonly<Record<string, PersonalizationIssue>>","required":true}}} />

## `ProductBadgesProps` [#productbadgesprops]

Props of [`ProductBadges`](/themes/sdk/reference/product/parts-2#productbadges).

<TypeTable type={{"badges":{"description":"The badges to draw, in order; the product's `badges`.","type":"readonly ProductBadge[]","required":true},"max":{"description":"The most badges to draw; 3 on a card and all of them on the product page by default.","type":"number","required":false},"placement":{"description":"`card` stacks small labels over a card's image corner; `page` lays them in a row above the title.","type":"'card' | 'page'","required":false},"className":{"description":"Classes added to the list.","type":"string","required":false}}} />

## `ProductDetailsProps` [#productdetailsprops]

Props of [`ProductDetails`](/themes/sdk/reference/product/defaults-4#productdetails).

<TypeTable type={{"className":{"description":"Classes added to the panel.","type":"string","required":false}}} />

## `ProductHeaderProps` [#productheaderprops]

Props of [`ProductHeader`](/themes/sdk/reference/product/defaults-5#productheader).

<TypeTable type={{"showReviewsSummary":{"description":"Shows the star rating and review count; on by default.","type":"boolean","required":false},"vendorLabel":{"description":"The text before the maker's name, such as \"Brand\".","type":"string","required":false},"skuLabel":{"description":"The text before the stock keeping unit, such as \"SKU\".","type":"string","required":false},"className":{"description":"Classes added to the header.","type":"string","required":false}}} />

## `ProductHighlightsProps` [#producthighlightsprops]

Props of [`ProductHighlights`](/themes/sdk/reference/product/defaults-6#producthighlights).

<TypeTable type={{"className":{"description":"Classes added to the list.","type":"string","required":false}}} />

## `ProductKeySpecsProps` [#productkeyspecsprops]

Props of [`ProductKeySpecs`](/themes/sdk/reference/product/parts-2#productkeyspecs).

<TypeTable type={{"className":{"description":"Classes added to the rows.","type":"string","required":false}}} />

## `ProductSharePanelProps` [#productsharepanelprops]

Props of [`ProductSharePanel`](/themes/sdk/reference/product/parts-3#productsharepanel).

<TypeTable type={{"open":{"description":"Whether the dialog is open.","type":"boolean","required":true},"onOpenChange":{"description":"Called when the dialog opens or closes.","type":"(open: boolean) => void","required":true},"title":{"description":"The product's title, used as the message subject.","type":"string","required":true},"url":{"description":"The address to share.","type":"string","required":true},"description":{"description":"The text shared with the link; a short invitation by default.","type":"string","required":false},"className":{"description":"Classes added to the dialog.","type":"string","required":false}}} />

## `ProductSpecsProps` [#productspecsprops]

Props of [`ProductSpecs`](/themes/sdk/reference/product/parts-3#productspecs).

<TypeTable type={{"groups":{"description":"The specification groups to draw; the ungrouped rows come first.","type":"readonly SpecGroup[]","required":true},"layout":{"description":"A bordered table or a plain list of names and values; a table when omitted.","type":"'table' | 'list'","required":false},"className":{"description":"Classes added to the table.","type":"string","required":false}}} />

## `ProductTabContentProps` [#producttabcontentprops]

Props of [`ProductTabContent`](/themes/sdk/reference/product/parts-3#producttabcontent).

<TypeTable type={{"tab":{"description":"The tab whose content to draw.","type":"ProductTab","required":true},"specsLayout":{"description":"How the specifications tab draws its rows; a table when omitted.","type":"'table' | 'list'","required":false},"className":{"description":"Classes added to the content.","type":"string","required":false}}} />

## `ProductTableLinkProps` [#producttablelinkprops]

Props of [`ProductTableLink`](/themes/sdk/reference/product/parts-3#producttablelink).

<TypeTable type={{"table":{"description":"The table the link opens.","type":"ProductTable","required":true},"className":{"description":"Classes added to the link.","type":"string","required":false}}} />

## `ProductTableLinks` [#producttablelinks]

Link tables by option: where they show in the variant picker.

<TypeTable type={{"byOption":{"description":"The tables whose first column names the values of an option, by option id; draw each on that option's title row.","type":"Readonly<Record<string, readonly ProductTable[]>>","required":true},"standalone":{"description":"The tables that belong to no option; draw them in a row after the picker.","type":"readonly ProductTable[]","required":true}}} />

## `ProductTableViewProps` [#producttableviewprops]

Props of [`ProductTableView`](/themes/sdk/reference/product/parts-3#producttableview).

<TypeTable type={{"table":{"description":"The table to draw.","type":"ProductTable","required":true},"className":{"description":"Classes added to the view.","type":"string","required":false}}} />

## `ProductTabsProps` [#producttabsprops]

Props of [`ProductTabs`](/themes/sdk/reference/product/defaults-7#producttabs).

<TypeTable type={{"display":{"description":"A tab bar, or an accordion with a heading per tab; a tab bar when omitted. A tab bar turns into the accordion on phones.","type":"ProductTabsDisplay","required":false},"specsLayout":{"description":"How the specifications tab draws its rows; a table when omitted.","type":"'table' | 'list'","required":false},"descriptionLabel":{"description":"Ignored.","type":"string","required":false,"deprecated":true},"specsLabel":{"description":"Ignored.","type":"string","required":false,"deprecated":true},"activationLabel":{"description":"Ignored.","type":"string","required":false,"deprecated":true},"warrantyLabel":{"description":"Ignored.","type":"string","required":false,"deprecated":true},"className":{"description":"Classes added to the tabs.","type":"string","required":false}}} />

## `SpecValueLabelProps` [#specvaluelabelprops]

Props of [`SpecValueLabel`](/themes/sdk/reference/product/parts-3#specvaluelabel).

<TypeTable type={{"value":{"description":"The value to draw.","type":"SpecValue","required":true},"iconOnly":{"description":"Shows only the icon, with the label as its accessible name; a value without an icon still shows its text.","type":"boolean","required":false},"className":{"description":"Classes added to the label.","type":"string","required":false}}} />

## `SpecValuesProps` [#specvaluesprops]

Props of [`SpecValues`](/themes/sdk/reference/product/parts-3#specvalues).

<TypeTable type={{"spec":{"description":"The attribute whose values to draw.","type":"Spec","required":true},"className":{"description":"Classes added to the list of values.","type":"string","required":false}}} />

## `RatingStarsProps` [#ratingstarsprops]

Props of [`RatingStars`](/themes/sdk/reference/product/parts-3#ratingstars).

<TypeTable type={{"rating":{"description":"The rating, from 0 to 5; it is rounded to whole stars.","type":"number","required":true},"size":{"description":"Star size; defaults to `sm`.","type":"'sm' | 'md'","required":false}}} />

## `RatingSummaryProps` [#ratingsummaryprops]

Props of [`RatingSummary`](/themes/sdk/reference/product/parts-3#ratingsummary).

<TypeTable type={{"stats":{"description":"The review score to draw.","type":"RatingStats","required":true},"policy":{"description":"How the store checks its reviews; when given, the summary states it under the score.","type":"ReviewPolicy","required":false}}} />

## `ReviewCardProps` [#reviewcardprops]

Props of [`ReviewCard`](/themes/sdk/reference/product/parts-3#reviewcard).

<TypeTable type={{"review":{"description":"The review to draw.","type":"Review","required":true},"productLabel":{"description":"The product's name, shown on a review in a list of several products.","type":"string","required":false},"isNew":{"description":"Fades the card in, for reviews that just loaded.","type":"boolean","required":false}}} />

## `ReviewFormProps` [#reviewformprops]

Props of [`ReviewForm`](/themes/sdk/reference/product/parts-4#reviewform).

<TypeTable type={{"target":{"description":"What the review is about.","type":"ReviewTarget","required":true},"onClose":{"description":"Called when the shopper closes the form; without it no close button is drawn.","type":"() => void","required":false},"verifiedPurchase":{"description":"Marks the review as a verified purchase in the form and its thank-you.","type":"boolean","required":false},"prefillEmail":{"description":"The shopper's email address when known; the field is then left out.","type":"string","required":false},"prefillName":{"description":"The shopper's name when known.","type":"string","required":false},"token":{"description":"The code from the review invitation email.","type":"string","required":false},"className":{"description":"Classes added to the form.","type":"string","required":false}}} />

## `ReviewInput` [#reviewinput]

What a shopper fills in to review a product.

<TypeTable type={{"productId":{"description":"The product's id.","type":"string","required":true},"productHandle":{"description":"The product's URL segment.","type":"string","required":true},"author":{"description":"The name shown with the review.","type":"string","required":true},"email":{"description":"The shopper's email address; it is never shown.","type":"string","required":true},"rating":{"description":"The star rating, from 1 to 5.","type":"number","required":true},"title":{"description":"The review's title.","type":"string","required":true},"body":{"description":"The review's text.","type":"string","required":true},"token":{"description":"The code from the review invitation email, which makes the review a verified purchase and skips the bot check.","type":"string","required":false}}} />

## `ReviewResult` [#reviewresult]

How sending a review ended.

<TypeTable type={{"ok":{"description":"The review was received.","type":"true","required":true}}} />

## `ReviewSkeletonProps` [#reviewskeletonprops]

Props of [`ReviewSkeleton`](/themes/sdk/reference/product/parts-4#reviewskeleton).

<TypeTable type={{"className":{"description":"Classes added around the placeholder cards.","type":"string","required":false}}} />

## `ReviewTarget` [#reviewtarget]

The product a review is written for; a bundle lets the shopper choose among its products.

```ts
type ReviewTarget = {
    readonly product: {
        readonly id: string;
        readonly handle: string;
    };
} | {
    readonly products: readonly {
        readonly id: string;
        readonly handle: string;
        readonly title: string;
    }[];
}
```

## `ReviewsBy` [#reviewsby]

Which product or products a review list is about.

```ts
type ReviewsBy = {
    readonly productId: string;
} | {
    readonly productIds: readonly string[];
}
```
