# Types: ProductPageView to RatingStats (/themes/sdk/reference/product/types-2)

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

## `ProductPageView` [#productpageview]

Everything a product page shows beyond the product itself.

<TypeTable type={{"product":{"description":"The product.","type":"Product","required":true},"breadcrumbs":{"description":"The trail from the home page to the product.","type":"readonly BreadcrumbItem[]","required":true},"descriptionMarkdown":{"description":"The product description as the merchant wrote it, Markdown that may hold HTML, as `Markdown` from the content module draws it; null without one.","type":"string | null","required":true},"descriptionAiGenerated":{"description":"Whether AI wrote the description; `Markdown` from the content module marks it in the page by itself.","type":"boolean","required":true},"highlights":{"description":"The merchant's highlighted selling points.","type":"readonly string[]","required":true},"specGroups":{"description":"The specification table.","type":"readonly SpecGroup[]","required":true},"keySpecs":{"description":"The attributes the store shows by the title, such as a game's platform; empty when none apply.","type":"readonly Spec[]","required":true},"guides":{"description":"Guides that belong to the product.","type":"readonly Guide[]","required":true},"downloads":{"description":"Every file and link the guides tab lists: the product's own first, then each guide's, in order.","type":"readonly GuideAttachment[]","required":true},"files":{"description":"The files buyers download after purchase, product-wide ones first; empty when it delivers none.","type":"readonly ProductFile[]","required":true},"warranty":{"description":"The warranty, or null.","type":"ProductWarranty | null","required":true},"safety":{"description":"The safety information, or null.","type":"ProductSafety | null","required":true},"coverage":{"description":"Where the product can be used, or null when it is not region-locked.","type":"ProductCoverage | null","required":true},"tables":{"description":"The tables attached to the product, strongest first; empty when it has none.","type":"readonly ProductTable[]","required":true},"tabs":{"description":"The tabs under the product in the merchant's order, without the ones that have nothing to show for this product.","type":"readonly ProductTab[]","required":true},"reviewsSeed":{"description":"The first page of reviews, read with the page, or null.","type":"ReviewPage | null","required":true},"reviewTarget":{"description":"Whose reviews the page shows and the review form asks about: the product, or each item of its bundle.","type":"ReviewTarget","required":true}}} />

## `ProductSafety` [#productsafety]

What the EU product safety rules (2023/988, Art. 19) require a listing to show.

<TypeTable type={{"manufacturer":{"description":"The manufacturer, or null.","type":"ProductSafetyContact | null","required":true},"responsiblePerson":{"description":"The person responsible in the EU, or null.","type":"ProductSafetyContact | null","required":true},"information":{"description":"Safety warnings and instructions, or null.","type":"string | null","required":true}}} />

## `ProductSafetyContact` [#productsafetycontact]

Who answers for a product's safety.

<TypeTable type={{"name":{"description":"The company's name.","type":"string","required":true},"address":{"description":"The postal address, or null.","type":"string | null","required":true},"email":{"description":"The contact address, or null.","type":"string | null","required":true}}} />

## `ProductTab` [#producttab]

A product page tab. A built-in one, the merchant's text, or a table.

<TypeTable type={{"id":{"description":"The tab's id.","type":"string","required":true},"kind":{"description":"A built-in tab shows content the product already holds.","type":"'builtin'","required":true},"label":{"description":"The merchant's name for it in the page language, or the default name of that content.","type":"string","required":true}}} />

## `ProductTabBuiltin` [#producttabbuiltin]

A built-in tab's content: what the product already holds.

```ts
type ProductTabBuiltin = 'description' | 'specs' | 'guides' | 'warranty'
```

## `ProductTable` [#producttable]

A product table. A size chart, nutrition facts or specifications.

<TypeTable type={{"id":{"description":"The table's id.","type":"string","required":true},"name":{"description":"The table's name in the page language, such as \"Women's tops\".","type":"string","required":true},"label":{"description":"The text of its link, its tab title or its section heading; the name when the merchant wrote none.","type":"string","required":true},"placements":{"description":"Where it shows.","type":"readonly ProductTablePlacement[]","required":true},"intro":{"description":"The sentence above the table, or null.","type":"string | null","required":true},"guideText":{"description":"The measuring instructions below the table, as Markdown, or null.","type":"string | null","required":true},"guideImageUrl":{"description":"The picture beside the measuring instructions, or null.","type":"string | null","required":true},"columns":{"description":"The columns, the first one naming each row.","type":"readonly ProductTableColumn[]","required":true},"rows":{"description":"The rows, in the merchant's order.","type":"readonly ProductTableRow[]","required":true},"selectVariant":{"description":"Whether a row whose first cell names a value of a product option selects that value.","type":"boolean","required":true},"unitSwitch":{"description":"Whether the shopper may flip the table between metric and imperial units.","type":"boolean","required":true}}} />

## `ProductTableColumn` [#producttablecolumn]

One column of a product table, such as a measurement.

<TypeTable type={{"id":{"description":"The column's id; the key of its cell in each row.","type":"string","required":true},"label":{"description":"The column's heading in the page language.","type":"string","required":true},"type":{"description":"Whether its cells are text, one number or a range of numbers.","type":"ProductTableColumnType","required":true},"unit":{"description":"The unit its numbers are written in, such as `cm`, or null.","type":"string | null","required":true}}} />

## `ProductTableColumnType` [#producttablecolumntype]

How a column's cells read.

```ts
type ProductTableColumnType = 'text' | 'number' | 'range'
```

## `ProductTablePlacement` [#producttableplacement]

Where a table shows.

```ts
type ProductTablePlacement = 'link' | 'tab' | 'section'
```

## `ProductTableRow` [#producttablerow]

One row of a product table, such as a size.

<TypeTable type={{"id":{"description":"The row's id.","type":"string","required":true},"cells":{"description":"The row's cell texts, by column id; a missing cell is empty.","type":"Readonly<Record<string, string>>","required":true}}} />

## `ProductTabsDisplay` [#producttabsdisplay]

Tabs or an accordion. A tab bar, or one heading per tab.

```ts
type ProductTabsDisplay = 'tabs' | 'accordion'
```

## `ProductWarranty` [#productwarranty]

The warranty that comes with a product.

<TypeTable type={{"name":{"description":"The warranty's name in the page language.","type":"string","required":true},"kind":{"description":"Whether it covers a digital licence or a physical product.","type":"'digitalLicense' | 'standard'","required":true},"activationWindowDays":{"description":"Days the buyer has to activate the product.","type":"number","required":true},"supportWindowDays":{"description":"Days of support, or null when support has no end.","type":"number | null","required":true},"replacementWindowDays":{"description":"Days within which a faulty item is replaced.","type":"number","required":true},"replacementAfterWindowGuaranteed":{"description":"Whether replacement is guaranteed after that window too.","type":"boolean","required":true}}} />

## `RatingCount` [#ratingcount]

How many reviews gave one star rating.

<TypeTable type={{"stars":{"description":"The star rating.","type":"1 | 2 | 3 | 4 | 5","required":true},"count":{"description":"How many reviews gave it.","type":"number","required":true}}} />

## `RatingStats` [#ratingstats]

A product's review score.

<TypeTable type={{"average":{"description":"The average star rating, from 1 to 5.","type":"number","required":true},"count":{"description":"How many reviews the average is over.","type":"number","required":true},"breakdown":{"description":"How many reviews gave each star rating.","type":"readonly RatingCount[]","required":true}}} />
