@propeller-commerce/propeller-v2-react-ui 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/pure.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/composables/shared/utils/cn.ts","../src/components/Breadcrumbs.tsx","../src/components/ClusterJsonLd.tsx","../src/components/ItemListJsonLd.tsx","../src/components/ProductJsonLd.tsx","../src/components/CategoryShortDescription.tsx","../src/components/GridTitle.tsx","../src/components/ItemStock.tsx","../src/components/OrderItemCard.tsx","../src/components/OrderSummary.tsx","../src/components/OrderTotals.tsx","../src/components/ProductBulkPrices.tsx","../src/components/ProductDownloads.tsx","../src/components/ProductPrice.tsx","../src/components/ProductShortDescription.tsx","../src/components/ProductVideos.tsx"],"names":["jsx","safeJsonStringify","React2","React3","jsxs","getLabel","Fragment","React4","formatPrice","localeForLanguage","getCountryName","_getCountryName","isContentHidden","formatPriceHelper","getLanguageString"],"mappings":"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","file":"pure.js","sourcesContent":["/**\n * Merge class lists so the LAST conflicting utility wins.\n *\n * Every component here builds its class attribute by appending the host's\n * override to its own defaults. Attribute order does not decide CSS — the\n * cascade does — so `class=\"text-white text-cocoa\"` rendered white, and\n * `iconClassName=\"text-cocoa\"` looked like it did nothing. It appeared to work\n * on components whose baked-in default happened to lose the cascade anyway,\n * which is worse than a consistent failure.\n *\n * `twMerge` resolves the conflict properly: same utility group → later value\n * replaces the earlier one. Unknown classes (our BEM hooks, `propeller-*`) are\n * passed through untouched.\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { Category, LocalizedString } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface BreadcrumbsProps {\n /**\n * The category path from the category, product or cluster response.\n * Obtain from `category.categoryPath` or `product.category.categoryPath`.\n */\n categoryPath: Category[];\n\n /**\n * When true (default), the last item in the path is displayed as the\n * current page (non-clickable, aria-current=\"page\").\n * When false, the last item is omitted.\n * Ignored when `currentLabel` is provided — the extra crumb becomes\n * the current page instead.\n */\n showCurrent?: boolean;\n\n /**\n * The category of the current page. When provided and not already\n * the last item in `categoryPath`, it is appended automatically so\n * the trail always ends at the current category. This makes the\n * component correct whether the API's categoryPath includes the\n * current category or only its ancestors.\n */\n currentCategory?: Category;\n\n /**\n * Optional trailing crumb appended after the category path — typically\n * the name of the current product or cluster on a detail page.\n * When provided, this crumb is marked as the current page and the\n * last category becomes a normal link.\n */\n currentLabel?: string;\n\n /**\n * Optional URL for the trailing `currentLabel` crumb. When omitted,\n * the crumb is rendered as a non-link `<span>`.\n */\n currentUrl?: string;\n\n /**\n * When true (default), a \"Home\" link is prepended to the trail.\n */\n showHome?: boolean;\n\n /**\n * URL for the Home link. Defaults to '/'.\n */\n homeUrl?: string;\n\n /**\n * Language code used to resolve localised category names and slugs.\n * Defaults to 'NL'.\n */\n language?: string;\n\n /**\n * Custom URL builder for category links.\n * Receives the Category object and its zero-based index in the path.\n * When omitted, URLs default to `/category/{categoryId}/{slug}`.\n */\n getUrl?: (category: Category, index: number) => string;\n\n /**\n * Override any UI string.\n * Available keys: home, separator\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n\n /** Configuration object passed to the component */\n configuration?: any;\n}\n/**\n * Renders a breadcrumb trail from a category path, with an optional Home link\n * and an optional trailing crumb for the current product/cluster page.\n */\nfunction Breadcrumbs(props: BreadcrumbsProps) {\n const lang = props.language || 'NL';\n // Filter the path to drop the base category, then optionally append the\n // explicit currentCategory if the API didn't already include it as the tail.\n const path = props.categoryPath || [];\n const baseId = props.configuration?.baseCategoryId;\n const filtered = baseId\n ? path.filter((cat: Category) => cat.categoryId !== baseId)\n : path;\n let items = filtered;\n if (props.currentCategory) {\n const last = filtered[filtered.length - 1];\n if (!last || last.categoryId !== props.currentCategory.categoryId) {\n items = [...filtered, props.currentCategory];\n }\n }\n const displayItems = props.showCurrent === false && items.length > 0\n ? items.slice(0, items.length - 1)\n : items;\n function getCategoryName(cat: Category): string {\n const match = cat.names?.find((n: LocalizedString) => n.language === lang);\n return match?.value || cat.names?.[0]?.value || '';\n }\n function getCategoryUrl(cat: Category, index: number): string {\n if (props.getUrl) return props.getUrl(cat, index);\n // Consumer-provided URL builder takes precedence. Fall back to the\n // configuration helper when present (legacy boilerplate pattern), then\n // to the documented default `/category/{categoryId}/{slug}` URL.\n // Reading `configuration.urls.getCategoryUrl` unconditionally crashed\n // pages that don't thread `configuration` into the Breadcrumbs island\n // (CategoryBreadcrumbsIsland / ProductBreadcrumbsIsland in the Next\n // boilerplate both pass only `categoryPath` + `labels`).\n // Invoke the configuration helper as a method (not via an extracted\n // reference) so that `this` is still bound to `configuration.urls` —\n // some boilerplates write the helper as `getCategoryUrl(...) { return\n // ...this.pattern... }` and detaching the reference crashes with\n // \"Cannot read properties of undefined (reading 'pattern')\".\n const urls = props.configuration?.urls;\n if (urls && typeof urls.getCategoryUrl === 'function') {\n return urls.getCategoryUrl(cat, props.language);\n }\n const slug = cat.slugs?.find((s: LocalizedString) => s.language === lang)?.value\n || cat.slugs?.[0]?.value\n || '';\n return `/category/${cat.categoryId}/${slug}`;\n }\n function isCurrentItem(index: number): boolean {\n if (props.showCurrent === false) return false;\n if (props.currentLabel) return false;\n return index === displayItems.length - 1;\n }\n // Show separator when Home precedes this item, or when a previous category item exists.\n const showSeparatorBefore = (index: number) =>\n props.showHome !== false || index > 0;\n return (\n <nav aria-label={getLabel(props.labels, 'breadcrumbAriaLabel', 'Breadcrumb')} className={cn(`propeller-breadcrumbs ${props.className || ''}`)}>\n <ol className=\"propeller-breadcrumbs__list flex flex-wrap items-center text-sm text-muted-foreground\">\n {props.showHome !== false ? (\n <li className=\"propeller-breadcrumbs__item flex items-center\" data-home=\"true\">\n <a\n className=\"propeller-breadcrumbs__link hover:text-foreground transition-colors\"\n href={props.homeUrl || '/'}\n >\n {getLabel(props.labels, 'home', 'Home')}\n </a>\n </li>\n ) : null}\n {displayItems.map((cat, index) => (\n <li\n className=\"propeller-breadcrumbs__item flex items-center\"\n key={cat.categoryId || index}\n data-current={isCurrentItem(index) ? 'true' : 'false'}\n >\n {showSeparatorBefore(index) ? (\n <span aria-hidden=\"true\" className=\"propeller-breadcrumbs__separator mx-2 select-none text-muted-foreground/40\">\n {getLabel(props.labels, 'separator', '/')}\n </span>\n ) : null}\n {isCurrentItem(index) ? (\n <span\n aria-current=\"page\"\n className=\"propeller-breadcrumbs__link propeller-breadcrumbs__link--current text-foreground\"\n >\n {getCategoryName(cat)}\n </span>\n ) : null}\n {!isCurrentItem(index) ? (\n <a\n className=\"propeller-breadcrumbs__link hover:text-foreground transition-colors\"\n href={getCategoryUrl(cat, index)}\n >\n {getCategoryName(cat)}\n </a>\n ) : null}\n </li>\n ))}\n {props.currentLabel ? (\n <li\n className=\"propeller-breadcrumbs__item flex items-center\"\n data-current=\"true\"\n >\n <span aria-hidden=\"true\" className=\"propeller-breadcrumbs__separator mx-2 select-none text-muted-foreground/40\">\n {getLabel(props.labels, 'separator', '/')}\n </span>\n {props.currentUrl ? (\n <a\n aria-current=\"page\"\n className=\"propeller-breadcrumbs__link propeller-breadcrumbs__link--current text-foreground\"\n href={props.currentUrl}\n >\n {props.currentLabel}\n </a>\n ) : (\n <span\n aria-current=\"page\"\n className=\"propeller-breadcrumbs__link propeller-breadcrumbs__link--current text-foreground\"\n >\n {props.currentLabel}\n </span>\n )}\n </li>\n ) : null}\n </ol>\n </nav>\n );\n}\n\nexport default Breadcrumbs;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads.\n *\n * Emits a `<script type=\"application/ld+json\">` with a schema.org Product\n * payload representing the cluster (clusters use `@type: \"Product\"` — schema.org\n * has no Cluster type; the cluster's `defaultProduct` supplies brand/SKU/price/image).\n * Returns `null` when the cluster has no usable name AND no URL.\n */\nimport * as React from 'react';\nimport type { Cluster } from '@propeller-commerce/propeller-sdk-v2';\nimport {\n buildClusterJsonLd,\n safeJsonStringify,\n type JsonLdContext,\n} from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface ClusterJsonLdProps {\n /** The cluster to describe. */\n cluster: Cluster;\n /** Per-request context: siteUrl, language, currency, portalMode, user, URL builders. */\n context: JsonLdContext;\n}\n\nfunction ClusterJsonLd(props: ClusterJsonLdProps) {\n const data = buildClusterJsonLd(props.cluster, props.context);\n if (!data) return null;\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: safeJsonStringify(data) }}\n />\n );\n}\n\nexport default React.memo(ClusterJsonLd);\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads.\n *\n * Emits a single `<script type=\"application/ld+json\">` containing a schema.org\n * `ItemList` of `Product` items, one per element in the `products` array.\n * Scope is intentionally first-page only — caller passes whatever array is\n * present in the initial SSR HTML; client-side filter/sort/page navigation\n * does NOT update the script tag (crawlers only see the SSR snapshot anyway).\n *\n * Clusters in the response are unwrapped to their `defaultProduct` for the\n * embedded Product node, but the ListItem URL points to the cluster page.\n * Returns `null` when the list is empty.\n */\nimport * as React from 'react';\nimport type { Product } from '@propeller-commerce/propeller-sdk-v2';\nimport {\n buildItemListJsonLd,\n safeJsonStringify,\n type JsonLdContext,\n} from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface ItemListJsonLdProps {\n /** First-page products (from server-side fetch). */\n products: ReadonlyArray<Product>;\n /** Per-request context: siteUrl, language, currency, portalMode, user, URL builders. */\n context: JsonLdContext;\n}\n\nfunction ItemListJsonLd(props: ItemListJsonLdProps) {\n const data = buildItemListJsonLd(props.products, props.context);\n if (!data) return null;\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: safeJsonStringify(data) }}\n />\n );\n}\n\nexport default React.memo(ItemListJsonLd);\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n *\n * Emits a single `<script type=\"application/ld+json\">` with the schema.org\n * Product payload built from the SDK `Product`. Returns `null` (no DOM) when\n * the input has no usable name AND no URL. Offers are gated by portal mode\n * (semi-closed + anonymous → no `offers` block).\n */\nimport * as React from 'react';\nimport type { Product } from '@propeller-commerce/propeller-sdk-v2';\nimport {\n buildProductJsonLd,\n safeJsonStringify,\n type JsonLdContext,\n} from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface ProductJsonLdProps {\n /** The product to describe. */\n product: Product;\n /** Per-request context: siteUrl, language, currency, portalMode, user, URL builders. */\n context: JsonLdContext;\n}\n\nfunction ProductJsonLd(props: ProductJsonLdProps) {\n const data = buildProductJsonLd(props.product, props.context);\n if (!data) return null;\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: safeJsonStringify(data) }}\n />\n );\n}\n\nexport default React.memo(ProductJsonLd);\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport type { Category, LocalizedString } from '@propeller-commerce/propeller-sdk-v2';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface CategoryShortDescriptionProps {\n // ── Required ────────────────────────────────────────────────────────────\n\n /**\n * Language code used to resolve the correct localised short description\n * from `category.shortDescriptions`.\n */\n language: string;\n\n // ── Optional ────────────────────────────────────────────────────────────\n\n /**\n * Propeller Category object.\n * The component reads `category.shortDescriptions` (an array of LocalizedString)\n * and renders the matching language entry as HTML.\n */\n category?: Category;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a category's localised HTML short description.\n */\nfunction CategoryShortDescription(props: CategoryShortDescriptionProps) {\n // Derived from props — computed once on render.\n const match = props.category?.shortDescriptions?.find(\n (d: LocalizedString) => d.language === props.language,\n );\n const html = match?.value || '';\n return (\n <>\n {!!html ? (\n <div className={cn(`propeller-category-short-description mb-6 ${props.className || ''}`)}>\n <div\n className=\"propeller-category-short-description__content text-muted-foreground\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </div>\n ) : null}\n </>\n );\n}\n\nexport default CategoryShortDescription;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface GridTitleProps {\n // ── Required ────────────────────────────────────────────────────────────\n\n /**\n * The main heading text to display.\n * Typically the category name, search term, or brand name.\n */\n title: string;\n\n /**\n * Language code for the content.\n * Defaults to 'NL'. Resolved from `<PropellerProvider>` when not passed explicitly.\n */\n language?: string;\n\n // ── Optional ────────────────────────────────────────────────────────────\n\n /**\n * Override the heading tag level.\n * Defaults to 'h1'. Use 'h2' when the grid is embedded inside\n * a page that already has an h1.\n */\n headingLevel?: string;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders the heading for a product grid page (category, search or brand\n * name), with a configurable heading level.\n */\nfunction GridTitle(props: GridTitleProps) {\n return (\n <div className={cn(`propeller-grid-title mb-8 ${(props.className as string) || ''}`)}>\n <div className=\"propeller-grid-title__row flex items-baseline gap-3 mb-3\">\n {(props.headingLevel as string) === 'h2' ? (\n <h2 className=\"propeller-grid-title__heading text-3xl sm:text-4xl font-bold tracking-tight\">{props.title}</h2>\n ) : null}\n {(props.headingLevel as string) !== 'h2' ? (\n <h1 className=\"propeller-grid-title__heading text-3xl sm:text-4xl font-bold tracking-tight\">{props.title}</h1>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport default GridTitle;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { ProductInventory } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ItemStockProps {\n /**\n * Product inventory to display stock and availability for.\n * Required — drives all stock calculations and display logic.\n */\n inventory: ProductInventory;\n\n /**\n * Shows whether the product is available or not available.\n * Defaults to true.\n */\n showAvailability?: boolean;\n\n /**\n * Shows the actual stock quantity (`inventory.totalQuantity`).\n * Defaults to true.\n */\n showStock?: boolean;\n\n /**\n * UI string overrides.\n * Available keys: inStock, outOfStock, lowStock, available, notAvailable, pieces\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders stock badges for a product: an availability indicator and/or a\n * stock-status badge (in stock / low stock / out of stock) with quantity.\n */\nfunction ItemStock(props: ItemStockProps) {\n \n function getTotalQuantity(): number {\n const qty = (props.inventory as ProductInventory)?.totalQuantity;\n return qty !== undefined && qty !== null ? qty : -1;\n }\n function isAvailable(): boolean {\n return getTotalQuantity() > 0;\n }\n function getStockStatusLabel(): string {\n const qty = getTotalQuantity();\n if (qty < 0) return '';\n if (qty === 0) return getLabel(props.labels, 'outOfStock', 'Out of stock');\n if (qty <= 5) return getLabel(props.labels, 'lowStock', 'Low stock');\n return getLabel(props.labels, 'inStock', 'In stock');\n }\n function getStockStatusClass(): string {\n const qty = getTotalQuantity();\n if (qty <= 0) return 'text-destructive bg-destructive/10 border-destructive/20';\n if (qty <= 5) return 'text-warning bg-warning/10 border-warning/20';\n return 'text-success bg-success/10 border-success/20';\n }\n function getStockStatusData(): string {\n const qty = getTotalQuantity();\n if (qty <= 0) return 'out';\n if (qty <= 5) return 'low';\n return 'in';\n }\n function getAvailabilityLabel(): string {\n return isAvailable()\n ? getLabel(props.labels, 'available', 'Available')\n : getLabel(props.labels, 'notAvailable', 'Not available');\n }\n function getAvailabilityClass(): string {\n return isAvailable()\n ? 'text-success bg-success/10 border-success/20'\n : 'text-destructive bg-destructive/10 border-destructive/20';\n }\n function getAvailabilityDotClass(): string {\n return isAvailable() ? 'bg-success' : 'bg-destructive';\n }\n function hasInventory(): boolean {\n return !!(props.inventory as ProductInventory) && getTotalQuantity() >= 0;\n }\n return (\n <>\n {hasInventory() ? (\n <>\n <div\n className={cn(`propeller-item-stock flex flex-wrap items-center gap-1.5 ${(props.className as string) || ''}`)}\n data-available={isAvailable() ? 'true' : 'false'}\n data-stock={getStockStatusData()}\n >\n {props.showAvailability !== false ? (\n <span\n className={`propeller-item-stock__availability inline-flex items-center gap-1 whitespace-nowrap rounded-full border px-2 py-0.5 text-[11px] font-medium ${getAvailabilityClass()}`}\n >\n <span\n className={`propeller-item-stock__availability-dot h-1.5 w-1.5 flex-shrink-0 rounded-full ${getAvailabilityDotClass()}`}\n />\n {getAvailabilityLabel()}\n </span>\n ) : null}\n {props.showStock !== false && !!getStockStatusLabel() ? (\n <span\n className={`propeller-item-stock__status inline-flex items-center gap-1 whitespace-nowrap rounded-full border px-2 py-0.5 text-[11px] font-medium ${getStockStatusClass()}`}\n >\n {getStockStatusLabel()}\n {getTotalQuantity() > 0 ? (\n <span className=\"propeller-item-stock__count opacity-70\">\n ({getTotalQuantity()}{' '}\n {getLabel(props.labels, 'pieces', 'pcs')})\n </span>\n ) : null}\n </span>\n ) : null}\n </div>\n </>\n ) : null}\n </>\n );\n}\n\n// Memoized: pure leaf rendered inside memoized cards; skips re-render when its\n// (inventory / labels / flags) props are shallow-equal (rbp §5.2).\nexport default React.memo(ItemStock);\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport type { Cluster, OrderItem, Product } from '@propeller-commerce/propeller-sdk-v2';\nimport { formatPrice, getLabel, getLocalizedValue, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport DefaultProductPriceImpl from './ProductPrice';\nimport DefaultItemStockImpl from './ItemStock';\n\nexport interface OrderItemCardProps {\n /** The order item to display */\n orderItem: OrderItem;\n\n /** Child order items (rendered as indented sub-rows beneath the parent) */\n childItems?: OrderItem[];\n\n /**\n * Language used to resolve localized product names and the slugs in the\n * item's PDP link. Defaults to the catalog's default language.\n *\n * This component is RSC-safe (no hooks, no context), so the host has to pass\n * it — there is nothing to read it from. Without it a non-default storefront\n * renders default-language names and, worse, default-language slugs in the\n * links.\n */\n language?: string;\n\n /**\n * URL builders from the host's configuration. Supply them and the item link\n * is generated the same way every other link on the storefront is — which is\n * what carries the locale prefix. Without it the component falls back to a\n * bare `/product/:id/:slug`, and on a prefixed storefront that link drops the\n * visitor onto the default language.\n */\n configuration?: {\n urls?: {\n getProductUrl?: (product: Product, language?: string) => string;\n getClusterUrl?: (cluster: Cluster, language?: string) => string;\n };\n };\n\n /** Should the item title be a link to the PDP */\n titleLinkable?: boolean;\n\n /** Display a small thumbnail of the order item */\n showImage?: boolean;\n\n /** Should stock info be displayed */\n showStockComponent?: boolean;\n\n /** Display the SKU of the order item beneath the item name */\n showSku?: boolean;\n\n /** Display the quantity of the order item */\n showQuantity?: boolean;\n\n /** Display the price of the order item */\n showPrice?: boolean;\n\n /** Display the discount column */\n showDiscount?: boolean;\n\n /** Should the order item notes field be displayed */\n showItemNotes?: boolean;\n\n /** Render as a child/sub-item (indented, no image) */\n isChildItem?: boolean;\n\n /** Custom price formatting function */\n formatPrice?: (price: number) => string;\n\n /** Currency symbol used by the default formatter. Default: `'€'`. */\n currency?: string;\n\n /** Translated labels keyed by the slugs used inside the component (see\n * `getLabel` calls). Missing keys fall back to the English defaults. */\n labels?: Record<string, string>;\n\n // ───── Extension API (RSC-safe variant) ─────\n // Direct-prop slot fallback (no useResolvedProps — keeps the component\n // server-component-safe). Caller passes the desired component; if absent,\n // renders the Default* fallback.\n priceComponent?: React.ComponentType<import('@propeller-commerce/propeller-v2-core-ui').PriceComponentProps>;\n stockComponent?: React.ComponentType<import('@propeller-commerce/propeller-v2-core-ui').StockComponentProps>;\n}\n\n// ── Pure accessors (module scope — created once, not per render) ────────────────\n\n// `[0]` is the catalog's default-language entry, so on any other storefront\n// these printed the wrong-language name and — the part that actually breaks —\n// emitted a default-language SLUG into the item's link.\nfunction getProductName(orderItem: OrderItem, language?: string): string {\n return (\n getLocalizedValue(orderItem?.product?.names, language, '') ||\n orderItem?.name ||\n 'Unknown Product'\n );\n}\n\ntype HostUrls = OrderItemCardProps['configuration'] extends infer C\n ? C extends { urls?: infer U }\n ? U\n : never\n : never;\n\nfunction getClusterUrl(orderItem: OrderItem, language?: string, urls?: HostUrls): string {\n const cluster = orderItem?.product?.cluster;\n if (!cluster) return '';\n const id = cluster.clusterId;\n const slug = getLocalizedValue(cluster.slugs, language, '');\n if (!id || !slug) return '';\n return urls?.getClusterUrl?.(cluster as Cluster, language) || `/cluster/${id}/${slug}`;\n}\n\nfunction getProductUrl(orderItem: OrderItem, language?: string, urls?: HostUrls): string {\n const cu = getClusterUrl(orderItem, language, urls);\n if (cu) return cu;\n const product = orderItem?.product;\n const id = product?.productId;\n const slug = getLocalizedValue(product?.slugs, language, '');\n if (id && slug) return urls?.getProductUrl?.(product as Product, language) || `/product/${id}/${slug}`;\n return '';\n}\n\n/**\n * Renders a single order line item as a table row (with optional indented\n * child-item rows), showing image, SKU, quantity, discount and price.\n *\n * `orderItem.product` is optional and really can be absent: a product that is\n * hidden, withdrawn or deleted from the catalog still appears on the orders and\n * quotes it was sold on, but the API returns no product record for it. Every\n * product-derived value below therefore falls back to the order item, which\n * carries its own snapshot of the line — name, sku, quantity and prices — taken\n * when the order was placed. Such a row renders as plain text: the placeholder\n * thumbnail, the untranslated `orderItem.name` (there are no localized names to\n * resolve), and no PDP link (there are no slugs to build one from).\n */\nfunction OrderItemCard(props: OrderItemCardProps) {\n const item = props.orderItem;\n const isChildItem = props.isChildItem || false;\n\n // Display toggles — resolved once (child items never show image/sku).\n const titleLinkable = props.titleLinkable !== undefined ? props.titleLinkable : true;\n const showImage = isChildItem ? false : props.showImage !== undefined ? props.showImage : true;\n const showSku = isChildItem ? false : props.showSku !== undefined ? props.showSku : true;\n const showQuantity = props.showQuantity !== undefined ? props.showQuantity : true;\n const showPrice = props.showPrice !== undefined ? props.showPrice : true;\n const showDiscount = props.showDiscount !== undefined ? props.showDiscount : false;\n const showStockComponent =\n props.showStockComponent !== undefined ? props.showStockComponent : false;\n const showItemNotes = props.showItemNotes !== undefined ? props.showItemNotes : false;\n\n // Derived item values — computed once per render (previously each was a\n // function redefined every render and called multiple times across the JSX).\n const productName = getProductName(item, props.language);\n const productSku = item?.product?.sku || item?.sku || '';\n const productImage = item?.product?.media?.images?.items?.[0]?.imageVariants?.[0]?.url || '';\n const productUrl = getProductUrl(item, props.language, props.configuration?.urls);\n const quantity = item?.quantity || 0;\n const priceTotal = item?.priceTotal || 0;\n const discount = item?.discount || 0;\n const originalPrice = item?.originalPrice || 0;\n const discountPercentage =\n originalPrice > 0 && discount > 0 ? (discount / originalPrice) * 100 : 0;\n const notes = item?.notes || '';\n const hasChildren = (props.childItems || []).length > 0;\n\n function formatItemPrice(price: number): string {\n if (props.formatPrice) {\n return props.formatPrice(price);\n }\n if (!price && price !== 0) return '-';\n return formatPrice(price, { symbol: props.currency ?? '€', locale: localeForLanguage(props.language) });\n }\n\n const discountDisplay =\n discountPercentage > 0\n ? `${formatItemPrice(discount)} (${discountPercentage.toFixed(2).replace('.', ',')}%)`\n : formatItemPrice(discount);\n\n return (\n <tbody className=\"propeller-order-item-card\">\n <tr\n className={`propeller-order-item-card__row ${isChildItem ? 'border-0' : 'hover:bg-surface-hover transition'}`}\n data-child={isChildItem ? 'true' : 'false'}\n >\n <td\n className={`propeller-order-item-card__cell propeller-order-item-card__cell--product ${isChildItem ? 'px-6 py-2 pl-28' : 'px-6 py-4'}`}\n >\n <div className=\"flex items-center gap-4\">\n {showImage ? (\n productImage ? (\n <div className=\"propeller-order-item-card__media relative w-16 h-16 flex-shrink-0 rounded overflow-hidden\">\n <img\n className=\"propeller-order-item-card__image object-cover w-full h-full\"\n src={productImage}\n alt={productName}\n />\n </div>\n ) : (\n <div className=\"propeller-order-item-card__image-placeholder w-16 h-16 bg-surface-hover rounded flex items-center justify-center text-foreground-subtle text-xs\">\n {getLabel(props.labels, 'noImage', 'No Img')}\n </div>\n )\n ) : null}\n <div>\n {titleLinkable && productUrl && !isChildItem ? (\n <a\n className=\"propeller-order-item-card__title font-medium text-foreground hover:text-primary hover:underline\"\n href={productUrl}\n >\n {productName}\n </a>\n ) : (\n <span\n className={`propeller-order-item-card__title ${isChildItem ? 'text-sm text-muted-foreground' : 'font-medium'}`}\n >\n {productName}\n </span>\n )}\n {showSku && productSku ? (\n <p className=\"propeller-order-item-card__sku text-sm text-muted-foreground mt-1\">\n SKU: {productSku}\n </p>\n ) : null}\n {showItemNotes && notes ? (\n <p className=\"propeller-order-item-card__notes text-sm text-foreground-subtle mt-1 italic\">\n {notes}\n </p>\n ) : null}\n {showStockComponent && item?.product?.inventory\n ? (() => {\n // Delegate to the injected stock slot, or fall back to\n // the default stock display. Replaces the prior literal\n // \"Stock info\" placeholder text. The `inventory` guard\n // above bridges the contract-vs-default mismatch: the\n // shared StockComponentProps.inventory is optional while\n // DefaultItemStock requires it, so we only render when\n // the SDK actually returned inventory data.\n const StockImpl = props.stockComponent ?? DefaultItemStockImpl;\n return (\n <StockImpl\n inventory={item.product.inventory}\n showStock={true}\n showAvailability={true}\n labels={props.labels}\n />\n );\n })()\n : null}\n </div>\n </div>\n </td>\n {showQuantity ? (\n <td\n className={\n isChildItem\n ? 'propeller-order-item-card__cell propeller-order-item-card__cell--quantity px-6 py-2 text-center text-sm text-muted-foreground'\n : 'propeller-order-item-card__cell propeller-order-item-card__cell--quantity px-6 py-4 text-center'\n }\n >\n {quantity}\n </td>\n ) : null}\n {showDiscount ? (\n <td\n className={\n isChildItem\n ? 'propeller-order-item-card__cell propeller-order-item-card__cell--discount px-6 py-2 text-right text-sm text-muted-foreground'\n : 'propeller-order-item-card__cell propeller-order-item-card__cell--discount px-6 py-4 text-right whitespace-nowrap text-warning'\n }\n >\n {discount > 0 ? <>{discountDisplay}</> : null}\n </td>\n ) : null}\n {showPrice ? (\n <td\n className={\n isChildItem\n ? 'propeller-order-item-card__cell propeller-order-item-card__cell--price px-6 py-2 text-right whitespace-nowrap text-sm text-muted-foreground'\n : 'propeller-order-item-card__cell propeller-order-item-card__cell--price px-6 py-4 text-right whitespace-nowrap'\n }\n >\n {(() => {\n // When the consumer injects a priceComponent, delegate to it;\n // otherwise keep the existing inline line-total rendering.\n //\n // Contract-vs-data note (same as CartItem): the\n // PriceComponentProps.price contract expects an SDK ProductPrice\n // (catalog/unit price), while this cell historically renders the\n // line total `item.priceTotal`. We pass `item.product?.price`\n // (catalog price) to the injected component to honour the\n // contract; consumers who need the line total can read it off\n // the labels/className surface or compute their own from the\n // catalog price + their own quantity context. The default\n // (uninjected) path is unchanged.\n //\n // The `product.price` guard is what keeps a product-less line\n // priced: an order item whose product came back null (hidden,\n // withdrawn, deleted from the catalog) has no catalog price to\n // hand the slot, and the slot renders blank when given\n // `undefined` — silently dropping the line total from the row.\n // Fall through to the order item's own `priceTotal` instead.\n const PriceImpl = props.priceComponent;\n if (PriceImpl && item?.product?.price) {\n return (\n <PriceImpl\n price={item.product.price}\n currency={props.currency}\n labels={props.labels}\n />\n );\n }\n return formatItemPrice(priceTotal);\n })()}\n </td>\n ) : null}\n </tr>\n {hasChildren ? (\n <>\n {(props.childItems || []).map((child) => (\n <tr\n className=\"propeller-order-item-card__child-row border-0\"\n key={child.id || child.uuid}\n data-child=\"true\"\n >\n <td className=\"propeller-order-item-card__cell propeller-order-item-card__cell--product px-6 py-2 pl-28\">\n <span className=\"propeller-order-item-card__child-title text-sm text-muted-foreground\">\n {getLocalizedValue(child.product?.names, props.language, '') || child.name || 'Unknown'}\n </span>\n </td>\n {showQuantity ? (\n <td className=\"propeller-order-item-card__cell propeller-order-item-card__cell--quantity px-6 py-2 text-center text-sm text-muted-foreground\">\n {child.quantity || 0}\n </td>\n ) : null}\n {showDiscount ? (\n <td className=\"propeller-order-item-card__cell propeller-order-item-card__cell--discount px-6 py-2 text-right text-sm text-muted-foreground\" />\n ) : null}\n {showPrice ? (\n <td className=\"propeller-order-item-card__cell propeller-order-item-card__cell--price px-6 py-2 text-right whitespace-nowrap text-sm text-muted-foreground\">\n {formatItemPrice(child.priceTotal || 0)}\n </td>\n ) : null}\n </tr>\n ))}\n </>\n ) : null}\n </tbody>\n );\n}\n\nexport default OrderItemCard;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { getLabel, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport { getCountryName as _getCountryName } from '@propeller-commerce/propeller-v2-core-ui';\nimport { formatPrice } from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface OrderSummaryProps {\n /**\n * Storefront language ('EN', 'NL', …). Decides the number format prices are\n * rendered in — without it they fall back to Dutch separators regardless of\n * the language the shopper is reading.\n */\n language?: string;\n\n /** The order object from propeller-sdk-v2 */\n order: any;\n\n /** The CSS class for the order summary container */\n orderSummaryContainerClass?: string;\n\n /** Title of the order summary */\n title?: string;\n\n /** Show the order number */\n showOrderNumber?: boolean;\n\n /** Show the order date */\n showOrderDate?: boolean;\n\n /** Show the order status */\n showOrderStatus?: boolean;\n\n /** Show the order total */\n showOrderTotal?: boolean;\n\n /** Custom price formatting function */\n formatPrice?: (price: number) => string;\n\n /** Show the invoice address */\n showInvoiceAddress?: boolean;\n\n /** Show the delivery address */\n showDeliveryAddress?: boolean;\n\n /** Show payment, carrier, and delivery date info */\n showDeliveryInfo?: boolean;\n\n /** Show order remarks and reference */\n showRemarks?: boolean;\n\n /** Custom date formatting function */\n formatDate?: (dateString: string) => string;\n\n /** Labels for the component */\n labels?: Record<string, string>;\n\n /**\n * Localized order/quote status labels, keyed by the raw backend status\n * (e.g. `{ NEW: 'Nieuw', REQUEST: 'Aangevraagd' }`). Unknown → raw value.\n */\n statusLabels?: Record<string, string>;\n\n /**\n * Localized payment-method names, keyed by the raw method value LOWER-CASED\n * (e.g. `{ rekening: 'Op rekening', account: 'Op rekening' }`). The backend\n * sends different raw values on the order vs quote path (REKENING / ACCOUNT),\n * so mapping both here makes the same method render identically. Unknown →\n * raw value.\n */\n paymethodLabels?: Record<string, string>;\n\n /** List of countries for resolving codes to names [{code: 'NL', name: 'Netherlands'}, ...] */\n countries?: {\n code: string;\n name: string;\n }[];\n\n /** Currency symbol used by the default formatter. Default: `'€'`. */\n currency?: string;\n}\n\n/**\n * Renders a read-only summary of an order: meta fields (number, date, status,\n * total), invoice/delivery addresses, delivery info and remarks.\n */\nfunction OrderSummary(props: OrderSummaryProps) {\n const order = props.order;\n\n const containerClass = props.orderSummaryContainerClass || 'order-summary';\n const showOrderNumber = props.showOrderNumber !== undefined ? props.showOrderNumber : true;\n const showOrderDate = props.showOrderDate !== undefined ? props.showOrderDate : true;\n const showOrderStatus = props.showOrderStatus !== undefined ? props.showOrderStatus : true;\n const showInvoiceAddress =\n props.showInvoiceAddress !== undefined ? props.showInvoiceAddress : true;\n const showDeliveryAddress =\n props.showDeliveryAddress !== undefined ? props.showDeliveryAddress : true;\n const showOrderTotal = props.showOrderTotal !== undefined ? props.showOrderTotal : true;\n const showDeliveryInfo = props.showDeliveryInfo !== undefined ? props.showDeliveryInfo : true;\n const showRemarks = props.showRemarks !== undefined ? props.showRemarks : true;\n\n // Order field accessors — computed once per render (previously each was a\n // function redefined every render; addresses.find() ran on every JSX read).\n const orderNumber = order?.id || '';\n const orderDate = order?.createdAt || '';\n const rawStatus = order?.status || '';\n // Map raw backend enums to localized labels; unknown → raw value. Was printing\n // the raw enum (NEW / REQUEST / REKENING / ACCOUNT) straight to the customer.\n const orderStatus = rawStatus ? (props.statusLabels?.[rawStatus] || rawStatus) : '';\n const orderTotal = Number(order?.total?.net || 0);\n const orderReference = order?.reference || '';\n const orderRemarks = order?.remarks || '';\n const rawPaymentMethod = order?.paymentData?.method || '';\n const paymentMethod = rawPaymentMethod\n ? (props.paymethodLabels?.[rawPaymentMethod.toLowerCase()] || rawPaymentMethod)\n : '';\n const carrierName = order?.postageData?.carrier || '';\n const addresses = order?.addresses || [];\n const invoiceAddress = addresses.find((a: any) => a.type === 'invoice') || null;\n const deliveryAddress = addresses.find((a: any) => a.type === 'delivery') || null;\n\n function formatItemPrice(price: number): string {\n if (props.formatPrice) {\n return props.formatPrice(price);\n }\n return formatPrice(price || 0, { symbol: props.currency ?? '€', locale: localeForLanguage(props.language) });\n }\n\n // Numeric day-first DD-MM-YYYY. Was hardcoded en-US (M/D/YYYY), which NL\n // readers misparse by months. Locale-neutral order; override via `formatDate`.\n function numericDate(dateString: string): string {\n const d = new Date(dateString);\n if (isNaN(d.getTime())) return dateString;\n const day = String(d.getDate()).padStart(2, '0');\n const month = String(d.getMonth() + 1).padStart(2, '0');\n return `${day}-${month}-${d.getFullYear()}`;\n }\n\n function formatOrderDate(dateString: string): string {\n if (props.formatDate) {\n return props.formatDate(dateString);\n }\n return numericDate(dateString);\n }\n\n const requestDateRaw = order?.postageData?.requestDate;\n let requestDate = '';\n if (requestDateRaw) {\n if (props.formatDate) {\n requestDate = props.formatDate(requestDateRaw);\n } else {\n requestDate = numericDate(requestDateRaw);\n }\n }\n\n const getCountryName = (code: string): string => _getCountryName(code, props.countries);\n\n return (\n <div className={`propeller-order-summary ${containerClass}`}>\n {props.title ? (\n <h2 className=\"propeller-order-summary__title text-xl font-bold mb-4\">{props.title}</h2>\n ) : null}\n <div className=\"propeller-order-summary__meta grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 pb-5 border-b border-border mb-5\">\n {showOrderNumber && orderNumber ? (\n <div className=\"propeller-order-summary__meta-item\" data-meta=\"order-number\">\n <p className=\"propeller-order-summary__meta-label text-sm text-muted-foreground mb-1\">\n {getLabel(props.labels, 'orderNumber', 'Order Number')}\n </p>\n <p className=\"propeller-order-summary__meta-value font-semibold\">{orderNumber}</p>\n </div>\n ) : null}\n {showOrderDate && orderDate ? (\n <div className=\"propeller-order-summary__meta-item\" data-meta=\"order-date\">\n <p className=\"propeller-order-summary__meta-label text-sm text-muted-foreground mb-1\">\n {getLabel(props.labels, 'orderDate', 'Order Date')}\n </p>\n <p className=\"propeller-order-summary__meta-value font-semibold\">\n {formatOrderDate(orderDate)}\n </p>\n </div>\n ) : null}\n {showOrderStatus && orderStatus ? (\n <div className=\"propeller-order-summary__meta-item\" data-meta=\"status\">\n <p className=\"propeller-order-summary__meta-label text-sm text-muted-foreground mb-1\">\n {getLabel(props.labels, 'status', 'Status')}\n </p>\n <span className=\"propeller-order-summary__status inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-secondary/10 text-secondary\">\n {orderStatus}\n </span>\n </div>\n ) : null}\n {showOrderTotal ? (\n <div className=\"propeller-order-summary__meta-item\" data-meta=\"total\">\n <p className=\"propeller-order-summary__meta-label text-sm text-muted-foreground mb-1\">\n {getLabel(props.labels, 'total', 'Total')}\n </p>\n <p className=\"propeller-order-summary__total font-bold text-lg\">\n {formatItemPrice(orderTotal)}\n </p>\n </div>\n ) : null}\n </div>\n <div className=\"propeller-order-summary__addresses grid grid-cols-1 md:grid-cols-2 gap-6 pb-5\">\n {showInvoiceAddress ? (\n <div className=\"propeller-order-summary__address space-y-2\" data-address=\"invoice\">\n <h3 className=\"propeller-order-summary__address-title text-sm font-semibold text-muted-foreground uppercase tracking-wide\">\n {getLabel(props.labels, 'invoiceAddress', 'Invoice Address')}\n </h3>\n {invoiceAddress && invoiceAddress.street ? (\n <div className=\"text-sm space-y-1\">\n {invoiceAddress.company ? (\n <p className=\"font-medium\">{invoiceAddress.company}</p>\n ) : null}\n <p>\n {[invoiceAddress.firstName, invoiceAddress.middleName, invoiceAddress.lastName]\n .filter(Boolean)\n .join(' ')}\n </p>\n <p>\n {[invoiceAddress.street, invoiceAddress.number, invoiceAddress.numberExtension]\n .filter(Boolean)\n .join(' ')}\n </p>\n <p>{[invoiceAddress.postalCode, invoiceAddress.city].filter(Boolean).join(' ')}</p>\n {invoiceAddress.country ? <p>{getCountryName(invoiceAddress.country)}</p> : null}\n {invoiceAddress.email ? (\n <p className=\"propeller-order-summary__address-email text-muted-foreground\">\n {invoiceAddress.email}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n {showDeliveryAddress ? (\n <div className=\"propeller-order-summary__address space-y-2\" data-address=\"delivery\">\n <h3 className=\"propeller-order-summary__address-title text-sm font-semibold text-muted-foreground uppercase tracking-wide\">\n {getLabel(props.labels, 'deliveryAddress', 'Delivery Address')}\n </h3>\n {deliveryAddress && deliveryAddress.street ? (\n <div className=\"text-sm space-y-1\">\n {deliveryAddress.company ? (\n <p className=\"font-medium\">{deliveryAddress.company}</p>\n ) : null}\n <p>\n {[deliveryAddress.firstName, deliveryAddress.middleName, deliveryAddress.lastName]\n .filter(Boolean)\n .join(' ')}\n </p>\n <p>\n {[deliveryAddress.street, deliveryAddress.number, deliveryAddress.numberExtension]\n .filter(Boolean)\n .join(' ')}\n </p>\n <p>{[deliveryAddress.postalCode, deliveryAddress.city].filter(Boolean).join(' ')}</p>\n {deliveryAddress.country ? <p>{getCountryName(deliveryAddress.country)}</p> : null}\n {deliveryAddress.email ? (\n <p className=\"propeller-order-summary__address-email text-muted-foreground\">\n {deliveryAddress.email}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n {showDeliveryInfo && (paymentMethod || carrierName || requestDate) ? (\n <div className=\"propeller-order-summary__info-panel bg-surface-hover p-4 rounded-control border border-border space-y-2 text-sm\">\n {paymentMethod ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">{getLabel(props.labels, 'payment', 'Payment:')}</span>\n <span>{paymentMethod}</span>\n </div>\n ) : null}\n {carrierName ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">{getLabel(props.labels, 'carrier', 'Carrier:')}</span>\n <span>{carrierName}</span>\n </div>\n ) : null}\n {requestDate ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">\n {getLabel(props.labels, 'deliveryDate', 'Delivery Date:')}\n </span>\n <span>{requestDate}</span>\n </div>\n ) : null}\n </div>\n ) : null}\n {showRemarks && (orderReference || orderRemarks) ? (\n <div className=\"propeller-order-summary__remarks-panel bg-surface-hover p-4 rounded-control border border-border space-y-2 text-sm mt-4\">\n {orderReference ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">\n {getLabel(props.labels, 'reference', 'Reference:')}\n </span>\n <span>{orderReference}</span>\n </div>\n ) : null}\n {orderRemarks ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">{getLabel(props.labels, 'remarks', 'Remarks:')}</span>\n <span>{orderRemarks}</span>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport default OrderSummary;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { Order, OrderDiscountType, OrderTotalTaxPercentage } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport { formatPrice } from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface OrderTotalsProps {\n /**\n * Storefront language ('EN', 'NL', …). Decides the number format prices are\n * rendered in — without it they fall back to Dutch separators regardless of\n * the language the shopper is reading.\n */\n language?: string;\n\n /** The order/quote used to populate the summary data */\n order: Order;\n\n /** Order summary block title */\n title?: string;\n\n /** Labels for the component */\n labels?: Record<string, string>;\n\n /** Display the subtotal of the order/quote */\n showSubtotal?: boolean;\n\n /** Display the total discount of the order/quote */\n showDiscount?: boolean;\n\n /** Display the shipping costs of the order/quote */\n showShippingCosts?: boolean;\n\n /** Display all VATs of the order/quote */\n showVATs?: boolean;\n\n /** Display the total of the order/quote excluding the VAT */\n showTotalExclVat?: boolean;\n\n /** Display the total VAT of the order/quote */\n showTotalVat?: boolean;\n\n /** Custom price formatting function */\n formatPrice?: (price: number) => string;\n\n /** Currency symbol used by the default formatter. Default: `'€'`. */\n currency?: string;\n}\n/**\n * Renders the price breakdown for an order or quote: subtotal, discount,\n * transaction and shipping costs, per-rate VAT lines and the grand total.\n */\nfunction OrderTotals(props: OrderTotalsProps) {\n // All visibility flags are derived directly from props at render — no need\n // for one-liner functions wrapping a `?? true`.\n const showSubtotal = props.showSubtotal !== false;\n const showDiscount = props.showDiscount !== false;\n const showShippingCosts = props.showShippingCosts !== false;\n const showVATs = props.showVATs !== false;\n const showTotalExclVat = props.showTotalExclVat !== false;\n const showTotalVat = props.showTotalVat !== false;\n const total = props.order?.total;\n const paymentData = props.order?.paymentData;\n const postageData = props.order?.postageData;\n\n function formatItemPrice(price: number): string {\n if (props.formatPrice) return props.formatPrice(price);\n return formatPrice(price || 0, { symbol: props.currency ?? '€', locale: localeForLanguage(props.language) });\n }\n const subtotal = total?.gross || 0;\n const hasDiscount = !!total\n && total.discountType !== OrderDiscountType.N\n && total.discountValue > 0;\n function discountDisplay(): string {\n if (!total) return '';\n if (total.discountType === OrderDiscountType.A) {\n return '-' + formatItemPrice(total.discountValue);\n }\n if (total.discountType === OrderDiscountType.P) {\n return '- ' + total.discountValue + '%';\n }\n return '-' + formatItemPrice(total.discountValue);\n }\n const subtotalWithDiscount = (total?.gross || 0) - (total?.discountValue || 0);\n const hasTransactionCosts = (paymentData?.gross ?? 0) > 0;\n const transactionCosts = Number(paymentData?.gross || 0);\n const hasShippingCosts = (postageData?.gross ?? 0) > 0;\n const shippingCosts = Number(postageData?.gross || 0);\n const totalExclVat = total?.gross || 0;\n const taxPercentages: OrderTotalTaxPercentage[] = (total?.taxPercentages || [])\n .filter((tax) => tax.percentage > 0 && tax.total > 0);\n const totalInclVat = total?.net || 0;\n const totalVat = taxPercentages.reduce((sum, t) => sum + Number(t.total || 0), 0);\n return (\n <div className=\"propeller-order-totals w-full md:w-80 bg-card p-6 rounded-container shadow space-y-3\">\n {showSubtotal ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground\" data-row=\"subtotal\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'subtotal', 'Subtotal:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(subtotal)}</span>\n </div>\n ) : null}\n {showDiscount && hasDiscount ? (\n <>\n <div className=\"propeller-order-totals__row flex justify-between text-secondary\" data-row=\"discount\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'discount', 'Discount:')}</span>\n <span className=\"propeller-order-totals__value\">{discountDisplay()}</span>\n </div>\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground border-t pt-2 border-dashed\" data-row=\"subtotal-with-discount\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'subtotalWithDiscount', 'Subtotal with discount:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(subtotalWithDiscount)}</span>\n </div>\n </>\n ) : null}\n {hasTransactionCosts ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground\" data-row=\"transaction-costs\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'transactionCosts', 'Transaction costs:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(transactionCosts)}</span>\n </div>\n ) : null}\n {showShippingCosts && hasShippingCosts ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground\" data-row=\"shipping-costs\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'shippingCosts', 'Shipping costs:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(shippingCosts)}</span>\n </div>\n ) : null}\n {showTotalExclVat ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground pt-2 border-t\" data-row=\"total-excl-vat\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'totalExclVat', 'Total excl. VAT:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(totalExclVat)}</span>\n </div>\n ) : null}\n {showVATs && taxPercentages.length > 0 ? (\n <>\n {taxPercentages.map((tax, index) => (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground text-sm\" key={index} data-row=\"vat-line\">\n <span className=\"propeller-order-totals__label\">\n {tax.percentage}% {getLabel(props.labels, 'vat', 'VAT')}:\n </span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(Number(tax.total))}</span>\n </div>\n ))}\n </>\n ) : null}\n {showTotalVat ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground text-sm\" data-row=\"total-vat\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'totalVat', 'Total VAT:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(totalVat)}</span>\n </div>\n ) : null}\n <div className=\"propeller-order-totals__row propeller-order-totals__row--total flex justify-between text-xl font-bold pt-4 border-t text-foreground mt-2\" data-row=\"total\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'total', 'Total:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(totalInclVat)}</span>\n </div>\n </div>\n );\n}\n\nexport default OrderTotals;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { ProductPrice, Contact, Customer } from '@propeller-commerce/propeller-sdk-v2';\nimport type { IDiscount } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport { isContentHidden } from '@propeller-commerce/propeller-v2-core-ui';\nimport { formatPrice } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductBulkPricesProps {\n /**\n * Storefront language ('EN', 'NL', …). Decides the number format prices are\n * rendered in — without it they fall back to Dutch separators regardless of\n * the language the shopper is reading.\n */\n language?: string;\n\n /**\n * Bulk price tiers from the product.\n * Obtain from `product.bulkPrices`.\n */\n bulkPrices: ProductPrice[];\n\n /**\n * When true, net price (incl. tax) is the leading price.\n * Defaults to false — gross (excl. VAT) is shown.\n * Note: in the Propeller SDK `price.gross` = excl. VAT, `price.net` = incl. VAT.\n */\n includeTax?: boolean;\n\n /**\n * Controls portal visibility mode.\n * 'semi-closed' — component is hidden for anonymous users.\n * Defaults to 'open'.\n */\n portalMode?: string;\n /**\n * Whether a session exists, independent of whether `user` has loaded yet.\n * Passed down by the parent alongside `portalMode`; closes the hydration\n * window in which an authenticated visitor still has a null `user`.\n */\n isAuthenticated?: boolean;\n\n /** Authenticated user — used for semi-closed visibility. */\n user?: Contact | Customer | null;\n\n /** Tax zone code. Defaults to 'NL'. */\n taxZone?: string;\n\n /** Currency symbol for prices. Defaults to '€'. */\n currency?: string;\n\n /**\n * Override any UI string.\n * Available keys: title, quantityFrom, price, inclTax, exclTax\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's volume/quantity-tier pricing as a table, filtering out\n * expired or list-price tiers and showing incl./excl. VAT prices.\n */\nfunction ProductBulkPrices(props: ProductBulkPricesProps) {\n const includeTax = !!props.includeTax;\n const isHidden = isContentHidden(props.portalMode, props.user, props.isAuthenticated);\n function getTierQuantity(tier: ProductPrice): number | null {\n const discount = tier.discount as\n | (IDiscount & { quantityFrom?: number })\n | undefined;\n return discount?.quantityFrom ?? tier.quantity ?? null;\n }\n function getBulkPrices(): ProductPrice[] {\n const rawAll = props.bulkPrices || [];\n const all = rawAll.filter((tier) => {\n const t = tier as ProductPrice & {\n type?: string;\n discountType?: string;\n };\n const priceType =\n t.type ??\n (\n t.discount as\n | {\n type?: string;\n }\n | undefined\n )?.type;\n const discountType =\n t.discountType ??\n (\n t.discount as\n | {\n discountType?: string;\n }\n | undefined\n )?.discountType;\n return !(priceType === 'PRICESHEET' && discountType === 'LIST_PRICE_MIN');\n });\n if (all.length === 0) return [];\n const now = new Date();\n const groups = new Map<number, ProductPrice[]>();\n for (const tier of all) {\n const qty = getTierQuantity(tier);\n if (qty === null) continue;\n const list = groups.get(qty) || [];\n list.push(tier);\n groups.set(qty, list);\n }\n const filtered: ProductPrice[] = [];\n for (const [, prices] of groups) {\n const validDated: ProductPrice[] = [];\n const nullDated: ProductPrice[] = [];\n for (const tier of prices) {\n const discount = tier.discount as\n | (IDiscount & {\n validFrom?: string;\n validTo?: string;\n })\n | undefined;\n if (!discount) {\n filtered.push(tier);\n continue;\n }\n const validFrom = discount.validFrom ?? null;\n const validTo = discount.validTo ?? null;\n if (validFrom === null && validTo === null) {\n nullDated.push(tier);\n continue;\n }\n let isValid = true;\n if (validFrom !== null && now < new Date(validFrom)) isValid = false;\n if (isValid && validTo !== null && now > new Date(validTo)) isValid = false;\n if (isValid) validDated.push(tier);\n }\n if (validDated.length > 0) filtered.push(validDated[0]);\n else if (nullDated.length > 0) filtered.push(nullDated[0]);\n }\n filtered.sort((a, b) => (getTierQuantity(a) ?? 0) - (getTierQuantity(b) ?? 0));\n if (filtered.length === 1 && getTierQuantity(filtered[0]) === 1) return [];\n return filtered;\n }\n const bulkPrices = getBulkPrices();\n const hasItems = bulkPrices.length > 0;\n function getPrice(tier: ProductPrice): string {\n const value = includeTax ? tier.net : tier.gross;\n if (value === null || value === undefined) return '';\n return formatPrice(value, { symbol: props.currency ?? '\\u20AC', locale: localeForLanguage(props.language) });\n }\n function getQuantityLabel(tier: ProductPrice, index: number): string {\n const discount = tier.discount as\n | (IDiscount & { quantityFrom?: number })\n | undefined;\n const qty = discount?.quantityFrom || tier.quantity || 1;\n const nextTier = bulkPrices[index + 1];\n const nextDiscount = nextTier?.discount as\n | (IDiscount & { quantityFrom?: number })\n | undefined;\n const nextQty = nextDiscount?.quantityFrom || nextTier?.quantity;\n if (nextQty) return `${qty}\\u2013${nextQty - 1}`;\n return `${qty}+`;\n }\n // An explicit empty `title` label means \"render no heading\" — the check\n // below relies on it. getLabel() treats '' as missing and returns its English\n // fallback, so the heading came back as \"Volume pricing\" in every locale;\n // read the label directly here and only fall back when the key is absent.\n const title = props.labels?.title ?? 'Volume pricing';\n return (\n <>\n {!isHidden && hasItems ? (\n <>\n <div\n className={cn(`propeller-product-bulk-prices ${props.className || ''}`)}\n data-include-tax={includeTax ? 'true' : 'false'}\n >\n {title ? (\n <h3 className=\"propeller-product-bulk-prices__title text-base font-semibold text-foreground mb-3\">\n {title}\n </h3>\n ) : null}\n <div className=\"propeller-product-bulk-prices__table-wrapper overflow-hidden rounded-container border border-border\">\n <table className=\"propeller-product-bulk-prices__table w-full text-sm\">\n <thead className=\"propeller-product-bulk-prices__thead bg-muted/50\">\n <tr>\n <th className=\"propeller-product-bulk-prices__th propeller-product-bulk-prices__th--quantity px-4 py-2 text-left font-medium text-muted-foreground\">\n {getLabel(props.labels, 'quantityFrom', 'Qty from')}\n </th>\n <th className=\"propeller-product-bulk-prices__th propeller-product-bulk-prices__th--price px-4 py-2 text-right font-medium text-muted-foreground\">\n {getLabel(props.labels, 'price', 'Price')}\n <span className=\"propeller-product-bulk-prices__tax-label font-normal text-xs\">\n (\n {includeTax\n ? getLabel(props.labels, 'inclTax', 'incl. VAT')\n : getLabel(props.labels, 'exclTax', 'excl. VAT')}\n )\n </span>\n </th>\n </tr>\n </thead>\n <tbody className=\"propeller-product-bulk-prices__tbody divide-y divide-border\">\n {bulkPrices.map((tier, index) => (\n <tr className=\"propeller-product-bulk-prices__row bg-card hover:bg-muted/20 transition-colors\" key={index}>\n <td className=\"propeller-product-bulk-prices__cell propeller-product-bulk-prices__cell--quantity px-4 py-2 text-foreground font-medium\">\n {getQuantityLabel(tier, index)}\n </td>\n <td className=\"propeller-product-bulk-prices__cell propeller-product-bulk-prices__cell--price px-4 py-2 text-right text-foreground font-semibold\">\n {getPrice(tier)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </>\n ) : null}\n </>\n );\n}\n\nexport default ProductBulkPrices;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport {\n PaginatedMediaDocumentResponse,\n MediaDocument,\n} from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, getLanguageString, resolveLanguageEntry } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductDownloadsProps {\n /**\n * Media documents for the product.\n * Obtain from `product.media?.documents`. The API answers `null` rather than\n * an empty page when a product has none, so this may be absent.\n */\n downloads?: PaginatedMediaDocumentResponse | null;\n\n /**\n * Language code used to resolve the correct localised document URL and label.\n */\n language: string;\n\n /**\n * Override any UI string.\n * Available keys: title, download, empty\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's downloadable media documents as a list of localised\n * download links, or an empty-state message when there are none.\n */\nfunction ProductDownloads(props: ProductDownloadsProps) {\n const items: MediaDocument[] = props.downloads?.items || [];\n const hasItems = items.length > 0;\n const lang = props.language || 'NL';\n // Case-insensitive on purpose: the API lowercases `documents[].language`\n // while leaving `alt[].language` as uploaded, so matching exactly gave the\n // right label with the wrong file.\n function getDocumentUrl(doc: MediaDocument): string {\n return resolveLanguageEntry(doc.documents, lang)?.originalUrl || '';\n }\n function getDocumentName(doc: MediaDocument): string {\n return getLanguageString(doc.alt, lang, 'Download');\n }\n return (\n <div className={cn(`propeller-product-downloads ${props.className || ''}`)}>\n {hasItems ? (\n <h3 className=\"propeller-product-downloads__title text-base font-semibold text-foreground mb-3\">\n {getLabel(props.labels, 'title', 'Downloads')}\n </h3>\n ) : null}\n {hasItems ? (\n <ul className=\"propeller-product-downloads__list space-y-2\">\n {items.map((doc, index) => (\n <li className=\"propeller-product-downloads__item\" key={index}>\n {!!getDocumentUrl(doc) ? (\n <a\n target=\"_blank\"\n className=\"propeller-product-downloads__link flex items-center gap-3 rounded-container border border-border bg-card px-4 py-3 text-sm text-foreground hover:bg-muted/30 hover:border-primary/40 transition-colors group\"\n href={getDocumentUrl(doc)}\n download\n >\n <svg\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n className=\"h-5 w-5 flex-shrink-0 text-muted-foreground group-hover:text-primary transition-colors\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n strokeWidth={1.5}\n />\n </svg>\n <span className=\"flex-1 min-w-0 truncate\">{getDocumentName(doc)}</span>\n <svg\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n className=\"h-4 w-4 flex-shrink-0 text-muted-foreground group-hover:text-primary transition-colors\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n strokeWidth={2}\n />\n </svg>\n </a>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n {!hasItems ? (\n <p className=\"propeller-product-downloads__empty text-sm text-muted-foreground\">{getLabel(props.labels, 'empty', 'No downloads')}</p>\n ) : null}\n </div>\n );\n}\n\nexport default ProductDownloads;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { ClusterOption, Contact, Customer, Product, ProductPrice, YesNo } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport { isContentHidden } from '@propeller-commerce/propeller-v2-core-ui';\nimport { formatPrice as formatPriceHelper } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductPriceProps {\n /**\n * Storefront language ('EN', 'NL', …). Decides the number format prices are\n * rendered in — without it they fall back to Dutch separators regardless of\n * the language the shopper is reading.\n */\n language?: string;\n\n /**\n * ProductPrice object from the product.\n * Obtain from `product.price`.\n */\n price: ProductPrice;\n\n /** Currency symbol to display. Defaults to '€'. */\n currency?: string;\n\n /**\n * Controls portal visibility mode.\n * 'open' — full e-commerce; price is always visible.\n * 'semi-closed' — catalog-only; price is hidden for anonymous users.\n * Defaults to 'open'.\n */\n portalMode?: string;\n /**\n * Whether a session exists, independent of whether `user` has loaded yet.\n * Passed down by the parent alongside `portalMode`; closes the hydration\n * window in which an authenticated visitor still has a null `user`.\n */\n isAuthenticated?: boolean;\n\n /** Authenticated user — used for semi-closed visibility. */\n user?: Contact | Customer | null;\n\n /**\n * When true, net price (incl. tax) is the leading price.\n * When false (default), gross price (excl. tax) is the leading price.\n * Note: in the Propeller SDK `price.gross` = excl. VAT, `price.net` = incl. VAT.\n */\n includeTax?: boolean;\n\n /** Tax zone code. Defaults to 'NL'. */\n taxZone?: string;\n\n /** Cluster options (cluster.options). Required option default prices are added even without an active selection. */\n options?: ClusterOption[];\n\n /** Active option product selections — pass Object.values(selectedOptionProducts). Price updates on every change. */\n selectedOptionProducts?: Product[];\n\n /**\n * Override any UI string.\n * Available keys: inclTax, exclTax, loginToSeePrices\n */\n labels?: Record<string, string>;\n\n /**\n * Show the \"log in to see prices\" prompt when the price is hidden.\n * Defaults to true; pass false to render nothing in its place.\n */\n showLoginPrompt?: boolean;\n\n /** Tailwind text-size class for the leading price. Defaults to 'text-3xl'. */\n priceSize?: string;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's price with a leading incl./excl.-VAT amount and a\n * secondary line for the other tax mode, adding selected cluster-option prices.\n */\nfunction ProductPriceDisplay(props: ProductPriceProps) {\n function isHidden(): boolean {\n return isContentHidden(props.portalMode, props.user, props.isAuthenticated);\n }\n function formatPrice(value: number | null | undefined): string {\n if (value === null || value === undefined) return '';\n return formatPriceHelper(value, { symbol: props.currency ?? '\\u20AC', locale: localeForLanguage(props.language) });\n }\n function getOptionsTotal(useNet: boolean): number {\n const options = props.options || [];\n const selected = props.selectedOptionProducts || [];\n let total = 0;\n options.forEach((option: ClusterOption) => {\n if (option.hidden === YesNo.Y) return;\n\n // Find whether the user has selected a product in this option\n const selectedProduct = selected.find((p: Product) =>\n (option.products || []).some((op: Product) => op.productId === p.productId)\n );\n if (selectedProduct) {\n total += useNet ? selectedProduct.price?.net || 0 : selectedProduct.price?.gross || 0;\n } else if (option.isRequired === YesNo.Y && option.defaultProduct) {\n // option.defaultProduct may lack price data; look up the full\n // product record from option.products (which always has prices).\n const defaultId = (option.defaultProduct as Product).productId;\n const fullDefault =\n (option.products || []).find((p: Product) => p.productId === defaultId) ||\n option.defaultProduct;\n total += useNet\n ? (fullDefault as Product).price?.net || 0\n : (fullDefault as Product).price?.gross || 0;\n }\n });\n return total;\n }\n function getLeadingPrice(): string {\n const price = props.price;\n if (!price) return '';\n const useNet = !!props.includeTax;\n const base = useNet ? price.net : price.gross;\n if (base === null || base === undefined) return '';\n return formatPrice(base + getOptionsTotal(useNet));\n }\n function getSecondaryPrice(): string {\n const price = props.price;\n if (!price) return '';\n const useNet = !props.includeTax; // opposite of leading\n const base = useNet ? price.net : price.gross;\n if (base === null || base === undefined) return '';\n return formatPrice(base + getOptionsTotal(useNet));\n }\n function getTaxLabel(): string {\n return props.includeTax ? getLabel(props.labels, 'inclTax', 'incl. VAT') : getLabel(props.labels, 'exclTax', 'excl. VAT');\n }\n function getSecondaryTaxLabel(): string {\n return props.includeTax ? getLabel(props.labels, 'exclTax', 'excl. VAT') : getLabel(props.labels, 'inclTax', 'incl. VAT');\n }\n return (\n <div className={cn(`propeller-product-price ${props.className || ''}`)} data-hidden={isHidden() ? 'true' : 'false'}>\n {isHidden() && props.showLoginPrompt !== false ? (\n <p className=\"propeller-product-price__login-prompt text-sm text-muted-foreground italic\">\n {getLabel(props.labels, 'loginToSeePrices', 'Log in to see prices')}\n </p>\n ) : null}\n {!isHidden() && !!getLeadingPrice() ? (\n <div className=\"propeller-product-price__content flex flex-col gap-0.5\">\n <div className=\"propeller-product-price__primary flex items-baseline gap-2\">\n <span\n className={`propeller-product-price__amount ${props.priceSize || 'text-3xl'} font-bold text-foreground`}\n >\n {getLeadingPrice()}\n </span>\n <span className=\"propeller-product-price__tax-label text-sm text-muted-foreground\">{getTaxLabel()}</span>\n </div>\n {!!getSecondaryPrice() ? (\n <div className=\"propeller-product-price__secondary text-sm text-muted-foreground flex items-baseline gap-1\">\n <span className=\"propeller-product-price-secondary__amount\">{getSecondaryPrice()}</span>\n <span className=\"propeller-product-price-secondary__tax-label\">{getSecondaryTaxLabel()}</span>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport default ProductPriceDisplay;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. The legacy `'use client'` header was\n * removed in C0 once verified pure. Renders directly\n * from props and can be imported into a React Server Component.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\n\nimport type { Product, Cluster, LocalizedString } from '@propeller-commerce/propeller-sdk-v2';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductShortDescriptionProps {\n /**\n * Product or Cluster object.\n * The component reads `product.shortDescriptions` (an array of LocalizedString)\n * and renders the matching language entry as HTML.\n */\n product: Product | Cluster;\n\n /**\n * Language code used to resolve the correct localised short description.\n * Defaults to 'NL'.\n */\n language?: string;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's localised short description as HTML.\n */\nfunction ProductShortDescription(props: ProductShortDescriptionProps) {\n // Derived from props — pure render-time computation, no state needed.\n function getShortDescription(): string {\n const product = props.product as Product;\n if (!product?.shortDescriptions) return '';\n const lang = props.language || 'NL';\n const match = product.shortDescriptions.find((d: LocalizedString) => d.language === lang);\n return match?.value || product.shortDescriptions?.[0]?.value || '';\n }\n const html = getShortDescription();\n return (\n <>\n {!!html ? (\n <div\n dangerouslySetInnerHTML={{ __html: html }}\n className={cn(`propeller-product-short-description text-muted-foreground ${props.className || ''}`)}\n />\n ) : null}\n </>\n );\n}\n\nexport default ProductShortDescription;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport {\n PaginatedMediaVideoResponse,\n MediaVideo,\n} from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, getLanguageString, getLanguageUri } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductVideosProps {\n /**\n * Media videos for the product.\n * Obtain from `product.media?.videos`. The API answers `null` rather than an\n * empty page when a product has none, so this may be absent.\n */\n videos?: PaginatedMediaVideoResponse | null;\n\n /**\n * Language code used to resolve the correct localised video URI.\n */\n language: string;\n\n /**\n * Override any UI string.\n * Available keys: title, empty\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's media videos, embedding YouTube/Vimeo URLs in an iframe\n * and other URLs in a native `<video>` player.\n */\nfunction ProductVideos(props: ProductVideosProps) {\n const items: MediaVideo[] = props.videos?.items || [];\n const hasItems = items.length > 0;\n const lang = props.language || 'NL';\n // Case-insensitive: media language casing is not guaranteed to match the\n // storefront language. Same resolver ProductDownloads uses.\n function getVideoUri(video: MediaVideo): string {\n return getLanguageUri(video.videos, lang, '');\n }\n function getVideoTitle(video: MediaVideo): string {\n return getLanguageString(video.alt, lang, 'Video');\n }\n function isEmbeddable(uri: string): boolean {\n return uri.includes('youtube.com') || uri.includes('youtu.be') || uri.includes('vimeo.com');\n }\n function getEmbedUrl(uri: string): string {\n // Already an embed URL — return as-is\n if (uri.includes('youtube.com/embed/') || uri.includes('player.vimeo.com/video/')) {\n return uri;\n }\n // YouTube watch URL → embed URL\n if (uri.includes('youtube.com/watch')) {\n const url = new URL(uri);\n const videoId = url.searchParams.get('v') || '';\n return `https://www.youtube.com/embed/${videoId}`;\n }\n // YouTube short URL\n if (uri.includes('youtu.be/')) {\n const videoId = uri.split('youtu.be/')[1]?.split('?')[0] || '';\n return `https://www.youtube.com/embed/${videoId}`;\n }\n // Vimeo standard URL (https://vimeo.com/ID or https://vimeo.com/ID/HASH)\n if (uri.includes('vimeo.com/')) {\n const parts = uri.split('vimeo.com/')[1]?.split('?')[0]?.split('/') || [];\n const videoId = parts[0] || '';\n const hash = parts[1] || '';\n return hash\n ? `https://player.vimeo.com/video/${videoId}?h=${hash}`\n : `https://player.vimeo.com/video/${videoId}`;\n }\n return uri;\n }\n return (\n <div className={cn(`propeller-product-videos ${props.className || ''}`)}>\n {hasItems ? (\n <h3 className=\"propeller-product-videos__title text-base font-semibold text-foreground mb-3\">\n {getLabel(props.labels, 'title', 'Videos')}\n </h3>\n ) : null}\n {hasItems ? (\n <div className=\"propeller-product-videos__list space-y-4\">\n {items.map((video, index) => (\n <div\n className=\"propeller-product-videos__item rounded-container overflow-hidden border border-border bg-foreground\"\n key={index}\n data-embedded={!!getVideoUri(video) && isEmbeddable(getVideoUri(video)) ? 'true' : 'false'}\n >\n {!!getVideoUri(video) ? (\n <>\n {isEmbeddable(getVideoUri(video)) ? (\n <div\n className=\"propeller-product-videos__embed relative w-full\"\n style={{\n paddingBottom: '56.25%',\n }}\n >\n <iframe\n loading=\"lazy\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n className=\"propeller-product-videos__iframe absolute inset-0 w-full h-full\"\n src={getEmbedUrl(getVideoUri(video))}\n title={getVideoTitle(video)}\n allowFullScreen\n />\n </div>\n ) : null}\n {!isEmbeddable(getVideoUri(video)) ? (\n <video preload=\"metadata\" className=\"propeller-product-videos__video w-full\" controls>\n <source src={getVideoUri(video)} />\n </video>\n ) : null}\n </>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n {!hasItems ? (\n <p className=\"propeller-product-videos__empty text-sm text-muted-foreground\">{getLabel(props.labels, 'empty', 'No videos')}</p>\n ) : null}\n </div>\n );\n}\n\nexport default ProductVideos;\n"]}
1
+ {"version":3,"sources":["../src/composables/shared/utils/cn.ts","../src/components/Breadcrumbs.tsx","../src/components/ClusterJsonLd.tsx","../src/components/ItemListJsonLd.tsx","../src/components/ProductJsonLd.tsx","../src/components/CategoryShortDescription.tsx","../src/components/GridTitle.tsx","../src/components/ItemStock.tsx","../src/components/OrderItemCard.tsx","../src/components/OrderSummary.tsx","../src/components/OrderTotals.tsx","../src/components/ProductBulkPrices.tsx","../src/components/ProductDownloads.tsx","../src/components/ProductPrice.tsx","../src/components/ProductShortDescription.tsx","../src/components/ProductVideos.tsx"],"names":["jsx","safeJsonStringify","React2","React3","jsxs","getLabel","Fragment","React4","formatPrice","localeForLanguage","getCountryName","_getCountryName","isContentHidden","formatPriceHelper","getLanguageString"],"mappings":"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","file":"pure.js","sourcesContent":["/**\n * Merge class lists so the LAST conflicting utility wins.\n *\n * Every component here builds its class attribute by appending the host's\n * override to its own defaults. Attribute order does not decide CSS — the\n * cascade does — so `class=\"text-white text-cocoa\"` rendered white, and\n * `iconClassName=\"text-cocoa\"` looked like it did nothing. It appeared to work\n * on components whose baked-in default happened to lose the cascade anyway,\n * which is worse than a consistent failure.\n *\n * `twMerge` resolves the conflict properly: same utility group → later value\n * replaces the earlier one. Unknown classes (our BEM hooks, `propeller-*`) are\n * passed through untouched.\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { Category, LocalizedString } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface BreadcrumbsProps {\n /**\n * The category path from the category, product or cluster response.\n * Obtain from `category.categoryPath` or `product.category.categoryPath`.\n */\n categoryPath: Category[];\n\n /**\n * When true (default), the last item in the path is displayed as the\n * current page (non-clickable, aria-current=\"page\").\n * When false, the last item is omitted.\n * Ignored when `currentLabel` is provided — the extra crumb becomes\n * the current page instead.\n */\n showCurrent?: boolean;\n\n /**\n * The category of the current page. When provided and not already\n * the last item in `categoryPath`, it is appended automatically so\n * the trail always ends at the current category. This makes the\n * component correct whether the API's categoryPath includes the\n * current category or only its ancestors.\n */\n currentCategory?: Category;\n\n /**\n * Optional trailing crumb appended after the category path — typically\n * the name of the current product or cluster on a detail page.\n * When provided, this crumb is marked as the current page and the\n * last category becomes a normal link.\n */\n currentLabel?: string;\n\n /**\n * Optional URL for the trailing `currentLabel` crumb. When omitted,\n * the crumb is rendered as a non-link `<span>`.\n */\n currentUrl?: string;\n\n /**\n * When true (default), a \"Home\" link is prepended to the trail.\n */\n showHome?: boolean;\n\n /**\n * URL for the Home link. Defaults to '/'.\n */\n homeUrl?: string;\n\n /**\n * Language code used to resolve localised category names and slugs.\n * Defaults to 'NL'.\n */\n language?: string;\n\n /**\n * Custom URL builder for category links.\n * Receives the Category object and its zero-based index in the path.\n * When omitted, URLs default to `/category/{categoryId}/{slug}`.\n */\n getUrl?: (category: Category, index: number) => string;\n\n /**\n * Override any UI string.\n * Available keys: home, separator\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n\n /** Configuration object passed to the component */\n configuration?: any;\n}\n/**\n * Renders a breadcrumb trail from a category path, with an optional Home link\n * and an optional trailing crumb for the current product/cluster page.\n */\nfunction Breadcrumbs(props: BreadcrumbsProps) {\n const lang = props.language || 'NL';\n // Filter the path to drop the base category, then optionally append the\n // explicit currentCategory if the API didn't already include it as the tail.\n const path = props.categoryPath || [];\n const baseId = props.configuration?.baseCategoryId;\n const filtered = baseId\n ? path.filter((cat: Category) => cat.categoryId !== baseId)\n : path;\n let items = filtered;\n if (props.currentCategory) {\n const last = filtered[filtered.length - 1];\n if (!last || last.categoryId !== props.currentCategory.categoryId) {\n items = [...filtered, props.currentCategory];\n }\n }\n const displayItems = props.showCurrent === false && items.length > 0\n ? items.slice(0, items.length - 1)\n : items;\n function getCategoryName(cat: Category): string {\n const match = cat.names?.find((n: LocalizedString) => n.language === lang);\n return match?.value || cat.names?.[0]?.value || '';\n }\n function getCategoryUrl(cat: Category, index: number): string {\n if (props.getUrl) return props.getUrl(cat, index);\n // Consumer-provided URL builder takes precedence. Fall back to the\n // configuration helper when present (legacy boilerplate pattern), then\n // to the documented default `/category/{categoryId}/{slug}` URL.\n // Reading `configuration.urls.getCategoryUrl` unconditionally crashed\n // pages that don't thread `configuration` into the Breadcrumbs island\n // (CategoryBreadcrumbsIsland / ProductBreadcrumbsIsland in the Next\n // boilerplate both pass only `categoryPath` + `labels`).\n // Invoke the configuration helper as a method (not via an extracted\n // reference) so that `this` is still bound to `configuration.urls` —\n // some boilerplates write the helper as `getCategoryUrl(...) { return\n // ...this.pattern... }` and detaching the reference crashes with\n // \"Cannot read properties of undefined (reading 'pattern')\".\n const urls = props.configuration?.urls;\n if (urls && typeof urls.getCategoryUrl === 'function') {\n return urls.getCategoryUrl(cat, props.language);\n }\n const slug = cat.slugs?.find((s: LocalizedString) => s.language === lang)?.value\n || cat.slugs?.[0]?.value\n || '';\n return `/category/${cat.categoryId}/${slug}`;\n }\n function isCurrentItem(index: number): boolean {\n if (props.showCurrent === false) return false;\n if (props.currentLabel) return false;\n return index === displayItems.length - 1;\n }\n // Show separator when Home precedes this item, or when a previous category item exists.\n const showSeparatorBefore = (index: number) =>\n props.showHome !== false || index > 0;\n return (\n <nav aria-label={getLabel(props.labels, 'breadcrumbAriaLabel', 'Breadcrumb')} className={cn(`propeller-breadcrumbs ${props.className || ''}`)}>\n <ol className=\"propeller-breadcrumbs__list flex flex-wrap items-center text-sm text-muted-foreground\">\n {props.showHome !== false ? (\n <li className=\"propeller-breadcrumbs__item flex items-center\" data-home=\"true\">\n <a\n className=\"propeller-breadcrumbs__link hover:text-foreground transition-colors\"\n href={props.homeUrl || '/'}\n >\n {getLabel(props.labels, 'home', 'Home')}\n </a>\n </li>\n ) : null}\n {displayItems.map((cat, index) => (\n <li\n className=\"propeller-breadcrumbs__item flex items-center\"\n key={cat.categoryId || index}\n data-current={isCurrentItem(index) ? 'true' : 'false'}\n >\n {showSeparatorBefore(index) ? (\n <span aria-hidden=\"true\" className=\"propeller-breadcrumbs__separator mx-2 select-none text-muted-foreground/40\">\n {getLabel(props.labels, 'separator', '/')}\n </span>\n ) : null}\n {isCurrentItem(index) ? (\n <span\n aria-current=\"page\"\n className=\"propeller-breadcrumbs__link propeller-breadcrumbs__link--current text-foreground\"\n >\n {getCategoryName(cat)}\n </span>\n ) : null}\n {!isCurrentItem(index) ? (\n <a\n className=\"propeller-breadcrumbs__link hover:text-foreground transition-colors\"\n href={getCategoryUrl(cat, index)}\n >\n {getCategoryName(cat)}\n </a>\n ) : null}\n </li>\n ))}\n {props.currentLabel ? (\n <li\n className=\"propeller-breadcrumbs__item flex items-center\"\n data-current=\"true\"\n >\n <span aria-hidden=\"true\" className=\"propeller-breadcrumbs__separator mx-2 select-none text-muted-foreground/40\">\n {getLabel(props.labels, 'separator', '/')}\n </span>\n {props.currentUrl ? (\n <a\n aria-current=\"page\"\n className=\"propeller-breadcrumbs__link propeller-breadcrumbs__link--current text-foreground\"\n href={props.currentUrl}\n >\n {props.currentLabel}\n </a>\n ) : (\n <span\n aria-current=\"page\"\n className=\"propeller-breadcrumbs__link propeller-breadcrumbs__link--current text-foreground\"\n >\n {props.currentLabel}\n </span>\n )}\n </li>\n ) : null}\n </ol>\n </nav>\n );\n}\n\nexport default Breadcrumbs;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads.\n *\n * Emits a `<script type=\"application/ld+json\">` with a schema.org Product\n * payload representing the cluster (clusters use `@type: \"Product\"` — schema.org\n * has no Cluster type; the cluster's `defaultProduct` supplies brand/SKU/price/image).\n * Returns `null` when the cluster has no usable name AND no URL.\n */\nimport * as React from 'react';\nimport type { Cluster } from '@propeller-commerce/propeller-sdk-v2';\nimport {\n buildClusterJsonLd,\n safeJsonStringify,\n type JsonLdContext,\n} from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface ClusterJsonLdProps {\n /** The cluster to describe. */\n cluster: Cluster;\n /** Per-request context: siteUrl, language, currency, portalMode, user, URL builders. */\n context: JsonLdContext;\n}\n\nfunction ClusterJsonLd(props: ClusterJsonLdProps) {\n const data = buildClusterJsonLd(props.cluster, props.context);\n if (!data) return null;\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: safeJsonStringify(data) }}\n />\n );\n}\n\nexport default React.memo(ClusterJsonLd);\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads.\n *\n * Emits a single `<script type=\"application/ld+json\">` containing a schema.org\n * `ItemList` of `Product` items, one per element in the `products` array.\n * Scope is intentionally first-page only — caller passes whatever array is\n * present in the initial SSR HTML; client-side filter/sort/page navigation\n * does NOT update the script tag (crawlers only see the SSR snapshot anyway).\n *\n * Clusters in the response are unwrapped to their `defaultProduct` for the\n * embedded Product node, but the ListItem URL points to the cluster page.\n * Returns `null` when the list is empty.\n */\nimport * as React from 'react';\nimport type { Product } from '@propeller-commerce/propeller-sdk-v2';\nimport {\n buildItemListJsonLd,\n safeJsonStringify,\n type JsonLdContext,\n} from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface ItemListJsonLdProps {\n /** First-page products (from server-side fetch). */\n products: ReadonlyArray<Product>;\n /** Per-request context: siteUrl, language, currency, portalMode, user, URL builders. */\n context: JsonLdContext;\n}\n\nfunction ItemListJsonLd(props: ItemListJsonLdProps) {\n const data = buildItemListJsonLd(props.products, props.context);\n if (!data) return null;\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: safeJsonStringify(data) }}\n />\n );\n}\n\nexport default React.memo(ItemListJsonLd);\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n *\n * Emits a single `<script type=\"application/ld+json\">` with the schema.org\n * Product payload built from the SDK `Product`. Returns `null` (no DOM) when\n * the input has no usable name AND no URL. Offers are gated by portal mode\n * (semi-closed + anonymous → no `offers` block).\n */\nimport * as React from 'react';\nimport type { Product } from '@propeller-commerce/propeller-sdk-v2';\nimport {\n buildProductJsonLd,\n safeJsonStringify,\n type JsonLdContext,\n} from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface ProductJsonLdProps {\n /** The product to describe. */\n product: Product;\n /** Per-request context: siteUrl, language, currency, portalMode, user, URL builders. */\n context: JsonLdContext;\n}\n\nfunction ProductJsonLd(props: ProductJsonLdProps) {\n const data = buildProductJsonLd(props.product, props.context);\n if (!data) return null;\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: safeJsonStringify(data) }}\n />\n );\n}\n\nexport default React.memo(ProductJsonLd);\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport type { Category, LocalizedString } from '@propeller-commerce/propeller-sdk-v2';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface CategoryShortDescriptionProps {\n // ── Required ────────────────────────────────────────────────────────────\n\n /**\n * Language code used to resolve the correct localised short description\n * from `category.shortDescriptions`.\n */\n language: string;\n\n // ── Optional ────────────────────────────────────────────────────────────\n\n /**\n * Propeller Category object.\n * The component reads `category.shortDescriptions` (an array of LocalizedString)\n * and renders the matching language entry as HTML.\n */\n category?: Category;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a category's localised HTML short description.\n */\nfunction CategoryShortDescription(props: CategoryShortDescriptionProps) {\n // Derived from props — computed once on render.\n const match = props.category?.shortDescriptions?.find(\n (d: LocalizedString) => d.language === props.language,\n );\n const html = match?.value || '';\n return (\n <>\n {!!html ? (\n <div className={cn(`propeller-category-short-description mb-6 ${props.className || ''}`)}>\n <div\n className=\"propeller-category-short-description__content text-muted-foreground\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </div>\n ) : null}\n </>\n );\n}\n\nexport default CategoryShortDescription;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface GridTitleProps {\n // ── Required ────────────────────────────────────────────────────────────\n\n /**\n * The main heading text to display.\n * Typically the category name, search term, or brand name.\n */\n title: string;\n\n /**\n * Language code for the content.\n * Defaults to 'NL'. Resolved from `<PropellerProvider>` when not passed explicitly.\n */\n language?: string;\n\n // ── Optional ────────────────────────────────────────────────────────────\n\n /**\n * Override the heading tag level.\n * Defaults to 'h1'. Use 'h2' when the grid is embedded inside\n * a page that already has an h1.\n */\n headingLevel?: string;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders the heading for a product grid page (category, search or brand\n * name), with a configurable heading level.\n */\nfunction GridTitle(props: GridTitleProps) {\n return (\n <div className={cn(`propeller-grid-title mb-8 ${(props.className as string) || ''}`)}>\n <div className=\"propeller-grid-title__row flex items-baseline gap-3 mb-3\">\n {(props.headingLevel as string) === 'h2' ? (\n <h2 className=\"propeller-grid-title__heading text-3xl sm:text-4xl font-bold tracking-tight\">{props.title}</h2>\n ) : null}\n {(props.headingLevel as string) !== 'h2' ? (\n <h1 className=\"propeller-grid-title__heading text-3xl sm:text-4xl font-bold tracking-tight\">{props.title}</h1>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport default GridTitle;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { ProductInventory } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ItemStockProps {\n /**\n * Product inventory to display stock and availability for.\n * Required — drives all stock calculations and display logic.\n */\n inventory: ProductInventory;\n\n /**\n * Shows whether the product is available or not available.\n * Defaults to true.\n */\n showAvailability?: boolean;\n\n /**\n * Shows the actual stock quantity (`inventory.totalQuantity`).\n * Defaults to true.\n */\n showStock?: boolean;\n\n /**\n * UI string overrides.\n * Available keys: inStock, outOfStock, lowStock, available, notAvailable, pieces\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders stock badges for a product: an availability indicator and/or a\n * stock-status badge (in stock / low stock / out of stock) with quantity.\n */\nfunction ItemStock(props: ItemStockProps) {\n \n function getTotalQuantity(): number {\n const qty = (props.inventory as ProductInventory)?.totalQuantity;\n return qty !== undefined && qty !== null ? qty : -1;\n }\n function isAvailable(): boolean {\n return getTotalQuantity() > 0;\n }\n function getStockStatusLabel(): string {\n const qty = getTotalQuantity();\n if (qty < 0) return '';\n if (qty === 0) return getLabel(props.labels, 'outOfStock', 'Out of stock');\n if (qty <= 5) return getLabel(props.labels, 'lowStock', 'Low stock');\n return getLabel(props.labels, 'inStock', 'In stock');\n }\n function getStockStatusClass(): string {\n const qty = getTotalQuantity();\n if (qty <= 0) return 'text-destructive bg-destructive/10 border-destructive/20';\n if (qty <= 5) return 'text-warning bg-warning/10 border-warning/20';\n return 'text-success bg-success/10 border-success/20';\n }\n function getStockStatusData(): string {\n const qty = getTotalQuantity();\n if (qty <= 0) return 'out';\n if (qty <= 5) return 'low';\n return 'in';\n }\n function getAvailabilityLabel(): string {\n return isAvailable()\n ? getLabel(props.labels, 'available', 'Available')\n : getLabel(props.labels, 'notAvailable', 'Not available');\n }\n function getAvailabilityClass(): string {\n return isAvailable()\n ? 'text-success bg-success/10 border-success/20'\n : 'text-destructive bg-destructive/10 border-destructive/20';\n }\n function getAvailabilityDotClass(): string {\n return isAvailable() ? 'bg-success' : 'bg-destructive';\n }\n function hasInventory(): boolean {\n return !!(props.inventory as ProductInventory) && getTotalQuantity() >= 0;\n }\n return (\n <>\n {hasInventory() ? (\n <>\n <div\n className={cn(`propeller-item-stock flex flex-wrap items-center gap-1.5 ${(props.className as string) || ''}`)}\n data-available={isAvailable() ? 'true' : 'false'}\n data-stock={getStockStatusData()}\n >\n {props.showAvailability !== false ? (\n <span\n className={`propeller-item-stock__availability inline-flex items-center gap-1 whitespace-nowrap rounded-full border px-2 py-0.5 text-[11px] font-medium ${getAvailabilityClass()}`}\n >\n <span\n className={`propeller-item-stock__availability-dot h-1.5 w-1.5 flex-shrink-0 rounded-full ${getAvailabilityDotClass()}`}\n />\n {getAvailabilityLabel()}\n </span>\n ) : null}\n {props.showStock !== false && !!getStockStatusLabel() ? (\n <span\n className={`propeller-item-stock__status inline-flex items-center gap-1 whitespace-nowrap rounded-full border px-2 py-0.5 text-[11px] font-medium ${getStockStatusClass()}`}\n >\n {getStockStatusLabel()}\n {getTotalQuantity() > 0 ? (\n <span className=\"propeller-item-stock__count opacity-70\">\n ({getTotalQuantity()}{' '}\n {getLabel(props.labels, 'pieces', 'pcs')})\n </span>\n ) : null}\n </span>\n ) : null}\n </div>\n </>\n ) : null}\n </>\n );\n}\n\n// Memoized: pure leaf rendered inside memoized cards; skips re-render when its\n// (inventory / labels / flags) props are shallow-equal (rbp §5.2).\nexport default React.memo(ItemStock);\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport type { Cluster, OrderItem, Product } from '@propeller-commerce/propeller-sdk-v2';\nimport { formatPrice, getLabel, getLocalizedValue, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport DefaultProductPriceImpl from './ProductPrice';\nimport DefaultItemStockImpl from './ItemStock';\n\nexport interface OrderItemCardProps {\n /** The order item to display */\n orderItem: OrderItem;\n\n /** Child order items (rendered as indented sub-rows beneath the parent) */\n childItems?: OrderItem[];\n\n /**\n * Language used to resolve localized product names and the slugs in the\n * item's PDP link. Defaults to the catalog's default language.\n *\n * This component is RSC-safe (no hooks, no context), so the host has to pass\n * it — there is nothing to read it from. Without it a non-default storefront\n * renders default-language names and, worse, default-language slugs in the\n * links.\n */\n language?: string;\n\n /**\n * URL builders from the host's configuration. Supply them and the item link\n * is generated the same way every other link on the storefront is — which is\n * what carries the locale prefix. Without it the component falls back to a\n * bare `/product/:id/:slug`, and on a prefixed storefront that link drops the\n * visitor onto the default language.\n */\n configuration?: {\n urls?: {\n getProductUrl?: (product: Product, language?: string) => string;\n getClusterUrl?: (cluster: Cluster, language?: string) => string;\n };\n };\n\n /** Should the item title be a link to the PDP */\n titleLinkable?: boolean;\n\n /** Display a small thumbnail of the order item */\n showImage?: boolean;\n\n /** Should stock info be displayed */\n showStockComponent?: boolean;\n\n /** Display the SKU of the order item beneath the item name */\n showSku?: boolean;\n\n /** Display the quantity of the order item */\n showQuantity?: boolean;\n\n /** Display the price of the order item */\n showPrice?: boolean;\n\n /** Display the discount column */\n showDiscount?: boolean;\n\n /** Should the order item notes field be displayed */\n showItemNotes?: boolean;\n\n /** Render as a child/sub-item (indented, no image) */\n isChildItem?: boolean;\n\n /** Custom price formatting function */\n formatPrice?: (price: number) => string;\n\n /** Currency symbol used by the default formatter. Default: `'€'`. */\n currency?: string;\n\n /** Translated labels keyed by the slugs used inside the component (see\n * `getLabel` calls). Missing keys fall back to the English defaults. */\n labels?: Record<string, string>;\n\n // ───── Extension API (RSC-safe variant) ─────\n // Direct-prop slot fallback (no useResolvedProps — keeps the component\n // server-component-safe). Caller passes the desired component; if absent,\n // renders the Default* fallback.\n priceComponent?: React.ComponentType<import('@propeller-commerce/propeller-v2-core-ui').PriceComponentProps>;\n stockComponent?: React.ComponentType<import('@propeller-commerce/propeller-v2-core-ui').StockComponentProps>;\n}\n\n// ── Pure accessors (module scope — created once, not per render) ────────────────\n\n// `[0]` is the catalog's default-language entry, so on any other storefront\n// these printed the wrong-language name and — the part that actually breaks —\n// emitted a default-language SLUG into the item's link.\nfunction getProductName(orderItem: OrderItem, language?: string): string {\n return (\n getLocalizedValue(orderItem?.product?.names, language, '') ||\n orderItem?.name ||\n 'Unknown Product'\n );\n}\n\ntype HostUrls = OrderItemCardProps['configuration'] extends infer C\n ? C extends { urls?: infer U }\n ? U\n : never\n : never;\n\nfunction getClusterUrl(orderItem: OrderItem, language?: string, urls?: HostUrls): string {\n const cluster = orderItem?.product?.cluster;\n if (!cluster) return '';\n const id = cluster.clusterId;\n const slug = getLocalizedValue(cluster.slugs, language, '');\n if (!id || !slug) return '';\n return urls?.getClusterUrl?.(cluster as Cluster, language) || `/cluster/${id}/${slug}`;\n}\n\nfunction getProductUrl(orderItem: OrderItem, language?: string, urls?: HostUrls): string {\n const cu = getClusterUrl(orderItem, language, urls);\n if (cu) return cu;\n const product = orderItem?.product;\n const id = product?.productId;\n const slug = getLocalizedValue(product?.slugs, language, '');\n if (id && slug) return urls?.getProductUrl?.(product as Product, language) || `/product/${id}/${slug}`;\n return '';\n}\n\n/**\n * Renders a single order line item as a table row (with optional indented\n * child-item rows), showing image, SKU, quantity, discount and price.\n *\n * `orderItem.product` is optional and really can be absent: a product that is\n * hidden, withdrawn or deleted from the catalog still appears on the orders and\n * quotes it was sold on, but the API returns no product record for it. Every\n * product-derived value below therefore falls back to the order item, which\n * carries its own snapshot of the line — name, sku, quantity and prices — taken\n * when the order was placed. Such a row renders as plain text: the placeholder\n * thumbnail, the untranslated `orderItem.name` (there are no localized names to\n * resolve), and no PDP link (there are no slugs to build one from).\n */\nfunction OrderItemCard(props: OrderItemCardProps) {\n const item = props.orderItem;\n const isChildItem = props.isChildItem || false;\n\n // Display toggles — resolved once (child items never show image/sku).\n const titleLinkable = props.titleLinkable !== undefined ? props.titleLinkable : true;\n const showImage = isChildItem ? false : props.showImage !== undefined ? props.showImage : true;\n const showSku = isChildItem ? false : props.showSku !== undefined ? props.showSku : true;\n const showQuantity = props.showQuantity !== undefined ? props.showQuantity : true;\n const showPrice = props.showPrice !== undefined ? props.showPrice : true;\n const showDiscount = props.showDiscount !== undefined ? props.showDiscount : false;\n const showStockComponent =\n props.showStockComponent !== undefined ? props.showStockComponent : false;\n const showItemNotes = props.showItemNotes !== undefined ? props.showItemNotes : false;\n\n // Derived item values — computed once per render (previously each was a\n // function redefined every render and called multiple times across the JSX).\n const productName = getProductName(item, props.language);\n const productSku = item?.product?.sku || item?.sku || '';\n const productImage = item?.product?.media?.images?.items?.[0]?.imageVariants?.[0]?.url || '';\n const productUrl = getProductUrl(item, props.language, props.configuration?.urls);\n const quantity = item?.quantity || 0;\n const priceTotal = item?.priceTotal || 0;\n const discount = item?.discount || 0;\n const originalPrice = item?.originalPrice || 0;\n const discountPercentage =\n originalPrice > 0 && discount > 0 ? (discount / originalPrice) * 100 : 0;\n const notes = item?.notes || '';\n const hasChildren = (props.childItems || []).length > 0;\n\n function formatItemPrice(price: number): string {\n if (props.formatPrice) {\n return props.formatPrice(price);\n }\n if (!price && price !== 0) return '-';\n return formatPrice(price, { symbol: props.currency ?? '€', locale: localeForLanguage(props.language) });\n }\n\n const discountDisplay =\n discountPercentage > 0\n ? `${formatItemPrice(discount)} (${discountPercentage.toFixed(2).replace('.', ',')}%)`\n : formatItemPrice(discount);\n\n return (\n <tbody className=\"propeller-order-item-card\">\n <tr\n className={`propeller-order-item-card__row ${isChildItem ? 'border-0' : 'hover:bg-surface-hover transition'}`}\n data-child={isChildItem ? 'true' : 'false'}\n >\n <td\n className={`propeller-order-item-card__cell propeller-order-item-card__cell--product ${isChildItem ? 'px-6 py-2 pl-28' : 'px-6 py-4'}`}\n >\n <div className=\"flex items-center gap-4\">\n {showImage ? (\n productImage ? (\n <div className=\"propeller-order-item-card__media relative w-16 h-16 flex-shrink-0 rounded overflow-hidden\">\n <img\n className=\"propeller-order-item-card__image object-cover w-full h-full\"\n src={productImage}\n alt={productName}\n />\n </div>\n ) : (\n <div className=\"propeller-order-item-card__image-placeholder w-16 h-16 bg-surface-hover rounded flex items-center justify-center text-foreground-subtle text-xs\">\n {getLabel(props.labels, 'noImage', 'No Img')}\n </div>\n )\n ) : null}\n <div>\n {titleLinkable && productUrl && !isChildItem ? (\n <a\n className=\"propeller-order-item-card__title font-medium text-foreground hover:text-primary hover:underline\"\n href={productUrl}\n >\n {productName}\n </a>\n ) : (\n <span\n className={`propeller-order-item-card__title ${isChildItem ? 'text-sm text-muted-foreground' : 'font-medium'}`}\n >\n {productName}\n </span>\n )}\n {showSku && productSku ? (\n <p className=\"propeller-order-item-card__sku text-sm text-muted-foreground mt-1\">\n SKU: {productSku}\n </p>\n ) : null}\n {showItemNotes && notes ? (\n <p className=\"propeller-order-item-card__notes text-sm text-foreground-subtle mt-1 italic\">\n {notes}\n </p>\n ) : null}\n {showStockComponent && item?.product?.inventory\n ? (() => {\n // Delegate to the injected stock slot, or fall back to\n // the default stock display. Replaces the prior literal\n // \"Stock info\" placeholder text. The `inventory` guard\n // above bridges the contract-vs-default mismatch: the\n // shared StockComponentProps.inventory is optional while\n // DefaultItemStock requires it, so we only render when\n // the SDK actually returned inventory data.\n const StockImpl = props.stockComponent ?? DefaultItemStockImpl;\n return (\n <StockImpl\n inventory={item.product.inventory}\n showStock={true}\n showAvailability={true}\n labels={props.labels}\n />\n );\n })()\n : null}\n </div>\n </div>\n </td>\n {showQuantity ? (\n <td\n className={\n isChildItem\n ? 'propeller-order-item-card__cell propeller-order-item-card__cell--quantity px-6 py-2 text-center text-sm text-muted-foreground'\n : 'propeller-order-item-card__cell propeller-order-item-card__cell--quantity px-6 py-4 text-center'\n }\n >\n {quantity}\n </td>\n ) : null}\n {showDiscount ? (\n <td\n className={\n isChildItem\n ? 'propeller-order-item-card__cell propeller-order-item-card__cell--discount px-6 py-2 text-right text-sm text-muted-foreground'\n : 'propeller-order-item-card__cell propeller-order-item-card__cell--discount px-6 py-4 text-right whitespace-nowrap text-warning'\n }\n >\n {discount > 0 ? <>{discountDisplay}</> : null}\n </td>\n ) : null}\n {showPrice ? (\n <td\n className={\n isChildItem\n ? 'propeller-order-item-card__cell propeller-order-item-card__cell--price px-6 py-2 text-right whitespace-nowrap text-sm text-muted-foreground'\n : 'propeller-order-item-card__cell propeller-order-item-card__cell--price px-6 py-4 text-right whitespace-nowrap'\n }\n >\n {(() => {\n // When the consumer injects a priceComponent, delegate to it;\n // otherwise keep the existing inline line-total rendering.\n //\n // Contract-vs-data note (same as CartItem): the\n // PriceComponentProps.price contract expects an SDK ProductPrice\n // (catalog/unit price), while this cell historically renders the\n // line total `item.priceTotal`. We pass `item.product?.price`\n // (catalog price) to the injected component to honour the\n // contract; consumers who need the line total can read it off\n // the labels/className surface or compute their own from the\n // catalog price + their own quantity context. The default\n // (uninjected) path is unchanged.\n //\n // The `product.price` guard is what keeps a product-less line\n // priced: an order item whose product came back null (hidden,\n // withdrawn, deleted from the catalog) has no catalog price to\n // hand the slot, and the slot renders blank when given\n // `undefined` — silently dropping the line total from the row.\n // Fall through to the order item's own `priceTotal` instead.\n const PriceImpl = props.priceComponent;\n if (PriceImpl && item?.product?.price) {\n return (\n <PriceImpl\n price={item.product.price}\n currency={props.currency}\n labels={props.labels}\n />\n );\n }\n return formatItemPrice(priceTotal);\n })()}\n </td>\n ) : null}\n </tr>\n {hasChildren ? (\n <>\n {(props.childItems || []).map((child) => (\n <tr\n className=\"propeller-order-item-card__child-row border-0\"\n key={child.id || child.uuid}\n data-child=\"true\"\n >\n <td className=\"propeller-order-item-card__cell propeller-order-item-card__cell--product px-6 py-2 pl-28\">\n <span className=\"propeller-order-item-card__child-title text-sm text-muted-foreground\">\n {getLocalizedValue(child.product?.names, props.language, '') || child.name || 'Unknown'}\n </span>\n </td>\n {showQuantity ? (\n <td className=\"propeller-order-item-card__cell propeller-order-item-card__cell--quantity px-6 py-2 text-center text-sm text-muted-foreground\">\n {child.quantity || 0}\n </td>\n ) : null}\n {showDiscount ? (\n <td className=\"propeller-order-item-card__cell propeller-order-item-card__cell--discount px-6 py-2 text-right text-sm text-muted-foreground\" />\n ) : null}\n {showPrice ? (\n <td className=\"propeller-order-item-card__cell propeller-order-item-card__cell--price px-6 py-2 text-right whitespace-nowrap text-sm text-muted-foreground\">\n {formatItemPrice(child.priceTotal || 0)}\n </td>\n ) : null}\n </tr>\n ))}\n </>\n ) : null}\n </tbody>\n );\n}\n\nexport default OrderItemCard;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { getLabel, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport { getCountryName as _getCountryName } from '@propeller-commerce/propeller-v2-core-ui';\nimport { formatPrice } from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface OrderSummaryProps {\n /**\n * Storefront language ('EN', 'NL', …). Decides the number format prices are\n * rendered in — without it they fall back to Dutch separators regardless of\n * the language the shopper is reading.\n */\n language?: string;\n\n /** The order object from propeller-sdk-v2 */\n order: any;\n\n /** The CSS class for the order summary container */\n orderSummaryContainerClass?: string;\n\n /** Title of the order summary */\n title?: string;\n\n /** Show the order number */\n showOrderNumber?: boolean;\n\n /** Show the order date */\n showOrderDate?: boolean;\n\n /** Show the order status */\n showOrderStatus?: boolean;\n\n /** Show the order total */\n showOrderTotal?: boolean;\n\n /** Custom price formatting function */\n formatPrice?: (price: number) => string;\n\n /** Show the invoice address */\n showInvoiceAddress?: boolean;\n\n /** Show the delivery address */\n showDeliveryAddress?: boolean;\n\n /** Show payment, carrier, and delivery date info */\n showDeliveryInfo?: boolean;\n\n /** Show order remarks and reference */\n showRemarks?: boolean;\n\n /** Custom date formatting function */\n formatDate?: (dateString: string) => string;\n\n /** Labels for the component */\n labels?: Record<string, string>;\n\n /**\n * Localized order/quote status labels, keyed by the raw backend status\n * (e.g. `{ NEW: 'Nieuw', REQUEST: 'Aangevraagd' }`). Unknown → raw value.\n */\n statusLabels?: Record<string, string>;\n\n /**\n * Localized payment-method names, keyed by the raw method value LOWER-CASED\n * (e.g. `{ rekening: 'Op rekening', account: 'Op rekening' }`). The backend\n * sends different raw values on the order vs quote path (REKENING / ACCOUNT),\n * so mapping both here makes the same method render identically. Unknown →\n * raw value.\n */\n paymethodLabels?: Record<string, string>;\n\n /** List of countries for resolving codes to names [{code: 'NL', name: 'Netherlands'}, ...] */\n countries?: {\n code: string;\n name: string;\n }[];\n\n /** Currency symbol used by the default formatter. Default: `'€'`. */\n currency?: string;\n}\n\n/**\n * Renders a read-only summary of an order: meta fields (number, date, status,\n * total), invoice/delivery addresses, delivery info and remarks.\n */\nfunction OrderSummary(props: OrderSummaryProps) {\n const order = props.order;\n\n const containerClass = props.orderSummaryContainerClass || 'order-summary';\n const showOrderNumber = props.showOrderNumber !== undefined ? props.showOrderNumber : true;\n const showOrderDate = props.showOrderDate !== undefined ? props.showOrderDate : true;\n const showOrderStatus = props.showOrderStatus !== undefined ? props.showOrderStatus : true;\n const showInvoiceAddress =\n props.showInvoiceAddress !== undefined ? props.showInvoiceAddress : true;\n const showDeliveryAddress =\n props.showDeliveryAddress !== undefined ? props.showDeliveryAddress : true;\n const showOrderTotal = props.showOrderTotal !== undefined ? props.showOrderTotal : true;\n const showDeliveryInfo = props.showDeliveryInfo !== undefined ? props.showDeliveryInfo : true;\n const showRemarks = props.showRemarks !== undefined ? props.showRemarks : true;\n\n // Order field accessors — computed once per render (previously each was a\n // function redefined every render; addresses.find() ran on every JSX read).\n const orderNumber = order?.id || '';\n const orderDate = order?.createdAt || '';\n const rawStatus = order?.status || '';\n // Map raw backend enums to localized labels; unknown → raw value. Was printing\n // the raw enum (NEW / REQUEST / REKENING / ACCOUNT) straight to the customer.\n const orderStatus = rawStatus ? (props.statusLabels?.[rawStatus] || rawStatus) : '';\n const orderTotal = Number(order?.total?.net || 0);\n const orderReference = order?.reference || '';\n const orderRemarks = order?.remarks || '';\n const rawPaymentMethod = order?.paymentData?.method || '';\n const paymentMethod = rawPaymentMethod\n ? (props.paymethodLabels?.[rawPaymentMethod.toLowerCase()] || rawPaymentMethod)\n : '';\n const carrierName = order?.postageData?.carrier || '';\n const addresses = order?.addresses || [];\n const invoiceAddress = addresses.find((a: any) => a.type === 'invoice') || null;\n const deliveryAddress = addresses.find((a: any) => a.type === 'delivery') || null;\n\n function formatItemPrice(price: number): string {\n if (props.formatPrice) {\n return props.formatPrice(price);\n }\n return formatPrice(price || 0, { symbol: props.currency ?? '€', locale: localeForLanguage(props.language) });\n }\n\n // Numeric day-first DD-MM-YYYY. Was hardcoded en-US (M/D/YYYY), which NL\n // readers misparse by months. Locale-neutral order; override via `formatDate`.\n function numericDate(dateString: string): string {\n const d = new Date(dateString);\n if (isNaN(d.getTime())) return dateString;\n const day = String(d.getDate()).padStart(2, '0');\n const month = String(d.getMonth() + 1).padStart(2, '0');\n return `${day}-${month}-${d.getFullYear()}`;\n }\n\n function formatOrderDate(dateString: string): string {\n if (props.formatDate) {\n return props.formatDate(dateString);\n }\n return numericDate(dateString);\n }\n\n const requestDateRaw = order?.postageData?.requestDate;\n let requestDate = '';\n if (requestDateRaw) {\n if (props.formatDate) {\n requestDate = props.formatDate(requestDateRaw);\n } else {\n requestDate = numericDate(requestDateRaw);\n }\n }\n\n const getCountryName = (code: string): string => _getCountryName(code, props.countries);\n\n return (\n <div className={`propeller-order-summary ${containerClass}`}>\n {props.title ? (\n <h2 className=\"propeller-order-summary__title text-xl font-bold mb-4\">{props.title}</h2>\n ) : null}\n <div className=\"propeller-order-summary__meta grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 pb-5 border-b border-border mb-5\">\n {showOrderNumber && orderNumber ? (\n <div className=\"propeller-order-summary__meta-item\" data-meta=\"order-number\">\n <p className=\"propeller-order-summary__meta-label text-sm text-muted-foreground mb-1\">\n {getLabel(props.labels, 'orderNumber', 'Order Number')}\n </p>\n <p className=\"propeller-order-summary__meta-value font-semibold\">{orderNumber}</p>\n </div>\n ) : null}\n {showOrderDate && orderDate ? (\n <div className=\"propeller-order-summary__meta-item\" data-meta=\"order-date\">\n <p className=\"propeller-order-summary__meta-label text-sm text-muted-foreground mb-1\">\n {getLabel(props.labels, 'orderDate', 'Order Date')}\n </p>\n <p className=\"propeller-order-summary__meta-value font-semibold\">\n {formatOrderDate(orderDate)}\n </p>\n </div>\n ) : null}\n {showOrderStatus && orderStatus ? (\n <div className=\"propeller-order-summary__meta-item\" data-meta=\"status\">\n <p className=\"propeller-order-summary__meta-label text-sm text-muted-foreground mb-1\">\n {getLabel(props.labels, 'status', 'Status')}\n </p>\n <span className=\"propeller-order-summary__status inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-secondary/10 text-secondary\">\n {orderStatus}\n </span>\n </div>\n ) : null}\n {showOrderTotal ? (\n <div className=\"propeller-order-summary__meta-item\" data-meta=\"total\">\n <p className=\"propeller-order-summary__meta-label text-sm text-muted-foreground mb-1\">\n {getLabel(props.labels, 'total', 'Total')}\n </p>\n <p className=\"propeller-order-summary__total font-bold text-lg\">\n {formatItemPrice(orderTotal)}\n </p>\n </div>\n ) : null}\n </div>\n <div className=\"propeller-order-summary__addresses grid grid-cols-1 md:grid-cols-2 gap-6 pb-5\">\n {showInvoiceAddress ? (\n <div className=\"propeller-order-summary__address space-y-2\" data-address=\"invoice\">\n <h3 className=\"propeller-order-summary__address-title text-sm font-semibold text-muted-foreground uppercase tracking-wide\">\n {getLabel(props.labels, 'invoiceAddress', 'Invoice Address')}\n </h3>\n {invoiceAddress && invoiceAddress.street ? (\n <div className=\"text-sm space-y-1\">\n {invoiceAddress.company ? (\n <p className=\"font-medium\">{invoiceAddress.company}</p>\n ) : null}\n <p>\n {[invoiceAddress.firstName, invoiceAddress.middleName, invoiceAddress.lastName]\n .filter(Boolean)\n .join(' ')}\n </p>\n <p>\n {[invoiceAddress.street, invoiceAddress.number, invoiceAddress.numberExtension]\n .filter(Boolean)\n .join(' ')}\n </p>\n <p>{[invoiceAddress.postalCode, invoiceAddress.city].filter(Boolean).join(' ')}</p>\n {invoiceAddress.country ? <p>{getCountryName(invoiceAddress.country)}</p> : null}\n {invoiceAddress.email ? (\n <p className=\"propeller-order-summary__address-email text-muted-foreground\">\n {invoiceAddress.email}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n {showDeliveryAddress ? (\n <div className=\"propeller-order-summary__address space-y-2\" data-address=\"delivery\">\n <h3 className=\"propeller-order-summary__address-title text-sm font-semibold text-muted-foreground uppercase tracking-wide\">\n {getLabel(props.labels, 'deliveryAddress', 'Delivery Address')}\n </h3>\n {deliveryAddress && deliveryAddress.street ? (\n <div className=\"text-sm space-y-1\">\n {deliveryAddress.company ? (\n <p className=\"font-medium\">{deliveryAddress.company}</p>\n ) : null}\n <p>\n {[deliveryAddress.firstName, deliveryAddress.middleName, deliveryAddress.lastName]\n .filter(Boolean)\n .join(' ')}\n </p>\n <p>\n {[deliveryAddress.street, deliveryAddress.number, deliveryAddress.numberExtension]\n .filter(Boolean)\n .join(' ')}\n </p>\n <p>{[deliveryAddress.postalCode, deliveryAddress.city].filter(Boolean).join(' ')}</p>\n {deliveryAddress.country ? <p>{getCountryName(deliveryAddress.country)}</p> : null}\n {deliveryAddress.email ? (\n <p className=\"propeller-order-summary__address-email text-muted-foreground\">\n {deliveryAddress.email}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n {showDeliveryInfo && (paymentMethod || carrierName || requestDate) ? (\n <div className=\"propeller-order-summary__info-panel bg-surface-hover p-4 rounded-control border border-border space-y-2 text-sm\">\n {paymentMethod ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">{getLabel(props.labels, 'payment', 'Payment:')}</span>\n <span>{paymentMethod}</span>\n </div>\n ) : null}\n {carrierName ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">{getLabel(props.labels, 'carrier', 'Carrier:')}</span>\n <span>{carrierName}</span>\n </div>\n ) : null}\n {requestDate ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">\n {getLabel(props.labels, 'deliveryDate', 'Delivery Date:')}\n </span>\n <span>{requestDate}</span>\n </div>\n ) : null}\n </div>\n ) : null}\n {showRemarks && (orderReference || orderRemarks) ? (\n <div className=\"propeller-order-summary__remarks-panel bg-surface-hover p-4 rounded-control border border-border space-y-2 text-sm mt-4\">\n {orderReference ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">\n {getLabel(props.labels, 'reference', 'Reference:')}\n </span>\n <span>{orderReference}</span>\n </div>\n ) : null}\n {orderRemarks ? (\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">{getLabel(props.labels, 'remarks', 'Remarks:')}</span>\n <span>{orderRemarks}</span>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport default OrderSummary;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { Order, OrderDiscountType, OrderTotalTaxPercentage } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport { formatPrice } from '@propeller-commerce/propeller-v2-core-ui';\n\nexport interface OrderTotalsProps {\n /**\n * Storefront language ('EN', 'NL', …). Decides the number format prices are\n * rendered in — without it they fall back to Dutch separators regardless of\n * the language the shopper is reading.\n */\n language?: string;\n\n /** The order/quote used to populate the summary data */\n order: Order;\n\n /** Order summary block title */\n title?: string;\n\n /** Labels for the component */\n labels?: Record<string, string>;\n\n /** Display the subtotal of the order/quote */\n showSubtotal?: boolean;\n\n /** Display the total discount of the order/quote */\n showDiscount?: boolean;\n\n /** Display the shipping costs of the order/quote */\n showShippingCosts?: boolean;\n\n /** Display all VATs of the order/quote */\n showVATs?: boolean;\n\n /** Display the total of the order/quote excluding the VAT */\n showTotalExclVat?: boolean;\n\n /** Display the total VAT of the order/quote */\n showTotalVat?: boolean;\n\n /** Custom price formatting function */\n formatPrice?: (price: number) => string;\n\n /** Currency symbol used by the default formatter. Default: `'€'`. */\n currency?: string;\n}\n/**\n * Renders the price breakdown for an order or quote: subtotal, discount,\n * transaction and shipping costs, per-rate VAT lines and the grand total.\n */\nfunction OrderTotals(props: OrderTotalsProps) {\n // All visibility flags are derived directly from props at render — no need\n // for one-liner functions wrapping a `?? true`.\n const showSubtotal = props.showSubtotal !== false;\n const showDiscount = props.showDiscount !== false;\n const showShippingCosts = props.showShippingCosts !== false;\n const showVATs = props.showVATs !== false;\n const showTotalExclVat = props.showTotalExclVat !== false;\n const showTotalVat = props.showTotalVat !== false;\n const total = props.order?.total;\n const paymentData = props.order?.paymentData;\n const postageData = props.order?.postageData;\n\n function formatItemPrice(price: number): string {\n if (props.formatPrice) return props.formatPrice(price);\n return formatPrice(price || 0, { symbol: props.currency ?? '€', locale: localeForLanguage(props.language) });\n }\n const subtotal = total?.gross || 0;\n const hasDiscount = !!total\n && total.discountType !== OrderDiscountType.N\n && total.discountValue > 0;\n function discountDisplay(): string {\n if (!total) return '';\n if (total.discountType === OrderDiscountType.A) {\n return '-' + formatItemPrice(total.discountValue);\n }\n if (total.discountType === OrderDiscountType.P) {\n return '- ' + total.discountValue + '%';\n }\n return '-' + formatItemPrice(total.discountValue);\n }\n const subtotalWithDiscount = (total?.gross || 0) - (total?.discountValue || 0);\n const hasTransactionCosts = (paymentData?.gross ?? 0) > 0;\n const transactionCosts = Number(paymentData?.gross || 0);\n const hasShippingCosts = (postageData?.gross ?? 0) > 0;\n const shippingCosts = Number(postageData?.gross || 0);\n const totalExclVat = total?.gross || 0;\n const taxPercentages: OrderTotalTaxPercentage[] = (total?.taxPercentages || [])\n .filter((tax) => tax.percentage > 0 && tax.total > 0);\n const totalInclVat = total?.net || 0;\n const totalVat = taxPercentages.reduce((sum, t) => sum + Number(t.total || 0), 0);\n return (\n <div className=\"propeller-order-totals w-full md:w-80 bg-card p-6 rounded-container shadow space-y-3\">\n {showSubtotal ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground\" data-row=\"subtotal\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'subtotal', 'Subtotal:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(subtotal)}</span>\n </div>\n ) : null}\n {showDiscount && hasDiscount ? (\n <>\n <div className=\"propeller-order-totals__row flex justify-between text-secondary\" data-row=\"discount\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'discount', 'Discount:')}</span>\n <span className=\"propeller-order-totals__value\">{discountDisplay()}</span>\n </div>\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground border-t pt-2 border-dashed\" data-row=\"subtotal-with-discount\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'subtotalWithDiscount', 'Subtotal with discount:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(subtotalWithDiscount)}</span>\n </div>\n </>\n ) : null}\n {hasTransactionCosts ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground\" data-row=\"transaction-costs\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'transactionCosts', 'Transaction costs:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(transactionCosts)}</span>\n </div>\n ) : null}\n {showShippingCosts && hasShippingCosts ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground\" data-row=\"shipping-costs\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'shippingCosts', 'Shipping costs:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(shippingCosts)}</span>\n </div>\n ) : null}\n {showTotalExclVat ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground pt-2 border-t\" data-row=\"total-excl-vat\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'totalExclVat', 'Total excl. VAT:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(totalExclVat)}</span>\n </div>\n ) : null}\n {showVATs && taxPercentages.length > 0 ? (\n <>\n {taxPercentages.map((tax, index) => (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground text-sm\" key={index} data-row=\"vat-line\">\n <span className=\"propeller-order-totals__label\">\n {tax.percentage}% {getLabel(props.labels, 'vat', 'VAT')}:\n </span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(Number(tax.total))}</span>\n </div>\n ))}\n </>\n ) : null}\n {showTotalVat ? (\n <div className=\"propeller-order-totals__row flex justify-between text-muted-foreground text-sm\" data-row=\"total-vat\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'totalVat', 'Total VAT:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(totalVat)}</span>\n </div>\n ) : null}\n <div className=\"propeller-order-totals__row propeller-order-totals__row--total flex justify-between text-xl font-bold pt-4 border-t text-foreground mt-2\" data-row=\"total\">\n <span className=\"propeller-order-totals__label\">{getLabel(props.labels, 'total', 'Total:')}</span>\n <span className=\"propeller-order-totals__value\">{formatItemPrice(totalInclVat)}</span>\n </div>\n </div>\n );\n}\n\nexport default OrderTotals;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { ProductPrice, Contact, Customer } from '@propeller-commerce/propeller-sdk-v2';\nimport type { IDiscount } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport { isContentHidden } from '@propeller-commerce/propeller-v2-core-ui';\nimport { formatPrice } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductBulkPricesProps {\n /**\n * Storefront language ('EN', 'NL', …). Decides the number format prices are\n * rendered in — without it they fall back to Dutch separators regardless of\n * the language the shopper is reading.\n */\n language?: string;\n\n /**\n * Bulk price tiers from the product.\n * Obtain from `product.bulkPrices`.\n */\n bulkPrices: ProductPrice[];\n\n /**\n * When true, net price (incl. tax) is the leading price.\n * Defaults to false — gross (excl. VAT) is shown.\n * Note: in the Propeller SDK `price.gross` = excl. VAT, `price.net` = incl. VAT.\n */\n includeTax?: boolean;\n\n /**\n * Controls portal visibility mode.\n * 'semi-closed' — component is hidden for anonymous users.\n * Defaults to 'open'.\n */\n portalMode?: string;\n /**\n * Whether a session exists, independent of whether `user` has loaded yet.\n * Passed down by the parent alongside `portalMode`; closes the hydration\n * window in which an authenticated visitor still has a null `user`.\n */\n isAuthenticated?: boolean;\n\n /** Authenticated user — used for semi-closed visibility. */\n user?: Contact | Customer | null;\n\n /** Tax zone code. Defaults to 'NL'. */\n taxZone?: string;\n\n /** Currency symbol for prices. Defaults to '€'. */\n currency?: string;\n\n /**\n * Override any UI string.\n * Available keys: title, quantityFrom, price, inclTax, exclTax\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's volume/quantity-tier pricing as a table, filtering out\n * expired or list-price tiers and showing incl./excl. VAT prices.\n */\nfunction ProductBulkPrices(props: ProductBulkPricesProps) {\n const includeTax = !!props.includeTax;\n const isHidden = isContentHidden(props.portalMode, props.user, props.isAuthenticated);\n function getTierQuantity(tier: ProductPrice): number | null {\n const discount = tier.discount as\n | (IDiscount & { quantityFrom?: number })\n | undefined;\n return discount?.quantityFrom ?? tier.quantity ?? null;\n }\n function getBulkPrices(): ProductPrice[] {\n const rawAll = props.bulkPrices || [];\n const all = rawAll.filter((tier) => {\n const t = tier as ProductPrice & {\n type?: string;\n discountType?: string;\n };\n const priceType =\n t.type ??\n (\n t.discount as\n | {\n type?: string;\n }\n | undefined\n )?.type;\n const discountType =\n t.discountType ??\n (\n t.discount as\n | {\n discountType?: string;\n }\n | undefined\n )?.discountType;\n return !(priceType === 'PRICESHEET' && discountType === 'LIST_PRICE_MIN');\n });\n if (all.length === 0) return [];\n const now = new Date();\n const groups = new Map<number, ProductPrice[]>();\n for (const tier of all) {\n const qty = getTierQuantity(tier);\n if (qty === null) continue;\n const list = groups.get(qty) || [];\n list.push(tier);\n groups.set(qty, list);\n }\n const filtered: ProductPrice[] = [];\n for (const [, prices] of groups) {\n const validDated: ProductPrice[] = [];\n const nullDated: ProductPrice[] = [];\n for (const tier of prices) {\n const discount = tier.discount as\n | (IDiscount & {\n validFrom?: string;\n validTo?: string;\n })\n | undefined;\n if (!discount) {\n filtered.push(tier);\n continue;\n }\n const validFrom = discount.validFrom ?? null;\n const validTo = discount.validTo ?? null;\n if (validFrom === null && validTo === null) {\n nullDated.push(tier);\n continue;\n }\n let isValid = true;\n if (validFrom !== null && now < new Date(validFrom)) isValid = false;\n if (isValid && validTo !== null && now > new Date(validTo)) isValid = false;\n if (isValid) validDated.push(tier);\n }\n if (validDated.length > 0) filtered.push(validDated[0]);\n else if (nullDated.length > 0) filtered.push(nullDated[0]);\n }\n filtered.sort((a, b) => (getTierQuantity(a) ?? 0) - (getTierQuantity(b) ?? 0));\n if (filtered.length === 1 && getTierQuantity(filtered[0]) === 1) return [];\n return filtered;\n }\n const bulkPrices = getBulkPrices();\n const hasItems = bulkPrices.length > 0;\n function getPrice(tier: ProductPrice): string {\n const value = includeTax ? tier.net : tier.gross;\n if (value === null || value === undefined) return '';\n return formatPrice(value, { symbol: props.currency ?? '\\u20AC', locale: localeForLanguage(props.language) });\n }\n function getQuantityLabel(tier: ProductPrice, index: number): string {\n const discount = tier.discount as\n | (IDiscount & { quantityFrom?: number })\n | undefined;\n const qty = discount?.quantityFrom || tier.quantity || 1;\n const nextTier = bulkPrices[index + 1];\n const nextDiscount = nextTier?.discount as\n | (IDiscount & { quantityFrom?: number })\n | undefined;\n const nextQty = nextDiscount?.quantityFrom || nextTier?.quantity;\n if (nextQty) return `${qty}\\u2013${nextQty - 1}`;\n return `${qty}+`;\n }\n // An explicit empty `title` label means \"render no heading\" — the check\n // below relies on it. getLabel() treats '' as missing and returns its English\n // fallback, so the heading came back as \"Volume pricing\" in every locale;\n // read the label directly here and only fall back when the key is absent.\n const title = props.labels?.title ?? 'Volume pricing';\n return (\n <>\n {!isHidden && hasItems ? (\n <>\n <div\n className={cn(`propeller-product-bulk-prices ${props.className || ''}`)}\n data-include-tax={includeTax ? 'true' : 'false'}\n >\n {title ? (\n <h3 className=\"propeller-product-bulk-prices__title text-base font-semibold text-foreground mb-3\">\n {title}\n </h3>\n ) : null}\n <div className=\"propeller-product-bulk-prices__table-wrapper overflow-hidden rounded-container border border-border\">\n <table className=\"propeller-product-bulk-prices__table w-full text-sm\">\n <thead className=\"propeller-product-bulk-prices__thead bg-muted/50\">\n <tr>\n <th className=\"propeller-product-bulk-prices__th propeller-product-bulk-prices__th--quantity px-4 py-2 text-left font-medium text-muted-foreground\">\n {getLabel(props.labels, 'quantityFrom', 'Qty from')}\n </th>\n <th className=\"propeller-product-bulk-prices__th propeller-product-bulk-prices__th--price px-4 py-2 text-right font-medium text-muted-foreground\">\n {getLabel(props.labels, 'price', 'Price')}\n <span className=\"propeller-product-bulk-prices__tax-label font-normal text-xs\">\n (\n {includeTax\n ? getLabel(props.labels, 'inclTax', 'incl. VAT')\n : getLabel(props.labels, 'exclTax', 'excl. VAT')}\n )\n </span>\n </th>\n </tr>\n </thead>\n <tbody className=\"propeller-product-bulk-prices__tbody divide-y divide-border\">\n {bulkPrices.map((tier, index) => (\n <tr className=\"propeller-product-bulk-prices__row bg-card hover:bg-muted/20 transition-colors\" key={index}>\n <td className=\"propeller-product-bulk-prices__cell propeller-product-bulk-prices__cell--quantity px-4 py-2 text-foreground font-medium\">\n {getQuantityLabel(tier, index)}\n </td>\n <td className=\"propeller-product-bulk-prices__cell propeller-product-bulk-prices__cell--price px-4 py-2 text-right text-foreground font-semibold\">\n {getPrice(tier)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </>\n ) : null}\n </>\n );\n}\n\nexport default ProductBulkPrices;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport {\n PaginatedMediaDocumentResponse,\n MediaDocument,\n} from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, getLanguageString, resolveLanguageEntry } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductDownloadsProps {\n /**\n * Media documents for the product.\n * Obtain from `product.media?.documents`. The API answers `null` rather than\n * an empty page when a product has none, so this may be absent.\n */\n downloads?: PaginatedMediaDocumentResponse | null;\n\n /**\n * Language code used to resolve the correct localised document URL and label.\n */\n language: string;\n\n /**\n * Override any UI string.\n * Available keys: title, download, empty\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's downloadable media documents as a list of localised\n * download links, or an empty-state message when there are none.\n */\nfunction ProductDownloads(props: ProductDownloadsProps) {\n const items: MediaDocument[] = props.downloads?.items || [];\n const hasItems = items.length > 0;\n const lang = props.language || 'NL';\n // Case-insensitive on purpose: the API lowercases `documents[].language`\n // while leaving `alt[].language` as uploaded, so matching exactly gave the\n // right label with the wrong file.\n function getDocumentUrl(doc: MediaDocument): string {\n return resolveLanguageEntry(doc.documents, lang)?.originalUrl || '';\n }\n function getDocumentName(doc: MediaDocument): string {\n return getLanguageString(doc.alt, lang, 'Download');\n }\n return (\n <div className={cn(`propeller-product-downloads ${props.className || ''}`)}>\n {hasItems ? (\n <h3 className=\"propeller-product-downloads__title text-base font-semibold text-foreground mb-3\">\n {getLabel(props.labels, 'title', 'Downloads')}\n </h3>\n ) : null}\n {hasItems ? (\n <ul className=\"propeller-product-downloads__list space-y-2\">\n {items.map((doc, index) => (\n <li className=\"propeller-product-downloads__item\" key={index}>\n {!!getDocumentUrl(doc) ? (\n <a\n target=\"_blank\"\n className=\"propeller-product-downloads__link flex items-center gap-3 rounded-container border border-border bg-card px-4 py-3 text-sm text-foreground hover:bg-muted/30 hover:border-primary/40 transition-colors group\"\n href={getDocumentUrl(doc)}\n download\n >\n <svg\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n className=\"h-5 w-5 flex-shrink-0 text-muted-foreground group-hover:text-primary transition-colors\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n strokeWidth={1.5}\n />\n </svg>\n <span className=\"flex-1 min-w-0 truncate\">{getDocumentName(doc)}</span>\n <svg\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n className=\"h-4 w-4 flex-shrink-0 text-muted-foreground group-hover:text-primary transition-colors\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n strokeWidth={2}\n />\n </svg>\n </a>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n {!hasItems ? (\n <p className=\"propeller-product-downloads__empty text-sm text-muted-foreground\">{getLabel(props.labels, 'empty', 'No downloads')}</p>\n ) : null}\n </div>\n );\n}\n\nexport default ProductDownloads;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport { ClusterOption, Contact, Customer, Product, ProductPrice, YesNo } from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, localeForLanguage } from '@propeller-commerce/propeller-v2-core-ui';\nimport { isContentHidden } from '@propeller-commerce/propeller-v2-core-ui';\nimport { formatPrice as formatPriceHelper } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductPriceProps {\n /**\n * Storefront language ('EN', 'NL', …). Decides the number format prices are\n * rendered in — without it they fall back to Dutch separators regardless of\n * the language the shopper is reading.\n */\n language?: string;\n\n /**\n * ProductPrice object from the product.\n * Obtain from `product.price`. Omitted only when `priceOnRequest` renders in\n * its place.\n */\n price?: ProductPrice;\n\n /** Currency symbol to display. Defaults to '€'. */\n currency?: string;\n\n /**\n * Controls portal visibility mode.\n * 'open' — full e-commerce; price is always visible.\n * 'semi-closed' — catalog-only; price is hidden for anonymous users.\n * Defaults to 'open'.\n */\n portalMode?: string;\n /**\n * Whether a session exists, independent of whether `user` has loaded yet.\n * Passed down by the parent alongside `portalMode`; closes the hydration\n * window in which an authenticated visitor still has a null `user`.\n */\n isAuthenticated?: boolean;\n\n /** Authenticated user — used for semi-closed visibility. */\n user?: Contact | Customer | null;\n\n /**\n * When true, net price (incl. tax) is the leading price.\n * When false (default), gross price (excl. tax) is the leading price.\n * Note: in the Propeller SDK `price.gross` = excl. VAT, `price.net` = incl. VAT.\n */\n includeTax?: boolean;\n\n /** Tax zone code. Defaults to 'NL'. */\n taxZone?: string;\n\n /** Cluster options (cluster.options). Required option default prices are added even without an active selection. */\n options?: ClusterOption[];\n\n /** Active option product selections — pass Object.values(selectedOptionProducts). Price updates on every change. */\n selectedOptionProducts?: Product[];\n\n /**\n * Render the price-on-request label instead of an amount.\n * Derive with `isPriceOnRequest(product)` — `price.gross`/`net` are still\n * populated (usually 0) for these products, so an unguarded render shows a\n * real-looking € 0,00.\n */\n priceOnRequest?: boolean;\n\n /**\n * Override any UI string.\n * Available keys: inclTax, exclTax, loginToSeePrices, priceOnRequest\n */\n labels?: Record<string, string>;\n\n /**\n * Show the \"log in to see prices\" prompt when the price is hidden.\n * Defaults to true; pass false to render nothing in its place.\n */\n showLoginPrompt?: boolean;\n\n /** Tailwind text-size class for the leading price. Defaults to 'text-3xl'. */\n priceSize?: string;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's price with a leading incl./excl.-VAT amount and a\n * secondary line for the other tax mode, adding selected cluster-option prices.\n */\nfunction ProductPriceDisplay(props: ProductPriceProps) {\n function isHidden(): boolean {\n return isContentHidden(props.portalMode, props.user, props.isAuthenticated);\n }\n function formatPrice(value: number | null | undefined): string {\n if (value === null || value === undefined) return '';\n return formatPriceHelper(value, { symbol: props.currency ?? '\\u20AC', locale: localeForLanguage(props.language) });\n }\n function getOptionsTotal(useNet: boolean): number {\n const options = props.options || [];\n const selected = props.selectedOptionProducts || [];\n let total = 0;\n options.forEach((option: ClusterOption) => {\n if (option.hidden === YesNo.Y) return;\n\n // Find whether the user has selected a product in this option\n const selectedProduct = selected.find((p: Product) =>\n (option.products || []).some((op: Product) => op.productId === p.productId)\n );\n if (selectedProduct) {\n total += useNet ? selectedProduct.price?.net || 0 : selectedProduct.price?.gross || 0;\n } else if (option.isRequired === YesNo.Y && option.defaultProduct) {\n // option.defaultProduct may lack price data; look up the full\n // product record from option.products (which always has prices).\n const defaultId = (option.defaultProduct as Product).productId;\n const fullDefault =\n (option.products || []).find((p: Product) => p.productId === defaultId) ||\n option.defaultProduct;\n total += useNet\n ? (fullDefault as Product).price?.net || 0\n : (fullDefault as Product).price?.gross || 0;\n }\n });\n return total;\n }\n function getLeadingPrice(): string {\n const price = props.price;\n if (!price) return '';\n const useNet = !!props.includeTax;\n const base = useNet ? price.net : price.gross;\n if (base === null || base === undefined) return '';\n return formatPrice(base + getOptionsTotal(useNet));\n }\n function getSecondaryPrice(): string {\n const price = props.price;\n if (!price) return '';\n const useNet = !props.includeTax; // opposite of leading\n const base = useNet ? price.net : price.gross;\n if (base === null || base === undefined) return '';\n return formatPrice(base + getOptionsTotal(useNet));\n }\n function getTaxLabel(): string {\n return props.includeTax ? getLabel(props.labels, 'inclTax', 'incl. VAT') : getLabel(props.labels, 'exclTax', 'excl. VAT');\n }\n function getSecondaryTaxLabel(): string {\n return props.includeTax ? getLabel(props.labels, 'exclTax', 'excl. VAT') : getLabel(props.labels, 'inclTax', 'incl. VAT');\n }\n return (\n <div className={cn(`propeller-product-price ${props.className || ''}`)} data-hidden={isHidden() ? 'true' : 'false'}>\n {isHidden() && props.showLoginPrompt !== false ? (\n <p className=\"propeller-product-price__login-prompt text-sm text-muted-foreground italic\">\n {getLabel(props.labels, 'loginToSeePrices', 'Log in to see prices')}\n </p>\n ) : null}\n {!isHidden() && props.priceOnRequest ? (\n <p className=\"propeller-product-price__on-request text-sm text-foreground\">\n {getLabel(props.labels, 'priceOnRequest', 'Price on request')}\n </p>\n ) : null}\n {!isHidden() && !props.priceOnRequest && !!getLeadingPrice() ? (\n <div className=\"propeller-product-price__content flex flex-col gap-0.5\">\n <div className=\"propeller-product-price__primary flex items-baseline gap-2\">\n <span\n className={`propeller-product-price__amount ${props.priceSize || 'text-3xl'} font-bold text-foreground`}\n >\n {getLeadingPrice()}\n </span>\n <span className=\"propeller-product-price__tax-label text-sm text-muted-foreground\">{getTaxLabel()}</span>\n </div>\n {!!getSecondaryPrice() ? (\n <div className=\"propeller-product-price__secondary text-sm text-muted-foreground flex items-baseline gap-1\">\n <span className=\"propeller-product-price-secondary__amount\">{getSecondaryPrice()}</span>\n <span className=\"propeller-product-price-secondary__tax-label\">{getSecondaryTaxLabel()}</span>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport default ProductPriceDisplay;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. The legacy `'use client'` header was\n * removed in C0 once verified pure. Renders directly\n * from props and can be imported into a React Server Component.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\n\nimport type { Product, Cluster, LocalizedString } from '@propeller-commerce/propeller-sdk-v2';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductShortDescriptionProps {\n /**\n * Product or Cluster object.\n * The component reads `product.shortDescriptions` (an array of LocalizedString)\n * and renders the matching language entry as HTML.\n */\n product: Product | Cluster;\n\n /**\n * Language code used to resolve the correct localised short description.\n * Defaults to 'NL'.\n */\n language?: string;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's localised short description as HTML.\n */\nfunction ProductShortDescription(props: ProductShortDescriptionProps) {\n // Derived from props — pure render-time computation, no state needed.\n function getShortDescription(): string {\n const product = props.product as Product;\n if (!product?.shortDescriptions) return '';\n const lang = props.language || 'NL';\n const match = product.shortDescriptions.find((d: LocalizedString) => d.language === lang);\n return match?.value || product.shortDescriptions?.[0]?.value || '';\n }\n const html = getShortDescription();\n return (\n <>\n {!!html ? (\n <div\n dangerouslySetInnerHTML={{ __html: html }}\n className={cn(`propeller-product-short-description text-muted-foreground ${props.className || ''}`)}\n />\n ) : null}\n </>\n );\n}\n\nexport default ProductShortDescription;\n","/**\n * @rsc-safe — Pure display component. No React hooks, no event handlers, no\n * browser APIs, no context reads. Renders directly from props and can be\n * imported into a React Server Component without a 'use client' boundary.\n * Verified C0.2 (2026-05-20).\n */\nimport * as React from 'react';\nimport {\n PaginatedMediaVideoResponse,\n MediaVideo,\n} from '@propeller-commerce/propeller-sdk-v2';\nimport { getLabel, getLanguageString, getLanguageUri } from '@propeller-commerce/propeller-v2-core-ui';\nimport { cn } from '../composables/shared/utils/cn';\n\nexport interface ProductVideosProps {\n /**\n * Media videos for the product.\n * Obtain from `product.media?.videos`. The API answers `null` rather than an\n * empty page when a product has none, so this may be absent.\n */\n videos?: PaginatedMediaVideoResponse | null;\n\n /**\n * Language code used to resolve the correct localised video URI.\n */\n language: string;\n\n /**\n * Override any UI string.\n * Available keys: title, empty\n */\n labels?: Record<string, string>;\n\n /** Extra CSS class applied to the root element. */\n className?: string;\n}\n/**\n * Renders a product's media videos, embedding YouTube/Vimeo URLs in an iframe\n * and other URLs in a native `<video>` player.\n */\nfunction ProductVideos(props: ProductVideosProps) {\n const items: MediaVideo[] = props.videos?.items || [];\n const hasItems = items.length > 0;\n const lang = props.language || 'NL';\n // Case-insensitive: media language casing is not guaranteed to match the\n // storefront language. Same resolver ProductDownloads uses.\n function getVideoUri(video: MediaVideo): string {\n return getLanguageUri(video.videos, lang, '');\n }\n function getVideoTitle(video: MediaVideo): string {\n return getLanguageString(video.alt, lang, 'Video');\n }\n function isEmbeddable(uri: string): boolean {\n return uri.includes('youtube.com') || uri.includes('youtu.be') || uri.includes('vimeo.com');\n }\n function getEmbedUrl(uri: string): string {\n // Already an embed URL — return as-is\n if (uri.includes('youtube.com/embed/') || uri.includes('player.vimeo.com/video/')) {\n return uri;\n }\n // YouTube watch URL → embed URL\n if (uri.includes('youtube.com/watch')) {\n const url = new URL(uri);\n const videoId = url.searchParams.get('v') || '';\n return `https://www.youtube.com/embed/${videoId}`;\n }\n // YouTube short URL\n if (uri.includes('youtu.be/')) {\n const videoId = uri.split('youtu.be/')[1]?.split('?')[0] || '';\n return `https://www.youtube.com/embed/${videoId}`;\n }\n // Vimeo standard URL (https://vimeo.com/ID or https://vimeo.com/ID/HASH)\n if (uri.includes('vimeo.com/')) {\n const parts = uri.split('vimeo.com/')[1]?.split('?')[0]?.split('/') || [];\n const videoId = parts[0] || '';\n const hash = parts[1] || '';\n return hash\n ? `https://player.vimeo.com/video/${videoId}?h=${hash}`\n : `https://player.vimeo.com/video/${videoId}`;\n }\n return uri;\n }\n return (\n <div className={cn(`propeller-product-videos ${props.className || ''}`)}>\n {hasItems ? (\n <h3 className=\"propeller-product-videos__title text-base font-semibold text-foreground mb-3\">\n {getLabel(props.labels, 'title', 'Videos')}\n </h3>\n ) : null}\n {hasItems ? (\n <div className=\"propeller-product-videos__list space-y-4\">\n {items.map((video, index) => (\n <div\n className=\"propeller-product-videos__item rounded-container overflow-hidden border border-border bg-foreground\"\n key={index}\n data-embedded={!!getVideoUri(video) && isEmbeddable(getVideoUri(video)) ? 'true' : 'false'}\n >\n {!!getVideoUri(video) ? (\n <>\n {isEmbeddable(getVideoUri(video)) ? (\n <div\n className=\"propeller-product-videos__embed relative w-full\"\n style={{\n paddingBottom: '56.25%',\n }}\n >\n <iframe\n loading=\"lazy\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n className=\"propeller-product-videos__iframe absolute inset-0 w-full h-full\"\n src={getEmbedUrl(getVideoUri(video))}\n title={getVideoTitle(video)}\n allowFullScreen\n />\n </div>\n ) : null}\n {!isEmbeddable(getVideoUri(video)) ? (\n <video preload=\"metadata\" className=\"propeller-product-videos__video w-full\" controls>\n <source src={getVideoUri(video)} />\n </video>\n ) : null}\n </>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n {!hasItems ? (\n <p className=\"propeller-product-videos__empty text-sm text-muted-foreground\">{getLabel(props.labels, 'empty', 'No videos')}</p>\n ) : null}\n </div>\n );\n}\n\nexport default ProductVideos;\n"]}