storyblok API
Everything the package exports, by the path you import it from. Open an export for its signature and options.
@evolve-framework/storyblok
StoryblokModule, the built-in content blocks and defineContentBlock for your own, the Storyblok clients, and catalog page sync.
Classes
MapperRegistryRegistry of mappers keyed by Storyblok component name.
import { MapperRegistry } from "@evolve-framework/storyblok";Bloks go through three channels. mapValue is the universal one: every block mapper
is reachable there by component name, and it is how a container maps its
children without importing the blocks that produce them. mapBlock and
mapColumnEntry are typed views over the two GraphQL unions, for fields whose
type is the union (a page body, a column) and which therefore need no
assertion at the call site. Whole stories go through a fourth, mapPage,
keyed by the component of the story's content.
Registering a mapper for an already-known component overrides the previous
registration without throwing. A blok for other markets than the request's
maps to nothing in every channel but mapPage.
new MapperRegistry()| Method | Description |
|---|---|
registerBlock(component: string, mapper: BlockMapper): MapperRegistry | |
registerColumnEntry(
component: string,
mapper: ColumnEntryMapper,
): this | |
registerValue(
component: string,
mapper: ContentBlockMapper,
): this | |
registerPage(component: string, mapper: PageMapper): MapperRegistry | |
hasBlock(component: string): boolean | |
hasColumnEntry(component: string): boolean | |
hasValue(component: string): boolean | |
hasPage(component: string): boolean | |
mapBlock(
storeContext: StoreContext,
blok: StoryblokBlok,
): Block | undefined | |
mapColumnEntry(
storeContext: StoreContext,
blok: StoryblokBlok,
): ColumnEntry | undefined | |
mapValue<T>(
storeContext: StoreContext,
blok: StoryblokBlok,
): T | undefined | Map a child blok by its component name. |
mapPage(
story: ISbStoryData<ISbComponentType<string> & { [index: string]: any; }>,
storeContext: StoreContext,
): MappedPage | Map a story by its content's component name; an unknown one throws. |
StoreContextThe store, locale and currency a request is for, from its X-StoreContext-* headers.
import { StoreContext } from "@evolve-framework/storyblok";new StoreContext(storeContext: StoreContextInput)| Option | Type | Description |
|---|---|---|
currency | string | The currency used in the store context. |
locale | string | The locale of the store context. For example: en-US. |
storeKey | string | The store key associated with the store context. |
country? | InputMaybe<string> | The market the store context is for; leave out for every market. |
StoryblokModuleModule wiring Storyblok resolvers, typedefs and webhook into a Domain Service.
import { StoryblokModule } from "@evolve-framework/storyblok";Pass either a pre-built clients bundle (from createStoryblokClients)
or a config object; the module will build its own clients from config
during init().
Only one StoryblokModule instance per process is supported -- clients are held as module-scope singletons.
Extends AbstractModule<StoryblokLoaderContext>
new StoryblokModule(options: StoryblokModuleOptions)| Option | Type | Description |
|---|---|---|
messagePublisher | MessagePublisher | Publisher used to emit |
webhookSecret | string | The webhook secret set on the space's webhook in Storyblok. A delivery
whose |
siteConfigs? | SiteConfig[] | Site configurations used to compute translated paths for catalog and content pages. Defaults to an empty array (no translated paths). |
origin? | string | Origin name attached to outbound |
webhookPath? | string | URL path the webhook is registered on. Defaults to "/api/webhook". |
blocks? | ContentBlockDef[] | The complete set of content blocks the module serves. Defaults to the
built-in |
mappers? | ((registry: MapperRegistry) => void) | Optional callback invoked with the pre-populated MapperRegistry. Use it to add or override mappers for custom Storyblok components. |
articlesPerProduct? | number | How many articles a product shows at most. Defaults to 4. |
siteRevalidation? | SiteRevalidationOptions | The sites whose caches a publish purges: their revalidate URLs and the
secret they share with this service. The locales purged are those of
|
clients? | StoryblokClients | Clients the module uses as they are, typically from
|
config? | StoryblokConfig | Settings the module builds its own clients from with
|
Functions
componentFromArrayThe first component of a blocks field, as T; undefined for an empty field.
import { componentFromArray } from "@evolve-framework/storyblok";function componentFromArray<T>(raw: unknown): TReturns T
convertStoryblokRichTextStoryblok's rich text document as the vendor-neutral tree.
import { convertStoryblokRichText } from "@evolve-framework/storyblok";function convertStoryblokRichText<Embed>( document: unknown, options: StoryblokRichTextOptions<Embed>,): ConvertedRichText<Embed>| Option | Type | Description |
|---|---|---|
prefix | string | Keeps this document's ref ids apart from another's on the same page. |
locale | string | The store's locale, which a linked story's path is given without. |
embed? | ((blok: unknown, id: string) => Embed | undefined) | A blok placed in the text as an embed, or undefined to leave it out. |
Returns ConvertedRichText<Embed>
createStoryblokClientsThe two clients for config.
import { createStoryblokClients } from "@evolve-framework/storyblok";function createStoryblokClients(config: StoryblokConfig): StoryblokClients| Option | Type | Description |
|---|---|---|
accessToken | string | Public delivery API access token. |
spaceId | number | Storyblok space id. |
categoryFolderId | number | Parent folder id used when upserting catalog category pages. |
managementToken? | string | OAuth management token used by event handlers. |
region? | "eu" | "us" | "ap" | "ca" | "cn" | Storyblok region (defaults to "eu"). |
defaultLanguage? | string | The language whose slug a story carries as its own, with every other
language beside it as a translated slug. Defaults to MoreIt has to be the space's default language: a story's |
Returns StoryblokClients
defineContentBlockDefines a content block.
import { defineContentBlock } from "@evolve-framework/storyblok";mapper: (storeContext, blok: StoryblokCampaignBanner): CampaignBanner => ({ ... })
The output type is erased on the way out, because a block is meant to be
reached through the registry rather than called directly -- that is what lets
a container map its children without importing them. Dispatch through
mapBlock / mapColumnEntry / mapValue to get a typed result back.
function defineContentBlock<TBlok, TOutput>( config: { id: string; typename: string; typeDefs?: string | undefined; terraform?: string | undefined; groups?: string[] | undefined; slots?: Record<string, Slot> | undefined; mapper: (storeContext: StoreContext, blok: TBlok) => TOutput; },): ContentBlockDef & { mapper: ContentBlockMapper;}| Option | Type | Description |
|---|---|---|
id | string | |
typename | string | |
mapper | (storeContext: StoreContext, blok: TBlok) => TOutput | |
typeDefs? | string | |
terraform? | string | |
groups? | string[] | |
slots? | Record<string, Slot> |
Returns ContentBlockDef & { mapper: ContentBlockMapper; }
generateTerraformAssembles the Terraform module as a single combined HCL string (the locals block followed by every block's Terraform).
import { generateTerraform } from "@evolve-framework/storyblok";function generateTerraform(blocks: ContentBlockDef[]): stringReturns string
getFolderSlugThe folder a story sits in, as the full slug up to and including its last slash, in the default language as starts_with matches it.
import { getFolderSlug } from "@evolve-framework/storyblok";function getFolderSlug(story: ISbStoryData<unknown>): stringReturns string
getLocalizedSlugA linked story's slug in a locale such as nl-NL: its translated slug where it has one, otherwise its full slug.
import { getLocalizedSlug } from "@evolve-framework/storyblok";function getLocalizedSlug( story: { full_slug?: string | undefined; translated_slugs?: TranslatedSlug[] | null | undefined; }, locale: string,): string | undefined| Option | Type | Description |
|---|---|---|
full_slug? | string | |
translated_slugs? | TranslatedSlug[] | null |
Returns string | undefined
getMapperRegistryThe registry StoryblokModule set up; throws before one is constructed.
import { getMapperRegistry } from "@evolve-framework/storyblok";function getMapperRegistry(): MapperRegistryReturns MapperRegistry
getPagePathThe path a frontend routes a story on: no locale prefix and no category folder, with the homepage as "/".
import { getPagePath } from "@evolve-framework/storyblok";function getPagePath(story: ISbStoryData<unknown>): stringReturns string
getStoryblokClientsThe clients StoryblokModule set up; throws before one is constructed.
import { getStoryblokClients } from "@evolve-framework/storyblok";function getStoryblokClients(): StoryblokClientsReturns StoryblokClients
getTranslatedNameA story's name in a locale.
import { getTranslatedName } from "@evolve-framework/storyblok";function getTranslatedName(story: ISbStoryData<unknown>, locale: string): stringReturns string
getTranslatedPathsThe path of a story in every locale of every configured site.
import { getTranslatedPaths } from "@evolve-framework/storyblok";function getTranslatedPaths( story: ISbStoryData<unknown>,): Array<{ locale: string; path: string;}>Returns Array<{ locale: string; path: string; }>
keysOfThe commerce keys in a field that holds one key per line, such as a categories or brands field, as Storyblok has no list-of-text field.
import { keysOf } from "@evolve-framework/storyblok";function keysOf(value: string | undefined): string[]Returns string[]
linkedStoryNameA linked story's name in the requested language.
import { linkedStoryName } from "@evolve-framework/storyblok";function linkedStoryName( story: { name?: string | undefined; } | undefined,): string | undefined| Option | Type | Description |
|---|---|---|
name? | string |
Returns string | undefined
mapAssetA Storyblok asset as a ContentAsset, with the focal point at the centre of the area the editor marked, where there is one.
import { mapAsset } from "@evolve-framework/storyblok";function mapAsset(asset: StoryblokAsset): ContentAsset| Option | Type | Description |
|---|---|---|
alt | string | null | |
copyright | string | null | |
fieldtype | "asset" | |
id | number | |
filename | string | null | |
name | string | |
title | string | null | |
focus | string | null | |
meta_data | Record<string, any> | |
source | string | null | |
is_external_url | boolean | |
is_private | boolean | |
src | string | |
updated_at | string | |
width | number | null | |
height | number | null | |
aspect_ratio | number | null | |
public_id | string | null | |
content_type | string |
Returns ContentAsset
mapBlocksMaps a story's body (a list of raw bloks) onto the Block union, dispatching each blok through the mapper registry on its component name.
import { mapBlocks } from "@evolve-framework/storyblok";A blok registered only as a column entry (a FAQ) is answered as Columns
holding that one entry, so an editor can drop column content straight into a
page body and still get a Block back; rich text is a block of its own.
Bloks with no mapper at all are logged and dropped, and so is a blok whose mapper throws, so that one malformed blok
cannot fail the page or listing it is part of. storySlug only labels the
log entry. A blok whose mapper answers a list, as snippet does with the
blocks it places, is inlined.
function mapBlocks( body: StoryblokBlok[] | undefined, storeContext: StoreContext, storySlug?: string,): Block[]Returns Block[]
mapBlockSettingsThe settings every block of the content model carries: the anchor an in-page link points to, and who the block is shown to, everyone where unset.
import { mapBlockSettings } from "@evolve-framework/storyblok";function mapBlockSettings( blok: { anchor?: string | undefined; audience?: string | undefined; },): { anchor: string | undefined; audience: AudienceType;}| Option | Type | Description |
|---|---|---|
anchor? | string | |
audience? | string |
Returns { anchor: string | undefined; audience: AudienceType; }
mapCategoriesA categories field as the categories the commerce subgraph resolves by key.
import { mapCategories } from "@evolve-framework/storyblok";function mapCategories(value: string | undefined): ProductCategory[]Returns ProductCategory[]
mapMultilinkA multilink as a ResourceLink: a story as its localized path, without the locale folder.
import { mapMultilink } from "@evolve-framework/storyblok";function mapMultilink( link: StoryblokMultilink, storeContext: StoreContext,): ResourceLink| Option | Type | Description |
|---|---|---|
fieldtype | "multilink" | |
id | string | |
url | string | |
cached_url | string | |
linktype | "url" | "asset" | "story" | "email" | |
target? | "_blank" | "_self" | |
anchor? | string | |
rel? | string | |
title? | string | |
prep? | string | |
story? | { name: string; created_at: string; published_at: string; id: number; uuid: string; content: Record<string, any>; slug: string; full_slug: string; sort_by_date?… | |
email? | string |
Returns ResourceLink
mapPageA story of any page type, by the page mapper registered for its content's component; a project's own page type replaces the built-in of the same name.
import { mapPage } from "@evolve-framework/storyblok";function mapPage( story: ISbStoryData<ISbComponentType<string> & { [index: string]: any; }>, storeContext: StoreContext,): MappedPageReturns MappedPage
mapPageMetaA page's metadata from its three SEO fields, the same in every CMS; the image falls back to the page's lead image where it has one.
import { mapPageMeta } from "@evolve-framework/storyblok";function mapPageMeta( content: Pick<StoryblokContentPage, "seoTitle" | "seoDescription" | "seoImage">, fallbackImage?: string | null,): PageMeta | undefined| Option | Type | Description |
|---|---|---|
seoTitle? | string | |
seoDescription? | string | |
seoImage? | StoryblokAsset |
Returns PageMeta | undefined
removeLocaleFromPathpath without a leading locale folder, in full or language-only form, and with homepage removed.
import { removeLocaleFromPath } from "@evolve-framework/storyblok";function removeLocaleFromPath(path: string, locale: string): stringReturns string
resolvedStoryA story an options field refers to, where the request resolved it.
import { resolvedStory } from "@evolve-framework/storyblok";function resolvedStory<T>( value: string | ISbStoryData<T> | undefined,): ISbStoryData<T> | undefinedReturns ISbStoryData<T> | undefined
terraformFilesAssembles the Terraform module as a set of files: a generated block_locals.tf (whitelist locals from group membership) plus one block_<snake id>.tf per block that carries Terraform.
import { terraformFiles } from "@evolve-framework/storyblok";The generated file is named block_locals.tf rather than locals.tf so it
sits alongside a consumer's own hand-owned locals.tf (space id, component
groups, ...) -- Terraform merges the two locals blocks.
function terraformFiles(blocks: ContentBlockDef[]): TerraformFile[]Returns TerraformFile[]
toColumnsRatioA stored columns ratio option as the schema's enum; fallback when unset or unknown.
import { toColumnsRatio } from "@evolve-framework/storyblok";function toColumnsRatio( value: string | undefined, fallback: ColumnsRatioType,): ColumnsRatioTypeReturns ColumnsRatioType
toResourceLinkA link drawn as the ResourceLink the types that still carry one answer: a page by its path, a product by its SKU and a URL as external.
import { toResourceLink } from "@evolve-framework/storyblok";function toResourceLink(link: MappedLink | undefined): ResourceLink | undefined| Option | Type | Description |
|---|---|---|
label | string | The visible text. |
variant | LinkVariantType | How prominently the link is drawn. |
__typename? | "Link" | |
product? | Maybe<ProductVariant> | The product it opens, as the variant the editor picked by its sku; the variant's product links to its page. |
route? | Maybe<StorefrontRouteType> | The storefront route it opens, such as the cart. |
url? | Maybe<string> | The URL it opens, for a target outside the site. |
pageStory? | ISbStoryData<ISbComponentType<string> & { [index: string]: any; }> |
Returns ResourceLink | undefined
upsertCatalogPageCreate the catalog page for a category, and whatever folders above it are still missing.
import { upsertCatalogPage } from "@evolve-framework/storyblok";Returns what it did, so a backfill can report rather than guess. A category that already has a page is left alone: what arrives here is a category, not a page — no hero, no copy, no meta — and everything beyond that is an editor's to fill in. Moving an existing page after a category was renamed is a separate decision, since it changes a URL an editor may have shared.
function upsertCatalogPage( input: CatalogPageInput,): Promise<"created" | "unchanged">| Option | Type | Description |
|---|---|---|
categoryId | string | The engine's category id. The join key, and the natural key. |
name | Record<string, string> | Category name per language, e.g. |
path | string | Record<string, string> | The path the storefront routes, without the MorePer language where the engine translates its slugs — |
Returns Promise<"created" | "unchanged">
writeTerraformWrites the assembled Terraform module for blocks to outputDir (created if needed): a generated block_locals.tf plus one block_<component>.tf per block.
import { writeTerraform } from "@evolve-framework/storyblok";Only resource/locals blocks are emitted -- provider, backend and
required_providers config are the consumer's to own.
function writeTerraform(blocks: ContentBlockDef[], outputDir: string): string[]Returns string[]
Constants
blocksBuilt-in content blocks keyed by their Storyblok component name.
import { blocks } from "@evolve-framework/storyblok";const blocks: Record<string, ContentBlockDef>contentBlocksBuilt-in content blocks.
import { contentBlocks } from "@evolve-framework/storyblok";const contentBlocks: ContentBlockDef[]pageTypesThe built-in page types.
import { pageTypes } from "@evolve-framework/storyblok";const pageTypes: ContentBlockDef[]storyblokDataLoadersThe Storyblok loaders a module declares, built per request from it.
import { storyblokDataLoaders } from "@evolve-framework/storyblok";const storyblokDataLoaders: DataLoaderDefinition<StoryblokLoaderContext, { contentSnippetsByKey: DataLoader<string, ISbStoryData<StoryblokContentSnippet> | null, string>; articlesByCategor…Types
BlockMapperMaps a blok to a page block, or undefined to leave it out.
import { type BlockMapper } from "@evolve-framework/storyblok";export type BlockMapper = (storeContext: StoreContext, blok: StoryblokBlok) => Block | undefined;ColumnEntryMapperMaps a blok to a column entry, or undefined to leave it out.
import { type ColumnEntryMapper } from "@evolve-framework/storyblok";export type ColumnEntryMapper = (storeContext: StoreContext, blok: StoryblokBlok) => ColumnEntry | undefined;ContentBlockDefA content block bundles everything one Storyblok component needs: its output typename, SDL fragment, mapper (Storyblok blok -> GraphQL type), the Terraform that provisions it, and its composition metadata (which groups it belongs to, and which slots it exposes).
import { type ContentBlockDef } from "@evolve-framework/storyblok";A block references other blocks only by component name or group -- never by import -- so any one can be ejected while still referencing the rest. A container maps its children by dispatching them through the registry on their component name, so each block owns the mapping of its own component and nothing else.
export type ContentBlockDef = { id: string; typename: string; typeDefs?: string; terraform?: string; groups?: GroupId[]; slots?: Record<string, Slot>; mapper?: ContentBlockMapper; pageMapper?: PageMapper;};ContentBlockMapperThe registry-facing mapper: takes an untyped blok and returns whatever the block's GraphQL type is.
import { type ContentBlockMapper } from "@evolve-framework/storyblok";export type ContentBlockMapper = (storeContext: StoreContext, blok: StoryblokBlok) => unknown;ContextValueThe GraphQL context the Storyblok resolvers read.
import { type ContextValue } from "@evolve-framework/storyblok";export type ContextValue = { request: Request; storeContext: StoreContext; loaders: { contentSnippetsByKey: DataLoader<string, ISbStoryData<StoryblokContentSnippet> | null>; articlesByCategoryTrail: DataLoader<string, ISbStoryData[]>; sectionByFolder: DataLoader<string, ISbStoryData<StoryblokArticleOverviewPage> | null>; catalogPageByCategory: DataLoader<string, ISbStoryData<StoryblokCatalogPage> | undefined>; pageTypeByStory: DataLoader<string, PageType | undefined>; }; links?: ISbLinkURLObject[];};GroupIdA slot-group: a named set of blocks that can fill a slot.
import { type GroupId } from "@evolve-framework/storyblok";export type GroupId = string;MappedArticlePageAn article with the folder it sits in, which the section field resolver reads, since the section is the overview that starts that folder.
import { type MappedArticlePage } from "@evolve-framework/storyblok";export type MappedArticlePage = ArticlePage & { folder: string; relatedQuery?: { topics: string[]; excluding: string; limit: number; };};MappedLinkA Link before its page is mapped: the resolved story travels along, and the Link.page field resolver maps it, so mapping a block never maps a whole page it links to.
import { type MappedLink } from "@evolve-framework/storyblok";export type MappedLink = Omit<Link, "page"> & { pageStory?: ISbStoryData;};MappedPageEach concrete page type, so a caller can return it as one.
import { type MappedPage } from "@evolve-framework/storyblok";export type MappedPage = ArticleOverviewPage | MappedArticlePage | CatalogPage | ContentPage;MappedPromoA Promo whose link is still a MappedLink.
import { type MappedPromo } from "@evolve-framework/storyblok";export type MappedPromo = Omit<Promo, "link"> & { link?: MappedLink;};PageMapperMaps a whole story of a page type onto its GraphQL page.
import { type PageMapper } from "@evolve-framework/storyblok";export type PageMapper = (story: ISbStoryData, storeContext: StoreContext) => MappedPage;SiteConfigA site the content serves: its country and the languages it is published in.
import { type SiteConfig } from "@evolve-framework/storyblok";export type SiteConfig = { country: string; languages: string[];};SlotA named containment point a block exposes.
import { type Slot } from "@evolve-framework/storyblok";export type Slot = { accepts: SlotAccepts;};SlotAcceptsWhat a slot accepts.
import { type SlotAccepts } from "@evolve-framework/storyblok";export type SlotAccepts = GroupId | { group?: GroupId; ids?: string[];};StoryblokBlokThe shape every raw Storyblok blok shares.
import { type StoryblokBlok } from "@evolve-framework/storyblok";export type StoryblokBlok = { component: string; _uid: string; [key: string]: unknown;};StoryblokClientsThe delivery and management clients for one space, with the settings they were built from.
import { type StoryblokClients } from "@evolve-framework/storyblok";export type StoryblokClients = { client: StoryblokClient; managementClient: StoryblokClient; spaceId: number; categoryFolderId: number; accessToken: string; defaultLanguage: string;};StoryblokLoaderContextWhat these loaders read off the request context.
import { type StoryblokLoaderContext } from "@evolve-framework/storyblok";export type StoryblokLoaderContext = { request: Request;};TerraformFileA single generated Terraform file: its name and HCL contents.
import { type TerraformFile } from "@evolve-framework/storyblok";export type TerraformFile = { filename: string; content: string;};@evolve-framework/storyblok/graphql/context
The request context the module's resolvers expect.
Classes
StoreContextThe store, locale and currency a request is for, from its X-StoreContext-* headers.
import { StoreContext } from "@evolve-framework/storyblok/graphql/context";new StoreContext(storeContext: StoreContextInput)| Option | Type | Description |
|---|---|---|
currency | string | The currency used in the store context. |
locale | string | The locale of the store context. For example: en-US. |
storeKey | string | The store key associated with the store context. |
country? | InputMaybe<string> | The market the store context is for; leave out for every market. |
Functions
initContextValueThe context for a request: its store context and the data loaders.
import { initContextValue } from "@evolve-framework/storyblok/graphql/context";function initContextValue({ request }: YogaInitialContext): ContextValueReturns ContextValue
Types
ContextValueThe GraphQL context the Storyblok resolvers read.
import { type ContextValue } from "@evolve-framework/storyblok/graphql/context";export type ContextValue = { request: Request; storeContext: StoreContext; loaders: { contentSnippetsByKey: DataLoader<string, ISbStoryData<StoryblokContentSnippet> | null>; articlesByCategoryTrail: DataLoader<string, ISbStoryData[]>; sectionByFolder: DataLoader<string, ISbStoryData<StoryblokArticleOverviewPage> | null>; catalogPageByCategory: DataLoader<string, ISbStoryData<StoryblokCatalogPage> | undefined>; pageTypeByStory: DataLoader<string, PageType | undefined>; }; links?: ISbLinkURLObject[];};@evolve-framework/storyblok/graphql/types
The generated GraphQL types of the content contract.
Generated types237Generated from the schema, one per type.
ArticleList | Article cards: the articles the editor picked, or else the newest that match its filters on section, topic and category. |
ArticleListResolvers | |
ArticleOverviewPage | The overview of one section of articles, such as a blog or the buying guides. |
ArticleOverviewPageResolvers | |
ArticlePage | An article, such as a blog post, a buying guide or a news item: a page whose text owns it. |
ArticlePageResolvers | |
ArticleResult | One page of articles, newest first. |
ArticleResultResolvers | |
AudienceType | Who a block is shown to. |
Author | Who wrote an article, as the byline and the author markup name them. |
AuthorResolvers | |
Block | Rich text is also a block of its own, placed directly in a page body. |
BlockResolvers | |
Brand | A brand. |
BrandList | Brand logos that link to their brand pages, in the order the editor placed them. |
BrandListResolvers | |
BrandResolvers | |
Breadcrumb | Represents a single item in a breadcrumb trail. |
BreadcrumbResolvers | |
BreadcrumbType | Represents different types of breadcrumbs in the navigation structure. |
CampaignBanner | A campaign: an image with the text beside it, not on it, and one call to action. |
CampaignBannerResolvers | |
CatalogPage | Represents a product listing page with its surrounding content. |
CatalogPageFacetFilter | One facet of a curated collection and the values it selects. |
CatalogPageFacetFilterInput | One facet of a listing's filter and the values it selects. |
CatalogPageFacetFilterResolvers | |
CatalogPageLayoutType | How a catalog page presents its category. |
CatalogPageResolvers | |
CategoryList | Entrances to categories: the ones the editor picked, or the children of one category. |
CategoryListResolvers | |
ColumnEntry | Represents content types that can be used in columns. |
ColumnEntryResolvers | |
Columns | Two to four blocks side by side, stacked in their order on a narrow screen. |
ColumnsRatioType | How the width is shared between two columns, in the order they are placed. |
ColumnsResolvers | |
ContentAsset | Represents a content asset, such as an image or file. |
ContentAssetResolvers | |
ContentPage | Represents a content page with various sections and blocks. |
ContentPageResolvers | |
ContentSearchHit | A page or an article that matches a search. |
ContentSearchHitResolvers | |
ContentSearchResult | What the CMS answers to a search term. |
ContentSearchResultResolvers | |
ContentSnippet | Represents a snippet of content that can be used in various places. |
ContentSnippetResolvers | |
ContentTeaser | An image beside text, or text alone, with up to two links. |
ContentTeaserResolvers | |
ContentVersionType | Specifies different versions of content. |
CountryCodeScalarConfig | |
CurrencyScalarConfig | |
DateScalarConfig | |
DateTimeScalarConfig | |
DirectiveResolverFn | |
DirectiveResolvers | |
EmailAddressScalarConfig | |
Error | Shared interface for every error returned as data. |
ErrorResolvers | |
Faq | |
FaqGroup | |
FaqGroupResolvers | |
FaqItem | |
FaqItemResolvers | |
FaqResolvers | |
FederationReferenceTypes | Mapping of federation reference types |
FederationTypes | Mapping of federation types |
FieldValidationIssue | A single field-level validation failure, to attach to its input control |
FieldValidationIssueResolvers | |
Figure | One key figure: a value with what it measures. |
FigureList | Two to four key figures. |
FigureListResolvers | |
FigureResolvers | |
FocalPoint | A point in an image, in percent from its left and top edges. |
FocalPointResolvers | |
GraphQLRecursivePick | |
Hotspot | One product pinned on a shoppable image. |
HotspotResolvers | |
Image | One image, or a pair side by side. |
ImageResolvers | |
InputMaybe | |
IsTypeOfResolverFn | |
JsonScalarConfig | |
Link | A link with its own label, to one target: a page, a product, a storefront route or a URL. |
LinkKindType | What a resolved link points at: a page of the site, or a URL. |
LinkResolvers | |
LinkVariantType | How prominently a link is drawn. |
LocaleScalarConfig | |
Maybe | |
MenuItem | One menu entry: a link, or a heading for the entries below it. |
MenuItemResolvers | |
Messages | The store's fixed system copy, one entry per store, for the places no editor fills by hand. |
MessagesResolvers | |
Mutation | Defines the available mutations in the schema. |
MutationResolvers | |
MutationStoreContentPreviewArgs | Defines the available mutations in the schema. |
Navigation | A menu: the header's, the footer's, or one of the project's own. |
NavigationResolvers | |
NextResolverFn | |
Omit | |
OpenGraph | Open Graph protocol metadata for social media sharing |
OpenGraphResolvers | |
Page | A page a route can land on. |
PageMeta | Page metadata for SEO, from the page's three SEO fields. |
PageMetaResolvers | |
PageRedirect | Where a path sends a visitor: written by an editor, or by the CMS when a page's path changed, from the old path to the page. |
PageRedirectResolvers | |
PageResolvers | |
PageSortOrderType | Specifies sorting options for pages. |
PagesResult | Represents the result of a query for multiple pages. |
PagesResultResolvers | |
PageType | Defines the different types of pages available in the system. |
Pagination | Where a page sits within the full result set. |
PaginationResolvers | |
PaymentBrandType | A way to pay the store accepts, which the site draws as that brand's logo. |
Product | Product entity containing all product information, variants, and metadata. |
ProductCategory | Represents a category of products. |
ProductCategoryResolvers | |
ProductList | Products, either the variants the editor picked or those a source selects. |
ProductListResolvers | |
ProductResolvers | |
ProductSortOrderType | Available sorting options for product listings |
ProductSource | Which products a listing shows: those in a category, narrowed by facet selections, in a sort order. |
ProductSourceFilter | One facet of a product source and the values it selects. |
ProductSourceFilterResolvers | |
ProductSourceResolvers | |
ProductVariant | |
ProductVariantResolvers | |
Promo | A card that links somewhere. |
PromoList | Two to four promo cards side by side. |
PromoListResolvers | |
PromoResolvers | |
Query | Defines the available queries in the schema. |
QueryArticlesArgs | Defines the available queries in the schema. |
QueryCatalogPageArgs | Defines the available queries in the schema. |
QueryCatalogPageByFilterArgs | Defines the available queries in the schema. |
QueryContentPageArgs | Defines the available queries in the schema. |
QueryContentSearchArgs | Defines the available queries in the schema. |
QueryContentSnippetArgs | Defines the available queries in the schema. |
QueryMessagesArgs | Defines the available queries in the schema. |
QueryPageArgs | Defines the available queries in the schema. |
QueryPagesArgs | Defines the available queries in the schema. |
QueryRedirectArgs | Defines the available queries in the schema. |
QueryResolvers | |
QuerySiteArgs | Defines the available queries in the schema. |
QuerySiteSettingsArgs | Defines the available queries in the schema. |
ReferenceResolver | |
RequireFields | |
RequiresSessionDirectiveArgs | |
RequiresSessionDirectiveResolver | |
Resolver | |
ResolverFn | |
Resolvers | |
ResolversInterfaceTypes | Mapping of interface types |
ResolversParentTypes | Mapping between all available schema types and the resolvers parents |
ResolversTypes | Mapping between all available schema types and the resolvers types |
ResolversUnionTypes | Mapping of union types |
ResolverTypeWrapper | |
ResourceLink | Represents a link to a resource, either internal or external. |
ResourceLinkResolvers | |
ResourceLinkType | Specifies different types of resource links. |
RichText | Formatted text, the same whichever CMS wrote it. |
RichTextEmbed | What rich text can embed. |
RichTextEmbedResolvers | |
RichTextImageEmbed | An image placed in rich text. |
RichTextImageEmbedResolvers | |
RichTextLink | A link in rich text, resolved by the adapter. |
RichTextLinkResolvers | |
RichTextProductEmbed | A product placed in rich text, by its sku. |
RichTextProductEmbedResolvers | |
RichTextPromoEmbed | A promo placed in rich text. |
RichTextPromoEmbedResolvers | |
RichTextResolvers | |
RichTextShoppableImageEmbed | A shoppable image placed in rich text. |
RichTextShoppableImageEmbedResolvers | |
RichTextTipEmbed | A tip placed in rich text. |
RichTextTipEmbedResolvers | |
RichTextVideoEmbed | A video placed in rich text. |
RichTextVideoEmbedResolvers | |
Scalars | All built-in and custom scalars, mapped to their actual values |
SearchRedirect | Where a keyword rule sends a search instead of to a result page. |
SearchRedirectResolvers | |
ShareableDirectiveArgs | |
ShareableDirectiveResolver | |
ShoppableImage | One image with two to six products pinned on it, also listed beside or below it. |
ShoppableImageResolvers | |
Site | The store's settings, one per store: its menus, the selling points in the header bar, its social profiles, payment brands and review rating, and the templates the SEO title and description of a page fall back to. |
SiteResolvers | |
SiteSettings | Which page of the site answers each recurring purpose, such as the contact or the returns page, one entry per store. |
SiteSettingsResolvers | |
SocialLink | The store's profile on a social network; the site draws the network's icon. |
SocialLinkResolvers | |
SocialPlatformType | A social network a store keeps a profile on. |
Step | One step of a step list. |
StepList | Two to four numbered steps, such as how an account, a return or a job works. |
StepListResolvers | |
StepResolvers | |
StoreContentPreviewData | Represents data for storing content previews. |
StoreContentPreviewDataResolvers | |
StoreContentPreviewError | |
StoreContentPreviewErrorResolvers | |
StoreContentPreviewResponse | |
StoreContentPreviewResponseResolvers | |
StoreContext | |
StoreContextResolvers | |
StorefrontRouteType | A page the storefront itself serves rather than the CMS. |
SubscriptionObject | |
SubscriptionResolveFn | |
SubscriptionResolver | |
SubscriptionResolverObject | |
SubscriptionSubscribeFn | |
SubscriptionSubscriberObject | |
TableOfContents | Links to the anchors on the page. |
TableOfContentsResolvers | |
TimeScalarConfig | |
Tip | A highlighted tip, in a page body or inside rich text. |
TipResolvers | |
Topic | What an article is about, such as tennis or maintenance. |
TopicPage | A topic's page below a section of articles. |
TopicPageResolvers | |
TopicResolvers | |
TranslatedPath | Represents a translated path for a specific locale. |
TranslatedPathResolvers | |
TrustRating | The store's average review score at a review service, such as 9.2 out of 10 from 1,284 reviews, as an editor entered it. |
TrustRatingResolvers | |
TypeResolveFn | |
UrlScalarConfig | |
Usp | Represents a single Unique Selling Point (USP). |
UspIconType | The icon a selling point shows, from a fixed set the storefront maps to its own glyphs. |
UspList | The store's selling points, two to six of them. |
UspListResolvers | |
UspResolvers | |
ValidationError | The input was malformed: one or more fields need editing before the operation can succeed. |
ValidationErrorResolvers | |
Video | A YouTube video, played from the privacy-enhanced domain once the visitor consents. |
VideoResolvers | |
WithInternalFields | |
YoutubeVideo | A YouTube video embedded in rich text. |
YoutubeVideoResolvers |
@evolve-framework/storyblok/sbtypes
TypeScript types of the Storyblok components the module reads.
Types
StoryblokArticleList
import { type StoryblokArticleList } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokArticleList { title?: string; articles?: (ISbStoryData<StoryblokArticlePage> | string)[]; section?: ISbStoryData<StoryblokArticleOverviewPage> | string; category?: string; limit?: number | string; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "article_list"; _uid: string; [k: string]: unknown;}StoryblokArticleOverviewPage
import { type StoryblokArticleOverviewPage } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokArticleOverviewPage { heading: string; intro?: string; featured?: ISbStoryData<StoryblokArticlePage> | string; body?: StoryblokContentPage["body"]; seoTitle?: string; seoDescription?: string; seoImage?: StoryblokAsset; tabSeo?: unknown; markets?: string[]; component: "article_overview_page"; _uid: string; [k: string]: unknown;}StoryblokArticlePage
import { type StoryblokArticlePage } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokArticlePage { title: string; lead: string; leadImage?: StoryblokAsset; publishedAt?: string; author?: ISbStoryData<StoryblokAuthor> | string; topics?: (ISbStoryData<StoryblokTopic> | string)[]; categories?: string; body?: StoryblokContentPage["body"]; related?: (ISbStoryData<StoryblokArticlePage> | string)[]; seoTitle?: string; seoDescription?: string; seoImage?: StoryblokAsset; tabSeo?: unknown; markets?: string[]; component: "article_page"; _uid: string; [k: string]: unknown;}StoryblokAsset
import { type StoryblokAsset } from "@evolve-framework/storyblok/sbtypes";interface StoryblokAsset { alt: string | null; copyright: string | null; fieldtype: "asset"; id: number; filename: string | null; name: string; title: string | null; focus: string | null; meta_data: Record<string, any>; source: string | null; is_external_url: boolean; is_private: boolean; src: string; updated_at: string; width: number | null; height: number | null; aspect_ratio: number | null; public_id: string | null; content_type: string;}StoryblokAuthor
import { type StoryblokAuthor } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokAuthor { name?: string; role?: string; photo?: StoryblokAsset; bio?: string; tabContent?: unknown; component: "author"; _uid: string; [k: string]: unknown;}StoryblokBrandList
import { type StoryblokBrandList } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokBrandList { title?: string; brands: string; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "brand_list"; _uid: string; [k: string]: unknown;}StoryblokCampaignBanner
import { type StoryblokCampaignBanner } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokCampaignBanner { title: string; text?: string; image: StoryblokAsset; link: StoryblokLink[]; visibleUntil?: string; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "campaign_banner"; _uid: string; [k: string]: unknown;}StoryblokCatalogPage
import { type StoryblokCatalogPage } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokCatalogPage { seoTitle?: string; seoDescription?: string; seoImage?: StoryblokAsset; title: string; category?: unknown; facet_filters?: string; description: string; topContent?: (StoryblokArticleList | StoryblokBrandList | StoryblokColumns | StoryblokContentTeaser | StoryblokFaq | StoryblokFigureList | StoryblokProductList | StoryblokRichText | StoryblokShoppableImage | StoryblokStepList | StoryblokTableOfContents | StoryblokTip | StoryblokUspList)[]; bottomContent?: (StoryblokArticleList | StoryblokBrandList | StoryblokColumns | StoryblokContentTeaser | StoryblokFaq | StoryblokFigureList | StoryblokProductList | StoryblokRichText | StoryblokShoppableImage | StoryblokStepList | StoryblokTableOfContents | StoryblokTip | StoryblokUspList)[]; tabSeo?: unknown; intro?: string; promos?: StoryblokPromo[]; markets?: string[]; component: "catalog_page"; _uid: string; [k: string]: unknown;}StoryblokCategoryList
import { type StoryblokCategoryList } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokCategoryList { title?: string; categories?: string; parentCategory?: string; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "category_list"; _uid: string; [k: string]: unknown;}StoryblokColumns
import { type StoryblokColumns } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokColumns { title?: string; ratio?: "" | "equal" | "narrow_wide" | "wide_narrow"; items: (StoryblokFaq | StoryblokFigureList | StoryblokRichText | StoryblokShoppableImage)[]; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "columns"; _uid: string; [k: string]: unknown;}StoryblokContentPage
import { type StoryblokContentPage } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokContentPage { seoTitle?: string; seoDescription?: string; seoImage?: StoryblokAsset; body?: (StoryblokArticleList | StoryblokBrandList | StoryblokColumns | StoryblokContentTeaser | StoryblokFaq | StoryblokFigureList | StoryblokProductList | StoryblokRichText | StoryblokShoppableImage | StoryblokStepList | StoryblokTableOfContents | StoryblokTip | StoryblokUspList)[]; tabSeo?: unknown; categories?: string; intro?: string; leadImage?: StoryblokAsset; headingVisible?: boolean; markets?: string[]; component: "content_page"; _uid: string; [k: string]: unknown;}StoryblokContentSnippet
import { type StoryblokContentSnippet } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokContentSnippet { name: string; key: string; body: (StoryblokArticleList | StoryblokBrandList | StoryblokColumns | StoryblokContentTeaser | StoryblokFaq | StoryblokFigureList | StoryblokProductList | StoryblokRichText | StoryblokShoppableImage | StoryblokStepList | StoryblokTableOfContents | StoryblokTip | StoryblokUspList)[]; component: "content_snippet"; _uid: string; [k: string]: unknown;}StoryblokFaq
import { type StoryblokFaq } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokFaq { title?: string; items: StoryblokFaqItem[]; component: "faq"; _uid: string; [k: string]: unknown;}StoryblokFaqItem
import { type StoryblokFaqItem } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokFaqItem { question: string; answer: StoryblokRichtext; component: "faq_item"; _uid: string; [k: string]: unknown;}StoryblokFigure
import { type StoryblokFigure } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokFigure { value: string; label: string; source?: string; component: "figure"; _uid: string; [k: string]: unknown;}StoryblokFigureList
import { type StoryblokFigureList } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokFigureList { title?: string; figures: StoryblokFigure[]; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "figure_list"; _uid: string; [k: string]: unknown;}StoryblokHotspot
import { type StoryblokHotspot } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokHotspot { sku: string; x: string | number; y: string | number; component: "hotspot"; _uid: string; [k: string]: unknown;}StoryblokLink
import { type StoryblokLink } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokLink { label: string; page?: ISbStoryData | string; product?: string; route?: "" | "home" | "account" | "orders" | "cart" | "search" | "wishlist" | "returns"; url?: string; variant?: "" | "primary" | "secondary"; component: "link"; _uid: string; [k: string]: unknown;}StoryblokMenuItem
import { type StoryblokMenuItem } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokMenuItem { label: string; link: StoryblokLink[]; children?: StoryblokMenuItem[]; promo: StoryblokPromo[]; component: "menu_item"; _uid: string; [k: string]: unknown;}StoryblokMessages
import { type StoryblokMessages } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokMessages { cartEmpty?: StoryblokRichtext; searchEmpty?: StoryblokRichtext; notFound?: StoryblokRichtext; component: "messages"; _uid: string; [k: string]: unknown;}StoryblokMultiasset
import { type StoryblokMultiasset } from "@evolve-framework/storyblok/sbtypes";interface StoryblokMultiasset extends Array<StoryblokAsset> {}StoryblokMultilink
import { type StoryblokMultilink } from "@evolve-framework/storyblok/sbtypes";interface StoryblokMultilink { fieldtype: "multilink"; id: string; url: string; cached_url: string; target?: "_blank" | "_self"; anchor?: string; rel?: string; title?: string; prep?: string; linktype: "story" | "url" | "email" | "asset"; story?: { name: string; created_at: string; published_at: string; id: number; uuid: string; content: Record<string, any>; slug: string; full_slug: string; sort_by_date?: string; position?: number; tag_list?: string[]; is_startpage?: boolean; parent_id?: number | null; meta_data?: Record<string, any> | null; group_id?: string; first_published_at?: string; release_id?: number | null; lang?: string; // …StoryblokProduct
import { type StoryblokProduct } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokProduct { sku: string; component: "product"; _uid: string; [k: string]: unknown;}StoryblokProductList
import { type StoryblokProductList } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokProductList { title?: string; skus?: string; category?: string; filters?: string; sort?: "" | "popular" | "new" | "price_asc" | "price_desc"; limit?: string | number; link: StoryblokLink[]; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "product_list"; _uid: string; [k: string]: unknown;}StoryblokPromo
import { type StoryblokPromo } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokPromo { title: string; text?: string; image?: StoryblokAsset; link: StoryblokLink[]; component: "promo"; _uid: string; [k: string]: unknown;}StoryblokPromoList
import { type StoryblokPromoList } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokPromoList { title?: string; promos: StoryblokPromo[]; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "promo_list"; _uid: string; [k: string]: unknown;}StoryblokPropertyType
import { type StoryblokPropertyType } from "@evolve-framework/storyblok/sbtypes";type StoryblokPropertyType = "asset" | "multiasset" | "multilink" | "table" | "richtext";StoryblokRichtext
import { type StoryblokRichtext } from "@evolve-framework/storyblok/sbtypes";interface StoryblokRichtext { type: string; content?: StoryblokRichtext[]; marks?: StoryblokRichtext[]; attrs?: Record<string, any>; text?: string;}StoryblokRichText
import { type StoryblokRichText } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokRichText { content: StoryblokRichtext; component: "rich_text"; _uid: string; [k: string]: unknown;}StoryblokShoppableImage
import { type StoryblokShoppableImage } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokShoppableImage { title?: string; image: StoryblokAsset; hotspots: StoryblokHotspot[]; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "shoppable_image"; _uid: string; [k: string]: unknown;}StoryblokSite
import { type StoryblokSite } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokSite { headerNavigation?: string; secondaryNavigation?: string; footerNavigation?: string; usps?: StoryblokUsp[]; socials?: StoryblokSocialLink[]; paymentMethods?: string[]; trustScore?: string; trustMaxScore?: string; trustReviewCount?: string; trustUrl?: string; catalogSeoTitle?: string; catalogSeoDescription?: string; articleSeoTitle?: string; contentSeoTitle?: string; topicPathSegment: string; component: "site"; _uid: string; [k: string]: unknown;}StoryblokSnippet
import { type StoryblokSnippet } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokSnippet { snippet: ISbStoryData<StoryblokContentSnippet> | string; component: "snippet"; _uid: string; [k: string]: unknown;}StoryblokSocialLink
import { type StoryblokSocialLink } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokSocialLink { platform: string; url: string; component: "social_link"; _uid: string; [k: string]: unknown;}StoryblokStep
import { type StoryblokStep } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokStep { title: string; text?: string; link: StoryblokLink[]; component: "step"; _uid: string; [k: string]: unknown;}StoryblokStepList
import { type StoryblokStepList } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokStepList { title?: string; steps: StoryblokStep[]; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "step_list"; _uid: string; [k: string]: unknown;}StoryblokTable
import { type StoryblokTable } from "@evolve-framework/storyblok/sbtypes";interface StoryblokTable { fieldtype: "table"; thead: Array<{ _uid: string; value: string; component: "_table_head"; _editable?: string; }>; tbody: Array<{ _uid: string; component: "_table_row"; _editable?: string; body: Array<{ _uid: string; value: string; component: "_table_col"; _editable?: string; }>; }>;}StoryblokTableOfContents
import { type StoryblokTableOfContents } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokTableOfContents { title?: string; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "table_of_contents"; _uid: string; [k: string]: unknown;}StoryblokTip
import { type StoryblokTip } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokTip { label?: string; text: string; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "tip"; _uid: string; [k: string]: unknown;}StoryblokTopic
import { type StoryblokTopic } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokTopic { name?: string; description?: string; leadImage?: StoryblokAsset; tabContent?: unknown; component: "topic"; _uid: string; [k: string]: unknown;}StoryblokUsp
import { type StoryblokUsp } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokUsp { text: string; description?: string; icon?: string; link: StoryblokLink[]; component: "usp"; _uid: string; [k: string]: unknown;}StoryblokUspList
import { type StoryblokUspList } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokUspList { usps: StoryblokUsp[]; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "usp_list"; _uid: string; [k: string]: unknown;}StoryblokVideo
import { type StoryblokVideo } from "@evolve-framework/storyblok/sbtypes";export interface StoryblokVideo { youtubeId: string; title: string; anchor?: string; audience?: "" | "everyone" | "logged_in" | "logged_out"; markets?: string[]; component: "video"; _uid: string; [k: string]: unknown;}Not listed: 4 options types. They appear as the tables under the constructors and functions they type.

