# Types: Availability to ProductOptionValue (/themes/sdk/reference/product/types-1)

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

## `Availability` [#availability]

Whether and how a product or variant can be bought, with its label in the page language.

<TypeTable type={{"status":{"description":"On hand.","type":"'inStock'","required":true},"purchasable":{"description":"Always purchasable.","type":"true","required":true},"label":{"description":"The status in the page language.","type":"string","required":true}}} />

## `BundleRef` [#bundleref]

The fixed bundle a product card sells as one item.

<TypeTable type={{"id":{"description":"The bundle's id.","type":"string","required":true},"title":{"description":"The bundle's title.","type":"string","required":true}}} />

## `CountryLabel` [#countrylabel]

A country with its name in the page language.

<TypeTable type={{"code":{"description":"The country code.","type":"CountryCode","required":true},"label":{"description":"The country's name in the page language.","type":"string","required":true}}} />

## `ExpectedDate` [#expecteddate]

When a pre-ordered or upcoming product is expected to ship.

<TypeTable type={{"date":{"description":"The calendar day as `YYYY-MM-DD`, or null when no date is promised.","type":"string | null","required":true},"precision":{"description":"How exact `date` is: the day, its month, its quarter, or not at all.","type":"ExpectedPrecision","required":true},"label":{"description":"The promise in the page language, such as \"Q4 2026\" or \"Date to be confirmed\".","type":"string","required":true}}} />

## `ExpectedPrecision` [#expectedprecision]

How exact a promised date is.

```ts
type ExpectedPrecision = 'day' | 'month' | 'quarter' | 'none'
```

## `GiftCardKind` [#giftcardkind]

Whether a gift card product is loaded with an amount or redeems for a set item.

```ts
type GiftCardKind = 'amount' | 'voucher'
```

## `PersonalizationField` [#personalizationfield]

A text the shopper fills in to personalise their item, such as an engraving.

<TypeTable type={{"key":{"description":"The field's key; the cart receives the shopper's text under it.","type":"string","required":true},"label":{"description":"The field's label in the page language.","type":"string","required":true},"type":{"description":"A single line or a multi-line text.","type":"'text' | 'textarea'","required":true},"required":{"description":"Whether the item cannot be added without it.","type":"boolean","required":true},"maxLength":{"description":"The longest text accepted, or null for no limit.","type":"number | null","required":true}}} />

## `Product` [#product]

A product with everything a product page shows of it.

<TypeTable type={{"id":{"description":"The product's id.","type":"string","required":true},"handle":{"description":"The product's URL segment.","type":"string","required":true},"href":{"description":"The product page's path.","type":"string","required":true},"title":{"description":"The product's title.","type":"string","required":true},"subtitle":{"description":"The subtitle, or null.","type":"string | null","required":true},"description":{"description":"The description, or null.","type":"RichTextValue | null","required":true},"vendor":{"description":"The brand or maker, or null.","type":"string | null","required":true},"type":{"description":"The product type, or null.","type":"ProductTypeRef | null","required":true},"tags":{"description":"The product's public tags.","type":"readonly string[]","required":true},"categories":{"description":"The categories the product is in.","type":"readonly CategoryRef[]","required":true},"collection":{"description":"The collection the product is in, or null.","type":"CollectionRef | null","required":true},"images":{"description":"The gallery images, in order.","type":"readonly MediaImageRef[]","required":true},"featuredImage":{"description":"The image that represents the product, or null.","type":"MediaImageRef | null","required":true},"options":{"description":"The choices that pick a variant; empty for a single-variant product.","type":"readonly ProductOption[]","required":true},"variants":{"description":"The buyable variants.","type":"readonly Variant[]","required":true},"price":{"description":"The price of the variant shown first.","type":"PriceView","required":true},"priceRange":{"description":"The lowest and highest variant prices, or null when every variant costs the same.","type":"PriceBounds | null","required":true},"availability":{"description":"The best availability of any variant.","type":"Availability","required":true},"specs":{"description":"The specification table.","type":"readonly SpecGroup[]","required":true},"rating":{"description":"The review score, or null when the product has no reviews.","type":"RatingStats | null","required":true},"badges":{"description":"The badges the product shows, in the merchant's order; empty when none apply.","type":"readonly ProductBadge[]","required":true},"isDigital":{"description":"Whether the product is delivered digitally.","type":"boolean","required":true},"giftCard":{"description":"The gift card kind, or null for a product that is not a gift card.","type":"GiftCardKind | null","required":true},"personalization":{"description":"Texts the shopper fills in to personalise the item.","type":"readonly PersonalizationField[]","required":true},"restricted":{"description":"Whether the store's plan locks the product, so it shows as unavailable.","type":"boolean","required":true}}} />

## `ProductBadge` [#productbadge]

A merchant-managed label on a product, such as "New" or "Sale", already in the page language.

<TypeTable type={{"id":{"description":"The badge's id.","type":"string","required":true},"kind":{"description":"`manual` badges are put on products by hand; the others show by a rule: on sale, recently added, or low in stock.","type":"'manual' | 'sale' | 'new' | 'lowStock'","required":true},"label":{"description":"The text, in the page language.","type":"string","required":true},"tone":{"description":"The theme colour preset the badge paints with, or null when it has a custom colour.","type":"'dark' | 'accent' | 'red' | 'green' | 'blue' | 'amber' | null","required":true},"color":{"description":"The custom background as `#rrggbb`, or null when the badge follows a tone.","type":"string | null","required":true},"textColor":{"description":"The text colour as `#rrggbb` that reads on `color`; set whenever `color` is.","type":"string | null","required":true}}} />

## `ProductCoverage` [#productcoverage]

Where a region-locked product, such as a licence key, can be used.

<TypeTable type={{"coversMarket":{"description":"Whether it works in the visitor's market country.","type":"boolean","required":true},"included":{"description":"The countries and regions it works in, named as they read on their own; empty when only exclusions apply.","type":"readonly CountryLabel[]","required":true},"excluded":{"description":"The countries it does not work in.","type":"readonly CountryLabel[]","required":true}}} />

## `ProductOption` [#productoption]

A choice the shopper makes to pick a variant, such as colour or size.

<TypeTable type={{"id":{"description":"The option's id.","type":"string","required":true},"title":{"description":"The option's name in the page language.","type":"string","required":true},"display":{"description":"How the picker presents the values.","type":"ProductOptionDisplay","required":true},"values":{"description":"The values, in the merchant's order.","type":"readonly ProductOptionValue[]","required":true}}} />

## `ProductOptionDisplay` [#productoptiondisplay]

How the picker presents an option's values.

```ts
type ProductOptionDisplay = 'buttons' | 'dropdown' | 'swatch' | 'imageTiles'
```

## `ProductOptionValue` [#productoptionvalue]

One value of a product option, such as "Red".

<TypeTable type={{"id":{"description":"The value's id.","type":"string","required":true},"label":{"description":"The value in the page language.","type":"string","required":true},"swatch":{"description":"The value's swatch, or null when it has none.","type":"Swatch | null","required":true}}} />
