@orderlyshop/web-components 0.1.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/AGENTS.md +110 -0
- package/README.md +685 -0
- package/bin/orderly-build-category-pages.mjs +160 -0
- package/bin/orderly-generate-category-pages.mjs +308 -0
- package/bin/orderly-hydrate-static-pages.mjs +595 -0
- package/bin/orderly-init-navigation.mjs +327 -0
- package/bin/orderly-init-shop.mjs +876 -0
- package/bin/orderly-init-taxonomy.mjs +2 -0
- package/bin/orderly-publish-site.mjs +342 -0
- package/custom-elements.json +495 -0
- package/dist/browser/orderly-web-components.define.global.js +3085 -0
- package/dist/browser/orderly-web-components.define.global.js.map +1 -0
- package/dist/browser/orderly-web-components.global.js +3085 -0
- package/dist/browser/orderly-web-components.global.js.map +1 -0
- package/dist/default-shop-DWdB_MRd.d.ts +220 -0
- package/dist/default-shop.d.ts +6 -0
- package/dist/default-shop.js +762 -0
- package/dist/default-shop.js.map +1 -0
- package/dist/define-IAQk8OmQ.d.ts +9 -0
- package/dist/define.d.ts +2 -0
- package/dist/define.js +10266 -0
- package/dist/define.js.map +1 -0
- package/dist/index.d.ts +683 -0
- package/dist/index.js +10589 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation.d.ts +51 -0
- package/dist/navigation.js +818 -0
- package/dist/navigation.js.map +1 -0
- package/dist/query.d.ts +31 -0
- package/dist/query.js +115 -0
- package/dist/query.js.map +1 -0
- package/dist/registry-CPDecU3g.d.ts +6 -0
- package/dist/shop-BnT1C6kG.d.ts +173 -0
- package/dist/shop-query.d.ts +8 -0
- package/dist/shop-query.js +100 -0
- package/dist/shop-query.js.map +1 -0
- package/dist/shop.d.ts +8 -0
- package/dist/shop.js +10359 -0
- package/dist/shop.js.map +1 -0
- package/dist/stores.d.ts +46 -0
- package/dist/stores.js +145 -0
- package/dist/stores.js.map +1 -0
- package/dist/taxonomy.d.ts +35 -0
- package/dist/taxonomy.js +247 -0
- package/dist/taxonomy.js.map +1 -0
- package/dist/types-CCQDd6Nd.d.ts +95 -0
- package/docs/components/README.md +610 -0
- package/docs/components/product-grid.md +176 -0
- package/docs/components/product-rail.md +174 -0
- package/examples/shop/README.md +71 -0
- package/examples/shop/package.json +28 -0
- package/examples/shop/src/category.html +20 -0
- package/examples/shop/src/checkout.html +21 -0
- package/examples/shop/src/forretningsbetingelser.html +80 -0
- package/examples/shop/src/includes/body-end.html +1 -0
- package/examples/shop/src/includes/body-start.html +2 -0
- package/examples/shop/src/includes/head.html +32 -0
- package/examples/shop/src/index.html +25 -0
- package/examples/shop/src/navigation.ts +154 -0
- package/examples/shop/src/product.html +24 -0
- package/examples/shop/src/templates/shop-footer.html +76 -0
- package/examples/shop/tsconfig.json +32 -0
- package/examples/shop/vite.config.mjs +184 -0
- package/html-custom-data.json +262 -0
- package/package.json +118 -0
- package/server/README.md +111 -0
- package/server/apache/.htaccess +18 -0
- package/server/nginx/orderly-products.conf +24 -0
- package/server/node/product-snapshot-server.mjs +133 -0
- package/server/php/orderly-product.php +204 -0
package/dist/shop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/taxonomy.ts","../src/query.ts","../src/shop-query.ts","../src/i18n.ts","../src/default-shop.ts","../src/utils/format.ts","../src/utils/dom.ts","../src/components/page-layout.ts","../src/base.ts","../src/components/shop-footer.ts","../src/basket.ts","../src/stores.ts","../src/components/basket.ts","../src/components/basket-icon.ts","../src/components/category-page.ts","../src/components/product-tile.ts","../src/components/checkout.ts","../src/components/checkout-page.ts","../src/components/collection-page.ts","../src/components/credit.ts","../src/components/home-page.ts","../src/components/product-detail-page.ts","../src/components/product-grid.ts","../src/components/product-page.ts","../src/components/product-rail.ts","../src/components/search-controls.ts","../src/components/stored-image.ts","../src/lazy-load.ts","../src/navigation.ts","../src/styles.ts","../src/registry.ts","../src/shop.ts"],"sourcesContent":["import { clone, create } from \"@bufbuild/protobuf\";\nimport { SearchQuerySchema, type SearchQuery } from \"@orderlyshop/core-client\";\nimport { normalizeSearchQuery } from \"./query.js\";\nimport type {\n CategoryUrlMode,\n NavigationDefinition,\n NavigationMetadata,\n ResolvedNavigationItem\n} from \"./types.js\";\nexport type {\n CategoryDefinition,\n CategoryNavigationItem,\n CategoryUrlMode,\n NavigationDefinition,\n NavigationMetadata,\n ResolvedNavigationItem\n} from \"./types.js\";\n\nexport const defaultCategoryPageRoot = \"/categories/\";\n\nexport interface NavigationBuildOptions {\n pageRoot?: string;\n urlMode?: CategoryUrlMode;\n description?: (input: NavigationDescriptionInput) => string;\n}\n\nexport type CategoryNavigationOptions = NavigationBuildOptions;\n\nexport interface NavigationDescriptionInput {\n definition: NavigationDefinition;\n parent?: NavigationDefinition;\n pathLabels: string[];\n}\n\nexport type CategoryDescriptionInput = NavigationDescriptionInput;\n\nexport function createCategoryNavigation(\n definitions: NavigationDefinition[],\n options: NavigationBuildOptions = {}\n): ResolvedNavigationItem[] {\n assertValidNavigationDefinitions(definitions);\n const pageRoot = options.pageRoot ?? defaultCategoryPageRoot;\n const urlMode = options.urlMode ?? \"path\";\n return definitions.map((definition) => {\n return createCategoryItem({\n definition,\n pageRoot,\n urlMode,\n description: options.description,\n pathLabels: [definition.label],\n pathSlugs: [definition.slug]\n });\n });\n}\n\nexport interface NavigationValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport function validateNavigationDefinitions(definitions: NavigationDefinition[]): NavigationValidationResult {\n const errors: string[] = [];\n const seenIds = new Map<string, string>();\n const seenSlugs = new Map<string, string>();\n if (!Array.isArray(definitions) || definitions.length === 0) {\n errors.push(\"navigationDefinitions must contain at least one category.\");\n return { valid: false, errors };\n }\n validateNavigationLevel(definitions, {\n errors,\n seenIds,\n seenSlugs,\n pathLabels: [],\n pathSlugs: []\n });\n return { valid: errors.length === 0, errors };\n}\n\nexport function navigationConfigurationError(definitions: NavigationDefinition[]): string | undefined {\n const result = validateNavigationDefinitions(definitions);\n return result.valid ? undefined : `Navigation configuration error: ${result.errors.join(\" \")}`;\n}\n\nexport function assertValidNavigationDefinitions(definitions: NavigationDefinition[]): void {\n const error = navigationConfigurationError(definitions);\n if (error) {\n throw new Error(error);\n }\n}\n\nexport function flattenCategoryNavigation(items: ResolvedNavigationItem[]): ResolvedNavigationItem[] {\n return items.flatMap((item) => [item, ...flattenCategoryNavigation(item.children ?? [])]);\n}\n\nexport function findCategoryById(\n id: string,\n items: ResolvedNavigationItem[]\n): ResolvedNavigationItem | undefined {\n return flattenCategoryNavigation(items).find((item) => item.id === id);\n}\n\nexport function findCategoryBySlug(\n slug: string,\n items: ResolvedNavigationItem[]\n): ResolvedNavigationItem | undefined {\n return flattenCategoryNavigation(items).find((item) => item.metadata.slug === slug || item.id === slug);\n}\n\nexport function findCategoryByIdOrSlug(\n value: string,\n items: ResolvedNavigationItem[]\n): ResolvedNavigationItem | undefined {\n return findCategoryById(value, items) ?? findCategoryBySlug(value, items);\n}\n\nexport function categoryPagePath(\n id: string,\n options: NavigationBuildOptions = {}\n): string {\n const pageRoot = options.pageRoot ?? defaultCategoryPageRoot;\n if (options.urlMode === \"hash\") {\n return `${pageRoot}#id=${encodeURIComponent(id)}`;\n }\n return `${pageRoot}${id}/`;\n}\n\nexport function resolveCategoryUrlMode(\n url: string | URL | Location = currentLocationUrl(),\n options: Pick<NavigationBuildOptions, \"pageRoot\"> = {}\n): CategoryUrlMode {\n const target = urlFromInput(url);\n const pageRoot = options.pageRoot ?? defaultCategoryPageRoot;\n if (categoryIdFromHash(target.hash)) {\n return \"hash\";\n }\n return categoryIdFromPath(target.pathname, pageRoot) ? \"path\" : \"hash\";\n}\n\nexport function categoryFromUrl(\n url: string | URL | Location,\n items: ResolvedNavigationItem[],\n options: NavigationBuildOptions = {}\n): ResolvedNavigationItem {\n const target = urlFromInput(url);\n const pageRoot = options.pageRoot ?? defaultCategoryPageRoot;\n const requestedId = categoryIdFromHash(target.hash) ?? categoryIdFromPath(target.pathname, pageRoot);\n return requestedId ? findCategoryByIdOrSlug(requestedId, items) ?? items[0] : items[0];\n}\n\nfunction createCategoryItem(input: {\n definition: NavigationDefinition;\n parent?: NavigationDefinition;\n pageRoot: string;\n urlMode: CategoryUrlMode;\n description?: NavigationBuildOptions[\"description\"];\n pathLabels: string[];\n pathSlugs: string[];\n parentId?: string;\n}): ResolvedNavigationItem {\n const id = input.pathSlugs.join(\"/\");\n const query = categorySearchQuery(input.definition, input.parent, input.pathLabels);\n const searchText = categorySearchText(query, input.pathLabels);\n const metadata: NavigationMetadata = {\n slug: input.pathSlugs[input.pathSlugs.length - 1],\n parentId: input.parentId,\n pathSegments: input.pathSlugs,\n query: clone(SearchQuerySchema, query),\n searchText,\n description: input.definition.description\n ?? input.description?.({\n definition: input.definition,\n parent: input.parent,\n pathLabels: input.pathLabels\n })\n ?? `Selected products in ${input.pathLabels.join(\" \").toLowerCase()}.`,\n heroImage: input.definition.heroImage ?? input.parent?.heroImage ?? \"\",\n pagePath: input.pageRoot\n };\n return {\n id,\n label: input.definition.label,\n href: categoryPagePath(id, { pageRoot: input.pageRoot, urlMode: input.urlMode }),\n query: clone(SearchQuerySchema, query),\n metadata,\n children: (input.definition.children ?? []).map((child) => createCategoryItem({\n definition: child,\n parent: input.definition,\n pageRoot: input.pageRoot,\n urlMode: input.urlMode,\n description: input.description,\n parentId: id,\n pathLabels: [...input.pathLabels, child.label],\n pathSlugs: [...input.pathSlugs, child.slug]\n }))\n };\n}\n\nfunction validateNavigationLevel(\n definitions: NavigationDefinition[],\n context: {\n errors: string[];\n seenIds: Map<string, string>;\n seenSlugs: Map<string, string>;\n pathLabels: string[];\n pathSlugs: string[];\n }\n): void {\n definitions.forEach((definition, index) => {\n const label = definition?.label?.trim();\n const location = [...context.pathLabels, label || `item ${index + 1}`].join(\" > \");\n const slug = definition?.slug?.trim();\n if (!label) {\n context.errors.push(`Category ${location} is missing label.`);\n }\n if (!slug) {\n context.errors.push(`Category ${location} is missing slug.`);\n } else if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) {\n context.errors.push(`Category ${location} has invalid slug \"${slug}\". Use lowercase letters, numbers, and hyphens only.`);\n }\n const nextPathSlugs = slug ? [...context.pathSlugs, slug] : context.pathSlugs;\n const id = nextPathSlugs.join(\"/\");\n if (id) {\n const existing = context.seenIds.get(id);\n if (existing) {\n context.errors.push(`Category ${location} duplicates category id \"${id}\" already used by ${existing}.`);\n } else {\n context.seenIds.set(id, location);\n }\n }\n if (slug) {\n const existing = context.seenSlugs.get(slug);\n if (existing) {\n context.errors.push(`Category ${location} duplicates slug \"${slug}\" already used by ${existing}. Slugs must be globally unique.`);\n } else {\n context.seenSlugs.set(slug, location);\n }\n }\n if (definition.children?.length) {\n validateNavigationLevel(definition.children, {\n ...context,\n pathLabels: [...context.pathLabels, label || `item ${index + 1}`],\n pathSlugs: nextPathSlugs\n });\n }\n });\n}\n\nfunction categorySearchQuery(\n definition: NavigationDefinition,\n parent: NavigationDefinition | undefined,\n pathLabels: string[]\n): SearchQuery {\n if (definition.query) {\n return normalizeSearchQuery(definition.query);\n }\n const parentQuery = parent?.query ? normalizeSearchQuery(parent.query) : undefined;\n const inherited = parentQuery ? clone(SearchQuerySchema, parentQuery) : create(SearchQuerySchema);\n const parentText = parentQuery ? categorySearchText(parentQuery, pathLabels.slice(0, -1)) : parent?.label;\n inherited.Query = [definition.label, parentText].filter(Boolean).join(\" \");\n return inherited;\n}\n\nfunction categorySearchText(query: SearchQuery, pathLabels: string[]): string {\n return query.Query\n || query.HiddenQuery\n || query.Tags.map((tag) => tag.Value).filter(Boolean).join(\" \")\n || pathLabels.join(\" \");\n}\n\nfunction categoryIdFromPath(pathname: string, pageRoot: string): string | undefined {\n const path = pathname.replace(/\\/index\\.html$/, \"/\");\n if (!path.startsWith(pageRoot) || path === pageRoot) {\n return undefined;\n }\n const normalized = path.slice(pageRoot.length).replace(/^\\/+|\\/+$/g, \"\");\n return normalized ? normalized.split(\"/\").map(decodeURIComponent).join(\"/\") : undefined;\n}\n\nfunction categoryIdFromHash(hash: string): string | undefined {\n const value = hash.startsWith(\"#\") ? hash.slice(1) : hash;\n if (!value) {\n return undefined;\n }\n const params = new URLSearchParams(value.startsWith(\"?\") ? value.slice(1) : value);\n const id = params.get(\"id\");\n if (id) {\n return id.trim() || undefined;\n }\n if (value.includes(\"=\")) {\n return undefined;\n }\n try {\n return decodeURIComponent(value).trim() || undefined;\n } catch {\n return value.trim() || undefined;\n }\n}\n\nfunction urlFromInput(url: string | URL | Location): URL {\n if (typeof url === \"string\") {\n return new URL(url, currentLocationUrl());\n }\n return new URL(url.href);\n}\n\nfunction currentLocationUrl(): URL {\n return typeof location === \"undefined\"\n ? new URL(defaultCategoryPageRoot, \"https://example.test\")\n : new URL(location.href);\n}\n","import { create } from \"@bufbuild/protobuf\";\nimport {\n SearchQuerySchema,\n TagSchema,\n type SearchQuery\n} from \"@orderlyshop/core-client\";\n\nexport const declarativeQueryAttributes = [\n \"keywords\",\n \"tags\",\n \"hidden-query\",\n \"order-by\",\n \"store-id\",\n \"featured\"\n];\n\nexport interface SearchQueryInput {\n query?: string;\n keywords?: string;\n hiddenQuery?: string;\n tags?: string[];\n orderBy?: string[];\n storeId?: string;\n featured?: boolean;\n}\n\nexport type SearchQueryConfig = SearchQuery | SearchQueryInput;\n\n/**\n * Creates a Core SearchQuery from plain JavaScript values.\n *\n * This is mainly useful for vanilla browser setups that load the standalone\n * bundle and do not want to import protobuf helpers directly.\n */\nexport function createSearchQuery(input: SearchQueryInput = {}): SearchQuery {\n return create(SearchQuerySchema, {\n Query: input.query ?? input.keywords,\n HiddenQuery: input.hiddenQuery,\n Tags: (input.tags ?? []).map((tag) => create(TagSchema, { Value: tag })),\n OrderBy: input.orderBy ?? [],\n StoreId: input.storeId,\n Featured: input.featured ?? false\n });\n}\n\nexport function normalizeSearchQuery(input: SearchQueryConfig = {}): SearchQuery {\n if (isCoreSearchQuery(input)) {\n return create(SearchQuerySchema, input);\n }\n return createSearchQuery(input);\n}\n\n/**\n * Builds a SearchQuery from simple HTML configuration.\n *\n * Supported on product grids, product rails, and collection pages. Typed\n * JavaScript `query` properties take precedence in the components; this helper\n * only covers the common declarative fields that are safe to express as text.\n */\nexport function declarativeSearchQuery(host: Element): SearchQuery | undefined {\n const queryElement = directQueryElement(host);\n const keywords = readQueryValue(host, queryElement, \"keywords\");\n const hiddenQuery = readQueryValue(host, queryElement, \"hidden-query\");\n const storeId = readQueryValue(host, queryElement, \"store-id\");\n const featured = readQueryBoolean(host, queryElement, \"featured\");\n const tags = readQueryList(host, queryElement, \"tags\");\n const orderBy = readQueryList(host, queryElement, \"order-by\");\n\n if (!keywords && !hiddenQuery && !storeId && featured === undefined && tags.length === 0 && orderBy.length === 0) {\n return undefined;\n }\n\n return create(SearchQuerySchema, {\n Query: keywords || undefined,\n HiddenQuery: hiddenQuery || undefined,\n Tags: tags.map((tag) => create(TagSchema, { Value: tag })),\n OrderBy: orderBy,\n StoreId: storeId || undefined,\n Featured: featured ?? false\n });\n}\n\nfunction directQueryElement(host: Element): Element | undefined {\n const queryElement = [...host.children].find((child) => child.localName === \"query\");\n if (queryElement instanceof HTMLElement) {\n queryElement.hidden = true;\n }\n return queryElement;\n}\n\nfunction isCoreSearchQuery(input: SearchQueryConfig): input is SearchQuery {\n return \"Query\" in input\n || \"HiddenQuery\" in input\n || \"Tags\" in input\n || \"OrderBy\" in input\n || \"StoreId\" in input\n || \"Featured\" in input;\n}\n\nfunction readQueryValue(host: Element, queryElement: Element | undefined, name: string): string {\n return firstValue(\n host.getAttribute(name),\n queryElement?.getAttribute(name),\n childText(queryElement, name)\n );\n}\n\nfunction readQueryList(host: Element, queryElement: Element | undefined, name: string): string[] {\n return uniqueValues([\n ...splitList(host.getAttribute(name)),\n ...splitList(queryElement?.getAttribute(name)),\n ...splitList(childText(queryElement, name))\n ]);\n}\n\nfunction readQueryBoolean(host: Element, queryElement: Element | undefined, name: string): boolean | undefined {\n if (host.hasAttribute(name) && !host.getAttribute(name)) {\n return true;\n }\n if (queryElement?.hasAttribute(name) && !queryElement.getAttribute(name)) {\n return true;\n }\n return parseBoolean(readQueryValue(host, queryElement, name));\n}\n\nfunction childText(queryElement: Element | undefined, name: string): string | undefined {\n const child = [...queryElement?.children ?? []].find((element) => element.localName === name);\n return child?.textContent?.trim();\n}\n\nfunction firstValue(...values: Array<string | null | undefined>): string {\n return values.map((value) => value?.trim()).find(Boolean) ?? \"\";\n}\n\nfunction splitList(value: string | null | undefined): string[] {\n return (value ?? \"\")\n .split(/[\\n,]/g)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction uniqueValues(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction parseBoolean(value: string): boolean | undefined {\n if (!value) {\n return undefined;\n }\n if ([\"true\", \"1\", \"yes\", \"\"].includes(value.toLowerCase())) {\n return true;\n }\n if ([\"false\", \"0\", \"no\"].includes(value.toLowerCase())) {\n return false;\n }\n return undefined;\n}\n","import { clone, create } from \"@bufbuild/protobuf\";\nimport {\n AccountIdSchema,\n SearchQuerySchema,\n UUIDSchema,\n type SearchQuery\n} from \"@orderlyshop/core-client\";\n\nlet configuredShopQuery: SearchQuery | undefined;\n\nexport function configureShopSearchQuery(query: SearchQuery | undefined): void {\n configuredShopQuery = query ? clone(SearchQuerySchema, query) : undefined;\n}\n\nexport function shopSearchQuery(): SearchQuery | undefined {\n return configuredShopQuery ? clone(SearchQuerySchema, configuredShopQuery) : undefined;\n}\n\nexport function createAccountShopQuery(accountId: string): SearchQuery {\n return create(SearchQuerySchema, {\n SourceAccountId: create(AccountIdSchema, {\n Id: create(UUIDSchema, { Value: accountId })\n })\n });\n}\n\nexport function mergeShopSearchQuery(query: SearchQuery | undefined, localShopQuery?: SearchQuery): SearchQuery {\n const specific = query ? clone(SearchQuerySchema, query) : create(SearchQuerySchema);\n const base = combineShopQueries(shopSearchQuery(), localShopQuery);\n if (!base) {\n return specific;\n }\n\n const merged = clone(SearchQuerySchema, base);\n const hiddenQuery = combineQueryText(\n base.HiddenQuery,\n specific.HiddenQuery,\n specific.Query !== undefined ? base.Query : undefined\n );\n\n merged.Query = specific.Query ?? base.Query;\n merged.HiddenQuery = hiddenQuery || undefined;\n merged.Tags = [...base.Tags, ...specific.Tags];\n merged.SourceAccountId = base.SourceAccountId ?? specific.SourceAccountId;\n merged.ExcludeAccountId = base.ExcludeAccountId ?? specific.ExcludeAccountId;\n merged.PriceFrom = specific.PriceFrom ?? base.PriceFrom;\n merged.PriceTo = specific.PriceTo ?? base.PriceTo;\n merged.OrderBy = specific.OrderBy.length ? [...specific.OrderBy] : [...base.OrderBy];\n merged.Facets = uniqueStrings([...base.Facets, ...specific.Facets]);\n merged.Barcode = specific.Barcode ?? base.Barcode;\n merged.ConditionAbove = specific.ConditionAbove ?? base.ConditionAbove;\n merged.SaveAsLatest = base.SaveAsLatest || specific.SaveAsLatest;\n merged.Featured = base.Featured || specific.Featured;\n merged.ShareUrl = specific.ShareUrl ?? base.ShareUrl;\n merged.StoreId = base.StoreId ?? specific.StoreId;\n merged.WithBadge = uniqueNumbers([...base.WithBadge, ...specific.WithBadge]);\n merged.RelatedUrl = specific.RelatedUrl ?? base.RelatedUrl;\n merged.Continuation = specific.Continuation;\n return merged;\n}\n\nfunction combineShopQueries(base: SearchQuery | undefined, local: SearchQuery | undefined): SearchQuery | undefined {\n if (!base && !local) {\n return undefined;\n }\n if (!base) {\n return clone(SearchQuerySchema, local!);\n }\n if (!local) {\n return clone(SearchQuerySchema, base);\n }\n\n const merged = clone(SearchQuerySchema, base);\n merged.Query = combineQueryText(base.Query, local.Query) || undefined;\n merged.HiddenQuery = combineQueryText(base.HiddenQuery, local.HiddenQuery) || undefined;\n merged.Tags = [...base.Tags, ...local.Tags];\n merged.SourceAccountId = local.SourceAccountId ?? base.SourceAccountId;\n merged.ExcludeAccountId = local.ExcludeAccountId ?? base.ExcludeAccountId;\n merged.PriceFrom = local.PriceFrom ?? base.PriceFrom;\n merged.PriceTo = local.PriceTo ?? base.PriceTo;\n merged.OrderBy = local.OrderBy.length ? [...local.OrderBy] : [...base.OrderBy];\n merged.Facets = uniqueStrings([...base.Facets, ...local.Facets]);\n merged.Barcode = local.Barcode ?? base.Barcode;\n merged.ConditionAbove = local.ConditionAbove ?? base.ConditionAbove;\n merged.SaveAsLatest = base.SaveAsLatest || local.SaveAsLatest;\n merged.Featured = base.Featured || local.Featured;\n merged.ShareUrl = local.ShareUrl ?? base.ShareUrl;\n merged.StoreId = local.StoreId ?? base.StoreId;\n merged.WithBadge = uniqueNumbers([...base.WithBadge, ...local.WithBadge]);\n merged.RelatedUrl = local.RelatedUrl ?? base.RelatedUrl;\n merged.Continuation = local.Continuation ?? base.Continuation;\n return merged;\n}\n\nfunction combineQueryText(...values: Array<string | undefined>): string {\n return uniqueStrings(values\n .map((value) => value?.trim())\n .filter((value): value is string => Boolean(value)))\n .join(\" \");\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction uniqueNumbers(values: number[]): number[] {\n return [...new Set(values)];\n}\n","export type UiLanguage = \"DA\" | \"EN\";\n\nexport type UiTextKey =\n | \"addressTitle\"\n | \"basketCheckoutDisabledLabel\"\n | \"basketCheckoutLabel\"\n | \"basketEmptyLabel\"\n | \"basketLabel\"\n | \"basketPanelTitle\"\n | \"categoriesLabel\"\n | \"categoryConfigurationErrorTitle\"\n | \"categoryNoConfigured\"\n | \"categoryNoDefinitions\"\n | \"categoryNoSlugMatch\"\n | \"categoryNoUrlMatch\"\n | \"checkoutAddressTitle\"\n | \"checkoutCityLabel\"\n | \"checkoutCompanyLabel\"\n | \"checkoutCountryLabel\"\n | \"checkoutCustomerTitle\"\n | \"checkoutChooseServicePointLabel\"\n | \"checkoutDeliveryMethodLabel\"\n | \"checkoutDeliveryAddressPrompt\"\n | \"checkoutDeliveryTitle\"\n | \"checkoutEmailLabel\"\n | \"checkoutErrorLabel\"\n | \"checkoutFirstNameLabel\"\n | \"checkoutFormTitle\"\n | \"checkoutLastNameLabel\"\n | \"checkoutOrderTitle\"\n | \"checkoutNoDeliveryMethodsLabel\"\n | \"checkoutNoServicePointsLabel\"\n | \"checkoutPageDescription\"\n | \"checkoutPageTitle\"\n | \"checkoutPhoneCountryLabel\"\n | \"checkoutPhoneLabel\"\n | \"checkoutServicePointLabel\"\n | \"checkoutServicePointHelpLabel\"\n | \"checkoutStreet2Label\"\n | \"checkoutStreetLabel\"\n | \"checkoutSubmitLabel\"\n | \"checkoutSubmittingLabel\"\n | \"checkoutTermsLabel\"\n | \"checkoutTermsLinkLabel\"\n | \"checkoutZipLabel\"\n | \"clearBasketLabel\"\n | \"clearSearchLabel\"\n | \"closeLabel\"\n | \"closeMenuLabel\"\n | \"collapseLabel\"\n | \"contactTitle\"\n | \"continueShoppingLabel\"\n | \"deliveryFallbackLabel\"\n | \"deliveryNote\"\n | \"emailLabel\"\n | \"emptyLabel\"\n | \"expandLabel\"\n | \"homeRailCtaLabel\"\n | \"homeTitle\"\n | \"informationLinksTitle\"\n | \"itemFallbackTitle\"\n | \"loadMoreLabel\"\n | \"loadingLabel\"\n | \"mainCategoriesLabel\"\n | \"mainNavigationLabel\"\n | \"menuLabel\"\n | \"navigationItemFallbackLabel\"\n | \"openingHoursTitle\"\n | \"phoneLabel\"\n | \"productAddLabel\"\n | \"productDetailColorLabel\"\n | \"productDetailConditionLabel\"\n | \"productDetailSizeLabel\"\n | \"productErrorLabel\"\n | \"productFallbackTitle\"\n | \"productImageLabel\"\n | \"productImageOverlayLabel\"\n | \"productLoadingLabel\"\n | \"productNotFoundLabel\"\n | \"productOpenImageLabel\"\n | \"productOpenPageLabel\"\n | \"productRemoveLabel\"\n | \"productViewLabel\"\n | \"productViewWithTitle\"\n | \"productsLabel\"\n | \"productsLoadError\"\n | \"quantityLabel\"\n | \"quantityShortLabel\"\n | \"removeLabel\"\n | \"searchLabel\"\n | \"searchPlaceholder\"\n | \"searchPromptLabel\"\n | \"searchingLabel\"\n | \"servicePointFallbackLabel\"\n | \"shippingLabel\"\n | \"shopBrandLabel\"\n | \"shopNowLabel\"\n | \"sortLabel\"\n | \"subtotalLabel\"\n | \"totalLabel\"\n | \"totalNote\"\n | \"websiteLabel\";\n\nconst UI_TEXTS: Record<UiLanguage, Record<UiTextKey, string>> = {\n DA: {\n addressTitle: \"Adresse\",\n basketCheckoutDisabledLabel: \"Læg varer i kurven før betaling\",\n basketCheckoutLabel: \"Gå til betaling\",\n basketEmptyLabel: \"Din kurv er tom\",\n basketLabel: \"Kurv\",\n basketPanelTitle: \"Kurv\",\n categoriesLabel: \"Kategorier\",\n categoryConfigurationErrorTitle: \"Fejl i kategorikonfiguration\",\n categoryNoConfigured: \"Der er ikke konfigureret nogen kategori.\",\n categoryNoDefinitions: \"Der er ikke konfigureret nogen navigation.\",\n categoryNoSlugMatch: \"Ingen kategori matcher slug \\\"{slug}\\\". Tjek navigation.ts og slug-attributten på orderly-category-page.\",\n categoryNoUrlMatch: \"Ingen kategori matcher URL-id \\\"{id}\\\". Tjek navigation.ts og #id-værdien.\",\n checkoutAddressTitle: \"Leveringsadresse\",\n checkoutCityLabel: \"By\",\n checkoutCompanyLabel: \"Firma\",\n checkoutCountryLabel: \"Land\",\n checkoutCustomerTitle: \"Kundeoplysninger\",\n checkoutChooseServicePointLabel: \"Vælg {method}\",\n checkoutDeliveryAddressPrompt: \"Udfyld adresse, postnummer og by for at se leveringsmetoder.\",\n checkoutDeliveryMethodLabel: \"Leveringsmetode\",\n checkoutDeliveryTitle: \"Leveringsmetode\",\n checkoutEmailLabel: \"Email\",\n checkoutErrorLabel: \"Checkout kunne ikke gennemføres.\",\n checkoutFirstNameLabel: \"Fornavn\",\n checkoutFormTitle: \"Levering og kontakt\",\n checkoutLastNameLabel: \"Efternavn\",\n checkoutOrderTitle: \"Din ordre\",\n checkoutNoDeliveryMethodsLabel: \"Der blev ikke fundet leveringsmetoder til adressen.\",\n checkoutNoServicePointsLabel: \"Der blev ikke fundet udleveringssteder til adressen.\",\n checkoutPageDescription: \"Udfyld leveringsoplysninger, vælg levering og gennemfør din ordre sikkert.\",\n checkoutPageTitle: \"Levering & betaling\",\n checkoutPhoneCountryLabel: \"Landekode\",\n checkoutPhoneLabel: \"Telefon\",\n checkoutServicePointLabel: \"Udleveringssted\",\n checkoutServicePointHelpLabel: \"Vælg dit ønskede udleveringssted\",\n checkoutStreet2Label: \"Adresse 2\",\n checkoutStreetLabel: \"Adresse\",\n checkoutSubmitLabel: \"Betal og bestil\",\n checkoutSubmittingLabel: \"Sender ordre...\",\n checkoutTermsLabel: \"Jeg accepterer\",\n checkoutTermsLinkLabel: \"forretningsbetingelserne\",\n checkoutZipLabel: \"Postnummer\",\n clearBasketLabel: \"Tøm kurv\",\n clearSearchLabel: \"Ryd søgning\",\n closeLabel: \"Luk\",\n closeMenuLabel: \"Luk menu\",\n collapseLabel: \"Luk {label}\",\n contactTitle: \"Kontakt\",\n continueShoppingLabel: \"Fortsæt med at handle\",\n deliveryFallbackLabel: \"Levering {index}\",\n deliveryNote: \"Levering beregnes fra valgt leveringsmetode.\",\n emailLabel: \"Email\",\n emptyLabel: \"Der blev ikke fundet varer.\",\n expandLabel: \"Åbn {label}\",\n homeRailCtaLabel: \"Se alle\",\n homeTitle: \"Butik\",\n informationLinksTitle: \"Information\",\n itemFallbackTitle: \"Vare\",\n loadMoreLabel: \"Indlæs flere\",\n loadingLabel: \"Indlæser...\",\n mainCategoriesLabel: \"Hovedkategorier\",\n mainNavigationLabel: \"Navigation\",\n menuLabel: \"Menu\",\n navigationItemFallbackLabel: \"Punkt {index}\",\n openingHoursTitle: \"Åbningstider\",\n phoneLabel: \"Telefon\",\n productAddLabel: \"Læg i kurven\",\n productDetailColorLabel: \"Farve\",\n productDetailConditionLabel: \"Stand\",\n productDetailSizeLabel: \"Størrelse\",\n productErrorLabel: \"Produktet kunne ikke indlæses.\",\n productFallbackTitle: \"Produkt\",\n productImageLabel: \"billede {index}\",\n productImageOverlayLabel: \"Produktbillede\",\n productLoadingLabel: \"Indlæser produkt...\",\n productNotFoundLabel: \"Produktet blev ikke fundet.\",\n productOpenImageLabel: \"Åbn produktbillede i fuld skærm\",\n productOpenPageLabel: \"Åbn produktside\",\n productRemoveLabel: \"Fjern fra kurven\",\n productViewLabel: \"Vis produkt\",\n productViewWithTitle: \"Vis {title}\",\n productsLabel: \"varer\",\n productsLoadError: \"Varerne kunne ikke indlæses.\",\n quantityLabel: \"Antal\",\n quantityShortLabel: \"Antal\",\n removeLabel: \"Fjern\",\n searchLabel: \"Søg\",\n searchPlaceholder: \"Søg produkter\",\n searchPromptLabel: \"Skriv i søgefeltet for at finde varer.\",\n searchingLabel: \"Søger efter\",\n servicePointFallbackLabel: \"Udleveringssted {index}\",\n shippingLabel: \"Levering\",\n shopBrandLabel: \"Butik\",\n shopNowLabel: \"Se varer\",\n sortLabel: \"Sorter\",\n subtotalLabel: \"Varer\",\n totalLabel: \"Total\",\n totalNote: \"Inkl. moms\",\n websiteLabel: \"Website\"\n },\n EN: {\n addressTitle: \"Address\",\n basketCheckoutDisabledLabel: \"Add items before checkout\",\n basketCheckoutLabel: \"Go to checkout\",\n basketEmptyLabel: \"Your basket is empty\",\n basketLabel: \"Basket\",\n basketPanelTitle: \"Basket\",\n categoriesLabel: \"Categories\",\n categoryConfigurationErrorTitle: \"Category configuration error\",\n categoryNoConfigured: \"No category has been configured.\",\n categoryNoDefinitions: \"No navigation definitions have been configured.\",\n categoryNoSlugMatch: \"No category matches slug \\\"{slug}\\\". Check navigation.ts and the orderly-category-page slug attribute.\",\n categoryNoUrlMatch: \"No category matches URL id \\\"{id}\\\". Check navigation.ts and the #id value.\",\n checkoutAddressTitle: \"Delivery address\",\n checkoutCityLabel: \"City\",\n checkoutCompanyLabel: \"Company\",\n checkoutCountryLabel: \"Country\",\n checkoutCustomerTitle: \"Customer information\",\n checkoutChooseServicePointLabel: \"Choose {method}\",\n checkoutDeliveryAddressPrompt: \"Enter street, zip, and city to see delivery methods.\",\n checkoutDeliveryMethodLabel: \"Delivery method\",\n checkoutDeliveryTitle: \"Delivery method\",\n checkoutEmailLabel: \"Email\",\n checkoutErrorLabel: \"Checkout failed.\",\n checkoutFirstNameLabel: \"First name\",\n checkoutFormTitle: \"Delivery and contact\",\n checkoutLastNameLabel: \"Last name\",\n checkoutOrderTitle: \"Your order\",\n checkoutNoDeliveryMethodsLabel: \"No delivery methods were found for the address.\",\n checkoutNoServicePointsLabel: \"No service points were found for the address.\",\n checkoutPageDescription: \"Enter your delivery details, choose delivery, and complete your order securely.\",\n checkoutPageTitle: \"Delivery & Payment\",\n checkoutPhoneCountryLabel: \"Phone country\",\n checkoutPhoneLabel: \"Phone\",\n checkoutServicePointLabel: \"Service point\",\n checkoutServicePointHelpLabel: \"Choose your preferred pickup point\",\n checkoutStreet2Label: \"Street 2\",\n checkoutStreetLabel: \"Street\",\n checkoutSubmitLabel: \"Create order\",\n checkoutSubmittingLabel: \"Creating order...\",\n checkoutTermsLabel: \"I accept the terms and conditions\",\n checkoutTermsLinkLabel: \"terms\",\n checkoutZipLabel: \"Zip\",\n clearBasketLabel: \"Clear basket\",\n clearSearchLabel: \"Clear search\",\n closeLabel: \"Close\",\n closeMenuLabel: \"Close menu\",\n collapseLabel: \"Collapse {label}\",\n contactTitle: \"Contact\",\n continueShoppingLabel: \"Continue shopping\",\n deliveryFallbackLabel: \"Delivery {index}\",\n deliveryNote: \"Delivery is calculated from the selected delivery method.\",\n emailLabel: \"Email\",\n emptyLabel: \"No products found.\",\n expandLabel: \"Expand {label}\",\n homeRailCtaLabel: \"See all\",\n homeTitle: \"Shop\",\n informationLinksTitle: \"Information\",\n itemFallbackTitle: \"Item\",\n loadMoreLabel: \"Load more\",\n loadingLabel: \"Loading...\",\n mainCategoriesLabel: \"Main categories\",\n mainNavigationLabel: \"Main navigation\",\n menuLabel: \"Menu\",\n navigationItemFallbackLabel: \"Item {index}\",\n openingHoursTitle: \"Opening hours\",\n phoneLabel: \"Phone\",\n productAddLabel: \"Add to basket\",\n productDetailColorLabel: \"Color\",\n productDetailConditionLabel: \"Condition\",\n productDetailSizeLabel: \"Size\",\n productErrorLabel: \"Product could not be loaded.\",\n productFallbackTitle: \"Product\",\n productImageLabel: \"image {index}\",\n productImageOverlayLabel: \"Product image\",\n productLoadingLabel: \"Loading product...\",\n productNotFoundLabel: \"Product could not be found.\",\n productOpenImageLabel: \"Open product image fullscreen\",\n productOpenPageLabel: \"Open product page\",\n productRemoveLabel: \"Remove from basket\",\n productViewLabel: \"View product\",\n productViewWithTitle: \"View {title}\",\n productsLabel: \"products\",\n productsLoadError: \"Products could not be loaded.\",\n quantityLabel: \"Quantity\",\n quantityShortLabel: \"Qty\",\n removeLabel: \"Remove\",\n searchLabel: \"Search\",\n searchPlaceholder: \"Search products\",\n searchPromptLabel: \"Start typing to find products.\",\n searchingLabel: \"Searching for\",\n servicePointFallbackLabel: \"Service point {index}\",\n shippingLabel: \"Shipping\",\n shopBrandLabel: \"Shop\",\n shopNowLabel: \"Shop now\",\n sortLabel: \"Sort\",\n subtotalLabel: \"Items\",\n totalLabel: \"Total\",\n totalNote: \"Incl. VAT\",\n websiteLabel: \"Website\"\n }\n};\n\nlet currentUiLanguage: UiLanguage = \"DA\";\n\nexport function defaultUiLanguage(): UiLanguage {\n return currentUiLanguage;\n}\n\nexport function configureUiLanguage(language: UiLanguage | string | undefined): UiLanguage {\n currentUiLanguage = normalizeUiLanguage(language);\n return currentUiLanguage;\n}\n\nexport function normalizeUiLanguage(language: UiLanguage | string | undefined): UiLanguage {\n const value = language?.trim().toUpperCase();\n return value === \"EN\" ? \"EN\" : \"DA\";\n}\n\nexport function uiText(key: UiTextKey, language: UiLanguage = currentUiLanguage): string {\n return UI_TEXTS[language][key] ?? UI_TEXTS.DA[key];\n}\n\nexport function formatUiText(key: UiTextKey, values: Record<string, string | number | undefined>, language: UiLanguage = currentUiLanguage): string {\n return uiText(key, language).replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = values[name];\n return value === undefined ? \"\" : String(value);\n });\n}\n","import type { CategoryUrlMode, NavigationDefinition, ResolvedNavigationItem, SortOption } from \"./types.js\";\nimport { createCategoryNavigation, navigationConfigurationError, resolveCategoryUrlMode } from \"./taxonomy.js\";\nimport { configureShopSearchQuery, shopSearchQuery } from \"./shop-query.js\";\nimport { normalizeSearchQuery } from \"./query.js\";\nimport type { SearchQuery } from \"@orderlyshop/core-client\";\nimport type { CheckoutLabels } from \"./components/checkout.js\";\nimport { configureUiLanguage, uiText, type UiLanguage } from \"./i18n.js\";\n\nexport const DEFAULT_SHOP_BASE_URL = \"https://service.orderly.shop\";\nexport const DEFAULT_SHOP_BRAND_LABEL = uiText(\"shopBrandLabel\", \"DA\");\n\nexport const DEFAULT_SHOP_SORT_OPTIONS: SortOption[] = defaultShopSortOptionsForLanguage(\"DA\");\n\nexport const DEFAULT_SHOP_NAVIGATION_DEFINITIONS: NavigationDefinition[] = defaultShopNavigationDefinitionsForLanguage(\"DA\");\nexport const DEFAULT_SHOP_CATEGORY_DEFINITIONS: NavigationDefinition[] = DEFAULT_SHOP_NAVIGATION_DEFINITIONS;\n\nexport interface BasketLabels {\n emptyLabel?: string;\n clearLabel?: string;\n continueLabel?: string;\n quantityLabel?: string;\n removeLabel?: string;\n subtotalLabel?: string;\n shippingLabel?: string;\n totalLabel?: string;\n totalNote?: string;\n deliveryNote?: string;\n}\n\nexport interface DefaultShopConfig {\n uiLanguage?: UiLanguage | string;\n baseUrl?: string;\n brandLabel?: string;\n homeHref?: string;\n productHref?: string;\n checkoutHref?: string;\n checkoutLabel?: string;\n checkoutPageTitle?: string;\n checkoutPageDescription?: string;\n checkoutOrderTitle?: string;\n checkoutTermsHref?: string;\n checkoutLabels?: CheckoutLabels;\n basketLabels?: BasketLabels;\n searchPlaceholder?: string;\n emptyLabel?: string;\n /**\n * User-facing navigation/category structure for default storefront pages.\n */\n navigationDefinitions?: NavigationDefinition[];\n /**\n * Backward-compatible alias for navigationDefinitions.\n */\n categoryDefinitions?: NavigationDefinition[];\n categoryPageRoot?: string;\n categoryUrlMode?: CategoryUrlMode;\n /**\n * Core SearchQuery merged into every default storefront search.\n *\n * Use this for shop-wide scope such as tenant/account filters, published-only\n * filters, inventory constraints, or other hidden search restrictions. It is\n * intentionally a generic SearchQuery and not account-id specific.\n */\n defaultQuery?: SearchQuery;\n /**\n * Backward-compatible alias for defaultQuery.\n */\n query?: SearchQuery;\n sortOptions?: SortOption[];\n}\n\ninterface DefaultShopState {\n uiLanguage: UiLanguage;\n baseUrl: string;\n brandLabel: string;\n homeHref: string;\n productHref: string;\n checkoutHref: string;\n checkoutLabel: string;\n checkoutPageTitle: string;\n checkoutPageDescription: string;\n checkoutOrderTitle: string;\n checkoutTermsHref: string;\n checkoutLabels: CheckoutLabels;\n basketLabels: BasketLabels;\n searchPlaceholder: string;\n emptyLabel: string;\n navigationDefinitions: NavigationDefinition[];\n categoryPageRoot: string;\n categoryUrlMode?: CategoryUrlMode;\n sortOptions: SortOption[];\n navigationError?: string;\n}\n\nconst initialDefaultShopConfig: DefaultShopState = defaultShopStateForLanguage(\"DA\");\n\nlet defaultShopConfig: DefaultShopState = cloneDefaultShopConfig(initialDefaultShopConfig);\n\nexport function configureDefaultShop(config: DefaultShopConfig = {}): void {\n const nextLanguage = \"uiLanguage\" in config ? configureUiLanguage(config.uiLanguage) : defaultShopConfig.uiLanguage;\n const baseConfig = nextLanguage === defaultShopConfig.uiLanguage ? defaultShopConfig : defaultShopStateForLanguage(nextLanguage);\n if (\"defaultQuery\" in config) {\n configureShopSearchQuery(config.defaultQuery);\n } else if (\"query\" in config) {\n configureShopSearchQuery(config.query);\n }\n const navigationDefinitions = config.navigationDefinitions ?? config.categoryDefinitions ?? baseConfig.navigationDefinitions;\n defaultShopConfig = cloneDefaultShopConfig({\n uiLanguage: nextLanguage,\n baseUrl: config.baseUrl ?? baseConfig.baseUrl,\n brandLabel: config.brandLabel ?? baseConfig.brandLabel,\n homeHref: config.homeHref ?? baseConfig.homeHref,\n productHref: config.productHref ?? baseConfig.productHref,\n checkoutHref: config.checkoutHref ?? baseConfig.checkoutHref,\n checkoutLabel: config.checkoutLabel ?? baseConfig.checkoutLabel,\n checkoutPageTitle: config.checkoutPageTitle ?? baseConfig.checkoutPageTitle,\n checkoutPageDescription: config.checkoutPageDescription ?? baseConfig.checkoutPageDescription,\n checkoutOrderTitle: config.checkoutOrderTitle ?? baseConfig.checkoutOrderTitle,\n checkoutTermsHref: config.checkoutTermsHref ?? baseConfig.checkoutTermsHref,\n checkoutLabels: config.checkoutLabels ? { ...baseConfig.checkoutLabels, ...config.checkoutLabels } : baseConfig.checkoutLabels,\n basketLabels: config.basketLabels ? { ...baseConfig.basketLabels, ...config.basketLabels } : baseConfig.basketLabels,\n searchPlaceholder: config.searchPlaceholder ?? baseConfig.searchPlaceholder,\n emptyLabel: config.emptyLabel ?? baseConfig.emptyLabel,\n navigationDefinitions,\n categoryPageRoot: config.categoryPageRoot ?? baseConfig.categoryPageRoot,\n categoryUrlMode: \"categoryUrlMode\" in config ? config.categoryUrlMode : baseConfig.categoryUrlMode,\n sortOptions: config.sortOptions ?? baseConfig.sortOptions,\n navigationError: navigationConfigurationError(navigationDefinitions)\n });\n}\n\nexport function resetDefaultShop(): void {\n configureUiLanguage(\"DA\");\n defaultShopConfig = cloneDefaultShopConfig(initialDefaultShopConfig);\n configureShopSearchQuery(undefined);\n}\n\nexport function defaultShopUiLanguage(): UiLanguage {\n return defaultShopConfig.uiLanguage;\n}\n\nexport function defaultShopBaseUrl(): string {\n return defaultShopConfig.baseUrl;\n}\n\nexport function defaultShopBrandLabel(): string {\n return defaultShopConfig.brandLabel;\n}\n\nexport function defaultShopHomeHref(): string {\n return defaultShopConfig.homeHref;\n}\n\nexport function defaultShopProductHref(): string {\n return defaultShopConfig.productHref;\n}\n\nexport function defaultShopCheckoutHref(): string {\n return defaultShopConfig.checkoutHref;\n}\n\nexport function defaultShopCheckoutLabel(): string {\n return defaultShopConfig.checkoutLabel;\n}\n\nexport function defaultShopCheckoutPageTitle(): string {\n return defaultShopConfig.checkoutPageTitle;\n}\n\nexport function defaultShopCheckoutPageDescription(): string {\n return defaultShopConfig.checkoutPageDescription;\n}\n\nexport function defaultShopCheckoutOrderTitle(): string {\n return defaultShopConfig.checkoutOrderTitle;\n}\n\nexport function defaultShopCheckoutTermsHref(): string {\n return defaultShopConfig.checkoutTermsHref;\n}\n\nexport function defaultShopCheckoutLabels(): CheckoutLabels {\n return { ...defaultShopConfig.checkoutLabels };\n}\n\nexport function defaultShopBasketLabels(): BasketLabels {\n return { ...defaultShopConfig.basketLabels };\n}\n\nexport function defaultShopSearchPlaceholder(): string {\n return defaultShopConfig.searchPlaceholder;\n}\n\nexport function defaultShopEmptyLabel(): string {\n return defaultShopConfig.emptyLabel;\n}\n\nexport function defaultShopSortOptions(): SortOption[] {\n return defaultShopConfig.sortOptions.map((option) => ({\n label: option.label,\n orderBy: [...option.orderBy]\n }));\n}\n\nexport function defaultShopSearchQuery(): SearchQuery | undefined {\n return shopSearchQuery();\n}\n\nexport function defaultShopNavigationItems(url: string | URL | Location = currentLocationUrl()): ResolvedNavigationItem[] {\n if (defaultShopConfig.navigationError) {\n return [];\n }\n return createCategoryNavigation(defaultShopConfig.navigationDefinitions, {\n pageRoot: defaultShopConfig.categoryPageRoot,\n urlMode: defaultShopConfig.categoryUrlMode ?? resolveCategoryUrlMode(url, { pageRoot: defaultShopConfig.categoryPageRoot })\n });\n}\n\nexport function defaultShopNavigationError(): string | undefined {\n return defaultShopConfig.navigationError;\n}\n\nfunction cloneDefaultShopConfig(config: DefaultShopState): DefaultShopState {\n return {\n ...config,\n navigationDefinitions: config.navigationDefinitions.map(cloneNavigationDefinition),\n checkoutLabels: { ...config.checkoutLabels },\n basketLabels: { ...config.basketLabels },\n navigationError: config.navigationError,\n sortOptions: config.sortOptions.map((option) => ({\n label: option.label,\n orderBy: [...option.orderBy]\n }))\n };\n}\n\nfunction cloneNavigationDefinition(definition: NavigationDefinition): NavigationDefinition {\n return {\n ...definition,\n query: definition.query ? normalizeSearchQuery(definition.query) : undefined,\n children: definition.children?.map(cloneNavigationDefinition)\n };\n}\n\nfunction defaultShopStateForLanguage(language: UiLanguage): DefaultShopState {\n return {\n uiLanguage: language,\n baseUrl: DEFAULT_SHOP_BASE_URL,\n brandLabel: uiText(\"shopBrandLabel\", language),\n homeHref: \"/\",\n productHref: \"/product.html\",\n checkoutHref: \"/checkout.html\",\n checkoutLabel: uiText(\"basketCheckoutLabel\", language),\n checkoutPageTitle: uiText(\"checkoutPageTitle\", language),\n checkoutPageDescription: uiText(\"checkoutPageDescription\", language),\n checkoutOrderTitle: uiText(\"checkoutOrderTitle\", language),\n checkoutTermsHref: \"#\",\n checkoutLabels: {},\n basketLabels: {},\n searchPlaceholder: uiText(\"searchPlaceholder\", language),\n emptyLabel: uiText(\"emptyLabel\", language),\n navigationDefinitions: defaultShopNavigationDefinitionsForLanguage(language),\n categoryPageRoot: \"/categories/\",\n categoryUrlMode: \"path\",\n sortOptions: defaultShopSortOptionsForLanguage(language),\n navigationError: undefined\n };\n}\n\nfunction defaultShopSortOptionsForLanguage(language: UiLanguage): SortOption[] {\n return [\n { label: language === \"EN\" ? \"Newest\" : \"Nyeste\", orderBy: [\"CreatedTime desc\"] },\n { label: language === \"EN\" ? \"Price: low to high\" : \"Pris: lav til høj\", orderBy: [\"Price asc\"] },\n { label: language === \"EN\" ? \"Price: high to low\" : \"Pris: høj til lav\", orderBy: [\"Price desc\"] }\n ];\n}\n\nfunction defaultShopNavigationDefinitionsForLanguage(language: UiLanguage): NavigationDefinition[] {\n if (language === \"EN\") {\n return [\n {\n label: \"Clothing\",\n slug: \"clothing\",\n heroImage: \"https://images.unsplash.com/photo-1496747611176-843222e1e57c?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"clothing fashion\" },\n children: [\n { label: \"Women\", slug: \"women\", query: { query: \"women clothing dresses jackets\" } },\n { label: \"Men\", slug: \"men\", query: { query: \"men clothing shirts jackets\" } },\n { label: \"Kids\", slug: \"kids\", query: { query: \"kids clothing\" } },\n { label: \"Accessories\", slug: \"accessories\", query: { query: \"fashion accessories\" } }\n ]\n },\n {\n label: \"Shoes\",\n slug: \"shoes\",\n heroImage: \"https://images.unsplash.com/photo-1542291026-7eec264c27ff?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"shoes sneakers\" },\n children: [\n { label: \"Women shoes\", slug: \"women-shoes\", query: { query: \"women shoes sneakers boots\" } },\n { label: \"Men shoes\", slug: \"men-shoes\", query: { query: \"men shoes sneakers boots\" } },\n { label: \"Sport shoes\", slug: \"sport-shoes\", query: { query: \"sport shoes running\" } }\n ]\n },\n {\n label: \"Home\",\n slug: \"home\",\n heroImage: \"https://images.unsplash.com/photo-1618221195710-dd6b41faaea6?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"home interior design\" },\n children: [\n { label: \"Furniture\", slug: \"furniture\", query: { query: \"furniture sofa chair table\" } },\n { label: \"Lighting\", slug: \"lighting\", query: { query: \"lamp lighting home\" } },\n { label: \"Kitchen\", slug: \"kitchen\", query: { query: \"kitchen equipment\" } }\n ]\n },\n {\n label: \"Electronics\",\n slug: \"electronics\",\n heroImage: \"https://images.unsplash.com/photo-1518770660439-4636190af475?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"electronics computer mobile\" },\n children: [\n { label: \"Computers\", slug: \"computers\", query: { query: \"computer tablet laptop\" } },\n { label: \"Mobile\", slug: \"mobile\", query: { query: \"mobile phone accessories\" } },\n { label: \"Gaming\", slug: \"gaming\", query: { query: \"gaming console\" } }\n ]\n },\n {\n label: \"Beauty\",\n slug: \"beauty\",\n heroImage: \"https://images.unsplash.com/photo-1522335789203-aabd1fc54bc9?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"beauty skincare makeup\" },\n children: [\n { label: \"Skincare\", slug: \"skincare\", query: { query: \"skincare beauty\" } },\n { label: \"Makeup\", slug: \"makeup\", query: { query: \"makeup cosmetics\" } },\n { label: \"Perfume\", slug: \"perfume\", query: { query: \"perfume fragrance\" } }\n ]\n }\n ];\n }\n\n return [\n {\n label: \"Tøj\",\n slug: \"toej\",\n heroImage: \"https://images.unsplash.com/photo-1496747611176-843222e1e57c?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"tøj mode\" },\n children: [\n { label: \"Dame\", slug: \"dame\", query: { query: \"dame tøj kjoler jakker\" } },\n { label: \"Herre\", slug: \"herre\", query: { query: \"herre tøj skjorter jakker\" } },\n { label: \"Børn\", slug: \"boern\", query: { query: \"børnetøj\" } },\n { label: \"Accessories\", slug: \"accessories\", query: { query: \"mode accessories\" } }\n ]\n },\n {\n label: \"Sko\",\n slug: \"sko\",\n heroImage: \"https://images.unsplash.com/photo-1542291026-7eec264c27ff?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"sko sneakers\" },\n children: [\n { label: \"Damesko\", slug: \"damesko\", query: { query: \"damesko sneakers støvler\" } },\n { label: \"Herresko\", slug: \"herresko\", query: { query: \"herresko sneakers støvler\" } },\n { label: \"Sportssko\", slug: \"sportssko\", query: { query: \"sportssko løbesko\" } }\n ]\n },\n {\n label: \"Bolig\",\n slug: \"bolig\",\n heroImage: \"https://images.unsplash.com/photo-1618221195710-dd6b41faaea6?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"bolig indretning design\" },\n children: [\n { label: \"Møbler\", slug: \"moebler\", query: { query: \"møbler sofa stol bord\" } },\n { label: \"Belysning\", slug: \"belysning\", query: { query: \"lampe belysning bolig\" } },\n { label: \"Køkken\", slug: \"koekken\", query: { query: \"køkkenudstyr\" } }\n ]\n },\n {\n label: \"Elektronik\",\n slug: \"elektronik\",\n heroImage: \"https://images.unsplash.com/photo-1518770660439-4636190af475?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"elektronik computer mobil\" },\n children: [\n { label: \"Computere\", slug: \"computere\", query: { query: \"computer tablet laptop\" } },\n { label: \"Mobil\", slug: \"mobil\", query: { query: \"mobil telefon tilbehør\" } },\n { label: \"Gaming\", slug: \"gaming\", query: { query: \"gaming konsol\" } }\n ]\n },\n {\n label: \"Skønhed\",\n slug: \"skoenhed\",\n heroImage: \"https://images.unsplash.com/photo-1522335789203-aabd1fc54bc9?auto=format&fit=crop&w=1800&q=80\",\n query: { query: \"skønhed hudpleje makeup\" },\n children: [\n { label: \"Hudpleje\", slug: \"hudpleje\", query: { query: \"hudpleje skønhed\" } },\n { label: \"Makeup\", slug: \"makeup\", query: { query: \"makeup kosmetik\" } },\n { label: \"Parfume\", slug: \"parfume\", query: { query: \"parfume duft\" } }\n ]\n }\n ];\n}\n\nfunction currentLocationUrl(): URL {\n return typeof location === \"undefined\"\n ? new URL(defaultShopConfig.categoryPageRoot, \"https://example.test\")\n : new URL(location.href);\n}\n","import type { Credit, SearchObject, StoredImage } from \"@orderlyshop/core-client\";\n\nexport type StoredImageUrlVariant = \"thumbnail\" | \"object\";\nexport type StoredImageUrlResolver = (image: StoredImage) => string | undefined;\nexport const DEFAULT_IMAGE_BASE_URL = \"https://orderlyproduction.azureedge.net/\";\n\nexport interface StoredImageUrlConfig {\n baseUrl?: string;\n thumbnailsPath?: string;\n objectsPath?: string;\n resolver?: StoredImageUrlResolver;\n}\n\nexport interface CreditFormatOptions {\n locale?: string;\n}\n\nexport interface CreditFormatParts {\n prefix: string;\n amount: string;\n currency: string;\n text: string;\n}\n\nconst defaultStoredImageUrlConfig: StoredImageUrlConfig = {\n baseUrl: DEFAULT_IMAGE_BASE_URL\n};\n\nlet storedImageUrlConfig: StoredImageUrlConfig = { ...defaultStoredImageUrlConfig };\n\nexport function configureStoredImageUrls(config: StoredImageUrlConfig): void {\n storedImageUrlConfig = {\n baseUrl: config.baseUrl ?? defaultStoredImageUrlConfig.baseUrl,\n thumbnailsPath: config.thumbnailsPath,\n objectsPath: config.objectsPath,\n resolver: config.resolver\n };\n}\n\nexport function firstImageUrl(product: SearchObject | undefined): string | undefined {\n return storedImageUrl(firstImage(product));\n}\n\nexport function firstImage(product: SearchObject | undefined): StoredImage | undefined {\n return product?.Images[0];\n}\n\nexport function storedImageUrl(image: StoredImage | undefined, variant: StoredImageUrlVariant = \"thumbnail\"): string | undefined {\n if (!image) {\n return undefined;\n }\n const candidate = image as unknown as Record<string, unknown>;\n for (const key of [\"URL\", \"Url\", \"url\", \"ThumbnailUrl\", \"thumbnailUrl\"]) {\n const value = candidate[key];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n if (image.ImageDataBase64) {\n return `data:image/jpeg;base64,${image.ImageDataBase64}`;\n }\n const resolved = storedImageUrlConfig.resolver?.(image);\n if (resolved) {\n return resolved;\n }\n if (/^https?:\\/\\//i.test(image.Name) || image.Name.startsWith(\"/\")) {\n return image.Name;\n }\n if (storedImageUrlConfig.baseUrl && image.Name) {\n const imageName = image.Name.toLowerCase();\n const path = variant === \"object\" || image.IsAsset || imageName.includes(\"cms\") || imageName.startsWith(\"images\")\n ? storedImageUrlConfig.objectsPath ?? \"objects\"\n : storedImageUrlConfig.thumbnailsPath ?? \"thumbnails\";\n return joinUrl(storedImageUrlConfig.baseUrl, path, image.Name);\n }\n return undefined;\n}\n\nexport function formatCredit(credit: Credit | undefined, options: CreditFormatOptions = {}): string {\n return formatCreditParts(credit, options).text;\n}\n\nexport function formatCreditParts(credit: Credit | undefined, options: CreditFormatOptions = {}): CreditFormatParts {\n if (!credit) {\n return emptyCreditParts();\n }\n const amount = Number(credit.Amount ?? 0);\n const currency = credit.Currency || \"\";\n const prefix = creditPrefix(currency);\n const formattedAmount = amount.toLocaleString(options.locale ?? \"da-DK\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n });\n return {\n prefix,\n amount: formattedAmount,\n currency,\n text: `${prefix ? `${prefix} ` : \"\"}${formattedAmount}`.trim()\n };\n}\n\nexport function productId(product: SearchObject): string {\n const target = product.Target as unknown as { Id?: { Value?: string } } | undefined;\n return target?.Id?.Value ?? product.SKU?.Value ?? product.Title ?? \"\";\n}\n\nfunction joinUrl(baseUrl: string, path: string, name: string): string {\n const root = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, \"\");\n const normalizedName = name.split(\"/\").map(encodeURIComponent).join(\"/\");\n return new URL(`${normalizedPath}/${normalizedName}`, root).toString();\n}\n\nfunction creditPrefix(currency: string): string {\n if (currency.toUpperCase() === \"DKK\") {\n return \"kr.\";\n }\n return currency.trim();\n}\n\nfunction emptyCreditParts(): CreditFormatParts {\n return {\n prefix: \"\",\n amount: \"\",\n currency: \"\",\n text: \"\"\n };\n}\n","import type { Credit, StoredImage } from \"@orderlyshop/core-client\";\nimport { formatCredit } from \"./format.js\";\n\nexport type TemplateViewport = \"desktop\" | \"mobile\";\n\nexport interface ResponsiveTemplateConfig {\n mobileMediaQuery?: string;\n}\n\nexport interface GlobalTemplateRegistration {\n name: string;\n template: HTMLTemplateElement | string;\n for?: string | string[];\n viewport?: TemplateViewport;\n media?: string;\n}\n\nconst defaultMobileMediaQuery = \"(max-width: 767px)\";\n\nlet responsiveTemplateConfig: Required<ResponsiveTemplateConfig> = {\n mobileMediaQuery: defaultMobileMediaQuery\n};\nlet responsiveMediaQuery: MediaQueryList | undefined;\nlet responsiveListenersConnected = false;\nlet responsiveNotificationQueued = false;\nconst responsiveTemplateListeners = new Set<() => void>();\nconst globalTemplates: HTMLTemplateElement[] = [];\nconst projectedSlotCache = new WeakMap<HTMLElement, Map<string, Node[]>>();\n\nexport function configureResponsiveTemplates(config: ResponsiveTemplateConfig = {}): void {\n responsiveTemplateConfig = {\n mobileMediaQuery: config.mobileMediaQuery ?? defaultMobileMediaQuery\n };\n resetResponsiveListeners();\n notifyResponsiveTemplateListeners();\n}\n\nexport function currentTemplateViewport(): TemplateViewport {\n if (matchesMedia(responsiveTemplateConfig.mobileMediaQuery)) {\n return \"mobile\";\n }\n return \"desktop\";\n}\n\nexport function observeResponsiveTemplateChanges(callback: () => void): () => void {\n if (typeof window === \"undefined\") {\n return () => undefined;\n }\n responsiveTemplateListeners.add(callback);\n connectResponsiveListeners();\n return () => {\n responsiveTemplateListeners.delete(callback);\n if (responsiveTemplateListeners.size === 0) {\n disconnectResponsiveListeners();\n }\n };\n}\n\nexport function registerGlobalTemplate(registration: GlobalTemplateRegistration): () => void {\n const templateElement = normalizeTemplateRegistration(registration);\n globalTemplates.push(templateElement);\n notifyResponsiveTemplateListeners();\n return () => {\n const index = globalTemplates.indexOf(templateElement);\n if (index >= 0) {\n globalTemplates.splice(index, 1);\n notifyResponsiveTemplateListeners();\n }\n };\n}\n\nexport function clearGlobalTemplates(): void {\n if (globalTemplates.length === 0) {\n return;\n }\n globalTemplates.splice(0, globalTemplates.length);\n notifyResponsiveTemplateListeners();\n}\n\nexport function ensureRenderRoot(host: HTMLElement): HTMLElement {\n const existing = host.querySelector(\":scope > [data-orderly-render-root]\");\n if (existing instanceof HTMLElement) {\n return existing;\n }\n const root = document.createElement(\"div\");\n root.dataset.orderlyRenderRoot = \"\";\n host.append(root);\n return root;\n}\n\nexport function render(host: HTMLElement, content: Node | string): HTMLElement {\n host.dataset.orderlyViewport = currentTemplateViewport();\n const root = ensureRenderRoot(host);\n root.dataset.orderlyViewport = currentTemplateViewport();\n root.replaceChildren();\n if (typeof content === \"string\") {\n root.innerHTML = content;\n } else {\n root.append(content);\n }\n host.dataset.orderlyReady = \"true\";\n host.setAttribute(\"data-orderly-ready\", \"true\");\n return root;\n}\n\nexport function template(host: HTMLElement, name: string): HTMLTemplateElement | undefined {\n const localCandidates = [...host.children]\n .filter((element): element is HTMLTemplateElement => element instanceof HTMLTemplateElement && element.dataset.orderlyTemplate === name);\n return selectResponsiveTemplate(localCandidates) ?? selectResponsiveTemplate(globalTemplateCandidates(host, name));\n}\n\nexport function cloneTemplate(host: HTMLElement, name: string): DocumentFragment | undefined {\n const found = template(host, name);\n return found?.content.cloneNode(true) as DocumentFragment | undefined;\n}\n\nexport function upgradeFragment(fragment: DocumentFragment): DocumentFragment {\n const container = document.createElement(\"div\");\n container.append(fragment);\n customElements.upgrade(container);\n const upgraded = document.createDocumentFragment();\n upgraded.append(...container.childNodes);\n return upgraded;\n}\n\nexport function cloneTemplateSource(source: HTMLTemplateElement | string | undefined): DocumentFragment | undefined {\n if (!source) {\n return undefined;\n }\n if (typeof source === \"string\") {\n const template = document.createElement(\"template\");\n template.innerHTML = source;\n return template.content.cloneNode(true) as DocumentFragment;\n }\n return source.content.cloneNode(true) as DocumentFragment;\n}\n\nexport function slotTarget(root: ParentNode, name: string): Element | undefined {\n const target = root.querySelector(`[data-orderly-slot=\"${name}\"], slot[name=\"${name}\"]`);\n return target ?? undefined;\n}\n\nexport function replaceSlot(root: ParentNode, name: string, content: Node | string | undefined): void {\n const target = slotTarget(root, name);\n if (!target) {\n return;\n }\n target.replaceChildren();\n if (typeof content === \"string\") {\n target.textContent = content;\n } else if (content) {\n target.append(content);\n }\n}\n\nexport function assignedSlotNodes(host: HTMLElement, slotName: string): Node[] {\n return [...host.querySelectorAll(`[slot=\"${slotName}\"]`)];\n}\n\nexport function projectSlots(host: HTMLElement, root: ParentNode, slotNames: string[]): void {\n const cache = projectedSlotCache.get(host) ?? new Map<string, Node[]>();\n if (!projectedSlotCache.has(host)) {\n projectedSlotCache.set(host, cache);\n }\n for (const name of slotNames) {\n const target = slotTarget(root, name);\n if (!target) {\n continue;\n }\n const directNodes = directAssignedSlotNodes(host, name);\n if (directNodes.length > 0) {\n cache.set(name, directNodes);\n }\n const nodes = (cache.get(name) ?? []).filter((node) => node.isConnected && host.contains(node));\n if (nodes.length > 0) {\n cache.set(name, nodes);\n } else {\n cache.delete(name);\n }\n target.replaceChildren(...nodes);\n }\n}\n\nfunction directAssignedSlotNodes(host: HTMLElement, slotName: string): Node[] {\n return [...host.children].filter((element) => element.getAttribute(\"slot\") === slotName);\n}\n\nexport function bindText(root: ParentNode, name: string, value: string | undefined): void {\n root.querySelectorAll(`[data-orderly-bind=\"${name}\"]`).forEach((element) => {\n element.textContent = value ?? \"\";\n });\n}\n\nexport function bindImage(root: ParentNode, name: string, value: string | undefined): void {\n root.querySelectorAll(`[data-orderly-bind=\"${name}\"]`).forEach((element) => {\n if (element instanceof HTMLImageElement) {\n if (value) {\n element.src = value;\n delete element.dataset.orderlyEmptyImage;\n } else {\n element.removeAttribute(\"src\");\n element.dataset.orderlyEmptyImage = \"\";\n }\n }\n });\n}\n\nexport function bindStoredImage(root: ParentNode, name: string, value: StoredImage | undefined): void {\n root.querySelectorAll(`[data-orderly-bind=\"${name}\"]`).forEach((element) => {\n if (\"image\" in element) {\n (element as HTMLElement & { image?: StoredImage }).image = value;\n }\n });\n}\n\nexport function bindCredit(root: ParentNode, name: string, value: Credit | undefined): void {\n root.querySelectorAll(`[data-orderly-bind=\"${name}\"]`).forEach((element) => {\n if (\"credit\" in element) {\n (element as HTMLElement & { credit?: Credit }).credit = value;\n } else {\n element.textContent = formatCredit(value);\n }\n });\n}\n\nexport function dispatch<T>(target: EventTarget, type: string, detail: T, options: EventInit = {}): boolean {\n return target.dispatchEvent(new CustomEvent(type, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n }));\n}\n\nexport function readInput(root: ParentNode, name: string): string {\n const element = root.querySelector(`[name=\"${name}\"]`);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n return element.value;\n }\n return \"\";\n}\n\nexport function setInput(root: ParentNode, name: string, value: string | undefined): void {\n const element = root.querySelector(`[name=\"${name}\"]`);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n element.value = value ?? \"\";\n }\n}\n\nexport function siblingTagName(host: HTMLElement, ownName: string, siblingName: string): string {\n if (host.localName.endsWith(ownName)) {\n return `${host.localName.slice(0, -ownName.length)}${siblingName}`;\n }\n return `orderly-${siblingName}`;\n}\n\nfunction selectResponsiveTemplate(candidates: HTMLTemplateElement[]): HTMLTemplateElement | undefined {\n const viewport = currentTemplateViewport();\n const mediaMatch = candidates.find((candidate) => {\n const media = candidate.dataset.orderlyMedia ?? candidate.getAttribute(\"media\") ?? \"\";\n return Boolean(media && matchesMedia(media));\n });\n if (mediaMatch) {\n return mediaMatch;\n }\n\n const viewportMatch = candidates.find((candidate) => normalizeViewport(candidate.dataset.orderlyViewport) === viewport);\n if (viewportMatch) {\n return viewportMatch;\n }\n\n return candidates.find((candidate) => {\n const media = candidate.dataset.orderlyMedia ?? candidate.getAttribute(\"media\");\n return !media && !candidate.dataset.orderlyViewport;\n });\n}\n\nfunction globalTemplateCandidates(host: HTMLElement, name: string): HTMLTemplateElement[] {\n return [\n ...globalTemplates,\n ...documentGlobalTemplates()\n ].filter((candidate) => candidate.dataset.orderlyTemplate === name && templateAppliesToHost(candidate, host));\n}\n\nfunction documentGlobalTemplates(): HTMLTemplateElement[] {\n if (typeof document === \"undefined\") {\n return [];\n }\n return [...document.querySelectorAll(\"template[data-orderly-template]\")]\n .filter((element): element is HTMLTemplateElement => element instanceof HTMLTemplateElement)\n .filter((element) => element.hasAttribute(\"data-orderly-for\")\n || element.hasAttribute(\"data-orderly-component\")\n || element.hasAttribute(\"data-orderly-template-scope\")\n || element.hasAttribute(\"data-orderly-global\"));\n}\n\nfunction templateAppliesToHost(templateElement: HTMLTemplateElement, host: HTMLElement): boolean {\n if (templateElement.hasAttribute(\"data-orderly-global\")) {\n return true;\n }\n const targets = splitTemplateTargets(\n templateElement.dataset.orderlyFor\n ?? templateElement.dataset.orderlyComponent\n ?? templateElement.dataset.orderlyTemplateScope\n );\n if (targets.length === 0) {\n return false;\n }\n const componentName = shortComponentName(host.localName);\n return targets.some((target) => target === \"*\"\n || target === host.localName\n || target === componentName);\n}\n\nfunction normalizeTemplateRegistration(registration: GlobalTemplateRegistration): HTMLTemplateElement {\n const templateElement = typeof registration.template === \"string\"\n ? document.createElement(\"template\")\n : registration.template.cloneNode(true) as HTMLTemplateElement;\n if (typeof registration.template === \"string\") {\n templateElement.innerHTML = registration.template;\n }\n templateElement.dataset.orderlyTemplate = registration.name;\n if (registration.for) {\n templateElement.dataset.orderlyFor = Array.isArray(registration.for)\n ? registration.for.join(\" \")\n : registration.for;\n } else {\n templateElement.dataset.orderlyGlobal = \"\";\n }\n if (registration.viewport) {\n templateElement.dataset.orderlyViewport = registration.viewport;\n }\n if (registration.media) {\n templateElement.dataset.orderlyMedia = registration.media;\n }\n return templateElement;\n}\n\nfunction splitTemplateTargets(value: string | undefined): string[] {\n return (value ?? \"\")\n .split(/[\\s,]+/g)\n .map((target) => target.trim())\n .filter(Boolean);\n}\n\nfunction shortComponentName(localName: string): string {\n return localName.includes(\"-\") ? localName.split(\"-\").slice(1).join(\"-\") : localName;\n}\n\nfunction normalizeViewport(value: string | undefined): TemplateViewport | undefined {\n if (value === \"mobile\" || value === \"desktop\") {\n return value;\n }\n return undefined;\n}\n\nfunction matchesMedia(media: string): boolean {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(media).matches;\n}\n\nfunction connectResponsiveListeners(): void {\n if (responsiveListenersConnected || typeof window === \"undefined\") {\n return;\n }\n responsiveListenersConnected = true;\n if (typeof window.matchMedia === \"function\") {\n responsiveMediaQuery = window.matchMedia(responsiveTemplateConfig.mobileMediaQuery);\n addMediaQueryListener(responsiveMediaQuery, notifyResponsiveTemplateListeners);\n }\n window.addEventListener(\"resize\", notifyResponsiveTemplateListeners);\n}\n\nfunction disconnectResponsiveListeners(): void {\n if (!responsiveListenersConnected || typeof window === \"undefined\") {\n return;\n }\n if (responsiveMediaQuery) {\n removeMediaQueryListener(responsiveMediaQuery, notifyResponsiveTemplateListeners);\n }\n responsiveMediaQuery = undefined;\n responsiveListenersConnected = false;\n window.removeEventListener(\"resize\", notifyResponsiveTemplateListeners);\n}\n\nfunction resetResponsiveListeners(): void {\n if (!responsiveListenersConnected) {\n return;\n }\n disconnectResponsiveListeners();\n if (responsiveTemplateListeners.size > 0) {\n connectResponsiveListeners();\n }\n}\n\nfunction notifyResponsiveTemplateListeners(): void {\n if (responsiveNotificationQueued) {\n return;\n }\n responsiveNotificationQueued = true;\n queueMicrotask(() => {\n responsiveNotificationQueued = false;\n responsiveTemplateListeners.forEach((listener) => listener());\n });\n}\n\nfunction addMediaQueryListener(query: MediaQueryList, listener: () => void): void {\n query.addEventListener(\"change\", listener);\n}\n\nfunction removeMediaQueryListener(query: MediaQueryList, listener: () => void): void {\n query.removeEventListener(\"change\", listener);\n}\n","import { assignedSlotNodes, cloneTemplate, cloneTemplateSource, observeResponsiveTemplateChanges, render, slotTarget } from \"../utils/dom.js\";\n\nexport const DEFAULT_PAGE_LAYOUT_LOGO_SRC = \"https://orderly.shop/home/App_Icon.svg\";\n\nconst pageLayoutSlots = [\n \"utility\",\n \"header\",\n \"header-actions\",\n \"primary-nav\",\n \"left\",\n \"right\",\n \"content-before\",\n \"content\",\n \"content-after\",\n \"footer\",\n \"overlay\"\n] as const;\n\nexport type PageLayoutSlot = typeof pageLayoutSlots[number];\n\nexport interface PageLayoutConfig {\n template?: HTMLTemplateElement | string;\n logoSrc?: string;\n logoAlt?: string;\n logoHref?: string;\n}\n\nlet pageLayoutConfig: PageLayoutConfig = {};\n\nexport function configurePageLayout(config: PageLayoutConfig): void {\n pageLayoutConfig = { ...config };\n}\n\nexport class OrderlyPageLayoutElement extends HTMLElement {\n static observedAttributes = [\"logo-src\", \"logo-alt\", \"logo-href\"];\n\n private disconnectResponsiveTemplates?: () => void;\n\n get logoSrc(): string {\n return this.hasAttribute(\"logo-src\")\n ? this.getAttribute(\"logo-src\") ?? \"\"\n : pageLayoutConfig.logoSrc ?? DEFAULT_PAGE_LAYOUT_LOGO_SRC;\n }\n\n set logoSrc(value: string) {\n this.setAttribute(\"logo-src\", value);\n }\n\n get logoAlt(): string {\n return this.hasAttribute(\"logo-alt\")\n ? this.getAttribute(\"logo-alt\") ?? \"\"\n : pageLayoutConfig.logoAlt ?? \"Orderly\";\n }\n\n set logoAlt(value: string) {\n this.setAttribute(\"logo-alt\", value);\n }\n\n get logoHref(): string {\n return this.hasAttribute(\"logo-href\")\n ? this.getAttribute(\"logo-href\") ?? \"\"\n : pageLayoutConfig.logoHref ?? \"/\";\n }\n\n set logoHref(value: string) {\n this.setAttribute(\"logo-href\", value);\n }\n\n connectedCallback(): void {\n this.disconnectResponsiveTemplates?.();\n this.disconnectResponsiveTemplates = observeResponsiveTemplateChanges(() => this.render());\n this.render();\n }\n\n disconnectedCallback(): void {\n this.disconnectResponsiveTemplates?.();\n this.disconnectResponsiveTemplates = undefined;\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) {\n this.render();\n }\n }\n\n render(): void {\n const slotted = new Map<PageLayoutSlot, Node[]>();\n for (const name of pageLayoutSlots) {\n slotted.set(name, assignedSlotNodes(this, name));\n }\n\n const custom = cloneTemplate(this, \"layout\") ?? cloneTemplateSource(pageLayoutConfig.template);\n const layout = custom ?? defaultPageLayout();\n bindPageLayoutLogo(layout, this.logoSrc, this.logoAlt, this.logoHref);\n for (const name of pageLayoutSlots) {\n const target = slotTarget(layout, name);\n if (target) {\n const nodes = slotted.get(name) ?? [];\n target.replaceChildren(...nodes);\n if (target instanceof HTMLElement && name === \"primary-nav\") {\n target.hidden = nodes.length === 0;\n }\n }\n }\n render(this, layout);\n }\n}\n\nfunction defaultPageLayout(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const root = document.createElement(\"div\");\n root.className = \"orderly-page-layout\";\n root.innerHTML = `\n <div class=\"orderly-page-layout__utility\" data-orderly-slot=\"utility\"></div>\n <header class=\"orderly-page-layout__header\">\n <div class=\"orderly-page-layout__header-main\">\n <a class=\"orderly-page-layout__logo\" data-orderly-bind=\"logoHref\">\n <img class=\"orderly-page-layout__logo-image\" data-orderly-bind=\"logoImage\" alt=\"\">\n </a>\n <div class=\"orderly-page-layout__header-content\" data-orderly-slot=\"header\"></div>\n </div>\n <div class=\"orderly-page-layout__header-actions\" data-orderly-slot=\"header-actions\"></div>\n </header>\n <div class=\"orderly-page-layout__primary-nav\" data-orderly-slot=\"primary-nav\"></div>\n <div class=\"orderly-page-layout__body\">\n <aside class=\"orderly-page-layout__left\" data-orderly-slot=\"left\"></aside>\n <main class=\"orderly-page-layout__content\">\n <div class=\"orderly-page-layout__content-before\" data-orderly-slot=\"content-before\"></div>\n <div class=\"orderly-page-layout__content-main\" data-orderly-slot=\"content\"></div>\n <div class=\"orderly-page-layout__content-after\" data-orderly-slot=\"content-after\"></div>\n </main>\n <aside class=\"orderly-page-layout__right\" data-orderly-slot=\"right\"></aside>\n </div>\n <footer class=\"orderly-page-layout__footer\" data-orderly-slot=\"footer\"></footer>\n <div class=\"orderly-page-layout__overlay\" data-orderly-slot=\"overlay\"></div>\n `;\n fragment.append(root);\n return fragment;\n}\n\nfunction bindPageLayoutLogo(root: ParentNode, logoSrc: string, logoAlt: string, logoHref: string): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"logoHref\\\"]\").forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n if (logoHref) {\n element.href = logoHref;\n } else {\n element.removeAttribute(\"href\");\n }\n element.setAttribute(\"aria-label\", logoAlt);\n }\n if (element instanceof HTMLElement) {\n element.hidden = !logoSrc;\n }\n });\n\n root.querySelectorAll(\"[data-orderly-bind=\\\"logoImage\\\"]\").forEach((element) => {\n if (element instanceof HTMLImageElement) {\n if (logoSrc) {\n element.src = logoSrc;\n element.alt = logoAlt;\n element.hidden = false;\n } else {\n element.removeAttribute(\"src\");\n element.alt = \"\";\n element.hidden = true;\n }\n }\n });\n}\n","import { createOrderlyWebClient } from \"@orderlyshop/core-client/web\";\nimport type { OrderlyClient } from \"@orderlyshop/core-client\";\nimport { observeResponsiveTemplateChanges } from \"./utils/dom.js\";\n\nexport abstract class OrderlyElement extends HTMLElement {\n private resolvedClient?: OrderlyClient;\n private renderQueued = false;\n private disconnectResponsiveTemplates?: () => void;\n\n get client(): OrderlyClient | undefined {\n return this.resolvedClient;\n }\n\n set client(value: OrderlyClient | undefined) {\n this.resolvedClient = value;\n this.requestRender();\n }\n\n get baseUrl(): string | undefined {\n return this.getAttribute(\"base-url\") ?? undefined;\n }\n\n set baseUrl(value: string | undefined) {\n if (value) {\n this.setAttribute(\"base-url\", value);\n } else {\n this.removeAttribute(\"base-url\");\n }\n }\n\n connectedCallback(): void {\n this.disconnectResponsiveTemplates?.();\n this.disconnectResponsiveTemplates = observeResponsiveTemplateChanges(() => this.requestRender());\n this.requestRender();\n }\n\n disconnectedCallback(): void {\n this.disconnectResponsiveTemplates?.();\n this.disconnectResponsiveTemplates = undefined;\n }\n\n protected getClient(): OrderlyClient {\n if (this.resolvedClient) {\n return this.resolvedClient;\n }\n const baseUrl = this.baseUrl ?? this.getDefaultBaseUrl();\n if (!baseUrl) {\n throw new Error(`${this.localName} requires a client property or base-url attribute.`);\n }\n this.resolvedClient = createOrderlyWebClient({ baseUrl });\n return this.resolvedClient;\n }\n\n protected getDefaultBaseUrl(): string | undefined {\n return undefined;\n }\n\n protected requestRender(): void {\n if (!this.isConnected || this.renderQueued) {\n return;\n }\n this.renderQueued = true;\n queueMicrotask(() => {\n this.renderQueued = false;\n if (this.isConnected) {\n this.render();\n }\n });\n }\n\n protected abstract render(): void;\n}\n","import { OrderlyElement } from \"../base.js\";\nimport { bindText, cloneTemplate, cloneTemplateSource, render, replaceSlot } from \"../utils/dom.js\";\nimport { uiText } from \"../i18n.js\";\n\nexport interface ShopFooterAddress {\n name?: string;\n street?: string;\n street2?: string;\n postalCode?: string;\n city?: string;\n region?: string;\n country?: string;\n lines?: string[];\n}\n\nexport interface ShopFooterContactItem {\n label: string;\n value: string;\n href?: string;\n}\n\nexport interface ShopFooterContact {\n email?: string;\n phone?: string;\n website?: string;\n items?: ShopFooterContactItem[];\n}\n\nexport interface ShopFooterOpeningHour {\n label: string;\n hours: string;\n}\n\nexport interface ShopFooterInformationLink {\n label: string;\n href: string;\n target?: string;\n rel?: string;\n}\n\nexport interface ShopFooterConfig {\n template?: HTMLTemplateElement | string;\n logoSrc?: string;\n logoAlt?: string;\n logoHref?: string;\n aboutText?: string;\n addressTitle?: string;\n contactTitle?: string;\n openingHoursTitle?: string;\n informationLinksTitle?: string;\n address?: ShopFooterAddress;\n contact?: ShopFooterContact;\n openingHours?: ShopFooterOpeningHour[];\n informationLinks?: ShopFooterInformationLink[];\n}\n\nlet shopFooterConfig: ShopFooterConfig = {};\n\nexport function configureShopFooter(config: ShopFooterConfig): void {\n shopFooterConfig = {\n ...config,\n openingHours: config.openingHours ? [...config.openingHours] : undefined,\n informationLinks: config.informationLinks ? [...config.informationLinks] : undefined\n };\n}\n\nexport class OrderlyShopFooterElement extends OrderlyElement {\n static observedAttributes = [\n \"logo-src\",\n \"logo-alt\",\n \"logo-href\",\n \"about\",\n \"about-text\",\n \"address-title\",\n \"contact-title\",\n \"opening-hours-title\",\n \"information-links-title\"\n ];\n\n private addressValue?: ShopFooterAddress;\n private contactValue?: ShopFooterContact;\n private openingHoursValue?: ShopFooterOpeningHour[];\n private informationLinksValue?: ShopFooterInformationLink[];\n\n get logoSrc(): string {\n return this.getAttribute(\"logo-src\") ?? shopFooterConfig.logoSrc ?? \"\";\n }\n\n set logoSrc(value: string) {\n this.setAttribute(\"logo-src\", value);\n }\n\n get logoAlt(): string {\n return this.getAttribute(\"logo-alt\") ?? shopFooterConfig.logoAlt ?? \"\";\n }\n\n set logoAlt(value: string) {\n this.setAttribute(\"logo-alt\", value);\n }\n\n get logoHref(): string {\n return this.getAttribute(\"logo-href\") ?? shopFooterConfig.logoHref ?? \"\";\n }\n\n set logoHref(value: string) {\n this.setAttribute(\"logo-href\", value);\n }\n\n get aboutText(): string {\n return this.getAttribute(\"about-text\") ?? this.getAttribute(\"about\") ?? shopFooterConfig.aboutText ?? \"\";\n }\n\n set aboutText(value: string) {\n this.setAttribute(\"about-text\", value);\n }\n\n get addressTitle(): string {\n return this.getAttribute(\"address-title\") ?? shopFooterConfig.addressTitle ?? uiText(\"addressTitle\");\n }\n\n set addressTitle(value: string) {\n this.setAttribute(\"address-title\", value);\n }\n\n get contactTitle(): string {\n return this.getAttribute(\"contact-title\") ?? shopFooterConfig.contactTitle ?? uiText(\"contactTitle\");\n }\n\n set contactTitle(value: string) {\n this.setAttribute(\"contact-title\", value);\n }\n\n get openingHoursTitle(): string {\n return this.getAttribute(\"opening-hours-title\") ?? shopFooterConfig.openingHoursTitle ?? uiText(\"openingHoursTitle\");\n }\n\n set openingHoursTitle(value: string) {\n this.setAttribute(\"opening-hours-title\", value);\n }\n\n get informationLinksTitle(): string {\n return this.getAttribute(\"information-links-title\") ?? shopFooterConfig.informationLinksTitle ?? uiText(\"informationLinksTitle\");\n }\n\n set informationLinksTitle(value: string) {\n this.setAttribute(\"information-links-title\", value);\n }\n\n get address(): ShopFooterAddress | undefined {\n return this.addressValue ?? shopFooterConfig.address;\n }\n\n set address(value: ShopFooterAddress | undefined) {\n this.addressValue = value;\n this.requestRender();\n }\n\n get contact(): ShopFooterContact | undefined {\n return this.contactValue ?? shopFooterConfig.contact;\n }\n\n set contact(value: ShopFooterContact | undefined) {\n this.contactValue = value;\n this.requestRender();\n }\n\n get openingHours(): ShopFooterOpeningHour[] {\n return this.openingHoursValue ?? shopFooterConfig.openingHours ?? [];\n }\n\n set openingHours(value: ShopFooterOpeningHour[]) {\n this.openingHoursValue = [...value];\n this.requestRender();\n }\n\n get informationLinks(): ShopFooterInformationLink[] {\n return this.informationLinksValue ?? shopFooterConfig.informationLinks ?? [];\n }\n\n set informationLinks(value: ShopFooterInformationLink[]) {\n this.informationLinksValue = [...value];\n this.requestRender();\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n const fragment = cloneTemplate(this, \"footer\") ?? cloneTemplateSource(shopFooterConfig.template) ?? defaultShopFooter();\n const address = this.renderAddress();\n const contact = this.renderContact();\n const openingHours = this.renderOpeningHours();\n const informationLinks = this.renderInformationLinks();\n const aboutText = this.aboutText;\n\n bindFooterLogo(fragment, this.logoSrc, this.logoAlt, this.logoHref);\n bindText(fragment, \"about\", aboutText);\n bindText(fragment, \"addressTitle\", this.addressTitle);\n bindText(fragment, \"contactTitle\", this.contactTitle);\n bindText(fragment, \"openingHoursTitle\", this.openingHoursTitle);\n bindText(fragment, \"informationLinksTitle\", this.informationLinksTitle);\n replaceSlot(fragment, \"address\", address);\n replaceSlot(fragment, \"contact\", contact);\n replaceSlot(fragment, \"opening-hours\", openingHours);\n replaceSlot(fragment, \"information-links\", informationLinks);\n setBoundHidden(fragment, \"about\", !aboutText);\n setSectionHidden(fragment, \"brand\", !this.logoSrc && !aboutText);\n setSectionHidden(fragment, \"address\", !address.childNodes.length);\n setSectionHidden(fragment, \"contact\", !contact.childNodes.length);\n setSectionHidden(fragment, \"opening-hours\", !openingHours.childNodes.length);\n setSectionHidden(fragment, \"information-links\", !informationLinks.childNodes.length);\n render(this, fragment);\n }\n\n private renderAddress(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (const line of addressLines(this.address)) {\n const item = cloneTemplate(this, \"address-line\") ?? defaultAddressLine();\n bindText(item, \"line\", line);\n bindText(item, \"value\", line);\n fragment.append(item);\n }\n return fragment;\n }\n\n private renderContact(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (const item of contactItems(this.contact)) {\n const node = cloneTemplate(this, \"contact-item\") ?? defaultContactItem();\n bindText(node, \"label\", item.label);\n bindText(node, \"value\", item.value);\n bindHref(node, \"href\", item.href);\n fragment.append(node);\n }\n return fragment;\n }\n\n private renderOpeningHours(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (const item of this.openingHours) {\n const node = cloneTemplate(this, \"opening-hour\") ?? defaultOpeningHour();\n bindText(node, \"label\", item.label);\n bindText(node, \"hours\", item.hours);\n bindText(node, \"value\", item.hours);\n fragment.append(node);\n }\n return fragment;\n }\n\n private renderInformationLinks(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (const item of this.informationLinks) {\n const node = cloneTemplate(this, \"information-link\") ?? defaultInformationLink();\n bindText(node, \"label\", item.label);\n bindHref(node, \"href\", item.href);\n bindLinkTarget(node, item);\n fragment.append(node);\n }\n return fragment;\n }\n}\n\nfunction addressLines(address: ShopFooterAddress | undefined): string[] {\n if (!address) {\n return [];\n }\n if (address.lines?.length) {\n return address.lines.filter(Boolean);\n }\n const locality = [address.postalCode, address.city].filter(Boolean).join(\" \");\n return [\n address.name,\n address.street,\n address.street2,\n locality,\n address.region,\n address.country\n ].filter((line): line is string => Boolean(line));\n}\n\nfunction contactItems(contact: ShopFooterContact | undefined): ShopFooterContactItem[] {\n if (!contact) {\n return [];\n }\n if (contact.items?.length) {\n return contact.items.filter((item) => Boolean(item.label && item.value));\n }\n const items: ShopFooterContactItem[] = [];\n if (contact.email) {\n items.push({ label: uiText(\"emailLabel\"), value: contact.email, href: `mailto:${contact.email}` });\n }\n if (contact.phone) {\n items.push({ label: uiText(\"phoneLabel\"), value: contact.phone, href: `tel:${contact.phone.replace(/\\s+/g, \"\")}` });\n }\n if (contact.website) {\n items.push({ label: uiText(\"websiteLabel\"), value: contact.website, href: externalHref(contact.website) });\n }\n return items;\n}\n\nfunction defaultShopFooter(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const footer = document.createElement(\"div\");\n footer.className = \"orderly-shop-footer\";\n footer.innerHTML = `\n <div class=\"orderly-shop-footer__brand\" data-orderly-section=\"brand\">\n <a class=\"orderly-shop-footer__logo\" data-orderly-bind=\"logoHref\">\n <img class=\"orderly-shop-footer__logo-image\" data-orderly-bind=\"logoImage\" alt=\"\">\n </a>\n <p class=\"orderly-shop-footer__about\" data-orderly-bind=\"about\"></p>\n </div>\n <section class=\"orderly-shop-footer__section\" data-orderly-section=\"address\">\n <h2 class=\"orderly-shop-footer__heading\" data-orderly-bind=\"addressTitle\"></h2>\n <address class=\"orderly-shop-footer__address\" data-orderly-slot=\"address\"></address>\n </section>\n <section class=\"orderly-shop-footer__section\" data-orderly-section=\"contact\">\n <h2 class=\"orderly-shop-footer__heading\" data-orderly-bind=\"contactTitle\"></h2>\n <ul class=\"orderly-shop-footer__list\" data-orderly-slot=\"contact\"></ul>\n </section>\n <section class=\"orderly-shop-footer__section\" data-orderly-section=\"opening-hours\">\n <h2 class=\"orderly-shop-footer__heading\" data-orderly-bind=\"openingHoursTitle\"></h2>\n <dl class=\"orderly-shop-footer__hours\" data-orderly-slot=\"opening-hours\"></dl>\n </section>\n <section class=\"orderly-shop-footer__section\" data-orderly-section=\"information-links\">\n <h2 class=\"orderly-shop-footer__heading\" data-orderly-bind=\"informationLinksTitle\"></h2>\n <ul class=\"orderly-shop-footer__list\" data-orderly-slot=\"information-links\"></ul>\n </section>\n `;\n fragment.append(footer);\n return fragment;\n}\n\nfunction defaultAddressLine(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const line = document.createElement(\"div\");\n line.className = \"orderly-shop-footer__address-line\";\n line.dataset.orderlyBind = \"line\";\n fragment.append(line);\n return fragment;\n}\n\nfunction defaultContactItem(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const item = document.createElement(\"li\");\n item.className = \"orderly-shop-footer__contact-item\";\n item.innerHTML = `\n <span class=\"orderly-shop-footer__contact-label\" data-orderly-bind=\"label\"></span>\n <a class=\"orderly-shop-footer__contact-value\" data-orderly-bind=\"href\">\n <span data-orderly-bind=\"value\"></span>\n </a>\n `;\n fragment.append(item);\n return fragment;\n}\n\nfunction defaultOpeningHour(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const row = document.createElement(\"div\");\n row.className = \"orderly-shop-footer__hours-row\";\n row.innerHTML = `\n <dt class=\"orderly-shop-footer__hours-label\" data-orderly-bind=\"label\"></dt>\n <dd class=\"orderly-shop-footer__hours-value\" data-orderly-bind=\"hours\"></dd>\n `;\n fragment.append(row);\n return fragment;\n}\n\nfunction defaultInformationLink(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const item = document.createElement(\"li\");\n item.className = \"orderly-shop-footer__link-item\";\n item.innerHTML = `\n <a class=\"orderly-shop-footer__link\" data-orderly-bind=\"href\">\n <span data-orderly-bind=\"label\"></span>\n </a>\n `;\n fragment.append(item);\n return fragment;\n}\n\nfunction bindFooterLogo(root: ParentNode, logoSrc: string, logoAlt: string, logoHref: string): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"logoHref\\\"]\").forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n if (logoHref) {\n element.href = logoHref;\n } else {\n element.removeAttribute(\"href\");\n }\n element.setAttribute(\"aria-label\", logoAlt);\n }\n if (element instanceof HTMLElement) {\n element.hidden = !logoSrc;\n }\n });\n root.querySelectorAll(\"[data-orderly-bind=\\\"logoImage\\\"]\").forEach((element) => {\n if (element instanceof HTMLImageElement) {\n if (logoSrc) {\n element.src = logoSrc;\n element.alt = logoAlt;\n element.hidden = false;\n } else {\n element.removeAttribute(\"src\");\n element.alt = \"\";\n element.hidden = true;\n }\n }\n });\n}\n\nfunction bindHref(root: ParentNode, name: string, href: string | undefined): void {\n root.querySelectorAll(`[data-orderly-bind=\"${name}\"]`).forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n if (href) {\n element.href = href;\n } else {\n element.removeAttribute(\"href\");\n }\n }\n });\n}\n\nfunction bindLinkTarget(root: ParentNode, link: ShopFooterInformationLink): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"href\\\"]\").forEach((element) => {\n if (!(element instanceof HTMLAnchorElement)) {\n return;\n }\n if (link.target) {\n element.target = link.target;\n } else {\n element.removeAttribute(\"target\");\n }\n if (link.rel) {\n element.rel = link.rel;\n } else if (link.target === \"_blank\") {\n element.rel = \"noreferrer\";\n } else {\n element.removeAttribute(\"rel\");\n }\n });\n}\n\nfunction setBoundHidden(root: ParentNode, name: string, hidden: boolean): void {\n root.querySelectorAll(`[data-orderly-bind=\"${name}\"]`).forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = hidden;\n }\n });\n}\n\nfunction setSectionHidden(root: ParentNode, name: string, hidden: boolean): void {\n root.querySelectorAll(`[data-orderly-section=\"${name}\"]`).forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = hidden;\n }\n });\n}\n\nfunction externalHref(value: string): string {\n return /^https?:\\/\\//i.test(value) ? value : `https://${value}`;\n}\n","import { create } from \"@bufbuild/protobuf\";\nimport {\n DraftOrderLineSchema,\n PriceSchema,\n type DraftOrder,\n type DraftOrderLine,\n type SearchObject\n} from \"@orderlyshop/core-client\";\nimport { createEmptyDraftOrder, LocalStorageBasketStore, type BasketStore } from \"./stores.js\";\nimport type { BasketChangeEvent, BasketChangeReason } from \"./types.js\";\nimport { productId } from \"./utils/format.js\";\n\nexport class BasketController extends EventTarget {\n private currentDraft: DraftOrder = createEmptyDraftOrder();\n\n constructor(private readonly store: BasketStore = new LocalStorageBasketStore()) {\n super();\n }\n\n get draft(): DraftOrder {\n return this.currentDraft;\n }\n\n get count(): number {\n return draftOrderItemCount(this.currentDraft);\n }\n\n hasProduct(product: SearchObject): boolean {\n return this.productLineIndex(product) >= 0;\n }\n\n productLineIndex(product: SearchObject): number {\n return this.currentDraft.OrderLines.findIndex((line) => lineMatchesProduct(line, product));\n }\n\n async load(): Promise<DraftOrder> {\n this.currentDraft = await this.store.load() ?? createEmptyDraftOrder();\n this.emitChange(\"load\");\n return this.currentDraft;\n }\n\n async setDraft(draft: DraftOrder, reason: BasketChangeReason = \"set-draft\"): Promise<void> {\n this.currentDraft = draft;\n await this.store.save(this.currentDraft);\n this.emitChange(reason);\n }\n\n async addProduct(product: SearchObject, quantity = 1): Promise<void> {\n const existing = this.currentDraft.OrderLines[this.productLineIndex(product)];\n if (existing) {\n existing.Quantity = constrainedQuantity(existing, (existing.Quantity ?? 0) + quantity);\n } else {\n this.currentDraft.OrderLines.push(productToDraftLine(product, quantity));\n }\n await this.store.save(this.currentDraft);\n this.emitChange(\"add-product\");\n }\n\n async setQuantity(index: number, quantity: number): Promise<void> {\n const line = this.currentDraft.OrderLines[index];\n if (!line) {\n return;\n }\n if (quantity <= 0) {\n this.currentDraft.OrderLines.splice(index, 1);\n } else {\n line.Quantity = constrainedQuantity(line, quantity);\n }\n await this.store.save(this.currentDraft);\n this.emitChange(\"set-quantity\");\n }\n\n async removeLine(index: number): Promise<void> {\n if (index < 0 || index >= this.currentDraft.OrderLines.length) {\n return;\n }\n this.currentDraft.OrderLines.splice(index, 1);\n await this.store.save(this.currentDraft);\n this.emitChange(\"remove-line\");\n }\n\n async removeProduct(product: SearchObject): Promise<void> {\n const index = this.productLineIndex(product);\n if (index < 0) {\n return;\n }\n this.currentDraft.OrderLines.splice(index, 1);\n await this.store.save(this.currentDraft);\n this.emitChange(\"remove-line\");\n }\n\n async clear(): Promise<void> {\n this.currentDraft = createEmptyDraftOrder();\n await this.store.clear();\n this.emitChange(\"clear\");\n }\n\n private emitChange(reason: BasketChangeReason): void {\n dispatchBasketDraftEvent(this, \"change\", this.currentDraft, reason, { bubbles: false, composed: false });\n }\n}\n\nexport const defaultBasketController = new BasketController();\n\nexport function createBasketController(options: { store?: BasketStore; draft?: DraftOrder } = {}): BasketController {\n const controller = new BasketController(options.store);\n if (options.draft) {\n void controller.setDraft(options.draft, \"set-draft\");\n }\n return controller;\n}\n\nexport function draftOrderItemCount(draft: DraftOrder): number {\n return draft.OrderLines.reduce((sum, line) => sum + (line.Quantity ?? 0), 0);\n}\n\nexport function dispatchBasketDraftEvent(\n target: EventTarget,\n type: string,\n draft: DraftOrder,\n reason?: BasketChangeReason,\n init: Omit<CustomEventInit<DraftOrder>, \"detail\"> = { bubbles: true, composed: true }\n): boolean {\n const event = new CustomEvent<DraftOrder>(type, { ...init, detail: draft }) as BasketChangeEvent;\n if (reason) {\n event.reason = reason;\n }\n return target.dispatchEvent(event);\n}\n\nexport function productToDraftLine(product: SearchObject, quantity = 1): DraftOrderLine {\n return create(DraftOrderLineSchema, {\n SKU: product.SKU,\n Quantity: quantity,\n Price: product.Price ? create(PriceSchema, { PriceExclTax: product.Price }) : undefined,\n Title: product.Title,\n Thumbnail: product.Images[0],\n Seller: product.AccountId,\n Errors: [],\n IsVirtualProduct: false,\n AllowOrderlyPay: false,\n MaxQuantity: 0,\n PriceComposition: undefined\n });\n}\n\nfunction lineMatchesProduct(line: DraftOrderLine, product: SearchObject): boolean {\n const lineKeys = nonEmptyKeys(line.SKU?.Value, line.Title);\n const productKeys = nonEmptyKeys(productId(product), product.SKU?.Value, product.Title);\n return lineKeys.some((key) => productKeys.includes(key));\n}\n\nfunction nonEmptyKeys(...values: Array<string | undefined>): string[] {\n return [...new Set(values.map((value) => value?.trim()).filter((value): value is string => Boolean(value)))];\n}\n\nfunction constrainedQuantity(line: DraftOrderLine, quantity: number): number {\n const normalized = Math.max(0, Number.isFinite(quantity) ? quantity : 0);\n return line.MaxQuantity > 0 ? Math.min(normalized, line.MaxQuantity) : normalized;\n}\n","import { create, fromJsonString, toJsonString } from \"@bufbuild/protobuf\";\nimport {\n AddressSchema,\n DraftOrderSchema,\n PhoneNumberSchema,\n type Address,\n type DraftOrder,\n type PhoneNumber\n} from \"@orderlyshop/core-client\";\nimport type { CheckoutProfile } from \"./types.js\";\n\nexport interface BasketStore {\n load(): DraftOrder | undefined | Promise<DraftOrder | undefined>;\n save(draft: DraftOrder): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\nexport interface CheckoutProfileStore {\n load(): CheckoutProfile | undefined | Promise<CheckoutProfile | undefined>;\n save(profile: CheckoutProfile): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\nexport const defaultBasketStorageKey = \"orderly.web-components.basket.v1\";\nexport const defaultCheckoutProfileStorageKey = \"orderly.web-components.checkout-profile.v1\";\n\nexport class MemoryBasketStore implements BasketStore {\n private draft?: DraftOrder;\n\n load(): DraftOrder | undefined {\n return this.draft;\n }\n\n save(draft: DraftOrder): void {\n this.draft = draft;\n }\n\n clear(): void {\n this.draft = undefined;\n }\n}\n\nexport class LocalStorageBasketStore implements BasketStore {\n constructor(private readonly key = defaultBasketStorageKey) {}\n\n load(): DraftOrder | undefined {\n const storage = getStorage();\n if (!storage) {\n return undefined;\n }\n const raw = storage.getItem(this.key);\n if (!raw) {\n return undefined;\n }\n try {\n return fromJsonString(DraftOrderSchema, raw);\n } catch {\n return undefined;\n }\n }\n\n save(draft: DraftOrder): void {\n const storage = getStorage();\n if (!storage) {\n return;\n }\n storage.setItem(this.key, toJsonString(DraftOrderSchema, draft));\n }\n\n clear(): void {\n getStorage()?.removeItem(this.key);\n }\n}\n\nexport class MemoryCheckoutProfileStore implements CheckoutProfileStore {\n private profile?: CheckoutProfile;\n\n load(): CheckoutProfile | undefined {\n return this.profile;\n }\n\n save(profile: CheckoutProfile): void {\n this.profile = sanitizeCheckoutProfile(profile);\n }\n\n clear(): void {\n this.profile = undefined;\n }\n}\n\nexport class LocalStorageCheckoutProfileStore implements CheckoutProfileStore {\n constructor(private readonly key = defaultCheckoutProfileStorageKey) {}\n\n load(): CheckoutProfile | undefined {\n const storage = getStorage();\n if (!storage) {\n return undefined;\n }\n const raw = storage.getItem(this.key);\n if (!raw) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(raw) as StoredCheckoutProfile;\n return sanitizeCheckoutProfile({\n address: parsed.address ? fromJsonString(AddressSchema, parsed.address) : undefined,\n email: parsed.email,\n phoneNumber: parsed.phoneNumber ? fromJsonString(PhoneNumberSchema, parsed.phoneNumber) : undefined,\n updatedAt: parsed.updatedAt\n });\n } catch {\n return undefined;\n }\n }\n\n save(profile: CheckoutProfile): void {\n const storage = getStorage();\n if (!storage) {\n return;\n }\n const sanitized = sanitizeCheckoutProfile(profile);\n storage.setItem(this.key, JSON.stringify({\n address: sanitized.address ? toJsonString(AddressSchema, sanitized.address) : undefined,\n email: sanitized.email,\n phoneNumber: sanitized.phoneNumber ? toJsonString(PhoneNumberSchema, sanitized.phoneNumber) : undefined,\n updatedAt: sanitized.updatedAt\n } satisfies StoredCheckoutProfile));\n }\n\n clear(): void {\n getStorage()?.removeItem(this.key);\n }\n}\n\nexport function createEmptyDraftOrder(): DraftOrder {\n return create(DraftOrderSchema, {\n OrderLines: [],\n ExtraLines: [],\n Errors: [],\n PaymentOptions: [],\n Discounts: [],\n Vouchers: [],\n Messages: [],\n Related: []\n });\n}\n\nexport function sanitizeCheckoutProfile(profile: Partial<CheckoutProfile> | undefined): CheckoutProfile {\n return {\n address: profile?.address ? create(AddressSchema, profile.address as Address) : undefined,\n email: typeof profile?.email === \"string\" && profile.email.length > 0 ? profile.email : undefined,\n phoneNumber: profile?.phoneNumber ? create(PhoneNumberSchema, profile.phoneNumber as PhoneNumber) : undefined,\n updatedAt: typeof profile?.updatedAt === \"string\" && profile.updatedAt.length > 0\n ? profile.updatedAt\n : new Date().toISOString()\n };\n}\n\ninterface StoredCheckoutProfile {\n address?: string;\n email?: string;\n phoneNumber?: string;\n updatedAt: string;\n}\n\nfunction getStorage(): Storage | undefined {\n try {\n return globalThis.localStorage;\n } catch {\n return undefined;\n }\n}\n","import type { Credit, DraftOrderLine } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport { defaultBasketController, dispatchBasketDraftEvent, type BasketController } from \"../basket.js\";\nimport type { BasketChangeEvent, BasketChangeReason } from \"../types.js\";\nimport { bindCredit, bindImage, bindStoredImage, bindText, cloneTemplate, dispatch, render, replaceSlot, siblingTagName, upgradeFragment } from \"../utils/dom.js\";\nimport { storedImageUrl } from \"../utils/format.js\";\nimport { uiText } from \"../i18n.js\";\n\nexport class OrderlyBasketElement extends OrderlyElement {\n static observedAttributes = [\n \"base-url\",\n \"checkout-action\",\n \"checkout-href\",\n \"checkout-label\",\n \"checkout-disabled-label\",\n \"clear-label\",\n \"continue-label\",\n \"continue-href\",\n \"empty-label\",\n \"quantity-label\",\n \"remove-label\",\n \"subtotal-label\",\n \"shipping-label\",\n \"total-label\",\n \"total-note\",\n \"delivery-note\"\n ];\n\n private controllerValue: BasketController = defaultBasketController;\n private verifyInFlight = false;\n private verifyPending = false;\n private mutationRevision = 0;\n\n get basketController(): BasketController {\n return this.controllerValue;\n }\n\n set basketController(value: BasketController) {\n this.controllerValue.removeEventListener(\"change\", this.onChange);\n this.controllerValue = value;\n this.controllerValue.addEventListener(\"change\", this.onChange);\n this.requestRender();\n }\n\n get checkoutHref(): string {\n return this.getAttribute(\"checkout-href\") ?? \"/checkout.html\";\n }\n\n set checkoutHref(value: string) {\n this.setAttribute(\"checkout-href\", value);\n }\n\n get checkoutAction(): \"show\" | \"hide\" {\n return this.getAttribute(\"checkout-action\") === \"hide\" ? \"hide\" : \"show\";\n }\n\n set checkoutAction(value: \"show\" | \"hide\") {\n this.setAttribute(\"checkout-action\", value);\n }\n\n get checkoutLabel(): string {\n return this.getAttribute(\"checkout-label\") ?? uiText(\"basketCheckoutLabel\");\n }\n\n set checkoutLabel(value: string) {\n this.setAttribute(\"checkout-label\", value);\n }\n\n get checkoutDisabledLabel(): string {\n return this.getAttribute(\"checkout-disabled-label\") ?? uiText(\"basketCheckoutDisabledLabel\");\n }\n\n set checkoutDisabledLabel(value: string) {\n this.setAttribute(\"checkout-disabled-label\", value);\n }\n\n get clearLabel(): string {\n return this.getAttribute(\"clear-label\") ?? uiText(\"clearBasketLabel\");\n }\n\n set clearLabel(value: string) {\n this.setAttribute(\"clear-label\", value);\n }\n\n get continueLabel(): string {\n return this.getAttribute(\"continue-label\") ?? uiText(\"continueShoppingLabel\");\n }\n\n set continueLabel(value: string) {\n this.setAttribute(\"continue-label\", value);\n }\n\n get continueHref(): string {\n return this.getAttribute(\"continue-href\") ?? \"\";\n }\n\n set continueHref(value: string) {\n this.setAttribute(\"continue-href\", value);\n }\n\n get emptyLabel(): string {\n return this.getAttribute(\"empty-label\") ?? uiText(\"basketEmptyLabel\");\n }\n\n set emptyLabel(value: string) {\n this.setAttribute(\"empty-label\", value);\n }\n\n get quantityLabel(): string {\n return this.getAttribute(\"quantity-label\") ?? uiText(\"quantityShortLabel\");\n }\n\n set quantityLabel(value: string) {\n this.setAttribute(\"quantity-label\", value);\n }\n\n get removeLabel(): string {\n return this.getAttribute(\"remove-label\") ?? uiText(\"removeLabel\");\n }\n\n set removeLabel(value: string) {\n this.setAttribute(\"remove-label\", value);\n }\n\n get subtotalLabel(): string {\n return this.getAttribute(\"subtotal-label\") ?? uiText(\"subtotalLabel\");\n }\n\n set subtotalLabel(value: string) {\n this.setAttribute(\"subtotal-label\", value);\n }\n\n get shippingLabel(): string {\n return this.getAttribute(\"shipping-label\") ?? uiText(\"shippingLabel\");\n }\n\n set shippingLabel(value: string) {\n this.setAttribute(\"shipping-label\", value);\n }\n\n get totalLabel(): string {\n return this.getAttribute(\"total-label\") ?? uiText(\"totalLabel\");\n }\n\n set totalLabel(value: string) {\n this.setAttribute(\"total-label\", value);\n }\n\n get totalNote(): string {\n return this.getAttribute(\"total-note\") ?? uiText(\"totalNote\");\n }\n\n set totalNote(value: string) {\n this.setAttribute(\"total-note\", value);\n }\n\n get deliveryNote(): string {\n return this.getAttribute(\"delivery-note\") ?? uiText(\"deliveryNote\");\n }\n\n set deliveryNote(value: string) {\n this.setAttribute(\"delivery-note\", value);\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n connectedCallback(): void {\n this.controllerValue.addEventListener(\"change\", this.onChange);\n void this.controllerValue.load();\n super.connectedCallback();\n }\n\n disconnectedCallback(): void {\n this.controllerValue.removeEventListener(\"change\", this.onChange);\n super.disconnectedCallback();\n }\n\n protected render(): void {\n const custom = cloneTemplate(this, \"basket\");\n const creditTagName = siblingTagName(this, \"basket\", \"credit\");\n const root = custom ? upgradeFragment(custom) : defaultBasket(creditTagName);\n const count = this.controllerValue.count;\n bindText(root, \"count\", count > 0 ? String(count) : \"\");\n bindText(root, \"checkoutLabel\", this.checkoutLabel);\n bindText(root, \"checkoutDisabledLabel\", count <= 0 ? this.checkoutDisabledLabel : \"\");\n bindText(root, \"clearLabel\", this.clearLabel);\n bindText(root, \"subtotalLabel\", this.subtotalLabel);\n bindText(root, \"shippingLabel\", this.shippingLabel);\n bindText(root, \"totalLabel\", this.totalLabel);\n bindText(root, \"totalNote\", this.totalNote);\n bindText(root, \"deliveryNote\", this.deliveryNote);\n const summary = draftSummary(this.controllerValue.draft.OrderLines, this.controllerValue.draft.Transport?.Price?.PriceExclTax, this.controllerValue.draft.Price?.PriceExclTax);\n bindCredit(root, \"subtotal\", summary.subtotal);\n if (summary.shipping) {\n bindCredit(root, \"shipping\", summary.shipping);\n } else {\n bindText(root, \"shipping\", \"-\");\n }\n bindCredit(root, \"total\", summary.total);\n configureBasketState(root, count, Boolean(summary.shipping));\n configureCheckoutAction(root, this.checkoutHref, count, this.checkoutDisabledLabel);\n configureCheckoutVisibility(root, this.checkoutAction);\n configureContinueAction(root, this.continueHref);\n configureClearAction(root, count, this.clearLabel);\n const lines = document.createDocumentFragment();\n this.controllerValue.draft.OrderLines.forEach((line, index) => {\n const customLine = cloneTemplate(this, \"line\");\n const item = customLine ? upgradeFragment(customLine) : defaultBasketLine(siblingTagName(this, \"basket\", \"stored-image\"), creditTagName);\n [...item.children].forEach((element) => {\n if (element instanceof HTMLElement) {\n element.dataset.index = String(index);\n }\n });\n bindText(item, \"title\", line.Title ?? line.SKU?.Value ?? uiText(\"itemFallbackTitle\"));\n bindText(item, \"sku\", line.SKU?.Value);\n bindText(item, \"quantity\", String(line.Quantity ?? 0));\n bindText(item, \"quantityLabel\", this.quantityLabel);\n bindCredit(item, \"price\", line.Price?.PriceExclTax);\n bindText(item, \"error\", line.Errors.map((error) => error.Message).filter(Boolean).join(\" \"));\n bindText(item, \"removeLabel\", this.removeLabel);\n bindStoredImage(item, \"thumbnail\", line.Thumbnail);\n bindImage(item, \"thumbnail\", storedImageUrl(line.Thumbnail));\n configureQuantityControls(item, line.MaxQuantity > 1, line.Quantity ?? 0, line.MaxQuantity);\n configureRemoveLabels(item, this.removeLabel, line.Title ?? line.SKU?.Value);\n lines.append(item);\n });\n replaceSlot(root, \"lines\", lines);\n replaceSlot(root, \"empty\", count <= 0 ? this.renderEmptyState() : undefined);\n root.querySelectorAll(\"[data-orderly-action=\\\"quantity\\\"]\").forEach((control) => {\n control.addEventListener(\"change\", () => {\n if (control instanceof HTMLElement && (control.hidden || control.getAttribute(\"aria-hidden\") === \"true\")) {\n return;\n }\n const item = (control as HTMLElement).closest(\"[data-index]\");\n const index = Number(item?.getAttribute(\"data-index\") ?? -1);\n void this.controllerValue.setQuantity(index, readQuantity(control));\n });\n });\n root.querySelectorAll(\"[data-orderly-action=\\\"remove\\\"]\").forEach((button) => {\n button.addEventListener(\"click\", () => {\n const item = (button as HTMLElement).closest(\"[data-index]\");\n const index = Number(item?.getAttribute(\"data-index\") ?? -1);\n void this.controllerValue.removeLine(index);\n });\n });\n root.querySelector(\"[data-orderly-action=\\\"clear\\\"]\")?.addEventListener(\"click\", () => void this.controllerValue.clear());\n root.querySelectorAll(\"[data-orderly-action=\\\"checkout\\\"]\").forEach((control) => {\n control.addEventListener(\"click\", (event) => {\n if (this.controllerValue.count <= 0) {\n event.preventDefault();\n return;\n }\n dispatch(this, \"orderly-basket-checkout\", {\n draft: this.controllerValue.draft,\n count: this.controllerValue.count,\n href: this.checkoutHref\n });\n });\n });\n render(this, root);\n }\n\n private renderEmptyState(): DocumentFragment {\n const custom = cloneTemplate(this, \"empty\");\n const root = custom ? upgradeFragment(custom) : defaultBasketEmpty();\n bindText(root, \"emptyLabel\", this.emptyLabel);\n bindText(root, \"continueLabel\", this.continueLabel);\n configureContinueAction(root, this.continueHref);\n return root;\n }\n\n private readonly onChange = (event: Event): void => {\n const detail = (event as BasketChangeEvent).detail ?? this.controllerValue.draft;\n const reason = (event as BasketChangeEvent).reason ?? \"set-draft\";\n dispatchBasketDraftEvent(this, \"orderly-basket-change\", detail, reason);\n if (shouldVerify(reason)) {\n this.mutationRevision += 1;\n this.requestVerifyDraft();\n }\n this.requestRender();\n };\n\n private requestVerifyDraft(): void {\n if (this.controllerValue.draft.OrderLines.length === 0 || (!this.client && !this.baseUrl)) {\n return;\n }\n this.verifyPending = true;\n if (!this.verifyInFlight) {\n void this.flushVerifyDraft();\n }\n }\n\n private async flushVerifyDraft(): Promise<void> {\n this.verifyInFlight = true;\n try {\n while (this.verifyPending && this.isConnected) {\n this.verifyPending = false;\n const revision = this.mutationRevision;\n const verified = await this.getClient().services.orderService.verifyDraft(this.controllerValue.draft);\n if (revision === this.mutationRevision) {\n await this.controllerValue.setDraft(verified, \"verify\");\n dispatchBasketDraftEvent(this, \"orderly-basket-verified\", verified, \"verify\");\n } else {\n this.verifyPending = true;\n }\n }\n } catch (error) {\n dispatch(this, \"orderly-error\", { error });\n } finally {\n this.verifyInFlight = false;\n }\n }\n}\n\nfunction defaultBasket(creditTagName: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const section = document.createElement(\"section\");\n section.className = \"orderly-basket\";\n section.innerHTML = `\n <div class=\"orderly-basket__empty\" data-orderly-slot=\"empty\"></div>\n <ul class=\"orderly-basket__lines\" data-orderly-slot=\"lines\"></ul>\n <div class=\"orderly-basket__summary\">\n <div class=\"orderly-basket__summary-row orderly-basket__summary-row--subtotal\">\n <span class=\"orderly-basket__summary-label\" data-orderly-bind=\"subtotalLabel\"></span>\n <${creditTagName} class=\"orderly-basket__summary-amount\" data-orderly-bind=\"subtotal\"></${creditTagName}>\n </div>\n <div class=\"orderly-basket__summary-row orderly-basket__summary-row--shipping\" data-orderly-shipping-row>\n <span class=\"orderly-basket__summary-label\" data-orderly-bind=\"shippingLabel\"></span>\n <${creditTagName} class=\"orderly-basket__summary-amount\" data-orderly-bind=\"shipping\"></${creditTagName}>\n </div>\n <p class=\"orderly-basket__delivery-note\" data-orderly-bind=\"deliveryNote\"></p>\n <div class=\"orderly-basket__summary-total\">\n <span class=\"orderly-basket__summary-total-label\" data-orderly-bind=\"totalLabel\"></span>\n <${creditTagName} class=\"orderly-basket__summary-total-amount\" data-orderly-bind=\"total\"></${creditTagName}>\n <span class=\"orderly-basket__summary-total-note\" data-orderly-bind=\"totalNote\"></span>\n </div>\n <span class=\"orderly-basket__count\" data-orderly-bind=\"count\"></span>\n </div>\n <a class=\"orderly-basket__checkout\" data-orderly-action=\"checkout\" data-orderly-bind=\"checkoutHref\">\n <span data-orderly-bind=\"checkoutLabel\"></span>\n </a>\n <p class=\"orderly-basket__checkout-disabled\" data-orderly-bind=\"checkoutDisabledLabel\"></p>\n `;\n fragment.append(section);\n return fragment;\n}\n\nfunction defaultBasketEmpty(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const empty = document.createElement(\"div\");\n empty.className = \"orderly-basket__empty-state\";\n empty.innerHTML = `\n <p class=\"orderly-basket__empty-text\" data-orderly-bind=\"emptyLabel\"></p>\n <a class=\"orderly-basket__continue\" data-orderly-bind=\"continueHref\">\n <span data-orderly-bind=\"continueLabel\"></span>\n </a>\n `;\n fragment.append(empty);\n return fragment;\n}\n\nfunction configureBasketState(root: ParentNode, count: number, hasShipping: boolean): void {\n root.querySelectorAll(\".orderly-basket\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.dataset.orderlyEmpty = count <= 0 ? \"true\" : \"false\";\n }\n });\n root.querySelectorAll(\".orderly-basket__summary\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = count <= 0;\n }\n });\n root.querySelectorAll(\"[data-orderly-shipping-row]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = !hasShipping;\n }\n });\n}\n\nfunction configureCheckoutAction(root: ParentNode, href: string, count: number, disabledLabel: string): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"checkoutHref\\\"], [data-orderly-action=\\\"checkout\\\"]\").forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n element.href = href;\n }\n if (element instanceof HTMLElement) {\n element.toggleAttribute(\"aria-disabled\", count <= 0);\n element.toggleAttribute(\"data-orderly-disabled\", count <= 0);\n element.tabIndex = count > 0 ? 0 : -1;\n if (count <= 0) {\n element.setAttribute(\"aria-label\", disabledLabel);\n } else {\n element.removeAttribute(\"aria-label\");\n }\n }\n });\n}\n\nfunction configureCheckoutVisibility(root: ParentNode, action: \"show\" | \"hide\"): void {\n const hidden = action === \"hide\";\n root.querySelectorAll(\"[data-orderly-action=\\\"checkout\\\"], .orderly-basket__checkout, .orderly-basket__checkout-disabled\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = hidden;\n }\n });\n}\n\nfunction configureContinueAction(root: ParentNode, href: string): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"continueHref\\\"], .orderly-basket__continue\").forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n if (href) {\n element.href = href;\n } else {\n element.removeAttribute(\"href\");\n }\n }\n if (element instanceof HTMLElement) {\n element.hidden = !href;\n }\n });\n}\n\nfunction configureClearAction(root: ParentNode, count: number, label: string): void {\n root.querySelectorAll(\"[data-orderly-action=\\\"clear\\\"]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = count <= 0;\n element.textContent = label;\n }\n });\n}\n\nfunction defaultBasketLine(storedImageTagName: string, creditTagName: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const item = document.createElement(\"li\");\n item.className = \"orderly-basket__line\";\n item.innerHTML = `\n <${storedImageTagName} class=\"orderly-basket__line-image\" data-orderly-bind=\"thumbnail\" fit=\"contain\"></${storedImageTagName}>\n <div class=\"orderly-basket__line-content\">\n <span class=\"orderly-basket__line-title\" data-orderly-bind=\"title\"></span>\n <span class=\"orderly-basket__line-sku\" data-orderly-bind=\"sku\"></span>\n <span class=\"orderly-basket__quantity-text\" data-orderly-quantity-readonly><span data-orderly-bind=\"quantityLabel\"></span> <span data-orderly-bind=\"quantity\"></span></span>\n <input class=\"orderly-basket__quantity\" type=\"number\" min=\"0\" step=\"1\" data-orderly-action=\"quantity\">\n <span class=\"orderly-basket__line-error\" data-orderly-bind=\"error\"></span>\n </div>\n <${creditTagName} class=\"orderly-basket__line-price\" data-orderly-bind=\"price\"></${creditTagName}>\n <button class=\"orderly-basket__remove\" type=\"button\" data-orderly-action=\"remove\">\n <svg class=\"orderly-basket__remove-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" width=\"18\" height=\"18\">\n <path d=\"M6.5 6.5 17.5 17.5M17.5 6.5 6.5 17.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.1\" stroke-linecap=\"round\"></path>\n </svg>\n <span class=\"orderly-basket__remove-label\" data-orderly-bind=\"removeLabel\"></span>\n </button>\n `;\n fragment.append(item);\n return fragment;\n}\n\nfunction configureRemoveLabels(root: ParentNode, removeLabel: string, title: string | undefined): void {\n root.querySelectorAll(\"[data-orderly-action=\\\"remove\\\"]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.setAttribute(\"aria-label\", title ? `${removeLabel} ${title}` : removeLabel);\n element.setAttribute(\"title\", removeLabel);\n }\n });\n}\n\nfunction configureQuantityControls(root: ParentNode, canEditQuantity: boolean, quantity: number, maxQuantity: number): void {\n root.querySelectorAll(\"[data-orderly-quantity-readonly]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = canEditQuantity;\n }\n });\n root.querySelectorAll(\"[data-orderly-action=\\\"quantity\\\"]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = !canEditQuantity;\n element.toggleAttribute(\"aria-hidden\", !canEditQuantity);\n }\n if (element instanceof HTMLInputElement) {\n element.disabled = !canEditQuantity;\n element.min = \"1\";\n element.max = maxQuantity > 1 ? String(maxQuantity) : \"\";\n element.value = String(quantity);\n } else if (element instanceof HTMLSelectElement) {\n element.disabled = !canEditQuantity;\n element.value = String(quantity);\n }\n });\n}\n\nfunction readQuantity(control: Element): number {\n if (control instanceof HTMLInputElement || control instanceof HTMLSelectElement) {\n return Number(control.value);\n }\n return 0;\n}\n\nfunction shouldVerify(reason: BasketChangeReason): boolean {\n return reason === \"add-product\" || reason === \"set-quantity\" || reason === \"remove-line\";\n}\n\nfunction draftSummary(lines: DraftOrderLine[], shipping: Credit | undefined, verifiedTotal: Credit | undefined): { subtotal?: Credit; shipping?: Credit; total?: Credit } {\n const subtotal = sumCredits(lines.map((line) => line.Price?.PriceExclTax));\n return {\n subtotal,\n shipping,\n total: verifiedTotal ?? sumCredits([subtotal, shipping]) ?? subtotal\n };\n}\n\nfunction sumCredits(credits: Array<Credit | undefined>): Credit | undefined {\n const values = credits.filter((credit): credit is Credit => Boolean(credit));\n if (!values.length) {\n return undefined;\n }\n const currency = values.find((credit) => credit.Currency)?.Currency ?? \"\";\n return {\n Currency: currency,\n Amount: values.reduce((sum, credit) => sum + Number(credit.Amount ?? 0), 0)\n } as Credit;\n}\n","import { OrderlyElement } from \"../base.js\";\nimport { defaultBasketController, dispatchBasketDraftEvent, type BasketController } from \"../basket.js\";\nimport type { BasketChangeEvent } from \"../types.js\";\nimport { bindText, cloneTemplate, render } from \"../utils/dom.js\";\nimport { uiText } from \"../i18n.js\";\n\nexport class OrderlyBasketIconElement extends OrderlyElement {\n static observedAttributes = [\"label\"];\n\n private controllerValue: BasketController = defaultBasketController;\n\n get basketController(): BasketController {\n return this.controllerValue;\n }\n\n set basketController(value: BasketController) {\n this.controllerValue.removeEventListener(\"change\", this.onChange);\n this.controllerValue = value;\n this.controllerValue.addEventListener(\"change\", this.onChange);\n this.requestRender();\n }\n\n get label(): string {\n return this.getAttribute(\"label\") ?? uiText(\"basketLabel\");\n }\n\n set label(value: string) {\n this.setAttribute(\"label\", value);\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n connectedCallback(): void {\n this.controllerValue.addEventListener(\"change\", this.onChange);\n void this.controllerValue.load();\n super.connectedCallback();\n }\n\n disconnectedCallback(): void {\n this.controllerValue.removeEventListener(\"change\", this.onChange);\n super.disconnectedCallback();\n }\n\n protected render(): void {\n const root = cloneTemplate(this, \"basket-icon\") ?? cloneTemplate(this, \"icon\") ?? defaultBasketIcon();\n const count = this.controllerValue.count;\n bindText(root, \"label\", this.label);\n bindText(root, \"count\", String(count));\n bindBasketIconState(root, this.label, count);\n const button = root.querySelector(\"[data-orderly-action=\\\"open-basket\\\"]\") ?? root.querySelector(\"button\");\n button?.addEventListener(\"click\", () => dispatchBasketDraftEvent(this, \"orderly-basket-open\", this.controllerValue.draft));\n render(this, root);\n }\n\n private readonly onChange = (event: Event): void => {\n dispatchBasketDraftEvent(\n this,\n \"orderly-basket-change\",\n (event as BasketChangeEvent).detail ?? this.controllerValue.draft,\n (event as BasketChangeEvent).reason\n );\n this.requestRender();\n };\n}\n\nfunction defaultBasketIcon(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const button = document.createElement(\"button\");\n button.className = \"orderly-basket-icon\";\n button.type = \"button\";\n button.dataset.orderlyAction = \"open-basket\";\n button.innerHTML = `\n <span class=\"orderly-basket-icon__label\" data-orderly-bind=\"label\"></span>\n <span class=\"orderly-basket-icon__glyph\" aria-hidden=\"true\">\n <svg class=\"orderly-basket-icon__svg\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M7 9h10l-1 10H8L7 9Z\"></path>\n <path d=\"M9 9a3 3 0 0 1 6 0\"></path>\n </svg>\n <span class=\"orderly-basket-icon__count\" data-orderly-bind=\"count\"></span>\n </span>\n `;\n const svg = button.querySelector(\".orderly-basket-icon__svg\") as SVGElement | null;\n if (svg) {\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", \"currentColor\");\n svg.setAttribute(\"stroke-width\", \"1.8\");\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n }\n fragment.append(button);\n return fragment;\n}\n\nfunction bindBasketIconState(root: ParentNode, label: string, count: number): void {\n const accessibleLabel = count > 0 ? `${label}: ${count}` : label;\n root.querySelectorAll(\"[data-orderly-action=\\\"open-basket\\\"], button\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.setAttribute(\"aria-label\", accessibleLabel);\n element.toggleAttribute(\"data-orderly-has-items\", count > 0);\n }\n });\n\n root.querySelectorAll(\".orderly-basket-icon__label\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = true;\n }\n });\n\n root.querySelectorAll(\".orderly-basket-icon__count\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = count <= 0;\n element.setAttribute(\"aria-hidden\", \"true\");\n }\n });\n}\n","import { clone } from \"@bufbuild/protobuf\";\nimport { SearchQuerySchema, type SearchObject, type SearchQuery } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport { BasketController } from \"../basket.js\";\nimport {\n defaultShopBaseUrl,\n defaultShopBasketLabels,\n defaultShopBrandLabel,\n defaultShopCheckoutHref,\n defaultShopCheckoutLabel,\n defaultShopEmptyLabel,\n defaultShopHomeHref,\n defaultShopNavigationError,\n defaultShopNavigationItems,\n defaultShopProductHref,\n defaultShopSearchPlaceholder,\n defaultShopSortOptions,\n type BasketLabels\n} from \"../default-shop.js\";\nimport type {\n ResolvedNavigationItem,\n NavigationItem,\n ProductEventDetail,\n SortOption,\n StorefrontClient\n} from \"../types.js\";\nimport { cloneTemplate, projectSlots, render, siblingTagName } from \"../utils/dom.js\";\nimport type { OrderlyBasketElement } from \"./basket.js\";\nimport type { OrderlyBasketIconElement } from \"./basket-icon.js\";\nimport type { OrderlyCollectionPageElement } from \"./collection-page.js\";\nimport type { OrderlyProductPageElement } from \"./product-page.js\";\nimport type { OrderlySearchBoxElement } from \"./search-controls.js\";\nimport { productShareHref, productShareUrl } from \"./product-tile.js\";\nimport { categoryFromUrl, findCategoryByIdOrSlug } from \"../taxonomy.js\";\nimport { formatUiText, uiText } from \"../i18n.js\";\n\nexport class OrderlyCategoryPageElement extends OrderlyElement {\n static observedAttributes = [\n \"base-url\",\n \"slug\",\n \"brand-label\",\n \"product-href\",\n \"checkout-href\",\n \"checkout-label\",\n \"search-placeholder\",\n \"empty-label\"\n ];\n\n private currentCategory?: ResolvedNavigationItem;\n private currentNavigationItems?: ResolvedNavigationItem[];\n private currentSortOptions?: SortOption[];\n private currentDefaultQuery?: SearchQuery;\n private controller?: BasketController;\n\n get defaultQuery(): SearchQuery | undefined {\n return this.currentDefaultQuery;\n }\n\n set defaultQuery(value: SearchQuery | undefined) {\n this.currentDefaultQuery = value;\n this.requestRender();\n }\n\n get shopQuery(): SearchQuery | undefined {\n return this.defaultQuery;\n }\n\n set shopQuery(value: SearchQuery | undefined) {\n this.defaultQuery = value;\n }\n\n get category(): ResolvedNavigationItem | undefined {\n return this.currentCategory;\n }\n\n set category(value: ResolvedNavigationItem | undefined) {\n this.currentCategory = value;\n this.requestRender();\n }\n\n get navigationItems(): ResolvedNavigationItem[] {\n return this.resolvedNavigationItems();\n }\n\n set navigationItems(value: ResolvedNavigationItem[]) {\n this.currentNavigationItems = [...value];\n this.requestRender();\n }\n\n get sortOptions(): SortOption[] {\n return this.resolvedSortOptions();\n }\n\n set sortOptions(value: SortOption[]) {\n this.currentSortOptions = [...value];\n this.requestRender();\n }\n\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n this.controller = value;\n this.requestRender();\n }\n\n get slug(): string {\n return this.getAttribute(\"slug\") ?? \"\";\n }\n\n set slug(value: string) {\n this.setAttribute(\"slug\", value);\n }\n\n get brandLabel(): string {\n return this.getAttribute(\"brand-label\") ?? defaultShopBrandLabel();\n }\n\n set brandLabel(value: string) {\n this.setAttribute(\"brand-label\", value);\n }\n\n get checkoutHref(): string {\n return this.getAttribute(\"checkout-href\") ?? defaultShopCheckoutHref();\n }\n\n set checkoutHref(value: string) {\n this.setAttribute(\"checkout-href\", value);\n }\n\n get productHref(): string {\n return this.getAttribute(\"product-href\") ?? defaultShopProductHref();\n }\n\n set productHref(value: string) {\n this.setAttribute(\"product-href\", value);\n }\n\n get checkoutLabel(): string {\n return this.getAttribute(\"checkout-label\") ?? defaultShopCheckoutLabel();\n }\n\n set checkoutLabel(value: string) {\n this.setAttribute(\"checkout-label\", value);\n }\n\n get searchPlaceholder(): string {\n return this.getAttribute(\"search-placeholder\") ?? defaultShopSearchPlaceholder();\n }\n\n set searchPlaceholder(value: string) {\n this.setAttribute(\"search-placeholder\", value);\n }\n\n get emptyLabel(): string {\n return this.getAttribute(\"empty-label\") ?? defaultShopEmptyLabel();\n }\n\n set emptyLabel(value: string) {\n this.setAttribute(\"empty-label\", value);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"orderly-product-selected\", this.onProductSelected as EventListener);\n this.addEventListener(\"orderly-add-to-basket\", this.onAddToBasket as EventListener);\n globalThis.addEventListener?.(\"hashchange\", this.onHashChange);\n }\n\n disconnectedCallback(): void {\n this.removeEventListener(\"orderly-product-selected\", this.onProductSelected as EventListener);\n this.removeEventListener(\"orderly-add-to-basket\", this.onAddToBasket as EventListener);\n globalThis.removeEventListener?.(\"hashchange\", this.onHashChange);\n super.disconnectedCallback();\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n const navigationItems = this.resolvedNavigationItems();\n const configurationError = defaultShopNavigationError();\n if (configurationError && !this.currentNavigationItems?.length) {\n render(this, cloneTemplate(this, \"configuration-error\") ?? defaultCategoryError(configurationError));\n return;\n }\n const sortOptions = this.resolvedSortOptions();\n const categoryResult = this.resolveCategory(navigationItems);\n const category = categoryResult.category;\n if (!category) {\n render(this, cloneTemplate(this, \"empty-category\") ?? defaultCategoryError(categoryResult.error ?? uiText(\"categoryNoConfigured\")));\n return;\n }\n\n const fragment = cloneTemplate(this, \"layout\") ?? defaultCategoryPage({\n pageLayoutTagName: siblingTagName(this, \"category-page\", \"page-layout\"),\n basketIconTagName: siblingTagName(this, \"category-page\", \"basket-icon\"),\n navigationTagName: siblingTagName(this, \"category-page\", \"navigation\"),\n searchBoxTagName: siblingTagName(this, \"category-page\", \"search-box\"),\n collectionPageTagName: siblingTagName(this, \"category-page\", \"collection-page\"),\n productGridTagName: siblingTagName(this, \"category-page\", \"product-grid\"),\n productTileTagName: siblingTagName(this, \"category-page\", \"product-tile\"),\n storedImageTagName: siblingTagName(this, \"category-page\", \"stored-image\"),\n shopFooterTagName: siblingTagName(this, \"category-page\", \"shop-footer\"),\n basketTagName: siblingTagName(this, \"category-page\", \"basket\"),\n productPageTagName: siblingTagName(this, \"category-page\", \"product-page\")\n });\n projectSlots(this, fragment, [\"utility\", \"header-actions\", \"content-before\", \"content-after\", \"footer\", \"overlay\"]);\n const root = render(this, fragment);\n customElements.upgrade(root);\n this.configureChildren(root, category, navigationItems, sortOptions);\n }\n\n private configureChildren(\n root: HTMLElement,\n category: ResolvedNavigationItem,\n navigationItems: ResolvedNavigationItem[],\n sortOptions: SortOption[]\n ): void {\n const client = this.clientOrUndefined();\n const basketController = this.controller ?? new BasketController();\n this.controller = basketController;\n const collection = this.requiredElement<OrderlyCollectionPageElement>(root, \"collectionPage\");\n const categoryNavigation = this.requiredElement<HTMLElement & { items?: NavigationItem[] }>(root, \"categoryNavigation\");\n const brandLink = this.requiredElement<HTMLAnchorElement>(root, \"brandLink\");\n const basketIcon = this.requiredElement<OrderlyBasketIconElement>(root, \"basketIcon\");\n const basket = this.requiredElement<OrderlyBasketElement>(root, \"basket\");\n const basketPanel = this.requiredElement<HTMLElement>(root, \"basketPanel\");\n const basketClose = this.requiredElement<HTMLButtonElement>(root, \"basketClose\");\n const searchBox = this.requiredElement<OrderlySearchBoxElement>(root, \"categorySearch\");\n const productDialog = this.requiredElement<HTMLDialogElement>(root, \"productDialog\");\n const productClose = this.requiredElement<HTMLButtonElement>(root, \"productClose\");\n const productExpand = root.querySelector(\"#productExpand\") as HTMLAnchorElement | null;\n const productDetail = this.requiredElement<OrderlyProductPageElement>(root, \"productDetail\");\n\n this.applyText(root, category);\n if (client) {\n collection.client = client;\n basket.client = client;\n searchBox.client = client;\n } else {\n searchBox.baseUrl = this.baseUrl ?? this.getDefaultBaseUrl();\n }\n collection.basketController = basketController;\n collection.defaultQuery = this.currentDefaultQuery;\n collection.sortOptions = sortOptions;\n collection.title = category.label;\n collection.description = category.metadata.description;\n collection.heroImage = category.metadata.heroImage;\n collection.query = categoryQueryWithDefaultSort(category, sortOptions);\n hideSsrFallbackWhenReady(root, collection);\n\n categoryNavigation.items = navigationItems;\n configureNavigation(categoryNavigation, category);\n\n brandLink.href = defaultShopHomeHref();\n basketIcon.basketController = basketController;\n basket.basketController = basketController;\n searchBox.basketController = basketController;\n searchBox.defaultQuery = this.currentDefaultQuery;\n searchBox.emptyLabel = this.emptyLabel;\n basket.continueHref = category.href ?? navigationItems[0]?.href ?? \"/\";\n basket.checkoutHref = this.checkoutHref;\n basket.checkoutLabel = this.checkoutLabel;\n applyBasketLabels(basket, defaultShopBasketLabels());\n productDetail.basketController = basketController;\n\n void basketController.load();\n\n basketIcon.addEventListener(\"orderly-basket-open\", () => {\n resetHorizontalScroll();\n basketPanel.hidden = false;\n });\n basketClose.addEventListener(\"click\", () => {\n basketPanel.hidden = true;\n resetHorizontalScroll();\n });\n productClose.addEventListener(\"click\", () => {\n productDialog.close();\n resetHorizontalScroll();\n });\n if (productExpand) {\n configureProductExpandLink(productExpand, undefined, this.productHref);\n }\n productDialog.addEventListener(\"close\", resetHorizontalScroll);\n }\n\n private applyText(root: ParentNode, category: ResolvedNavigationItem): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"brandLabel\\\"]\").forEach((element) => {\n element.textContent = this.brandLabel;\n });\n root.querySelectorAll(\"[data-orderly-bind=\\\"emptyLabel\\\"]\").forEach((element) => {\n element.textContent = this.emptyLabel;\n });\n root.querySelectorAll(\"[data-orderly-bind=\\\"searchPlaceholder\\\"]\").forEach((element) => {\n if (element instanceof HTMLInputElement) {\n element.placeholder = this.searchPlaceholder;\n }\n if (\"placeholder\" in element) {\n (element as HTMLElement & { placeholder?: string }).placeholder = this.searchPlaceholder;\n }\n });\n document.title = `${category.label} | ${this.brandLabel}`;\n document.body.dataset.categoryId = category.id;\n document.body.dataset.categorySlug = category.metadata.slug;\n document.body.dataset.categoryTitle = category.label;\n document.body.dataset.categoryDescription = category.metadata.description;\n document.body.dataset.categoryQuery = category.metadata.searchText;\n document.body.dataset.categoryHero = category.metadata.heroImage;\n }\n\n private resolveCategory(navigationItems: ResolvedNavigationItem[]): { category?: ResolvedNavigationItem; error?: string } {\n if (navigationItems.length === 0) {\n return { error: uiText(\"categoryNoDefinitions\") };\n }\n if (this.currentCategory) {\n return { category: this.currentCategory };\n }\n const slug = this.slug.trim();\n if (slug) {\n const category = findCategoryByIdOrSlug(slug, navigationItems);\n return category\n ? { category }\n : { error: formatUiText(\"categoryNoSlugMatch\", { slug }) };\n }\n const pageRoot = navigationItems[0]?.metadata.pagePath;\n const requested = requestedCategoryFromUrl(currentLocationUrl(), pageRoot);\n const category = categoryFromUrl(currentLocationUrl(), navigationItems, { pageRoot });\n if (requested && category.id !== requested && category.metadata.slug !== requested) {\n return { error: formatUiText(\"categoryNoUrlMatch\", { id: requested }) };\n }\n return { category };\n }\n\n private clientOrUndefined(): StorefrontClient | undefined {\n if (this.client) {\n return this.client;\n }\n if (!this.baseUrl && !this.getDefaultBaseUrl()) {\n return undefined;\n }\n return this.getClient();\n }\n\n private resolvedNavigationItems(): ResolvedNavigationItem[] {\n return this.currentNavigationItems ? [...this.currentNavigationItems] : defaultShopNavigationItems();\n }\n\n private resolvedSortOptions(): SortOption[] {\n return this.currentSortOptions ? [...this.currentSortOptions] : defaultShopSortOptions();\n }\n\n protected getDefaultBaseUrl(): string | undefined {\n return defaultShopBaseUrl();\n }\n\n private requiredElement<T extends HTMLElement>(root: ParentNode, id: string): T {\n const element = root.querySelector(`#${id}`);\n if (!element) {\n throw new Error(`Missing #${id}.`);\n }\n return element as T;\n }\n\n private readonly onProductSelected = (event: CustomEvent<ProductEventDetail>): void => {\n const product = event.detail.product;\n if (!product) {\n return;\n }\n const productDialog = this.querySelector(\"#productDialog\") as HTMLDialogElement | null;\n const productDetail = this.querySelector(\"#productDetail\") as OrderlyProductPageElement | null;\n if (!productDialog || !productDetail) {\n return;\n }\n productDetail.product = product as SearchObject;\n const productExpand = this.querySelector(\"#productExpand\") as HTMLAnchorElement | null;\n if (productExpand) {\n configureProductExpandLink(productExpand, product as SearchObject, this.productHref);\n }\n resetHorizontalScroll();\n if (!productDialog.open) {\n productDialog.showModal();\n }\n };\n\n private readonly onAddToBasket = (event: CustomEvent<ProductEventDetail>): void => {\n const product = event.detail.product;\n if (!product) {\n return;\n }\n if (!event.detail.controllerUpdated) {\n void this.controller?.addProduct(product);\n }\n const basketPanel = this.querySelector(\"#basketPanel\") as HTMLElement | null;\n resetHorizontalScroll();\n if (basketPanel) {\n basketPanel.hidden = false;\n }\n };\n\n private readonly onHashChange = (): void => {\n if (this.currentCategory || this.slug.trim()) {\n return;\n }\n this.requestRender();\n };\n}\n\nfunction defaultCategoryPage(tags: {\n pageLayoutTagName: string;\n basketIconTagName: string;\n navigationTagName: string;\n searchBoxTagName: string;\n collectionPageTagName: string;\n productGridTagName: string;\n productTileTagName: string;\n storedImageTagName: string;\n shopFooterTagName: string;\n basketTagName: string;\n productPageTagName: string;\n}): DocumentFragment {\n const template = document.createElement(\"template\");\n template.innerHTML = `\n <${tags.pageLayoutTagName}>\n <div slot=\"utility\" data-orderly-slot=\"utility\"></div>\n <a slot=\"header\" class=\"orderly-category-page__brand\" id=\"brandLink\" href=\"/\">\n <span data-orderly-bind=\"brandLabel\"></span>\n </a>\n <${tags.searchBoxTagName} slot=\"header-actions\" id=\"categorySearch\" mode=\"icon\" for=\"productGrid\" data-orderly-bind=\"searchPlaceholder\"></${tags.searchBoxTagName}>\n <${tags.basketIconTagName} slot=\"header-actions\" id=\"basketIcon\" label=\"${uiText(\"basketLabel\")}\"></${tags.basketIconTagName}>\n <div slot=\"header-actions\" data-orderly-slot=\"header-actions\"></div>\n <${tags.navigationTagName} slot=\"left\" id=\"categoryNavigation\" aria-label=\"${uiText(\"categoriesLabel\")}\"></${tags.navigationTagName}>\n <div slot=\"content-before\" data-orderly-slot=\"content-before\"></div>\n <${tags.collectionPageTagName} slot=\"content\" id=\"collectionPage\">\n <template data-orderly-template=\"grid\">\n <${tags.productGridTagName} id=\"productGrid\" paging=\"dynamic\">\n <template data-orderly-template=\"empty\">\n <p class=\"orderly-category-page__empty-state\" data-orderly-bind=\"emptyLabel\"></p>\n </template>\n <template data-orderly-template=\"product\">\n <${tags.productTileTagName} class=\"orderly-category-page__product-card\" add-label=\"${uiText(\"productAddLabel\")}\" remove-label=\"${uiText(\"productRemoveLabel\")}\"></${tags.productTileTagName}>\n </template>\n </${tags.productGridTagName}>\n </template>\n </${tags.collectionPageTagName}>\n <div slot=\"content-after\" data-orderly-slot=\"content-after\"></div>\n <${tags.shopFooterTagName} slot=\"footer\"></${tags.shopFooterTagName}>\n <div slot=\"footer\" data-orderly-slot=\"footer\"></div>\n <aside slot=\"overlay\" class=\"orderly-category-page__basket-panel\" id=\"basketPanel\" hidden>\n <div class=\"orderly-category-page__basket-panel-header\">\n <h2>${uiText(\"basketPanelTitle\")}</h2>\n <button id=\"basketClose\" type=\"button\">${uiText(\"closeLabel\")}</button>\n </div>\n <${tags.basketTagName} id=\"basket\" empty-label=\"${uiText(\"basketEmptyLabel\")}\" continue-label=\"${uiText(\"continueShoppingLabel\")}\" quantity-label=\"${uiText(\"quantityLabel\")}\" remove-label=\"${uiText(\"removeLabel\")}\"></${tags.basketTagName}>\n </aside>\n <dialog slot=\"overlay\" class=\"orderly-category-page__product-dialog\" id=\"productDialog\">\n <div class=\"orderly-category-page__product-dialog-actions\">\n <a class=\"orderly-category-page__product-dialog-expand\" id=\"productExpand\" href=\"${defaultShopProductHref()}\" aria-label=\"${uiText(\"productOpenPageLabel\")}\" title=\"${uiText(\"productOpenPageLabel\")}\" hidden>\n <svg viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\" width=\"20\" height=\"20\">\n <path d=\"M8 7H6.75A1.75 1.75 0 0 0 5 8.75v8.5c0 .97.78 1.75 1.75 1.75h8.5c.97 0 1.75-.78 1.75-1.75V16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M13 5h6v6M12 12l7-7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </a>\n <button class=\"orderly-category-page__product-dialog-close\" id=\"productClose\" type=\"button\" aria-label=\"${uiText(\"closeLabel\")}\" title=\"${uiText(\"closeLabel\")}\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\" width=\"20\" height=\"20\">\n <path d=\"m6.4 5 5.6 5.6L17.6 5 19 6.4 13.4 12l5.6 5.6-1.4 1.4-5.6-5.6L6.4 19 5 17.6l5.6-5.6L5 6.4 6.4 5Z\" fill=\"currentColor\"></path>\n </svg>\n </button>\n </div>\n <${tags.productPageTagName} id=\"productDetail\" add-label=\"${uiText(\"productAddLabel\")}\"></${tags.productPageTagName}>\n </dialog>\n <div slot=\"overlay\" data-orderly-slot=\"overlay\"></div>\n </${tags.pageLayoutTagName}>\n `;\n return template.content.cloneNode(true) as DocumentFragment;\n}\n\nfunction defaultCategoryError(message: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const section = document.createElement(\"section\");\n section.className = \"orderly-category-page__error\";\n section.setAttribute(\"role\", \"alert\");\n section.innerHTML = `\n <h1>${uiText(\"categoryConfigurationErrorTitle\")}</h1>\n <p></p>\n `;\n const text = section.querySelector(\"p\");\n if (text) {\n text.textContent = message;\n }\n fragment.append(section);\n return fragment;\n}\n\nfunction configureProductExpandLink(link: HTMLAnchorElement, product: SearchObject | undefined, productHref: string): void {\n const shareUrl = productShareUrl(product);\n if (!shareUrl) {\n link.hidden = true;\n link.removeAttribute(\"href\");\n return;\n }\n link.hidden = false;\n link.href = productShareHref(productHref, shareUrl);\n}\n\nfunction applyBasketLabels(basket: OrderlyBasketElement, labels: BasketLabels): void {\n if (labels.emptyLabel !== undefined) {\n basket.emptyLabel = labels.emptyLabel;\n }\n if (labels.clearLabel !== undefined) {\n basket.clearLabel = labels.clearLabel;\n }\n if (labels.continueLabel !== undefined) {\n basket.continueLabel = labels.continueLabel;\n }\n if (labels.quantityLabel !== undefined) {\n basket.quantityLabel = labels.quantityLabel;\n }\n if (labels.removeLabel !== undefined) {\n basket.removeLabel = labels.removeLabel;\n }\n if (labels.subtotalLabel !== undefined) {\n basket.subtotalLabel = labels.subtotalLabel;\n }\n if (labels.shippingLabel !== undefined) {\n basket.shippingLabel = labels.shippingLabel;\n }\n if (labels.totalLabel !== undefined) {\n basket.totalLabel = labels.totalLabel;\n }\n if (labels.totalNote !== undefined) {\n basket.totalNote = labels.totalNote;\n }\n if (labels.deliveryNote !== undefined) {\n basket.deliveryNote = labels.deliveryNote;\n }\n}\n\nfunction configureNavigation(\n element: HTMLElement & { items?: NavigationItem[]; controller?: { activePath: string; expandedIds?: Set<string> }; refresh?: () => void },\n category: ResolvedNavigationItem | undefined\n): void {\n if (!category || !element.controller) {\n element.refresh?.();\n return;\n }\n element.controller.activePath = category.href ?? location.pathname;\n element.controller.expandedIds?.clear();\n if (category.metadata.parentId) {\n element.controller.expandedIds?.add(category.metadata.parentId);\n }\n element.refresh?.();\n}\n\nfunction categoryQueryWithDefaultSort(\n category: ResolvedNavigationItem,\n sortOptions: SortOption[]\n): SearchQuery {\n const query = clone(SearchQuerySchema, category.metadata.query);\n if (query.OrderBy.length === 0) {\n query.OrderBy = [...sortOptions[0]?.orderBy ?? []];\n }\n return query;\n}\n\nfunction resetHorizontalScroll(): void {\n const scrollingElement = document.scrollingElement ?? document.documentElement;\n scrollingElement.scrollLeft = 0;\n document.documentElement.scrollLeft = 0;\n document.body.scrollLeft = 0;\n}\n\nfunction hideSsrFallbackWhenReady(root: ParentNode, target: EventTarget): void {\n const fallback = root.querySelector(\"[data-orderly-ssr-fallback]\");\n if (!(fallback instanceof HTMLElement)) {\n return;\n }\n target.addEventListener(\"orderly-results\", () => {\n fallback.hidden = true;\n }, { once: true });\n}\n\nfunction currentLocationUrl(): URL {\n return typeof location === \"undefined\"\n ? new URL(\"/categories/\", \"https://example.test\")\n : new URL(location.href);\n}\n\nfunction requestedCategoryFromUrl(url: string | URL | Location, pageRoot = \"/categories/\"): string | undefined {\n const target = typeof url === \"string\" ? new URL(url, currentLocationUrl()) : new URL(url.href);\n const hash = target.hash.startsWith(\"#\") ? target.hash.slice(1) : target.hash;\n if (hash) {\n const params = new URLSearchParams(hash.startsWith(\"?\") ? hash.slice(1) : hash);\n const id = params.get(\"id\");\n if (id) {\n return id.trim() || undefined;\n }\n if (!hash.includes(\"=\")) {\n try {\n return decodeURIComponent(hash).trim() || undefined;\n } catch {\n return hash.trim() || undefined;\n }\n }\n }\n const path = target.pathname.replace(/\\/index\\.html$/, \"/\");\n if (!path.startsWith(pageRoot) || path === pageRoot) {\n return undefined;\n }\n const normalized = path.slice(pageRoot.length).replace(/^\\/+|\\/+$/g, \"\");\n return normalized ? normalized.split(\"/\").map(decodeURIComponent).join(\"/\") : undefined;\n}\n","import type { Credit, SearchObject } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport type { BasketController } from \"../basket.js\";\nimport { firstImage, firstImageUrl } from \"../utils/format.js\";\nimport { bindCredit, bindImage, bindStoredImage, bindText, cloneTemplate, dispatch, render, siblingTagName, upgradeFragment } from \"../utils/dom.js\";\nimport { formatUiText, uiText } from \"../i18n.js\";\n\nconst ORDERLY_SHARE_URL_PREFIX = \"https://orderly.shop/\";\n\nexport class OrderlyProductTileElement extends OrderlyElement {\n static observedAttributes = [\"add-label\", \"remove-label\"];\n\n private currentProduct?: SearchObject;\n private controller?: BasketController;\n private readonly onBasketChange = () => this.requestRender();\n\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n if (this.controller === value) {\n return;\n }\n if (this.isConnected) {\n this.controller?.removeEventListener(\"change\", this.onBasketChange);\n }\n this.controller = value;\n if (this.isConnected) {\n this.controller?.addEventListener(\"change\", this.onBasketChange);\n }\n this.requestRender();\n }\n\n get product(): SearchObject | undefined {\n return this.currentProduct;\n }\n\n set product(value: SearchObject | undefined) {\n this.currentProduct = value;\n this.requestRender();\n }\n\n get addLabel(): string {\n return this.getAttribute(\"add-label\") ?? uiText(\"productAddLabel\");\n }\n\n set addLabel(value: string) {\n this.setAttribute(\"add-label\", value);\n }\n\n get removeLabel(): string {\n return this.getAttribute(\"remove-label\") ?? uiText(\"productRemoveLabel\");\n }\n\n set removeLabel(value: string) {\n this.setAttribute(\"remove-label\", value);\n }\n\n connectedCallback(): void {\n this.controller?.addEventListener(\"change\", this.onBasketChange);\n this.addEventListener(\"click\", this.onHostClick);\n this.addEventListener(\"keydown\", this.onHostKeyDown);\n super.connectedCallback();\n }\n\n disconnectedCallback(): void {\n this.controller?.removeEventListener(\"change\", this.onBasketChange);\n this.removeEventListener(\"click\", this.onHostClick);\n this.removeEventListener(\"keydown\", this.onHostKeyDown);\n super.disconnectedCallback();\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n this.style.display ||= \"block\";\n this.style.height ||= \"100%\";\n this.style.minWidth ||= \"0\";\n const product = this.currentProduct;\n configureHostSelection(this, product);\n const inBasket = Boolean(product && this.controller?.hasProduct(product));\n const custom = cloneTemplate(this, \"product\") ?? cloneTemplate(this, \"default\");\n const root = custom ? upgradeFragment(custom) : defaultProductTile(\n siblingTagName(this, \"product-tile\", \"stored-image\"),\n siblingTagName(this, \"product-tile\", \"credit\")\n );\n bindProduct(root, product, { inBasket });\n configureBasketAction(root, product, inBasket, this.addLabel, this.removeLabel);\n const rendered = render(this, root);\n rendered.style.height = \"100%\";\n rendered.style.minWidth = \"0\";\n const add = rendered.querySelector(\"[data-orderly-action=\\\"add-to-basket\\\"], [data-orderly-action=\\\"toggle-basket\\\"]\");\n add?.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n if (product) {\n if (this.controller && inBasket) {\n void this.controller.removeProduct(product);\n dispatch(this, \"orderly-remove-from-basket\", {\n product,\n controllerUpdated: true\n });\n return;\n }\n void this.controller?.addProduct(product);\n dispatch(this, \"orderly-add-to-basket\", {\n product,\n controllerUpdated: Boolean(this.controller)\n });\n }\n });\n }\n\n private readonly onHostClick = (event: MouseEvent): void => {\n if (!this.currentProduct || isInteractiveTarget(event.target)) {\n return;\n }\n dispatch(this, \"orderly-product-selected\", { product: this.currentProduct });\n };\n\n private readonly onHostKeyDown = (event: KeyboardEvent): void => {\n if (!this.currentProduct || isInteractiveTarget(event.target) || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n event.preventDefault();\n dispatch(this, \"orderly-product-selected\", { product: this.currentProduct });\n };\n}\n\nexport function bindProduct(root: ParentNode, product: SearchObject | undefined, options: { inBasket?: boolean } = {}): void {\n const shareUrl = productShareUrl(product);\n bindText(root, \"title\", product?.Title);\n bindText(root, \"description\", product?.Description);\n bindBrand(root, product?.Brand);\n bindCredit(root, \"price\", product?.Price);\n bindText(root, \"basket-action-state\", options.inBasket ? \"in-basket\" : \"not-in-basket\");\n bindShareUrl(root, shareUrl);\n bindStoredImage(root, \"image\", firstImage(product));\n bindImage(root, \"image\", firstImageUrl(product));\n bindProductStructuredData(root, product, shareUrl);\n}\n\nexport function productShareUrl(product: SearchObject | undefined): string {\n return product?.ShareURL?.URL ?? \"\";\n}\n\nfunction defaultProductTile(storedImageTagName: string, creditTagName: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const article = document.createElement(\"article\");\n article.className = \"orderly-product-tile\";\n article.dataset.orderlyProduct = \"\";\n article.innerHTML = `\n <${storedImageTagName} class=\"orderly-product-tile__image\" data-orderly-bind=\"image\" fit=\"contain\"></${storedImageTagName}>\n <link data-orderly-bind=\"schema-url\" data-orderly-schema-prop=\"url\">\n <link data-orderly-bind=\"schema-image\" data-orderly-schema-prop=\"image\">\n <meta data-orderly-bind=\"schema-description\" data-orderly-schema-prop=\"description\">\n <meta data-orderly-bind=\"schema-sku\" data-orderly-schema-prop=\"sku\">\n <div class=\"orderly-product-tile__body\">\n <h3 class=\"orderly-product-tile__title\" data-orderly-bind=\"title\" itemprop=\"name\"></h3>\n <p class=\"orderly-product-tile__brand\" data-orderly-bind=\"brand\" data-orderly-schema-prop=\"brand\"></p>\n <div class=\"orderly-product-tile__footer\">\n <div class=\"orderly-product-tile__offer\" data-orderly-schema-offer>\n <link data-orderly-bind=\"schema-url\" data-orderly-schema-prop=\"url\">\n <meta data-orderly-bind=\"schema-price-currency\" data-orderly-schema-prop=\"priceCurrency\">\n <meta data-orderly-bind=\"schema-price\" data-orderly-schema-prop=\"price\">\n <link data-orderly-bind=\"schema-availability\" data-orderly-schema-prop=\"availability\">\n <${creditTagName} class=\"orderly-product-tile__price\" data-orderly-bind=\"price\"></${creditTagName}>\n </div>\n <button class=\"orderly-product-tile__add\" type=\"button\" data-orderly-action=\"add-to-basket\">\n <span class=\"orderly-product-tile__add-icon\" data-orderly-bind=\"basket-action-icon\" aria-hidden=\"true\"></span>\n </button>\n </div>\n </div>\n `;\n fragment.append(article);\n return fragment;\n}\n\nfunction bindBrand(root: ParentNode, brand: string | undefined): void {\n const value = displayBrand(brand);\n bindText(root, \"brand\", value);\n root.querySelectorAll(\"[data-orderly-bind=\\\"brand\\\"]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = !value;\n if (value) {\n element.setAttribute(\"itemprop\", \"brand\");\n } else {\n element.removeAttribute(\"itemprop\");\n }\n }\n });\n}\n\nfunction bindProductStructuredData(root: ParentNode, product: SearchObject | undefined, shareUrl: string): void {\n const hasProduct = Boolean(product);\n root.querySelectorAll(\"[data-orderly-product], .orderly-product-tile, .orderly-product-page\").forEach((element) => {\n if (!(element instanceof HTMLElement)) {\n return;\n }\n if (hasProduct) {\n element.setAttribute(\"itemscope\", \"\");\n element.setAttribute(\"itemtype\", \"https://schema.org/Product\");\n } else {\n element.removeAttribute(\"itemscope\");\n element.removeAttribute(\"itemtype\");\n }\n });\n configureOfferSchema(root, product?.Price);\n bindSchemaValue(root, \"schema-url\", shareUrl);\n bindSchemaValue(root, \"schema-image\", firstImageUrl(product));\n bindSchemaValue(root, \"schema-description\", product?.Description);\n bindSchemaValue(root, \"schema-sku\", product?.SKU?.Value);\n bindSchemaValue(root, \"schema-price-currency\", schemaCurrency(product?.Price));\n bindSchemaValue(root, \"schema-price\", schemaPrice(product?.Price));\n bindSchemaValue(root, \"schema-availability\", product?.Active ? \"https://schema.org/InStock\" : undefined);\n}\n\nfunction configureOfferSchema(root: ParentNode, price: Credit | undefined): void {\n const hasPrice = schemaPrice(price) !== undefined;\n root.querySelectorAll(\"[data-orderly-schema-offer]\").forEach((element) => {\n if (!(element instanceof HTMLElement)) {\n return;\n }\n if (hasPrice) {\n element.setAttribute(\"itemprop\", \"offers\");\n element.setAttribute(\"itemscope\", \"\");\n element.setAttribute(\"itemtype\", \"https://schema.org/Offer\");\n } else {\n element.removeAttribute(\"itemprop\");\n element.removeAttribute(\"itemscope\");\n element.removeAttribute(\"itemtype\");\n }\n });\n}\n\nfunction bindSchemaValue(root: ParentNode, name: string, value: string | undefined): void {\n root.querySelectorAll(`[data-orderly-bind=\"${name}\"]`).forEach((element) => {\n const property = element instanceof HTMLElement ? element.dataset.orderlySchemaProp : undefined;\n if (!value) {\n element.removeAttribute(\"itemprop\");\n element.removeAttribute(\"content\");\n element.removeAttribute(\"href\");\n return;\n }\n if (property) {\n element.setAttribute(\"itemprop\", property);\n }\n if (element instanceof HTMLLinkElement) {\n element.href = value;\n return;\n }\n if (element instanceof HTMLMetaElement) {\n element.content = value;\n return;\n }\n element.setAttribute(\"content\", value);\n });\n}\n\nfunction schemaPrice(price: Credit | undefined): string | undefined {\n if (!price || !Number.isFinite(price.Amount)) {\n return undefined;\n }\n return price.Amount.toFixed(2);\n}\n\nfunction schemaCurrency(price: Credit | undefined): string | undefined {\n const currency = price?.Currency?.trim();\n return currency ? currency.toUpperCase() : undefined;\n}\n\nfunction bindShareUrl(root: ParentNode, shareUrl: string): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"shareUrl\\\"], [data-orderly-bind=\\\"share-url\\\"]\").forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n if (shareUrl) {\n element.href = productShareHref(element.getAttribute(\"href\"), shareUrl);\n } else {\n element.removeAttribute(\"href\");\n }\n }\n if (element instanceof HTMLInputElement) {\n element.value = shareUrl;\n }\n if (element instanceof HTMLElement) {\n if (shareUrl) {\n element.dataset.orderlyShareUrl = shareUrl;\n element.setAttribute(\"share-url\", shareUrl);\n } else {\n delete element.dataset.orderlyShareUrl;\n element.removeAttribute(\"share-url\");\n }\n }\n if (!(element instanceof HTMLAnchorElement) && !(element instanceof HTMLInputElement)) {\n element.textContent = shareUrl;\n }\n });\n}\n\nexport function productShareHref(baseHref: string | null, shareUrl: string): string {\n const base = baseHref?.trim();\n if (!base || base === \"#\") {\n return shareUrl;\n }\n const target = base.split(\"#\")[0] ?? base;\n return `${target}#url=${encodeURIComponent(compactProductShareUrl(shareUrl))}`;\n}\n\nexport function compactProductShareUrl(shareUrl: string): string {\n const value = shareUrl.trim();\n return value.startsWith(ORDERLY_SHARE_URL_PREFIX) ? value.slice(ORDERLY_SHARE_URL_PREFIX.length) : value;\n}\n\nfunction displayBrand(brand: string | undefined): string {\n const normalized = brand?.trim();\n if (!normalized || normalized.toLocaleLowerCase() === \"ukendt\" || normalized.toLocaleLowerCase() === \"dvd\") {\n return \"\";\n }\n return normalized;\n}\n\nfunction configureBasketAction(root: ParentNode, product: SearchObject | undefined, inBasket: boolean, addLabel: string, removeLabel: string): void {\n const label = inBasket ? removeLabel : addLabel;\n root.querySelectorAll(\"[data-orderly-action=\\\"add-to-basket\\\"], [data-orderly-action=\\\"toggle-basket\\\"]\").forEach((element) => {\n if (!(element instanceof HTMLElement)) {\n return;\n }\n element.dataset.orderlyInBasket = inBasket ? \"true\" : \"false\";\n element.dataset.orderlyBasketAction = inBasket ? \"remove\" : \"add\";\n element.setAttribute(\"aria-label\", label);\n element.setAttribute(\"title\", label);\n if (element instanceof HTMLButtonElement) {\n element.disabled = !product;\n }\n });\n root.querySelectorAll(\"[data-orderly-bind=\\\"basket-action-label\\\"]\").forEach((element) => {\n element.textContent = label;\n });\n root.querySelectorAll(\"[data-orderly-bind=\\\"basket-action-icon\\\"]\").forEach((element) => {\n element.innerHTML = inBasket ? removeIcon() : addIcon();\n });\n root.querySelectorAll(\".orderly-product-tile\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.dataset.orderlyInBasket = inBasket ? \"true\" : \"false\";\n }\n });\n}\n\nfunction configureHostSelection(host: HTMLElement, product: SearchObject | undefined): void {\n if (product) {\n host.tabIndex = host.tabIndex >= 0 ? host.tabIndex : 0;\n host.setAttribute(\"role\", \"button\");\n host.setAttribute(\"aria-label\", product.Title ? formatUiText(\"productViewWithTitle\", { title: product.Title }) : uiText(\"productViewLabel\"));\n host.dataset.orderlyClickable = \"true\";\n return;\n }\n host.removeAttribute(\"role\");\n host.removeAttribute(\"aria-label\");\n host.removeAttribute(\"data-orderly-clickable\");\n if (host.tabIndex === 0) {\n host.removeAttribute(\"tabindex\");\n }\n}\n\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) {\n return false;\n }\n return Boolean(target.closest(\"button, a, input, select, textarea, [data-orderly-action=\\\"add-to-basket\\\"], [data-orderly-action=\\\"toggle-basket\\\"]\"));\n}\n\nfunction addIcon(): string {\n return `\n <svg class=\"orderly-product-tile__add-svg\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\" width=\"20\" height=\"20\">\n <path d=\"M6.5 8.5h11l-1 10h-9l-1-10Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"></path>\n <path d=\"M9 8.5a3 3 0 0 1 6 0\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"></path>\n <path d=\"M12 11.25v4.5M9.75 13.5h4.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"></path>\n </svg>\n `;\n}\n\nfunction removeIcon(): string {\n return `\n <svg class=\"orderly-product-tile__remove-svg\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\" width=\"20\" height=\"20\">\n <path d=\"M7.75 7.75 16.25 16.25M16.25 7.75 7.75 16.25\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"></path>\n </svg>\n `;\n}\n","import { create, type MessageInitShape } from \"@bufbuild/protobuf\";\nimport { anyUnpack } from \"@bufbuild/protobuf/wkt\";\nimport {\n AddressSchema,\n EmailSchema,\n PhoneNumberSchema,\n ServicePointHeaderSchema,\n ServicePointQuerySchema,\n TransportDetailsSchema,\n TransportMethodQuerySchema,\n TransportMethodSchema,\n type Address,\n type PageResult,\n type ServicePointHeader,\n type ServicePointQuery,\n type TransportMethod,\n type TransportMethodQuery\n} from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport { defaultBasketController, type BasketController } from \"../basket.js\";\nimport { LocalStorageCheckoutProfileStore, type CheckoutProfileStore } from \"../stores.js\";\nimport type { CheckoutProfile } from \"../types.js\";\nimport { bindCredit, bindText, cloneTemplate, dispatch, readInput, render, replaceSlot, setInput, siblingTagName } from \"../utils/dom.js\";\nimport { formatUiText, uiText } from \"../i18n.js\";\n\nconst DEFAULT_COUNTRY_CODE = \"DK\";\nconst DANISH_POSTAL_CODE_ENDPOINT = \"https://api.dataforsyningen.dk/postnumre\";\nconst DANISH_POSTAL_CODE_PATTERN = /^\\d{4}$/;\n\nexport interface CheckoutLabels {\n customerTitle?: string;\n addressTitle?: string;\n deliveryTitle?: string;\n terms?: string;\n termsLink?: string;\n firstName?: string;\n lastName?: string;\n email?: string;\n phoneCountry?: string;\n phone?: string;\n company?: string;\n street?: string;\n street2?: string;\n zip?: string;\n city?: string;\n country?: string;\n deliveryMethod?: string;\n servicePoint?: string;\n deliveryAddressPrompt?: string;\n noDeliveryMethods?: string;\n servicePointHelp?: string;\n noServicePoints?: string;\n submit?: string;\n submitting?: string;\n error?: string;\n}\n\nexport class OrderlyCheckoutElement extends OrderlyElement {\n static observedAttributes = [\n \"first-name-label\",\n \"customer-title\",\n \"address-title\",\n \"delivery-title\",\n \"terms-label\",\n \"terms-link-label\",\n \"terms-href\",\n \"last-name-label\",\n \"email-label\",\n \"phone-country-label\",\n \"phone-label\",\n \"company-label\",\n \"street-label\",\n \"street-2-label\",\n \"zip-label\",\n \"city-label\",\n \"country-label\",\n \"delivery-method-label\",\n \"service-point-label\",\n \"delivery-address-prompt-label\",\n \"no-delivery-methods-label\",\n \"service-point-help-label\",\n \"no-service-points-label\",\n \"submit-label\",\n \"submitting-label\",\n \"error-label\"\n ];\n\n basketController: BasketController = defaultBasketController;\n profileStore: CheckoutProfileStore = new LocalStorageCheckoutProfileStore();\n profile?: CheckoutProfile;\n deliveryMethods: TransportMethod[] = [];\n servicePoints: ServicePointHeader[] = [];\n selectedDeliveryMethod?: TransportMethod;\n selectedServicePoint?: ServicePointHeader;\n loading = false;\n error?: unknown;\n private labelValues: CheckoutLabels = {};\n private deliveryMethodsLoading = false;\n private servicePointsLoading = false;\n private deliveryRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n private postalCodeLookupTimer: ReturnType<typeof setTimeout> | undefined;\n private postalCodeLookupSequence = 0;\n private lastAutoFilledCity = \"\";\n private readonly postalCodeCityCache = new Map<string, string>();\n\n get termsHref(): string {\n return this.getAttribute(\"terms-href\") ?? \"#\";\n }\n\n set termsHref(value: string) {\n this.setAttribute(\"terms-href\", value);\n }\n\n get labels(): CheckoutLabels {\n return { ...this.labelValues };\n }\n\n set labels(value: CheckoutLabels) {\n this.labelValues = { ...value };\n this.requestRender();\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n connectedCallback(): void {\n void this.loadProfile();\n void this.basketController.load();\n super.connectedCallback();\n }\n\n async loadProfile(): Promise<void> {\n this.profile = await this.profileStore.load();\n this.requestRender();\n }\n\n async loadDeliveryMethods(query: MessageInitShape<typeof TransportMethodQuerySchema> = {}): Promise<TransportMethod[]> {\n const request = create(TransportMethodQuerySchema, query);\n request.Order = this.basketController.draft;\n const result = await this.getClient().services.deliveryService.listTransportMethods(request);\n this.deliveryMethods = unpackTransportMethods(result as PageResult);\n this.ensureSelectedDeliveryMethod();\n this.requestRender();\n return this.deliveryMethods;\n }\n\n async loadServicePoints(query: MessageInitShape<typeof ServicePointQuerySchema> = {}): Promise<ServicePointHeader[]> {\n const result = await this.getClient().services.servicePointService.list(create(ServicePointQuerySchema, query));\n this.servicePoints = unpackServicePointHeaders(result as PageResult);\n this.ensureSelectedServicePoint();\n this.requestRender();\n return this.servicePoints;\n }\n\n async submit(): Promise<void> {\n this.loading = true;\n this.error = undefined;\n this.requestRender();\n try {\n const profile = this.collectProfile();\n await this.profileStore.save(profile);\n this.profile = profile;\n const draft = this.basketController.draft;\n draft.Transport = this.transportDetails(profile);\n const verified = await this.getClient().services.orderService.verifyDraft(draft);\n await this.basketController.setDraft(verified);\n dispatch(this, \"orderly-checkout-ready\", { draft: verified, profile, transportMethod: this.selectedDeliveryMethod });\n const order = await this.getClient().services.orderService.create(verified);\n dispatch(this, \"orderly-order-created\", { order, draft: verified });\n } catch (error) {\n this.error = error;\n dispatch(this, \"orderly-error\", { error });\n } finally {\n this.loading = false;\n this.requestRender();\n }\n }\n\n protected render(): void {\n const custom = cloneTemplate(this, \"checkout\");\n const labels = this.resolvedLabels();\n const creditTagName = siblingTagName(this, \"checkout\", \"credit\");\n const root = custom ?? defaultCheckout();\n bindCheckoutLabels(root, labels);\n configureTermsHref(root, this.termsHref);\n bindText(root, \"submitLabel\", this.loading ? labels.submitting : labels.submit);\n bindText(root, \"error\", this.error ? labels.error : \"\");\n this.hydrateProfile(root);\n this.renderDeliveryOptions(root, labels, creditTagName);\n this.configureAddressRefresh(root);\n const form = root.querySelector(\"form\");\n if (form instanceof HTMLFormElement) {\n form.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n void this.submit();\n });\n }\n render(this, root);\n }\n\n private resolvedLabels(): Required<CheckoutLabels> {\n const defaults = defaultCheckoutLabels();\n return {\n customerTitle: this.label(\"customer-title\", \"customerTitle\", defaults.customerTitle),\n addressTitle: this.label(\"address-title\", \"addressTitle\", defaults.addressTitle),\n deliveryTitle: this.label(\"delivery-title\", \"deliveryTitle\", defaults.deliveryTitle),\n terms: this.label(\"terms-label\", \"terms\", defaults.terms),\n termsLink: this.label(\"terms-link-label\", \"termsLink\", defaults.termsLink),\n firstName: this.label(\"first-name-label\", \"firstName\", defaults.firstName),\n lastName: this.label(\"last-name-label\", \"lastName\", defaults.lastName),\n email: this.label(\"email-label\", \"email\", defaults.email),\n phoneCountry: this.label(\"phone-country-label\", \"phoneCountry\", defaults.phoneCountry),\n phone: this.label(\"phone-label\", \"phone\", defaults.phone),\n company: this.label(\"company-label\", \"company\", defaults.company),\n street: this.label(\"street-label\", \"street\", defaults.street),\n street2: this.label(\"street-2-label\", \"street2\", defaults.street2),\n zip: this.label(\"zip-label\", \"zip\", defaults.zip),\n city: this.label(\"city-label\", \"city\", defaults.city),\n country: this.label(\"country-label\", \"country\", defaults.country),\n deliveryMethod: this.label(\"delivery-method-label\", \"deliveryMethod\", defaults.deliveryMethod),\n servicePoint: this.label(\"service-point-label\", \"servicePoint\", defaults.servicePoint),\n deliveryAddressPrompt: this.label(\"delivery-address-prompt-label\", \"deliveryAddressPrompt\", defaults.deliveryAddressPrompt),\n noDeliveryMethods: this.label(\"no-delivery-methods-label\", \"noDeliveryMethods\", defaults.noDeliveryMethods),\n servicePointHelp: this.label(\"service-point-help-label\", \"servicePointHelp\", defaults.servicePointHelp),\n noServicePoints: this.label(\"no-service-points-label\", \"noServicePoints\", defaults.noServicePoints),\n submit: this.label(\"submit-label\", \"submit\", defaults.submit),\n submitting: this.label(\"submitting-label\", \"submitting\", defaults.submitting),\n error: this.label(\"error-label\", \"error\", defaults.error)\n };\n }\n\n private label(attribute: string, property: keyof CheckoutLabels, fallback: string): string {\n return this.getAttribute(attribute) ?? this.labelValues[property] ?? fallback;\n }\n\n private hydrateProfile(root: ParentNode): void {\n const address = this.profile?.address;\n setInput(root, \"firstName\", address?.FirstName);\n setInput(root, \"lastName\", address?.LastName);\n setInput(root, \"email\", this.profile?.email);\n setInput(root, \"phoneCountryCode\", this.profile?.phoneNumber?.CountryCode);\n setInput(root, \"phoneNumber\", this.profile?.phoneNumber?.Number);\n setInput(root, \"companyName\", address?.CompanyName);\n setInput(root, \"street\", address?.Street);\n setInput(root, \"street2\", address?.Street2);\n setInput(root, \"zip\", address?.Zip);\n setInput(root, \"city\", address?.City);\n setInput(root, \"countryCode\", address?.CountryCodeIso2Letter ?? DEFAULT_COUNTRY_CODE);\n }\n\n private renderDeliveryOptions(root: ParentNode, labels: Required<CheckoutLabels>, creditTagName: string): void {\n replaceSlot(root, \"deliveryMethods\", this.renderDeliveryMethodCards(root, labels, creditTagName));\n replaceSlot(root, \"servicePoints\", this.renderServicePointCards(labels));\n const delivery = root.querySelector(\"[name=\\\"deliveryMethod\\\"]\");\n if (delivery instanceof HTMLSelectElement) {\n delivery.replaceChildren(...this.deliveryMethods.map((method, index) => {\n const option = document.createElement(\"option\");\n option.value = String(index);\n option.textContent = method.Title || method.SKU?.Value || formatUiText(\"deliveryFallbackLabel\", { index: index + 1 });\n return option;\n }));\n delivery.value = String(this.selectedDeliveryMethodIndex());\n delivery.addEventListener(\"change\", () => {\n void this.selectDeliveryMethod(Number(delivery.value));\n });\n }\n const servicePoint = root.querySelector(\"[name=\\\"servicePoint\\\"]\");\n if (servicePoint instanceof HTMLSelectElement) {\n servicePoint.replaceChildren(...this.servicePoints.map((point, index) => {\n const option = document.createElement(\"option\");\n option.value = String(index);\n option.textContent = point.Title || point.Id?.Id || formatUiText(\"servicePointFallbackLabel\", { index: index + 1 });\n return option;\n }));\n servicePoint.value = String(this.selectedServicePointIndex());\n servicePoint.addEventListener(\"change\", () => {\n void this.selectServicePoint(Number(servicePoint.value));\n });\n }\n }\n\n private collectProfile(): CheckoutProfile {\n return this.collectProfileFrom(this);\n }\n\n private collectProfileFrom(root: ParentNode): CheckoutProfile {\n const address: Address = create(AddressSchema, {\n CompanyName: readInput(root, \"companyName\") || undefined,\n Street: readInput(root, \"street\") || undefined,\n Street2: readInput(root, \"street2\") || undefined,\n City: readInput(root, \"city\") || undefined,\n Zip: readInput(root, \"zip\") || undefined,\n FirstName: readInput(root, \"firstName\") || undefined,\n LastName: readInput(root, \"lastName\") || undefined,\n CountryCodeIso2Letter: readInput(root, \"countryCode\") || DEFAULT_COUNTRY_CODE\n });\n return {\n address,\n email: readInput(root, \"email\") || undefined,\n phoneNumber: create(PhoneNumberSchema, {\n CountryCode: readInput(root, \"phoneCountryCode\"),\n Number: readInput(root, \"phoneNumber\")\n }),\n updatedAt: new Date().toISOString()\n };\n }\n\n private configureAddressRefresh(root: ParentNode): void {\n const names = [\"street\", \"street2\", \"zip\", \"city\", \"countryCode\"];\n for (const name of names) {\n const element = root.querySelector(`[name=\"${name}\"]`);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n element.addEventListener(\"input\", () => {\n this.schedulePostalCodeLookupIfNeeded(name);\n this.scheduleDeliveryRefresh();\n });\n element.addEventListener(\"change\", () => {\n this.schedulePostalCodeLookupIfNeeded(name, 0);\n this.scheduleDeliveryRefresh();\n });\n element.addEventListener(\"blur\", () => {\n this.schedulePostalCodeLookupIfNeeded(name, 0);\n this.scheduleDeliveryRefresh(0);\n });\n }\n }\n }\n\n private schedulePostalCodeLookupIfNeeded(fieldName: string, delay = 300): void {\n if (fieldName !== \"zip\" && fieldName !== \"countryCode\") {\n return;\n }\n this.schedulePostalCodeLookup(delay);\n }\n\n private schedulePostalCodeLookup(delay = 300): void {\n if (this.postalCodeLookupTimer) {\n clearTimeout(this.postalCodeLookupTimer);\n }\n this.postalCodeLookupTimer = setTimeout(() => {\n this.postalCodeLookupTimer = undefined;\n void this.lookupCityFromPostalCode();\n }, delay);\n }\n\n private async lookupCityFromPostalCode(): Promise<void> {\n const postalCode = normalizeDanishPostalCode(readInput(this, \"zip\"));\n const countryCode = (readInput(this, \"countryCode\") || DEFAULT_COUNTRY_CODE).trim().toUpperCase();\n if (!postalCode || countryCode !== DEFAULT_COUNTRY_CODE) {\n return;\n }\n\n const cityControl = formControl(this, \"city\");\n if (!cityControl) {\n return;\n }\n const currentCity = cityControl.value.trim();\n if (currentCity && currentCity !== this.lastAutoFilledCity) {\n return;\n }\n\n const sequence = ++this.postalCodeLookupSequence;\n const city = await this.resolveDanishPostalCodeCity(postalCode);\n if (sequence !== this.postalCodeLookupSequence || !city) {\n return;\n }\n if (normalizeDanishPostalCode(readInput(this, \"zip\")) !== postalCode) {\n return;\n }\n\n const latestCityControl = formControl(this, \"city\");\n if (!latestCityControl) {\n return;\n }\n const latestCity = latestCityControl.value.trim();\n if (latestCity && latestCity !== this.lastAutoFilledCity) {\n return;\n }\n\n latestCityControl.value = city;\n this.lastAutoFilledCity = city;\n this.profile = this.collectProfile();\n this.scheduleDeliveryRefresh(0);\n }\n\n private async resolveDanishPostalCodeCity(postalCode: string): Promise<string | undefined> {\n const cached = this.postalCodeCityCache.get(postalCode);\n if (cached) {\n return cached;\n }\n if (typeof fetch !== \"function\") {\n return undefined;\n }\n try {\n const response = await fetch(`${DANISH_POSTAL_CODE_ENDPOINT}/${encodeURIComponent(postalCode)}`, {\n headers: { Accept: \"application/json\" }\n });\n if (!response.ok) {\n return undefined;\n }\n const data = await response.json() as { nr?: unknown; navn?: unknown };\n if (data.nr !== postalCode || typeof data.navn !== \"string\" || data.navn.trim().length === 0) {\n return undefined;\n }\n const city = data.navn.trim();\n this.postalCodeCityCache.set(postalCode, city);\n return city;\n } catch {\n return undefined;\n }\n }\n\n private scheduleDeliveryRefresh(delay = 450): void {\n if (this.deliveryRefreshTimer) {\n clearTimeout(this.deliveryRefreshTimer);\n }\n this.deliveryRefreshTimer = setTimeout(() => {\n this.deliveryRefreshTimer = undefined;\n void this.refreshDeliveryOptions();\n }, delay);\n }\n\n private async refreshDeliveryOptions(): Promise<void> {\n const profile = this.collectProfile();\n const address = profile.address;\n if (!hasDeliveryAddress(address)) {\n this.deliveryMethods = [];\n this.servicePoints = [];\n this.selectedDeliveryMethod = undefined;\n this.selectedServicePoint = undefined;\n this.requestRender();\n return;\n }\n this.profile = profile;\n this.deliveryMethodsLoading = true;\n this.requestRender();\n try {\n await this.loadDeliveryMethods({ Address: address });\n if (needsServicePoint(this.selectedDeliveryMethod)) {\n await this.loadServicePoints(this.servicePointQuery(address));\n } else {\n this.servicePoints = [];\n }\n await this.verifySelectedDelivery(profile);\n } finally {\n this.deliveryMethodsLoading = false;\n this.servicePointsLoading = false;\n this.requestRender();\n }\n }\n\n private renderDeliveryMethodCards(root: ParentNode, labels: Required<CheckoutLabels>, creditTagName: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n if (!hasDeliveryAddress(this.collectProfileFrom(root).address)) {\n const prompt = document.createElement(\"p\");\n prompt.className = \"orderly-checkout__delivery-prompt\";\n prompt.textContent = labels.deliveryAddressPrompt;\n fragment.append(prompt);\n return fragment;\n }\n if (this.deliveryMethodsLoading) {\n const loading = document.createElement(\"p\");\n loading.className = \"orderly-checkout__delivery-prompt\";\n loading.textContent = uiText(\"loadingLabel\");\n fragment.append(loading);\n return fragment;\n }\n if (this.deliveryMethods.length === 0) {\n const empty = document.createElement(\"p\");\n empty.className = \"orderly-checkout__delivery-prompt\";\n empty.textContent = labels.noDeliveryMethods;\n fragment.append(empty);\n return fragment;\n }\n const group = document.createElement(\"div\");\n group.className = \"orderly-checkout__option-grid orderly-checkout__option-grid--delivery\";\n group.setAttribute(\"role\", \"radiogroup\");\n group.setAttribute(\"aria-label\", labels.deliveryMethod);\n this.deliveryMethods.forEach((method, index) => {\n const option = deliveryMethodOption(method, index, method === this.selectedDeliveryMethod, creditTagName);\n option.addEventListener(\"change\", (event) => {\n if (event.target instanceof HTMLInputElement) {\n void this.selectDeliveryMethod(index, { verifyIfUnchanged: true });\n }\n });\n option.addEventListener(\"click\", (event) => {\n if (event.target instanceof HTMLInputElement) {\n return;\n }\n event.preventDefault();\n void this.selectDeliveryMethod(index, { verifyIfUnchanged: true });\n });\n group.append(option);\n });\n fragment.append(group);\n return fragment;\n }\n\n private renderServicePointCards(labels: Required<CheckoutLabels>): DocumentFragment {\n const fragment = document.createDocumentFragment();\n if (!needsServicePoint(this.selectedDeliveryMethod)) {\n return fragment;\n }\n const section = document.createElement(\"section\");\n section.className = \"orderly-checkout__service-points\";\n const title = document.createElement(\"h3\");\n title.className = \"orderly-checkout__subsection-title\";\n title.textContent = servicePointTitle(this.selectedDeliveryMethod, labels.servicePoint);\n const help = document.createElement(\"p\");\n help.className = \"orderly-checkout__service-point-help\";\n help.textContent = labels.servicePointHelp;\n section.append(title, help);\n if (this.servicePointsLoading) {\n const loading = document.createElement(\"p\");\n loading.className = \"orderly-checkout__delivery-prompt\";\n loading.textContent = uiText(\"loadingLabel\");\n section.append(loading);\n fragment.append(section);\n return fragment;\n }\n if (this.servicePoints.length === 0) {\n const empty = document.createElement(\"p\");\n empty.className = \"orderly-checkout__delivery-prompt\";\n empty.textContent = labels.noServicePoints;\n section.append(empty);\n fragment.append(section);\n return fragment;\n }\n const list = document.createElement(\"div\");\n list.className = \"orderly-checkout__option-list orderly-checkout__option-list--service-points\";\n list.setAttribute(\"role\", \"radiogroup\");\n list.setAttribute(\"aria-label\", labels.servicePoint);\n this.servicePoints.forEach((point, index) => {\n const option = servicePointOption(point, index, point === this.selectedServicePoint);\n option.addEventListener(\"change\", () => void this.selectServicePoint(index));\n option.addEventListener(\"click\", () => void this.selectServicePoint(index));\n list.append(option);\n });\n section.append(list);\n fragment.append(section);\n return fragment;\n }\n\n private async selectDeliveryMethod(index: number, options: { verifyIfUnchanged?: boolean } = {}): Promise<void> {\n const method = this.deliveryMethods[index];\n if (!method) {\n return;\n }\n const unchanged = sameTransportMethod(method, this.selectedDeliveryMethod);\n if (unchanged && !options.verifyIfUnchanged) {\n return;\n }\n if (!unchanged) {\n this.selectedDeliveryMethod = method;\n this.selectedServicePoint = method.DefaultServicePoint;\n }\n if (needsServicePoint(method) && (!unchanged || this.servicePoints.length === 0)) {\n const address = this.collectProfile().address;\n if (!hasDeliveryAddress(address)) {\n return;\n }\n this.servicePointsLoading = true;\n this.requestRender();\n try {\n await this.loadServicePoints(this.servicePointQuery(address));\n } finally {\n this.servicePointsLoading = false;\n }\n } else if (!needsServicePoint(method)) {\n this.servicePoints = [];\n }\n await this.verifySelectedDelivery();\n this.requestRender();\n }\n\n private async selectServicePoint(index: number): Promise<void> {\n const point = this.servicePoints[index];\n if (!point || point === this.selectedServicePoint) {\n return;\n }\n this.selectedServicePoint = point;\n await this.verifySelectedDelivery();\n this.requestRender();\n }\n\n private ensureSelectedDeliveryMethod(): void {\n if (this.deliveryMethods.length === 0) {\n this.selectedDeliveryMethod = undefined;\n this.selectedServicePoint = undefined;\n return;\n }\n const index = this.selectedDeliveryMethodIndex();\n this.selectedDeliveryMethod = index >= 0 ? this.deliveryMethods[index] : this.deliveryMethods[0];\n if (!needsServicePoint(this.selectedDeliveryMethod)) {\n this.selectedServicePoint = this.selectedDeliveryMethod.DefaultServicePoint;\n }\n }\n\n private ensureSelectedServicePoint(): void {\n if (!needsServicePoint(this.selectedDeliveryMethod)) {\n return;\n }\n if (this.servicePoints.length === 0) {\n this.selectedServicePoint = undefined;\n return;\n }\n const index = this.selectedServicePointIndex();\n this.selectedServicePoint = index >= 0 ? this.servicePoints[index] : this.servicePoints[0];\n }\n\n private selectedDeliveryMethodIndex(): number {\n return this.deliveryMethods.findIndex((method) => sameTransportMethod(method, this.selectedDeliveryMethod));\n }\n\n private selectedServicePointIndex(): number {\n return this.servicePoints.findIndex((point) => sameServicePoint(point, this.selectedServicePoint));\n }\n\n private servicePointQuery(address: Address): MessageInitShape<typeof ServicePointQuerySchema> {\n const provider = this.selectedDeliveryMethod?.Provider;\n return {\n Address: address,\n ServiceProviders: provider !== undefined ? [provider] : [],\n IncludeActive: true\n };\n }\n\n private async verifySelectedDelivery(profile = this.collectProfile()): Promise<void> {\n if (!this.selectedDeliveryMethod) {\n return;\n }\n const draft = this.basketController.draft;\n draft.Transport = this.transportDetails(profile);\n try {\n const verified = await this.getClient().services.orderService.verifyDraft(draft);\n await this.basketController.setDraft(verified);\n dispatch(this, \"orderly-checkout-delivery-selected\", {\n draft: verified,\n transportMethod: this.selectedDeliveryMethod,\n servicePoint: this.selectedServicePoint\n });\n } catch (error) {\n this.error = error;\n dispatch(this, \"orderly-error\", { error });\n }\n }\n\n private transportDetails(profile: CheckoutProfile) {\n const servicePoint = this.selectedServicePoint ?? this.selectedDeliveryMethod?.DefaultServicePoint;\n return create(TransportDetailsSchema, {\n TransportSKU: this.selectedDeliveryMethod?.SKU,\n Address: profile.address,\n ContactPhone: profile.phoneNumber,\n Email: profile.email ? create(EmailSchema, { Value: profile.email }) : undefined,\n Type: this.selectedDeliveryMethod && (needsServicePoint(this.selectedDeliveryMethod) || servicePoint) ? 2 : 0,\n Provider: this.selectedDeliveryMethod?.Provider ?? 0,\n ServicePointId: servicePoint?.Id,\n Context: this.selectedDeliveryMethod ? { TransportMethod: this.selectedDeliveryMethod, ServicePointHeader: servicePoint } : undefined,\n Price: this.selectedDeliveryMethod?.Price,\n Features: undefined,\n Cost: undefined\n });\n }\n}\n\nfunction defaultCheckoutLabels(): Required<CheckoutLabels> {\n return {\n customerTitle: uiText(\"checkoutCustomerTitle\"),\n addressTitle: uiText(\"checkoutAddressTitle\"),\n deliveryTitle: uiText(\"checkoutDeliveryTitle\"),\n terms: uiText(\"checkoutTermsLabel\"),\n termsLink: uiText(\"checkoutTermsLinkLabel\"),\n firstName: uiText(\"checkoutFirstNameLabel\"),\n lastName: uiText(\"checkoutLastNameLabel\"),\n email: uiText(\"checkoutEmailLabel\"),\n phoneCountry: uiText(\"checkoutPhoneCountryLabel\"),\n phone: uiText(\"checkoutPhoneLabel\"),\n company: uiText(\"checkoutCompanyLabel\"),\n street: uiText(\"checkoutStreetLabel\"),\n street2: uiText(\"checkoutStreet2Label\"),\n zip: uiText(\"checkoutZipLabel\"),\n city: uiText(\"checkoutCityLabel\"),\n country: uiText(\"checkoutCountryLabel\"),\n deliveryMethod: uiText(\"checkoutDeliveryMethodLabel\"),\n servicePoint: uiText(\"checkoutServicePointLabel\"),\n deliveryAddressPrompt: uiText(\"checkoutDeliveryAddressPrompt\"),\n noDeliveryMethods: uiText(\"checkoutNoDeliveryMethodsLabel\"),\n servicePointHelp: uiText(\"checkoutServicePointHelpLabel\"),\n noServicePoints: uiText(\"checkoutNoServicePointsLabel\"),\n submit: uiText(\"checkoutSubmitLabel\"),\n submitting: uiText(\"checkoutSubmittingLabel\"),\n error: uiText(\"checkoutErrorLabel\")\n };\n}\n\nfunction defaultCheckout(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const form = document.createElement(\"form\");\n form.className = \"orderly-checkout\";\n form.innerHTML = `\n <section class=\"orderly-checkout__section orderly-checkout__section--customer\">\n <h2 class=\"orderly-checkout__section-title\" data-orderly-bind=\"customerTitleLabel\"></h2>\n <fieldset class=\"orderly-checkout__contact orderly-checkout__field-grid\">\n <label class=\"orderly-checkout__field\"><span data-orderly-bind=\"firstNameLabel\"></span> <input name=\"firstName\" autocomplete=\"given-name\"></label>\n <label class=\"orderly-checkout__field\"><span data-orderly-bind=\"lastNameLabel\"></span> <input name=\"lastName\" autocomplete=\"family-name\"></label>\n <label class=\"orderly-checkout__field\"><span data-orderly-bind=\"emailLabel\"></span> <input name=\"email\" type=\"email\" autocomplete=\"email\"></label>\n <label class=\"orderly-checkout__field\"><span data-orderly-bind=\"phoneCountryLabel\"></span> <input name=\"phoneCountryCode\" autocomplete=\"tel-country-code\"></label>\n <label class=\"orderly-checkout__field\"><span data-orderly-bind=\"phoneLabel\"></span> <input name=\"phoneNumber\" autocomplete=\"tel-national\"></label>\n </fieldset>\n </section>\n <section class=\"orderly-checkout__section orderly-checkout__section--address\">\n <h2 class=\"orderly-checkout__section-title\" data-orderly-bind=\"addressTitleLabel\"></h2>\n <fieldset class=\"orderly-checkout__address orderly-checkout__field-grid\">\n <label class=\"orderly-checkout__field\"><span data-orderly-bind=\"companyLabel\"></span> <input name=\"companyName\" autocomplete=\"organization\"></label>\n <label class=\"orderly-checkout__field orderly-checkout__field--full\"><span data-orderly-bind=\"streetLabel\"></span> <input name=\"street\" autocomplete=\"address-line1\"></label>\n <label class=\"orderly-checkout__field orderly-checkout__field--full\"><span data-orderly-bind=\"street2Label\"></span> <input name=\"street2\" autocomplete=\"address-line2\"></label>\n <label class=\"orderly-checkout__field\"><span data-orderly-bind=\"zipLabel\"></span> <input name=\"zip\" autocomplete=\"postal-code\"></label>\n <label class=\"orderly-checkout__field\"><span data-orderly-bind=\"cityLabel\"></span> <input name=\"city\" autocomplete=\"address-level2\"></label>\n <input name=\"countryCode\" type=\"hidden\" value=\"${DEFAULT_COUNTRY_CODE}\" autocomplete=\"country\">\n </fieldset>\n </section>\n <section class=\"orderly-checkout__section orderly-checkout__section--delivery\">\n <h2 class=\"orderly-checkout__section-title\" data-orderly-bind=\"deliveryTitleLabel\"></h2>\n <div data-orderly-slot=\"deliveryMethods\"></div>\n <div data-orderly-slot=\"servicePoints\"></div>\n </section>\n <label class=\"orderly-checkout__terms\">\n <input name=\"termsAccepted\" type=\"checkbox\" required>\n <span><span data-orderly-bind=\"termsLabel\"></span> <a data-orderly-bind=\"termsHref\" target=\"_blank\" rel=\"noopener\"><span data-orderly-bind=\"termsLinkLabel\"></span></a></span>\n </label>\n <button class=\"orderly-checkout__submit\" type=\"submit\" data-orderly-bind=\"submitLabel\"></button>\n <p class=\"orderly-checkout__error\" data-orderly-bind=\"error\"></p>\n `;\n fragment.append(form);\n return fragment;\n}\n\nfunction bindCheckoutLabels(root: ParentNode, labels: Required<CheckoutLabels>): void {\n bindText(root, \"customerTitleLabel\", labels.customerTitle);\n bindText(root, \"addressTitleLabel\", labels.addressTitle);\n bindText(root, \"deliveryTitleLabel\", labels.deliveryTitle);\n bindText(root, \"termsLabel\", labels.terms);\n bindText(root, \"termsLinkLabel\", labels.termsLink);\n bindText(root, \"firstNameLabel\", labels.firstName);\n bindText(root, \"lastNameLabel\", labels.lastName);\n bindText(root, \"emailLabel\", labels.email);\n bindText(root, \"phoneCountryLabel\", labels.phoneCountry);\n bindText(root, \"phoneLabel\", labels.phone);\n bindText(root, \"companyLabel\", labels.company);\n bindText(root, \"streetLabel\", labels.street);\n bindText(root, \"street2Label\", labels.street2);\n bindText(root, \"zipLabel\", labels.zip);\n bindText(root, \"cityLabel\", labels.city);\n bindText(root, \"countryLabel\", labels.country);\n bindText(root, \"deliveryMethodLabel\", labels.deliveryMethod);\n bindText(root, \"servicePointLabel\", labels.servicePoint);\n bindText(root, \"deliveryAddressPromptLabel\", labels.deliveryAddressPrompt);\n bindText(root, \"noDeliveryMethodsLabel\", labels.noDeliveryMethods);\n bindText(root, \"servicePointHelpLabel\", labels.servicePointHelp);\n bindText(root, \"noServicePointsLabel\", labels.noServicePoints);\n}\n\nfunction configureTermsHref(root: ParentNode, href: string): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"termsHref\\\"]\").forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n element.href = href;\n }\n });\n}\n\nexport function unpackTransportMethods(result: PageResult): TransportMethod[] {\n return result.data\n .map((item) => anyUnpack(item, TransportMethodSchema))\n .filter((item): item is TransportMethod => Boolean(item));\n}\n\nexport function unpackServicePointHeaders(result: PageResult): ServicePointHeader[] {\n return result.data\n .map((item) => anyUnpack(item, ServicePointHeaderSchema))\n .filter((item): item is ServicePointHeader => Boolean(item));\n}\n\nfunction deliveryMethodOption(method: TransportMethod, index: number, selected: boolean, creditTagName: string): HTMLElement {\n const label = document.createElement(\"label\");\n label.className = `orderly-checkout__option orderly-checkout__option--delivery${selected ? \" is-selected\" : \"\"}`;\n label.innerHTML = `\n <input class=\"orderly-checkout__option-input\" type=\"radio\" name=\"deliveryMethod\" value=\"${index}\">\n <span class=\"orderly-checkout__option-copy\">\n <span class=\"orderly-checkout__option-title\" data-orderly-bind=\"title\"></span>\n <span class=\"orderly-checkout__option-meta\">\n <${creditTagName} data-orderly-bind=\"price\"></${creditTagName}>\n <span data-orderly-bind=\"information\"></span>\n </span>\n </span>\n `;\n const input = label.querySelector(\"input\");\n if (input instanceof HTMLInputElement) {\n input.checked = selected;\n }\n bindText(label, \"title\", method.Title || method.SKU?.Value || formatUiText(\"deliveryFallbackLabel\", { index: index + 1 }));\n bindCredit(label, \"price\", method.Price?.PriceExclTax);\n bindText(label, \"information\", deliveryMethodInformation(method));\n return label;\n}\n\nfunction servicePointOption(point: ServicePointHeader, index: number, selected: boolean): HTMLElement {\n const label = document.createElement(\"label\");\n label.className = `orderly-checkout__option orderly-checkout__option--service-point${selected ? \" is-selected\" : \"\"}`;\n label.innerHTML = `\n <input class=\"orderly-checkout__option-input\" type=\"radio\" name=\"servicePoint\" value=\"${index}\">\n <span class=\"orderly-checkout__option-copy\">\n <span class=\"orderly-checkout__option-title\" data-orderly-bind=\"title\"></span>\n <span class=\"orderly-checkout__option-meta\" data-orderly-bind=\"description\"></span>\n </span>\n `;\n const input = label.querySelector(\"input\");\n if (input instanceof HTMLInputElement) {\n input.checked = selected;\n }\n bindText(label, \"title\", point.Title || point.Id?.Id || formatUiText(\"servicePointFallbackLabel\", { index: index + 1 }));\n bindText(label, \"description\", servicePointDescription(point));\n return label;\n}\n\nfunction deliveryMethodInformation(method: TransportMethod): string {\n const parts = [method.Subtitle, ...method.Information].filter(Boolean);\n return parts.length > 0 ? `- ${parts.join(\" - \")}` : \"\";\n}\n\nfunction servicePointDescription(point: ServicePointHeader): string {\n return point.LocationDescription ?? point.Description ?? (point.Id?.Id ? `Pakkeshop: ${point.Id.Id}` : \"\");\n}\n\nfunction servicePointTitle(method: TransportMethod | undefined, fallback: string): string {\n const title = method?.Title?.split(\"-\")[0]?.trim();\n return title ? formatUiText(\"checkoutChooseServicePointLabel\", { method: title }) : fallback;\n}\n\nfunction hasDeliveryAddress(address: Address | undefined): address is Address {\n return Boolean(address?.Street?.trim() && address.Zip?.trim() && address.City?.trim());\n}\n\nfunction normalizeDanishPostalCode(value: string): string | undefined {\n const postalCode = value.trim().replace(/\\s+/g, \"\");\n return DANISH_POSTAL_CODE_PATTERN.test(postalCode) ? postalCode : undefined;\n}\n\nfunction formControl(root: ParentNode, name: string): HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | undefined {\n const element = root.querySelector(`[name=\"${name}\"]`);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n return element;\n }\n return undefined;\n}\n\nfunction needsServicePoint(method: TransportMethod | undefined): boolean {\n return Boolean(method?.RequiresServicePoint);\n}\n\nfunction sameTransportMethod(left: TransportMethod | undefined, right: TransportMethod | undefined): boolean {\n if (!left || !right) {\n return false;\n }\n return left === right || `${left.Provider}|${left.SKU?.Value ?? \"\"}|${left.Title}` === `${right.Provider}|${right.SKU?.Value ?? \"\"}|${right.Title}`;\n}\n\nfunction sameServicePoint(left: ServicePointHeader | undefined, right: ServicePointHeader | undefined): boolean {\n if (!left || !right) {\n return false;\n }\n return left === right || `${left.Id?.Provider ?? \"\"}|${left.Id?.Id ?? \"\"}|${left.Title}` === `${right.Id?.Provider ?? \"\"}|${right.Id?.Id ?? \"\"}|${right.Title}`;\n}\n","import type { OrderlyClient } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport { BasketController } from \"../basket.js\";\nimport {\n defaultShopBaseUrl,\n defaultShopBasketLabels,\n defaultShopBrandLabel,\n defaultShopCheckoutLabels,\n defaultShopCheckoutOrderTitle,\n defaultShopCheckoutPageDescription,\n defaultShopCheckoutPageTitle,\n defaultShopCheckoutTermsHref,\n defaultShopHomeHref,\n defaultShopNavigationItems,\n type BasketLabels\n} from \"../default-shop.js\";\nimport type { NavigationItem } from \"../types.js\";\nimport { bindText, cloneTemplate, projectSlots, render, siblingTagName, template } from \"../utils/dom.js\";\nimport type { OrderlyBasketElement } from \"./basket.js\";\nimport type { CheckoutLabels, OrderlyCheckoutElement } from \"./checkout.js\";\nimport { uiText } from \"../i18n.js\";\n\n/**\n * Full checkout page composition for vanilla storefronts.\n *\n * The component wraps page layout, top navigation, checkout form, basket order\n * summary, footer, shared basket state, delivery-option loading, and order\n * creation cleanup. Shops can use it as a complete page with\n * `<orderly-checkout-page>` and customize copy through configureDefaultShop().\n */\nexport class OrderlyCheckoutPageElement extends OrderlyElement {\n static observedAttributes = [\n \"base-url\",\n \"brand-label\",\n \"title\",\n \"description\",\n \"order-title\",\n \"terms-href\"\n ];\n\n private controller?: BasketController;\n private currentNavigationItems?: NavigationItem[];\n private currentBasketLabels?: BasketLabels;\n private currentCheckoutLabels?: CheckoutLabels;\n\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n this.controller = value;\n this.requestRender();\n }\n\n get navigationItems(): NavigationItem[] {\n return this.currentNavigationItems ? [...this.currentNavigationItems] : defaultShopNavigationItems();\n }\n\n set navigationItems(value: NavigationItem[]) {\n this.currentNavigationItems = [...value];\n this.requestRender();\n }\n\n get basketLabels(): BasketLabels {\n return { ...this.currentBasketLabels };\n }\n\n set basketLabels(value: BasketLabels) {\n this.currentBasketLabels = { ...value };\n this.requestRender();\n }\n\n get checkoutLabels(): CheckoutLabels {\n return { ...this.currentCheckoutLabels };\n }\n\n set checkoutLabels(value: CheckoutLabels) {\n this.currentCheckoutLabels = { ...value };\n this.requestRender();\n }\n\n get brandLabel(): string {\n return this.getAttribute(\"brand-label\") ?? defaultShopBrandLabel();\n }\n\n set brandLabel(value: string) {\n this.setAttribute(\"brand-label\", value);\n }\n\n get title(): string {\n return this.getAttribute(\"title\") ?? defaultShopCheckoutPageTitle();\n }\n\n set title(value: string) {\n this.setAttribute(\"title\", value);\n }\n\n get description(): string {\n return this.getAttribute(\"description\") ?? defaultShopCheckoutPageDescription();\n }\n\n set description(value: string) {\n this.setAttribute(\"description\", value);\n }\n\n get orderTitle(): string {\n return this.getAttribute(\"order-title\") ?? defaultShopCheckoutOrderTitle();\n }\n\n set orderTitle(value: string) {\n this.setAttribute(\"order-title\", value);\n }\n\n get termsHref(): string {\n return this.getAttribute(\"terms-href\") ?? defaultShopCheckoutTermsHref();\n }\n\n set termsHref(value: string) {\n this.setAttribute(\"terms-href\", value);\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n const fragment = cloneTemplate(this, \"layout\") ?? defaultCheckoutPage({\n pageLayoutTagName: siblingTagName(this, \"checkout-page\", \"page-layout\"),\n navigationTagName: siblingTagName(this, \"checkout-page\", \"navigation\"),\n checkoutTagName: siblingTagName(this, \"checkout-page\", \"checkout\"),\n basketTagName: siblingTagName(this, \"checkout-page\", \"basket\"),\n shopFooterTagName: siblingTagName(this, \"checkout-page\", \"shop-footer\")\n });\n projectSlots(this, fragment, [\"utility\", \"header-actions\", \"content-before\", \"content-after\", \"footer\", \"overlay\"]);\n const root = render(this, fragment);\n customElements.upgrade(root);\n this.configureChildren(root);\n }\n\n protected getDefaultBaseUrl(): string | undefined {\n return defaultShopBaseUrl();\n }\n\n private configureChildren(root: HTMLElement): void {\n const client = this.clientOrUndefined();\n const basketController = this.controller ?? new BasketController();\n this.controller = basketController;\n const brandLink = root.querySelector(\"#brandLink\") as HTMLAnchorElement | null;\n const navigation = root.querySelector(\"#checkoutNavigation\") as HTMLElement & {\n items?: NavigationItem[];\n controller?: { activePath: string; expandedIds?: Set<string> };\n refresh?: () => void;\n } | null;\n const checkout = this.requiredElement<OrderlyCheckoutElement>(root, \"checkout\");\n const basket = this.requiredElement<OrderlyBasketElement>(root, \"basket\");\n\n this.applyText(root);\n if (brandLink) {\n brandLink.href = defaultShopHomeHref();\n }\n if (navigation) {\n navigation.items = this.navigationItems;\n if (navigation.controller) {\n navigation.controller.activePath = locationPath();\n navigation.controller.expandedIds?.clear();\n }\n navigation.refresh?.();\n }\n\n appendChildTemplate(checkout, \"checkout\", template(this, \"checkout\"));\n appendChildTemplate(basket, \"basket\", template(this, \"basket\"));\n appendChildTemplate(basket, \"line\", template(this, \"line\"));\n appendChildTemplate(basket, \"empty\", template(this, \"empty\"));\n\n if (client) {\n checkout.client = client;\n basket.client = client;\n }\n basket.basketController = basketController;\n basket.checkoutAction = \"hide\";\n applyBasketLabels(basket, {\n ...defaultShopBasketLabels(),\n ...this.currentBasketLabels\n });\n basket.continueHref = this.navigationItems[0]?.href ?? defaultShopHomeHref();\n checkout.basketController = basketController;\n checkout.termsHref = this.termsHref;\n checkout.labels = {\n ...defaultShopCheckoutLabels(),\n ...this.currentCheckoutLabels\n };\n checkout.addEventListener(\"orderly-order-created\", () => {\n void basketController.clear();\n }, { once: true });\n\n void basketController.load();\n void checkout.loadDeliveryMethods().catch(() => undefined);\n void checkout.loadServicePoints().catch(() => undefined);\n }\n\n private applyText(root: ParentNode): void {\n bindText(root, \"brandLabel\", this.brandLabel);\n bindText(root, \"title\", this.title);\n bindText(root, \"description\", this.description);\n bindText(root, \"orderTitle\", this.orderTitle);\n document.title = `${this.title} | ${this.brandLabel}`;\n }\n\n private clientOrUndefined(): OrderlyClient | undefined {\n if (this.client) {\n return this.client;\n }\n if (!this.baseUrl && !this.getDefaultBaseUrl()) {\n return undefined;\n }\n return this.getClient();\n }\n\n private requiredElement<T extends HTMLElement>(root: ParentNode, id: string): T {\n const element = root.querySelector(`#${id}`);\n if (!element) {\n throw new Error(`Missing #${id}.`);\n }\n return element as T;\n }\n}\n\nfunction defaultCheckoutPage(tags: {\n pageLayoutTagName: string;\n navigationTagName: string;\n checkoutTagName: string;\n basketTagName: string;\n shopFooterTagName: string;\n}): DocumentFragment {\n const templateElement = document.createElement(\"template\");\n templateElement.innerHTML = `\n <${tags.pageLayoutTagName}>\n <div slot=\"utility\" data-orderly-slot=\"utility\"></div>\n <a slot=\"header\" class=\"orderly-checkout-page__brand\" id=\"brandLink\" href=\"/\">\n <span data-orderly-bind=\"brandLabel\"></span>\n </a>\n <div slot=\"header-actions\" data-orderly-slot=\"header-actions\"></div>\n <${tags.navigationTagName} slot=\"left\" id=\"checkoutNavigation\" aria-label=\"${uiText(\"mainCategoriesLabel\")}\"></${tags.navigationTagName}>\n <div slot=\"content-before\" data-orderly-slot=\"content-before\"></div>\n <section slot=\"content\" class=\"orderly-checkout-page\">\n <header class=\"orderly-checkout-page__header\">\n <h1 data-orderly-bind=\"title\"></h1>\n <p data-orderly-bind=\"description\"></p>\n </header>\n <div class=\"orderly-checkout-page__grid\">\n <section class=\"orderly-checkout-page__card\" aria-labelledby=\"checkoutFormTitle\">\n <h2 id=\"checkoutFormTitle\" class=\"orderly-checkout-page__visually-hidden\">${uiText(\"checkoutFormTitle\")}</h2>\n <${tags.checkoutTagName} id=\"checkout\"></${tags.checkoutTagName}>\n </section>\n <aside class=\"orderly-checkout-page__card orderly-checkout-page__card--summary\" aria-labelledby=\"checkoutBasketTitle\">\n <h2 id=\"checkoutBasketTitle\" data-orderly-bind=\"orderTitle\"></h2>\n <${tags.basketTagName} id=\"basket\" checkout-action=\"hide\"></${tags.basketTagName}>\n </aside>\n </div>\n </section>\n <div slot=\"content-after\" data-orderly-slot=\"content-after\"></div>\n <${tags.shopFooterTagName} slot=\"footer\"></${tags.shopFooterTagName}>\n <div slot=\"footer\" data-orderly-slot=\"footer\"></div>\n <div slot=\"overlay\" data-orderly-slot=\"overlay\"></div>\n </${tags.pageLayoutTagName}>\n `;\n return templateElement.content.cloneNode(true) as DocumentFragment;\n}\n\nfunction applyBasketLabels(basket: OrderlyBasketElement, labels: BasketLabels): void {\n if (labels.emptyLabel !== undefined) {\n basket.emptyLabel = labels.emptyLabel;\n }\n if (labels.clearLabel !== undefined) {\n basket.clearLabel = labels.clearLabel;\n }\n if (labels.continueLabel !== undefined) {\n basket.continueLabel = labels.continueLabel;\n }\n if (labels.quantityLabel !== undefined) {\n basket.quantityLabel = labels.quantityLabel;\n }\n if (labels.removeLabel !== undefined) {\n basket.removeLabel = labels.removeLabel;\n }\n if (labels.subtotalLabel !== undefined) {\n basket.subtotalLabel = labels.subtotalLabel;\n }\n if (labels.shippingLabel !== undefined) {\n basket.shippingLabel = labels.shippingLabel;\n }\n if (labels.totalLabel !== undefined) {\n basket.totalLabel = labels.totalLabel;\n }\n if (labels.totalNote !== undefined) {\n basket.totalNote = labels.totalNote;\n }\n if (labels.deliveryNote !== undefined) {\n basket.deliveryNote = labels.deliveryNote;\n }\n}\n\nfunction appendChildTemplate(host: HTMLElement, name: string, source: HTMLTemplateElement | undefined): void {\n if (!source || host.querySelector(`:scope > template[data-orderly-template=\"${name}\"]`)) {\n return;\n }\n const childTemplate = document.createElement(\"template\");\n childTemplate.dataset.orderlyTemplate = name;\n childTemplate.innerHTML = source.innerHTML;\n host.append(childTemplate);\n}\n\nfunction locationPath(): string {\n return typeof location === \"undefined\" ? \"/\" : location.pathname;\n}\n","import type { SearchQuery } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport type { BasketController } from \"../basket.js\";\nimport { declarativeQueryAttributes, declarativeSearchQuery } from \"../query.js\";\nimport type { SortOption } from \"../types.js\";\nimport { bindImage, bindText, cloneTemplate, render, replaceSlot, siblingTagName } from \"../utils/dom.js\";\n\n/**\n * Collection page wrapper for hero content plus a SearchQuery-backed product grid.\n *\n * The page stays headless: it owns data wiring, default query propagation, and\n * template slots, while consuming shops own visual CSS and layout decisions.\n */\nexport class OrderlyCollectionPageElement extends OrderlyElement {\n static observedAttributes = [\"title\", \"description\", \"hero-image\", \"base-url\", \"cta-label\", \"cta-href\", ...declarativeQueryAttributes];\n\n private currentQuery?: SearchQuery;\n private currentDefaultQuery?: SearchQuery;\n private controller?: BasketController;\n private currentSortOptions: SortOption[] = [];\n\n /**\n * Optional shop-wide SearchQuery scope passed to the internal product grid.\n */\n get defaultQuery(): SearchQuery | undefined {\n return this.currentDefaultQuery;\n }\n\n set defaultQuery(value: SearchQuery | undefined) {\n this.currentDefaultQuery = value;\n this.requestRender();\n }\n\n /**\n * Backward-compatible alias for defaultQuery.\n */\n get shopQuery(): SearchQuery | undefined {\n return this.defaultQuery;\n }\n\n set shopQuery(value: SearchQuery | undefined) {\n this.defaultQuery = value;\n }\n\n /**\n * Typed Core SearchQuery for the collection grid.\n *\n * When omitted, the page falls back to declarative query markup such as\n * `keywords`, `tags`, `order-by`, or a direct child `<query>` element.\n */\n get query(): SearchQuery | undefined {\n return this.currentQuery;\n }\n\n set query(value: SearchQuery | undefined) {\n this.currentQuery = value;\n this.requestRender();\n }\n\n /**\n * Shared basket controller passed to the internal product grid.\n */\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n this.controller = value;\n this.requestRender();\n }\n\n /**\n * Sort choices passed to the internal product grid.\n */\n get sortOptions(): SortOption[] {\n return [...this.currentSortOptions];\n }\n\n set sortOptions(value: SortOption[]) {\n this.currentSortOptions = [...value];\n this.requestRender();\n }\n\n get title(): string {\n return this.getAttribute(\"title\") ?? \"\";\n }\n\n set title(value: string) {\n this.setAttribute(\"title\", value);\n }\n\n get description(): string {\n return this.getAttribute(\"description\") ?? \"\";\n }\n\n set description(value: string) {\n this.setAttribute(\"description\", value);\n }\n\n get heroImage(): string {\n return this.getAttribute(\"hero-image\") ?? \"\";\n }\n\n set heroImage(value: string) {\n this.setAttribute(\"hero-image\", value);\n }\n\n get ctaLabel(): string {\n return this.getAttribute(\"cta-label\") ?? \"\";\n }\n\n set ctaLabel(value: string) {\n this.setAttribute(\"cta-label\", value);\n }\n\n get ctaHref(): string {\n return this.getAttribute(\"cta-href\") ?? \"\";\n }\n\n set ctaHref(value: string) {\n this.setAttribute(\"cta-href\", value);\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n const fragment = cloneTemplate(this, \"layout\") ?? defaultCollectionPage();\n const hero = cloneTemplate(this, \"hero\") ?? defaultHero();\n bindText(hero, \"title\", this.title);\n bindText(hero, \"description\", this.description);\n bindText(hero, \"ctaLabel\", this.ctaLabel);\n bindImage(hero, \"heroImage\", this.heroImage);\n configureHeroCta(hero, this.ctaLabel, this.ctaHref);\n const grid = this.createGrid();\n replaceSlot(fragment, \"hero\", hero);\n replaceSlot(fragment, \"grid\", grid);\n render(this, fragment);\n }\n\n private createGrid(): HTMLElement {\n const gridTagName = siblingTagName(this, \"collection-page\", \"product-grid\");\n const custom = cloneTemplate(this, \"grid\");\n if (custom) {\n const container = document.createElement(\"div\");\n container.append(custom);\n customElements.upgrade(container);\n const grid = (container.querySelector(gridTagName) ?? container.querySelector(\"orderly-product-grid\")) as HTMLElement & {\n basketController?: BasketController;\n client?: unknown;\n query?: SearchQuery;\n defaultQuery?: SearchQuery;\n sortOptions?: SortOption[];\n } | null;\n if (grid) {\n if (this.client) {\n grid.client = this.client;\n }\n grid.basketController = this.controller;\n grid.defaultQuery = this.currentDefaultQuery;\n grid.sortOptions = this.currentSortOptions;\n grid.query = this.currentQuery ?? declarativeSearchQuery(this);\n }\n return container;\n }\n const element = document.createElement(gridTagName) as HTMLElement & {\n basketController?: BasketController;\n client?: unknown;\n query?: SearchQuery;\n defaultQuery?: SearchQuery;\n sortOptions?: SortOption[];\n };\n element.className = \"orderly-collection-page__grid\";\n if (this.client) {\n element.client = this.client;\n }\n if (this.baseUrl) {\n element.setAttribute(\"base-url\", this.baseUrl);\n }\n element.basketController = this.controller;\n element.defaultQuery = this.currentDefaultQuery;\n element.sortOptions = this.currentSortOptions;\n element.query = this.currentQuery ?? declarativeSearchQuery(this);\n return element;\n }\n}\n\nfunction defaultHero(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const header = document.createElement(\"header\");\n header.className = \"orderly-collection-page__hero\";\n header.style.aspectRatio = \"5 / 1\";\n header.style.minHeight = \"180px\";\n header.style.maxHeight = \"280px\";\n header.innerHTML = `\n <img class=\"orderly-collection-page__hero-image\" data-orderly-bind=\"heroImage\" alt=\"\">\n <div class=\"orderly-collection-page__intro\">\n <h1 class=\"orderly-collection-page__title\" data-orderly-bind=\"title\"></h1>\n <p class=\"orderly-collection-page__description\" data-orderly-bind=\"description\"></p>\n <a class=\"orderly-collection-page__cta\" data-orderly-bind=\"ctaHref\">\n <span data-orderly-bind=\"ctaLabel\"></span>\n </a>\n </div>\n `;\n const image = header.querySelector(\".orderly-collection-page__hero-image\") as HTMLImageElement | null;\n if (image) {\n image.style.minHeight = \"0\";\n }\n fragment.append(header);\n return fragment;\n}\n\nfunction configureHeroCta(root: ParentNode, label: string, href: string): void {\n root.querySelectorAll(\"[data-orderly-bind=\\\"ctaHref\\\"], .orderly-collection-page__cta\").forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n if (href) {\n element.href = href;\n } else {\n element.removeAttribute(\"href\");\n }\n }\n if (element instanceof HTMLElement) {\n element.hidden = !label;\n }\n });\n}\n\nfunction defaultCollectionPage(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const section = document.createElement(\"section\");\n section.className = \"orderly-collection-page\";\n section.innerHTML = `\n <div data-orderly-slot=\"hero\"></div>\n <div data-orderly-slot=\"grid\"></div>\n `;\n fragment.append(section);\n return fragment;\n}\n","import type { Credit } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport { bindText, cloneTemplate, render, upgradeFragment } from \"../utils/dom.js\";\nimport { formatCreditParts } from \"../utils/format.js\";\n\nexport class OrderlyCreditElement extends OrderlyElement {\n static observedAttributes = [\"amount\", \"currency\", \"locale\", \"empty-label\"];\n\n private currentCredit?: Credit;\n\n get credit(): Credit | undefined {\n return this.currentCredit;\n }\n\n set credit(value: Credit | undefined) {\n this.currentCredit = value;\n this.requestRender();\n }\n\n get amount(): number | undefined {\n const value = this.getAttribute(\"amount\");\n if (value === null || value.trim() === \"\") {\n return undefined;\n }\n const number = Number(value);\n return Number.isFinite(number) ? number : undefined;\n }\n\n set amount(value: number | undefined) {\n if (value === undefined) {\n this.removeAttribute(\"amount\");\n } else {\n this.setAttribute(\"amount\", String(value));\n }\n }\n\n get currency(): string {\n return this.getAttribute(\"currency\") ?? \"\";\n }\n\n set currency(value: string) {\n if (value) {\n this.setAttribute(\"currency\", value);\n } else {\n this.removeAttribute(\"currency\");\n }\n }\n\n get locale(): string {\n return this.getAttribute(\"locale\") ?? \"da-DK\";\n }\n\n set locale(value: string) {\n this.setAttribute(\"locale\", value);\n }\n\n get emptyLabel(): string {\n return this.getAttribute(\"empty-label\") ?? \"\";\n }\n\n set emptyLabel(value: string) {\n this.setAttribute(\"empty-label\", value);\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n this.style.display ||= \"inline-block\";\n const custom = cloneTemplate(this, \"credit\") ?? cloneTemplate(this, \"default\");\n const root = custom ? upgradeFragment(custom) : defaultCredit();\n const parts = formatCreditParts(this.resolvedCredit(), { locale: this.locale });\n const text = parts.text || this.emptyLabel;\n bindText(root, \"prefix\", parts.prefix);\n bindText(root, \"amount\", parts.amount || this.emptyLabel);\n bindText(root, \"currency\", parts.currency);\n bindText(root, \"text\", text);\n root.querySelectorAll(\"[data-orderly-credit]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.setAttribute(\"aria-label\", text);\n element.toggleAttribute(\"data-orderly-empty-credit\", !parts.text);\n }\n });\n render(this, root);\n }\n\n private resolvedCredit(): Credit | undefined {\n if (this.currentCredit) {\n return this.currentCredit;\n }\n const amount = this.amount;\n if (amount === undefined && !this.currency) {\n return undefined;\n }\n return {\n Amount: amount ?? 0,\n Currency: this.currency\n } as Credit;\n }\n}\n\nfunction defaultCredit(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const wrapper = document.createElement(\"span\");\n wrapper.className = \"orderly-credit\";\n wrapper.dataset.orderlyCredit = \"\";\n wrapper.innerHTML = `\n <span class=\"orderly-credit__prefix\" data-orderly-bind=\"prefix\"></span>\n <span class=\"orderly-credit__amount\" data-orderly-bind=\"amount\"></span>\n `;\n fragment.append(wrapper);\n return fragment;\n}\n","import { clone } from \"@bufbuild/protobuf\";\nimport { SearchQuerySchema, type OrderlyClient, type SearchObject, type SearchQuery } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport { BasketController } from \"../basket.js\";\nimport {\n defaultShopBasketLabels,\n defaultShopBaseUrl,\n defaultShopBrandLabel,\n defaultShopCheckoutHref,\n defaultShopCheckoutLabel,\n defaultShopEmptyLabel,\n defaultShopHomeHref,\n defaultShopNavigationItems,\n defaultShopProductHref,\n defaultShopSortOptions,\n type BasketLabels\n} from \"../default-shop.js\";\nimport type { ResolvedNavigationItem, NavigationItem, ProductEventDetail, SortOption } from \"../types.js\";\nimport { bindText, cloneTemplate, projectSlots, render, siblingTagName, template } from \"../utils/dom.js\";\nimport type { OrderlyBasketElement } from \"./basket.js\";\nimport type { OrderlyBasketIconElement } from \"./basket-icon.js\";\nimport type { OrderlyProductPageElement } from \"./product-page.js\";\nimport type { OrderlyProductRailElement } from \"./product-rail.js\";\nimport type { OrderlySearchBoxElement } from \"./search-controls.js\";\nimport { productShareHref, productShareUrl } from \"./product-tile.js\";\nimport { uiText } from \"../i18n.js\";\n\n/**\n * Default storefront homepage composed from configured category navigation.\n *\n * It renders one horizontal product rail per top-level category and wires shared\n * basket state, basket drawer behavior, and product detail dialog behavior.\n */\nexport class OrderlyHomePageElement extends OrderlyElement {\n static observedAttributes = [\n \"base-url\",\n \"brand-label\",\n \"eyebrow\",\n \"title\",\n \"rail-cta-label\",\n \"empty-label\",\n \"product-href\",\n \"checkout-href\",\n \"checkout-label\"\n ];\n\n private currentNavigationItems?: ResolvedNavigationItem[];\n private currentSortOptions?: SortOption[];\n private currentDefaultQuery?: SearchQuery;\n private currentBasketLabels?: BasketLabels;\n private controller?: BasketController;\n\n get defaultQuery(): SearchQuery | undefined {\n return this.currentDefaultQuery;\n }\n\n set defaultQuery(value: SearchQuery | undefined) {\n this.currentDefaultQuery = value;\n this.requestRender();\n }\n\n get navigationItems(): ResolvedNavigationItem[] {\n return this.currentNavigationItems ? [...this.currentNavigationItems] : defaultShopNavigationItems();\n }\n\n set navigationItems(value: ResolvedNavigationItem[]) {\n this.currentNavigationItems = [...value];\n this.requestRender();\n }\n\n get sortOptions(): SortOption[] {\n return this.currentSortOptions ? [...this.currentSortOptions] : defaultShopSortOptions();\n }\n\n set sortOptions(value: SortOption[]) {\n this.currentSortOptions = [...value];\n this.requestRender();\n }\n\n get basketLabels(): BasketLabels {\n return { ...this.currentBasketLabels };\n }\n\n set basketLabels(value: BasketLabels) {\n this.currentBasketLabels = { ...value };\n this.requestRender();\n }\n\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n this.controller = value;\n this.requestRender();\n }\n\n get brandLabel(): string {\n return this.getAttribute(\"brand-label\") ?? defaultShopBrandLabel();\n }\n\n set brandLabel(value: string) {\n this.setAttribute(\"brand-label\", value);\n }\n\n get eyebrow(): string {\n return this.getAttribute(\"eyebrow\") ?? \"\";\n }\n\n set eyebrow(value: string) {\n this.setAttribute(\"eyebrow\", value);\n }\n\n get title(): string {\n return this.getAttribute(\"title\") ?? uiText(\"homeTitle\");\n }\n\n set title(value: string) {\n this.setAttribute(\"title\", value);\n }\n\n get railCtaLabel(): string {\n return this.getAttribute(\"rail-cta-label\") ?? uiText(\"homeRailCtaLabel\");\n }\n\n set railCtaLabel(value: string) {\n this.setAttribute(\"rail-cta-label\", value);\n }\n\n get emptyLabel(): string {\n return this.getAttribute(\"empty-label\") ?? defaultShopEmptyLabel();\n }\n\n set emptyLabel(value: string) {\n this.setAttribute(\"empty-label\", value);\n }\n\n get checkoutHref(): string {\n return this.getAttribute(\"checkout-href\") ?? defaultShopCheckoutHref();\n }\n\n set checkoutHref(value: string) {\n this.setAttribute(\"checkout-href\", value);\n }\n\n get productHref(): string {\n return this.getAttribute(\"product-href\") ?? defaultShopProductHref();\n }\n\n set productHref(value: string) {\n this.setAttribute(\"product-href\", value);\n }\n\n get checkoutLabel(): string {\n return this.getAttribute(\"checkout-label\") ?? defaultShopCheckoutLabel();\n }\n\n set checkoutLabel(value: string) {\n this.setAttribute(\"checkout-label\", value);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"orderly-product-selected\", this.onProductSelected as EventListener);\n this.addEventListener(\"orderly-add-to-basket\", this.onAddToBasket as EventListener);\n }\n\n disconnectedCallback(): void {\n this.removeEventListener(\"orderly-product-selected\", this.onProductSelected as EventListener);\n this.removeEventListener(\"orderly-add-to-basket\", this.onAddToBasket as EventListener);\n super.disconnectedCallback();\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n const fragment = cloneTemplate(this, \"layout\") ?? defaultHomePage({\n pageLayoutTagName: siblingTagName(this, \"home-page\", \"page-layout\"),\n basketIconTagName: siblingTagName(this, \"home-page\", \"basket-icon\"),\n navigationTagName: siblingTagName(this, \"home-page\", \"navigation\"),\n searchBoxTagName: siblingTagName(this, \"home-page\", \"search-box\"),\n productRailTagName: siblingTagName(this, \"home-page\", \"product-rail\"),\n productGridTagName: siblingTagName(this, \"home-page\", \"product-grid\"),\n productTileTagName: siblingTagName(this, \"home-page\", \"product-tile\"),\n shopFooterTagName: siblingTagName(this, \"home-page\", \"shop-footer\"),\n basketTagName: siblingTagName(this, \"home-page\", \"basket\"),\n productPageTagName: siblingTagName(this, \"home-page\", \"product-page\")\n });\n projectSlots(this, fragment, [\"utility\", \"header-actions\", \"content-before\", \"content-after\", \"footer\", \"overlay\"]);\n const root = render(this, fragment);\n customElements.upgrade(root);\n this.configureChildren(root);\n }\n\n protected getDefaultBaseUrl(): string | undefined {\n return defaultShopBaseUrl();\n }\n\n private configureChildren(root: HTMLElement): void {\n const client = this.clientOrUndefined();\n const navigationItems = this.navigationItems;\n const sortOptions = this.sortOptions;\n const basketController = this.controller ?? new BasketController();\n this.controller = basketController;\n const brandLink = this.requiredElement<HTMLAnchorElement>(root, \"brandLink\");\n const navigation = this.requiredElement<HTMLElement & {\n items?: NavigationItem[];\n controller?: { activePath: string; expandedIds?: Set<string> };\n refresh?: () => void;\n }>(root, \"homeNavigation\");\n const rails = this.requiredElement<HTMLElement>(root, \"homeRails\");\n const searchBox = this.requiredElement<OrderlySearchBoxElement>(root, \"homeSearch\");\n const basketIcon = this.requiredElement<OrderlyBasketIconElement>(root, \"basketIcon\");\n const basket = this.requiredElement<OrderlyBasketElement>(root, \"basket\");\n const basketPanel = this.requiredElement<HTMLElement>(root, \"basketPanel\");\n const basketClose = this.requiredElement<HTMLButtonElement>(root, \"basketClose\");\n const productDialog = this.requiredElement<HTMLDialogElement>(root, \"productDialog\");\n const productClose = this.requiredElement<HTMLButtonElement>(root, \"productClose\");\n const productExpand = root.querySelector(\"#productExpand\") as HTMLAnchorElement | null;\n const productDetail = this.requiredElement<OrderlyProductPageElement>(root, \"productDetail\");\n\n bindText(root, \"brandLabel\", this.brandLabel);\n bindText(root, \"eyebrow\", this.eyebrow);\n bindText(root, \"title\", this.title);\n brandLink.href = defaultShopHomeHref();\n\n navigation.items = navigationItems;\n if (navigation.controller) {\n navigation.controller.activePath = defaultShopHomeHref();\n navigation.controller.expandedIds?.clear();\n }\n navigation.refresh?.();\n\n basketIcon.basketController = basketController;\n basket.basketController = basketController;\n searchBox.basketController = basketController;\n searchBox.defaultQuery = this.currentDefaultQuery;\n searchBox.emptyLabel = this.emptyLabel;\n if (client) {\n basket.client = client;\n searchBox.client = client;\n } else {\n searchBox.baseUrl = this.baseUrl ?? this.getDefaultBaseUrl();\n }\n applyBasketLabels(basket, {\n ...defaultShopBasketLabels(),\n ...this.currentBasketLabels\n });\n basket.continueHref = navigationItems[0]?.href ?? defaultShopHomeHref();\n basket.checkoutHref = this.checkoutHref;\n basket.checkoutLabel = this.checkoutLabel;\n productDetail.basketController = basketController;\n\n rails.replaceChildren(...navigationItems.map((category) => this.createRail(category, client, basketController, sortOptions)));\n hideSsrFallbackWhenReady(root, rails);\n void basketController.load();\n\n basketIcon.addEventListener(\"orderly-basket-open\", () => {\n resetHorizontalScroll();\n basketPanel.hidden = false;\n });\n basketClose.addEventListener(\"click\", () => {\n basketPanel.hidden = true;\n resetHorizontalScroll();\n });\n productClose.addEventListener(\"click\", () => {\n productDialog.close();\n resetHorizontalScroll();\n });\n if (productExpand) {\n configureProductExpandLink(productExpand, undefined, this.productHref);\n }\n productDialog.addEventListener(\"close\", resetHorizontalScroll);\n }\n\n private createRail(\n category: ResolvedNavigationItem,\n client: OrderlyClient | undefined,\n basketController: BasketController,\n sortOptions: SortOption[]\n ): HTMLElement {\n const railTagName = siblingTagName(this, \"home-page\", \"product-rail\");\n const rail = document.createElement(railTagName) as OrderlyProductRailElement;\n if (client) {\n rail.client = client;\n } else if (this.baseUrl) {\n rail.setAttribute(\"base-url\", this.baseUrl);\n }\n rail.basketController = basketController;\n rail.defaultQuery = this.currentDefaultQuery;\n rail.title = category.label;\n rail.ctaLabel = this.railCtaLabel;\n rail.ctaHref = category.href ?? \"\";\n rail.emptyLabel = this.emptyLabel;\n rail.query = categoryQueryWithDefaultSort(category, sortOptions);\n appendChildTemplate(rail, \"layout\", template(this, \"rail\"));\n appendChildTemplate(rail, \"grid\", template(this, \"grid\"));\n appendChildTemplate(rail, \"product\", template(this, \"product\"));\n appendChildTemplate(rail, \"loading\", template(this, \"loading\"));\n appendChildTemplate(rail, \"empty\", template(this, \"empty\"));\n return rail;\n }\n\n private clientOrUndefined(): OrderlyClient | undefined {\n if (this.client) {\n return this.client;\n }\n if (!this.baseUrl && !this.getDefaultBaseUrl()) {\n return undefined;\n }\n return this.getClient();\n }\n\n private requiredElement<T extends HTMLElement>(root: ParentNode, id: string): T {\n const element = root.querySelector(`#${id}`);\n if (!element) {\n throw new Error(`Missing #${id}.`);\n }\n return element as T;\n }\n\n private readonly onProductSelected = (event: CustomEvent<ProductEventDetail>): void => {\n const product = event.detail.product;\n if (!product) {\n return;\n }\n const productDialog = this.querySelector(\"#productDialog\") as HTMLDialogElement | null;\n const productDetail = this.querySelector(\"#productDetail\") as OrderlyProductPageElement | null;\n if (!productDialog || !productDetail) {\n return;\n }\n productDetail.product = product as SearchObject;\n const productExpand = this.querySelector(\"#productExpand\") as HTMLAnchorElement | null;\n if (productExpand) {\n configureProductExpandLink(productExpand, product as SearchObject, this.productHref);\n }\n resetHorizontalScroll();\n if (!productDialog.open) {\n productDialog.showModal();\n }\n };\n\n private readonly onAddToBasket = (event: CustomEvent<ProductEventDetail>): void => {\n const product = event.detail.product;\n if (!product) {\n return;\n }\n if (!event.detail.controllerUpdated) {\n void this.controller?.addProduct(product);\n }\n const basketPanel = this.querySelector(\"#basketPanel\") as HTMLElement | null;\n resetHorizontalScroll();\n if (basketPanel) {\n basketPanel.hidden = false;\n }\n };\n}\n\nfunction defaultHomePage(tags: {\n pageLayoutTagName: string;\n basketIconTagName: string;\n navigationTagName: string;\n searchBoxTagName: string;\n productRailTagName: string;\n productGridTagName: string;\n productTileTagName: string;\n shopFooterTagName: string;\n basketTagName: string;\n productPageTagName: string;\n}): DocumentFragment {\n const templateElement = document.createElement(\"template\");\n templateElement.innerHTML = `\n <${tags.pageLayoutTagName}>\n <div slot=\"utility\" data-orderly-slot=\"utility\"></div>\n <a slot=\"header\" class=\"orderly-home-page__brand\" id=\"brandLink\" href=\"/\">\n <span data-orderly-bind=\"brandLabel\"></span>\n </a>\n <${tags.searchBoxTagName} slot=\"header-actions\" id=\"homeSearch\" mode=\"icon\"></${tags.searchBoxTagName}>\n <${tags.basketIconTagName} slot=\"header-actions\" id=\"basketIcon\" label=\"${uiText(\"basketLabel\")}\"></${tags.basketIconTagName}>\n <div slot=\"header-actions\" data-orderly-slot=\"header-actions\"></div>\n <${tags.navigationTagName} slot=\"left\" id=\"homeNavigation\" aria-label=\"${uiText(\"mainCategoriesLabel\")}\"></${tags.navigationTagName}>\n <div slot=\"content-before\" data-orderly-slot=\"content-before\"></div>\n <section slot=\"content\" class=\"orderly-home-page\">\n <header class=\"orderly-home-page__intro\">\n <p class=\"orderly-home-page__eyebrow\" data-orderly-bind=\"eyebrow\"></p>\n <h1 data-orderly-bind=\"title\"></h1>\n </header>\n <div id=\"homeRails\" class=\"orderly-home-page__rails\" data-orderly-slot=\"rails\"></div>\n </section>\n <div slot=\"content-after\" data-orderly-slot=\"content-after\"></div>\n <${tags.shopFooterTagName} slot=\"footer\"></${tags.shopFooterTagName}>\n <div slot=\"footer\" data-orderly-slot=\"footer\"></div>\n <aside slot=\"overlay\" class=\"orderly-category-page__basket-panel\" id=\"basketPanel\" hidden>\n <div class=\"orderly-category-page__basket-panel-header\">\n <h2>${uiText(\"basketPanelTitle\")}</h2>\n <button id=\"basketClose\" type=\"button\">${uiText(\"closeLabel\")}</button>\n </div>\n <${tags.basketTagName} id=\"basket\"></${tags.basketTagName}>\n </aside>\n <dialog slot=\"overlay\" class=\"orderly-category-page__product-dialog\" id=\"productDialog\">\n <div class=\"orderly-category-page__product-dialog-actions\">\n <a class=\"orderly-category-page__product-dialog-expand\" id=\"productExpand\" href=\"${defaultShopProductHref()}\" aria-label=\"${uiText(\"productOpenPageLabel\")}\" title=\"${uiText(\"productOpenPageLabel\")}\" hidden>\n <svg viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\" width=\"20\" height=\"20\">\n <path d=\"M8 7H6.75A1.75 1.75 0 0 0 5 8.75v8.5c0 .97.78 1.75 1.75 1.75h8.5c.97 0 1.75-.78 1.75-1.75V16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M13 5h6v6M12 12l7-7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </a>\n <button class=\"orderly-category-page__product-dialog-close\" id=\"productClose\" type=\"button\" aria-label=\"${uiText(\"closeLabel\")}\" title=\"${uiText(\"closeLabel\")}\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\" width=\"20\" height=\"20\">\n <path d=\"m6.4 5 5.6 5.6L17.6 5 19 6.4 13.4 12l5.6 5.6-1.4 1.4-5.6-5.6L6.4 19 5 17.6l5.6-5.6L5 6.4 6.4 5Z\" fill=\"currentColor\"></path>\n </svg>\n </button>\n </div>\n <${tags.productPageTagName} id=\"productDetail\" add-label=\"${uiText(\"productAddLabel\")}\"></${tags.productPageTagName}>\n </dialog>\n <div slot=\"overlay\" data-orderly-slot=\"overlay\"></div>\n </${tags.pageLayoutTagName}>\n `;\n return templateElement.content.cloneNode(true) as DocumentFragment;\n}\n\nfunction configureProductExpandLink(link: HTMLAnchorElement, product: SearchObject | undefined, productHref: string): void {\n const shareUrl = productShareUrl(product);\n if (!shareUrl) {\n link.hidden = true;\n link.removeAttribute(\"href\");\n return;\n }\n link.hidden = false;\n link.href = productShareHref(productHref, shareUrl);\n}\n\nfunction categoryQueryWithDefaultSort(\n category: ResolvedNavigationItem,\n sortOptions: SortOption[]\n): SearchQuery {\n const query = clone(SearchQuerySchema, category.metadata.query);\n if (query.OrderBy.length === 0) {\n query.OrderBy = [...sortOptions[0]?.orderBy ?? []];\n }\n return query;\n}\n\nfunction applyBasketLabels(basket: OrderlyBasketElement, labels: BasketLabels): void {\n if (labels.emptyLabel !== undefined) {\n basket.emptyLabel = labels.emptyLabel;\n }\n if (labels.clearLabel !== undefined) {\n basket.clearLabel = labels.clearLabel;\n }\n if (labels.continueLabel !== undefined) {\n basket.continueLabel = labels.continueLabel;\n }\n if (labels.quantityLabel !== undefined) {\n basket.quantityLabel = labels.quantityLabel;\n }\n if (labels.removeLabel !== undefined) {\n basket.removeLabel = labels.removeLabel;\n }\n if (labels.subtotalLabel !== undefined) {\n basket.subtotalLabel = labels.subtotalLabel;\n }\n if (labels.shippingLabel !== undefined) {\n basket.shippingLabel = labels.shippingLabel;\n }\n if (labels.totalLabel !== undefined) {\n basket.totalLabel = labels.totalLabel;\n }\n if (labels.totalNote !== undefined) {\n basket.totalNote = labels.totalNote;\n }\n if (labels.deliveryNote !== undefined) {\n basket.deliveryNote = labels.deliveryNote;\n }\n}\n\nfunction appendChildTemplate(host: HTMLElement, name: string, source: HTMLTemplateElement | undefined): void {\n if (!source || host.querySelector(`:scope > template[data-orderly-template=\"${name}\"]`)) {\n return;\n }\n const childTemplate = document.createElement(\"template\");\n childTemplate.dataset.orderlyTemplate = name;\n childTemplate.innerHTML = source.innerHTML;\n host.append(childTemplate);\n}\n\nfunction resetHorizontalScroll(): void {\n const scrollingElement = document.scrollingElement ?? document.documentElement;\n scrollingElement.scrollLeft = 0;\n document.documentElement.scrollLeft = 0;\n document.body.scrollLeft = 0;\n}\n\nfunction hideSsrFallbackWhenReady(root: ParentNode, target: EventTarget): void {\n const fallback = root.querySelector(\"[data-orderly-ssr-fallback]\");\n if (!(fallback instanceof HTMLElement)) {\n return;\n }\n target.addEventListener(\"orderly-results\", () => {\n fallback.hidden = true;\n }, { once: true });\n}\n","import { create } from \"@bufbuild/protobuf\";\nimport {\n type OrderlyClient,\n type PageResult,\n type SearchObject,\n SearchQuerySchema,\n type SearchQuery\n} from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport { BasketController } from \"../basket.js\";\nimport {\n defaultShopBaseUrl,\n defaultShopBasketLabels,\n defaultShopBrandLabel,\n defaultShopCheckoutHref,\n defaultShopCheckoutLabel,\n defaultShopHomeHref,\n defaultShopNavigationItems,\n type BasketLabels\n} from \"../default-shop.js\";\nimport { mergeShopSearchQuery } from \"../shop-query.js\";\nimport type { NavigationItem } from \"../types.js\";\nimport { bindText, cloneTemplate, dispatch, projectSlots, render, siblingTagName, template } from \"../utils/dom.js\";\nimport type { OrderlyBasketElement } from \"./basket.js\";\nimport type { OrderlyBasketIconElement } from \"./basket-icon.js\";\nimport { unpackProducts } from \"./product-grid.js\";\nimport type { OrderlyProductPageElement } from \"./product-page.js\";\nimport { uiText } from \"../i18n.js\";\n\nconst ORDERLY_SHARE_URL_PREFIX = \"https://orderly.shop/\";\n\n/**\n * Full product detail page composition for vanilla storefronts.\n *\n * The component resolves a SearchObject through SearchService.Search using\n * SearchQuery.ShareUrl, then renders the reusable product detail component inside\n * the default page layout with navigation, basket drawer, and footer.\n */\nexport class OrderlyProductDetailPageElement extends OrderlyElement {\n static observedAttributes = [\n \"base-url\",\n \"share-url\",\n \"brand-label\",\n \"checkout-href\",\n \"checkout-label\",\n \"add-label\",\n \"loading-label\",\n \"not-found-label\",\n \"error-label\"\n ];\n\n private controller?: BasketController;\n private currentNavigationItems?: NavigationItem[];\n private currentBasketLabels?: BasketLabels;\n private currentDefaultQuery?: SearchQuery;\n private currentProduct?: SearchObject;\n private loadedShareUrl?: string;\n private loading = false;\n private error: unknown;\n private loadRevision = 0;\n\n get shareUrl(): string {\n return this.getAttribute(\"share-url\") ?? \"\";\n }\n\n set shareUrl(value: string) {\n if (value) {\n this.setAttribute(\"share-url\", value);\n } else {\n this.removeAttribute(\"share-url\");\n }\n }\n\n get product(): SearchObject | undefined {\n return this.currentProduct;\n }\n\n set product(value: SearchObject | undefined) {\n this.currentProduct = value;\n this.loadedShareUrl = value?.ShareURL?.URL ?? this.resolvedShareUrl();\n this.error = undefined;\n this.loading = false;\n this.requestRender();\n }\n\n get defaultQuery(): SearchQuery | undefined {\n return this.currentDefaultQuery;\n }\n\n set defaultQuery(value: SearchQuery | undefined) {\n this.currentDefaultQuery = value;\n this.resetProductLoad();\n this.requestRender();\n }\n\n get shopQuery(): SearchQuery | undefined {\n return this.defaultQuery;\n }\n\n set shopQuery(value: SearchQuery | undefined) {\n this.defaultQuery = value;\n }\n\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n this.controller = value;\n this.requestRender();\n }\n\n get navigationItems(): NavigationItem[] {\n return this.currentNavigationItems ? [...this.currentNavigationItems] : defaultShopNavigationItems();\n }\n\n set navigationItems(value: NavigationItem[]) {\n this.currentNavigationItems = [...value];\n this.requestRender();\n }\n\n get basketLabels(): BasketLabels {\n return { ...this.currentBasketLabels };\n }\n\n set basketLabels(value: BasketLabels) {\n this.currentBasketLabels = { ...value };\n this.requestRender();\n }\n\n get brandLabel(): string {\n return this.getAttribute(\"brand-label\") ?? defaultShopBrandLabel();\n }\n\n set brandLabel(value: string) {\n this.setAttribute(\"brand-label\", value);\n }\n\n get checkoutHref(): string {\n return this.getAttribute(\"checkout-href\") ?? defaultShopCheckoutHref();\n }\n\n set checkoutHref(value: string) {\n this.setAttribute(\"checkout-href\", value);\n }\n\n get checkoutLabel(): string {\n return this.getAttribute(\"checkout-label\") ?? defaultShopCheckoutLabel();\n }\n\n set checkoutLabel(value: string) {\n this.setAttribute(\"checkout-label\", value);\n }\n\n get addLabel(): string {\n return this.getAttribute(\"add-label\") ?? uiText(\"productAddLabel\");\n }\n\n set addLabel(value: string) {\n this.setAttribute(\"add-label\", value);\n }\n\n get loadingLabel(): string {\n return this.getAttribute(\"loading-label\") ?? uiText(\"productLoadingLabel\");\n }\n\n set loadingLabel(value: string) {\n this.setAttribute(\"loading-label\", value);\n }\n\n get notFoundLabel(): string {\n return this.getAttribute(\"not-found-label\") ?? uiText(\"productNotFoundLabel\");\n }\n\n set notFoundLabel(value: string) {\n this.setAttribute(\"not-found-label\", value);\n }\n\n get errorLabel(): string {\n return this.getAttribute(\"error-label\") ?? uiText(\"productErrorLabel\");\n }\n\n set errorLabel(value: string) {\n this.setAttribute(\"error-label\", value);\n }\n\n refresh(): void {\n this.resetProductLoad();\n this.requestRender();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"orderly-add-to-basket\", this.onAddToBasket as EventListener);\n globalThis.addEventListener?.(\"hashchange\", this.onHashChange);\n }\n\n disconnectedCallback(): void {\n this.removeEventListener(\"orderly-add-to-basket\", this.onAddToBasket as EventListener);\n globalThis.removeEventListener?.(\"hashchange\", this.onHashChange);\n super.disconnectedCallback();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (name === \"share-url\" && oldValue !== newValue) {\n this.resetProductLoad();\n }\n this.requestRender();\n }\n\n protected render(): void {\n const fragment = cloneTemplate(this, \"layout\") ?? defaultProductDetailPage({\n pageLayoutTagName: siblingTagName(this, \"product-detail-page\", \"page-layout\"),\n basketIconTagName: siblingTagName(this, \"product-detail-page\", \"basket-icon\"),\n navigationTagName: siblingTagName(this, \"product-detail-page\", \"navigation\"),\n productPageTagName: siblingTagName(this, \"product-detail-page\", \"product-page\"),\n basketTagName: siblingTagName(this, \"product-detail-page\", \"basket\"),\n shopFooterTagName: siblingTagName(this, \"product-detail-page\", \"shop-footer\")\n });\n projectSlots(this, fragment, [\"utility\", \"header-actions\", \"content-before\", \"content-after\", \"footer\", \"overlay\"]);\n const root = render(this, fragment);\n customElements.upgrade(root);\n this.configureChildren(root);\n this.ensureProductLoaded();\n }\n\n protected getDefaultBaseUrl(): string | undefined {\n return defaultShopBaseUrl();\n }\n\n private configureChildren(root: HTMLElement): void {\n const client = this.clientOrUndefined();\n const navigationItems = this.navigationItems;\n const basketController = this.controller ?? new BasketController();\n this.controller = basketController;\n const brandLink = this.requiredElement<HTMLAnchorElement>(root, \"brandLink\");\n const navigation = this.requiredElement<HTMLElement & {\n items?: NavigationItem[];\n controller?: { activePath: string; expandedIds?: Set<string> };\n refresh?: () => void;\n }>(root, \"productNavigation\");\n const basketIcon = this.requiredElement<OrderlyBasketIconElement>(root, \"basketIcon\");\n const basket = this.requiredElement<OrderlyBasketElement>(root, \"basket\");\n const basketPanel = this.requiredElement<HTMLElement>(root, \"basketPanel\");\n const basketClose = this.requiredElement<HTMLButtonElement>(root, \"basketClose\");\n const productDetail = this.requiredElement<OrderlyProductPageElement>(root, \"productDetail\");\n const productContainer = this.requiredElement<HTMLElement>(root, \"productContainer\");\n\n this.applyText(root);\n brandLink.href = defaultShopHomeHref();\n navigation.items = navigationItems;\n if (navigation.controller) {\n navigation.controller.activePath = locationPath();\n navigation.controller.expandedIds?.clear();\n }\n navigation.refresh?.();\n\n appendChildTemplate(productDetail, \"product\", template(this, \"product\"));\n appendChildTemplate(productDetail, \"thumbnail\", template(this, \"thumbnail\"));\n appendChildTemplate(basket, \"basket\", template(this, \"basket\"));\n appendChildTemplate(basket, \"line\", template(this, \"line\"));\n appendChildTemplate(basket, \"empty\", template(this, \"empty\"));\n\n if (client) {\n basket.client = client;\n }\n productDetail.product = this.currentProduct;\n productDetail.basketController = basketController;\n productDetail.addLabel = this.addLabel;\n productContainer.hidden = !this.currentProduct;\n hideSsrFallbackWhenReady(root, Boolean(this.currentProduct));\n\n basketIcon.basketController = basketController;\n basket.basketController = basketController;\n basket.checkoutHref = this.checkoutHref;\n basket.checkoutLabel = this.checkoutLabel;\n basket.continueHref = navigationItems[0]?.href ?? defaultShopHomeHref();\n applyBasketLabels(basket, {\n ...defaultShopBasketLabels(),\n ...this.currentBasketLabels\n });\n\n basketIcon.addEventListener(\"orderly-basket-open\", () => {\n basketPanel.hidden = false;\n });\n basketClose.addEventListener(\"click\", () => {\n basketPanel.hidden = true;\n });\n\n void basketController.load();\n }\n\n private applyText(root: ParentNode): void {\n const title = this.currentProduct?.Title || uiText(\"productFallbackTitle\");\n bindText(root, \"brandLabel\", this.brandLabel);\n bindText(root, \"status\", this.statusText());\n document.title = `${title} | ${this.brandLabel}`;\n document.body.dataset.productShareUrl = this.resolvedShareUrl();\n if (this.currentProduct?.Title) {\n document.body.dataset.productTitle = this.currentProduct.Title;\n } else {\n delete document.body.dataset.productTitle;\n }\n }\n\n private async loadProduct(shareUrl: string): Promise<void> {\n const revision = ++this.loadRevision;\n this.loading = true;\n this.error = undefined;\n this.loadedShareUrl = shareUrl;\n this.requestRender();\n try {\n const request = mergeShopSearchQuery(create(SearchQuerySchema, { ShareUrl: shareUrl }), this.currentDefaultQuery);\n const result = await this.getClient().services.searchService.search(request);\n if (revision !== this.loadRevision || shareUrl !== this.loadedShareUrl) {\n return;\n }\n const product = unpackProducts(result as PageResult)[0];\n this.currentProduct = product;\n if (product) {\n dispatch(this, \"orderly-product-loaded\", { product, shareUrl });\n } else {\n dispatch(this, \"orderly-product-not-found\", { shareUrl });\n }\n } catch (error) {\n if (revision !== this.loadRevision || shareUrl !== this.loadedShareUrl) {\n return;\n }\n this.error = error;\n dispatch(this, \"orderly-error\", { error });\n } finally {\n if (revision === this.loadRevision) {\n this.loading = false;\n this.requestRender();\n }\n }\n }\n\n private ensureProductLoaded(): void {\n const shareUrl = this.resolvedShareUrl();\n if (!shareUrl || this.loading || this.loadedShareUrl === shareUrl) {\n return;\n }\n void this.loadProduct(shareUrl);\n }\n\n private resetProductLoad(): void {\n this.loadRevision += 1;\n this.currentProduct = undefined;\n this.loadedShareUrl = undefined;\n this.loading = false;\n this.error = undefined;\n }\n\n private statusText(): string {\n if (this.loading) {\n return this.loadingLabel;\n }\n if (this.error) {\n return this.errorLabel;\n }\n if (!this.resolvedShareUrl()) {\n return this.notFoundLabel;\n }\n if (!this.currentProduct && this.loadedShareUrl) {\n return this.notFoundLabel;\n }\n return \"\";\n }\n\n private resolvedShareUrl(): string {\n return normalizeProductShareUrl(this.shareUrl.trim() || shareUrlFromHash());\n }\n\n private clientOrUndefined(): OrderlyClient | undefined {\n if (this.client) {\n return this.client;\n }\n if (!this.baseUrl && !this.getDefaultBaseUrl()) {\n return undefined;\n }\n return this.getClient();\n }\n\n private requiredElement<T extends HTMLElement>(root: ParentNode, id: string): T {\n const element = root.querySelector(`#${id}`);\n if (!element) {\n throw new Error(`Missing #${id}.`);\n }\n return element as T;\n }\n\n private readonly onAddToBasket = (): void => {\n const basketPanel = this.querySelector(\"#basketPanel\") as HTMLElement | null;\n if (basketPanel) {\n basketPanel.hidden = false;\n }\n };\n\n private readonly onHashChange = (): void => {\n if (this.shareUrl.trim()) {\n return;\n }\n const nextShareUrl = this.resolvedShareUrl();\n if (!nextShareUrl || nextShareUrl === this.loadedShareUrl) {\n return;\n }\n this.resetProductLoad();\n this.requestRender();\n };\n}\n\nfunction shareUrlFromHash(): string {\n if (typeof location === \"undefined\") {\n return \"\";\n }\n const hash = location.hash.startsWith(\"#\") ? location.hash.slice(1) : location.hash;\n if (!hash) {\n return \"\";\n }\n const params = new URLSearchParams(hash.startsWith(\"?\") ? hash.slice(1) : hash);\n const shareUrl = params.get(\"url\") ?? params.get(\"shareUrl\") ?? params.get(\"share-url\");\n if (shareUrl) {\n return shareUrl.trim();\n }\n if (hash.includes(\"=\")) {\n return \"\";\n }\n try {\n return decodeURIComponent(hash).trim();\n } catch {\n return hash.trim();\n }\n}\n\nfunction normalizeProductShareUrl(value: string): string {\n const trimmed = value.trim();\n if (!trimmed || trimmed.startsWith(ORDERLY_SHARE_URL_PREFIX) || /^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n return `${ORDERLY_SHARE_URL_PREFIX}${trimmed.replace(/^\\/+/, \"\")}`;\n}\n\nfunction defaultProductDetailPage(tags: {\n pageLayoutTagName: string;\n basketIconTagName: string;\n navigationTagName: string;\n productPageTagName: string;\n basketTagName: string;\n shopFooterTagName: string;\n}): DocumentFragment {\n const templateElement = document.createElement(\"template\");\n templateElement.innerHTML = `\n <${tags.pageLayoutTagName}>\n <div slot=\"utility\" data-orderly-slot=\"utility\"></div>\n <a slot=\"header\" class=\"orderly-product-detail-page__brand\" id=\"brandLink\" href=\"/\">\n <span data-orderly-bind=\"brandLabel\"></span>\n </a>\n <${tags.basketIconTagName} slot=\"header-actions\" id=\"basketIcon\" label=\"${uiText(\"basketLabel\")}\"></${tags.basketIconTagName}>\n <div slot=\"header-actions\" data-orderly-slot=\"header-actions\"></div>\n <${tags.navigationTagName} slot=\"left\" id=\"productNavigation\" aria-label=\"${uiText(\"mainCategoriesLabel\")}\"></${tags.navigationTagName}>\n <div slot=\"content-before\" data-orderly-slot=\"content-before\"></div>\n <section slot=\"content\" class=\"orderly-product-detail-page\">\n <p class=\"orderly-product-detail-page__status\" data-orderly-bind=\"status\"></p>\n <section class=\"orderly-product-detail-page__product\" id=\"productContainer\" aria-live=\"polite\">\n <${tags.productPageTagName} id=\"productDetail\"></${tags.productPageTagName}>\n </section>\n </section>\n <div slot=\"content-after\" data-orderly-slot=\"content-after\"></div>\n <${tags.shopFooterTagName} slot=\"footer\"></${tags.shopFooterTagName}>\n <div slot=\"footer\" data-orderly-slot=\"footer\"></div>\n <aside slot=\"overlay\" class=\"orderly-product-detail-page__basket-panel\" id=\"basketPanel\" hidden>\n <div class=\"orderly-product-detail-page__basket-panel-header\">\n <h2>${uiText(\"basketPanelTitle\")}</h2>\n <button id=\"basketClose\" type=\"button\">${uiText(\"closeLabel\")}</button>\n </div>\n <${tags.basketTagName} id=\"basket\"></${tags.basketTagName}>\n </aside>\n <div slot=\"overlay\" data-orderly-slot=\"overlay\"></div>\n </${tags.pageLayoutTagName}>\n `;\n return templateElement.content.cloneNode(true) as DocumentFragment;\n}\n\nfunction applyBasketLabels(basket: OrderlyBasketElement, labels: BasketLabels): void {\n if (labels.emptyLabel !== undefined) {\n basket.emptyLabel = labels.emptyLabel;\n }\n if (labels.clearLabel !== undefined) {\n basket.clearLabel = labels.clearLabel;\n }\n if (labels.continueLabel !== undefined) {\n basket.continueLabel = labels.continueLabel;\n }\n if (labels.quantityLabel !== undefined) {\n basket.quantityLabel = labels.quantityLabel;\n }\n if (labels.removeLabel !== undefined) {\n basket.removeLabel = labels.removeLabel;\n }\n if (labels.subtotalLabel !== undefined) {\n basket.subtotalLabel = labels.subtotalLabel;\n }\n if (labels.shippingLabel !== undefined) {\n basket.shippingLabel = labels.shippingLabel;\n }\n if (labels.totalLabel !== undefined) {\n basket.totalLabel = labels.totalLabel;\n }\n if (labels.totalNote !== undefined) {\n basket.totalNote = labels.totalNote;\n }\n if (labels.deliveryNote !== undefined) {\n basket.deliveryNote = labels.deliveryNote;\n }\n}\n\nfunction appendChildTemplate(host: HTMLElement, name: string, source: HTMLTemplateElement | undefined): void {\n if (!source || host.querySelector(`:scope > template[data-orderly-template=\"${name}\"]`)) {\n return;\n }\n const childTemplate = document.createElement(\"template\");\n childTemplate.dataset.orderlyTemplate = name;\n childTemplate.innerHTML = source.innerHTML;\n host.append(childTemplate);\n}\n\nfunction locationPath(): string {\n return typeof location === \"undefined\" ? \"/\" : location.pathname;\n}\n\nfunction hideSsrFallbackWhenReady(root: ParentNode, ready: boolean): void {\n if (!ready) {\n return;\n }\n const fallback = root.querySelector(\"[data-orderly-ssr-fallback]\");\n if (fallback instanceof HTMLElement) {\n fallback.hidden = true;\n }\n}\n","import { clone } from \"@bufbuild/protobuf\";\nimport { anyUnpack } from \"@bufbuild/protobuf/wkt\";\nimport {\n type ContinuationToken,\n SearchObjectSchema,\n SearchQuerySchema,\n type PageResult,\n type SearchObject,\n type SearchQuery\n} from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport type { BasketController } from \"../basket.js\";\nimport { declarativeQueryAttributes, declarativeSearchQuery } from \"../query.js\";\nimport { mergeShopSearchQuery } from \"../shop-query.js\";\nimport type { SortOption, ProductGridPagingMode, ProductGridState } from \"../types.js\";\nimport { bindProduct } from \"./product-tile.js\";\nimport { bindText, cloneTemplate, dispatch, render, replaceSlot, siblingTagName } from \"../utils/dom.js\";\nimport { uiText } from \"../i18n.js\";\n\nconst defaultProductTileTagName = \"orderly-product-tile\";\n\n/**\n * Search-backed product grid for storefront category and collection pages.\n *\n * The grid accepts typed SearchQuery objects, supports simple declarative query\n * markup, merges a configured default shop query, owns sorting, and handles\n * ContinuationToken paging for button, manual, and dynamic/infinite modes.\n */\nexport class OrderlyProductGridElement extends OrderlyElement {\n static observedAttributes = [\n \"base-url\",\n \"paging\",\n \"sort-label\",\n \"clear-search-label\",\n \"error-label\",\n \"loading-label\",\n \"results-label\",\n \"searching-label\",\n ...declarativeQueryAttributes\n ];\n\n private currentQuery?: SearchQuery;\n private currentDefaultQuery?: SearchQuery;\n private currentProducts: SearchObject[] = [];\n private continuation?: ContinuationToken;\n private loading = false;\n private error: unknown;\n private observer?: IntersectionObserver;\n private totalCount = 0;\n private estimatedTotalCount?: number;\n private controller?: BasketController;\n private currentSortOptions: SortOption[] = [];\n\n /**\n * Paging behavior for continuation-token results.\n *\n * `button` renders a load-more button, `manual` exposes loadNextPage() only,\n * and `dynamic`/`infinite` load the next page when the sentinel enters view.\n */\n paging: ProductGridPagingMode = \"button\";\n\n /**\n * Tag name used when the grid creates default product tile elements.\n */\n productTileTagName = defaultProductTileTagName;\n\n /**\n * Optional shop-wide SearchQuery scope merged into every grid request.\n */\n get defaultQuery(): SearchQuery | undefined {\n return this.currentDefaultQuery;\n }\n\n set defaultQuery(value: SearchQuery | undefined) {\n this.currentDefaultQuery = value;\n void this.refresh();\n }\n\n /**\n * Backward-compatible alias for defaultQuery.\n */\n get shopQuery(): SearchQuery | undefined {\n return this.defaultQuery;\n }\n\n set shopQuery(value: SearchQuery | undefined) {\n this.defaultQuery = value;\n }\n\n /**\n * Available sort choices rendered by the grid's sort control.\n */\n get sortOptions(): SortOption[] {\n return [...this.currentSortOptions];\n }\n\n set sortOptions(value: SortOption[]) {\n this.currentSortOptions = [...value];\n this.requestRender();\n }\n\n get sortLabel(): string {\n return this.getAttribute(\"sort-label\") ?? uiText(\"sortLabel\");\n }\n\n set sortLabel(value: string) {\n this.setAttribute(\"sort-label\", value);\n }\n\n get clearSearchLabel(): string {\n return this.getAttribute(\"clear-search-label\") ?? uiText(\"clearSearchLabel\");\n }\n\n set clearSearchLabel(value: string) {\n this.setAttribute(\"clear-search-label\", value);\n }\n\n get errorLabel(): string {\n return this.getAttribute(\"error-label\") ?? uiText(\"productsLoadError\");\n }\n\n set errorLabel(value: string) {\n this.setAttribute(\"error-label\", value);\n }\n\n get loadingLabel(): string {\n return this.getAttribute(\"loading-label\") ?? uiText(\"loadingLabel\");\n }\n\n set loadingLabel(value: string) {\n this.setAttribute(\"loading-label\", value);\n }\n\n get resultsLabel(): string {\n return this.getAttribute(\"results-label\") ?? uiText(\"productsLabel\");\n }\n\n set resultsLabel(value: string) {\n this.setAttribute(\"results-label\", value);\n }\n\n get searchingLabel(): string {\n return this.getAttribute(\"searching-label\") ?? uiText(\"searchingLabel\");\n }\n\n set searchingLabel(value: string) {\n this.setAttribute(\"searching-label\", value);\n }\n\n /**\n * Shared basket controller assigned to product tiles rendered by this grid.\n */\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n this.controller = value;\n this.requestRender();\n }\n\n /**\n * Typed Core SearchQuery for SearchService.Search.\n *\n * When omitted, the grid falls back to declarative query markup such as\n * `keywords`, `tags`, `order-by`, or a direct child `<query>` element.\n */\n get query(): SearchQuery | undefined {\n return this.currentQuery;\n }\n\n set query(value: SearchQuery | undefined) {\n this.currentQuery = value;\n void this.refresh();\n }\n\n get products(): SearchObject[] {\n return [...this.currentProducts];\n }\n\n get continuationToken(): ContinuationToken | undefined {\n return this.continuation;\n }\n\n get hasMore(): boolean {\n return hasContinuationToken(this.continuation);\n }\n\n get state(): ProductGridState {\n return {\n loading: this.loading,\n error: this.error,\n products: this.products,\n count: this.totalCount,\n estimatedTotalCount: this.estimatedTotalCount,\n hasMore: this.hasMore\n };\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (this.hasAttribute(\"paging\")) {\n this.paging = normalizePagingMode(this.getAttribute(\"paging\"), this.paging);\n }\n if (this.productTileTagName === defaultProductTileTagName) {\n this.productTileTagName = siblingTagName(this, \"product-grid\", \"product-tile\");\n }\n if (!this.currentQuery && declarativeSearchQuery(this)) {\n void this.refresh();\n }\n }\n\n disconnectedCallback(): void {\n this.observer?.disconnect();\n super.disconnectedCallback();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === \"paging\") {\n this.paging = normalizePagingMode(this.getAttribute(\"paging\"), this.paging);\n }\n if (declarativeQueryAttributes.includes(name)) {\n if (this.isConnected) {\n void this.refresh();\n }\n return;\n }\n this.requestRender();\n }\n\n /**\n * Clears current results and loads the first page for the resolved query.\n */\n async refresh(): Promise<void> {\n const query = this.resolvedQuery();\n if (!query) {\n this.currentProducts = [];\n this.continuation = undefined;\n this.requestRender();\n return;\n }\n this.currentProducts = [];\n this.continuation = undefined;\n await this.fetchPage(false);\n }\n\n /**\n * Loads the next continuation-token page when one is available.\n */\n async loadNextPage(): Promise<void> {\n if (!this.resolvedQuery() || this.loading || !this.hasMore) {\n return;\n }\n await this.fetchPage(true);\n }\n\n /**\n * Applies an OrderBy array to a cloned query and reloads the grid.\n */\n async setSort(orderBy: string[]): Promise<void> {\n const query = this.resolvedQuery();\n if (!query) {\n return;\n }\n const next = clone(SearchQuerySchema, query);\n next.OrderBy = [...orderBy];\n this.currentQuery = next;\n await this.refresh();\n }\n\n /**\n * Clears the visible Query text on a cloned query and reloads the grid.\n */\n async clearSearch(): Promise<void> {\n const query = this.resolvedQuery();\n if (!query) {\n return;\n }\n const next = clone(SearchQuerySchema, query);\n next.Query = \"\";\n this.currentQuery = next;\n await this.refresh();\n }\n\n protected render(): void {\n const fragment = cloneTemplate(this, \"layout\") ?? defaultProductGrid();\n bindText(fragment, \"status\", this.error ? this.errorLabel : this.loading ? this.loadingLabel : \"\");\n replaceSlot(fragment, \"context\", this.renderContext());\n replaceSlot(fragment, \"sort\", this.renderSort());\n this.configureSortContainer(fragment);\n replaceSlot(fragment, \"items\", this.renderProducts());\n this.configureLoadMore(fragment);\n const root = render(this, fragment);\n root.toggleAttribute(\"aria-busy\", this.loading);\n this.toggleAttribute(\"data-orderly-loading\", this.loading);\n this.configureInfiniteScroll(root);\n }\n\n private renderProducts(): DocumentFragment {\n const items = document.createDocumentFragment();\n if (this.loading && this.currentProducts.length === 0) {\n const loading = cloneTemplate(this, \"loading\");\n items.append(loading ?? defaultLoadingProducts());\n return items;\n }\n if (!this.loading && !this.error && this.currentProducts.length === 0) {\n const empty = cloneTemplate(this, \"empty\");\n items.append(empty ?? defaultMessage(uiText(\"emptyLabel\")));\n }\n for (const product of this.currentProducts) {\n items.append(this.renderProduct(product));\n }\n return items;\n }\n\n private async fetchPage(append: boolean): Promise<void> {\n this.loading = true;\n this.error = undefined;\n this.requestRender();\n try {\n const request = mergeShopSearchQuery(this.resolvedQuery()!, this.currentDefaultQuery);\n if (append) {\n request.Continuation = this.continuation;\n } else {\n request.Continuation = undefined;\n }\n const result = await this.getClient().services.searchService.search(request);\n const products = unpackProducts(result as PageResult);\n this.currentProducts = append ? [...this.currentProducts, ...products] : products;\n this.continuation = nextContinuationToken((result as PageResult).Continuation);\n this.totalCount = (result as PageResult).Count;\n this.estimatedTotalCount = (result as PageResult).EstimatedTotalCount;\n dispatch(this, \"orderly-results\", this.state);\n } catch (error) {\n this.error = error;\n dispatch(this, \"orderly-error\", { error });\n } finally {\n this.loading = false;\n this.requestRender();\n }\n }\n\n private renderProduct(product: SearchObject): Node {\n const custom = cloneTemplate(this, \"product\");\n if (custom) {\n const container = document.createElement(\"div\");\n container.append(custom);\n customElements.upgrade(container);\n bindProduct(container, product);\n const tile = (container.querySelector(this.productTileTagName) ?? container.querySelector(defaultProductTileTagName)) as HTMLElement & {\n basketController?: BasketController;\n product?: SearchObject;\n } | null;\n if (tile) {\n tile.basketController = this.controller;\n tile.product = product;\n }\n const fragment = document.createDocumentFragment();\n markProductGridItems(container);\n fragment.append(...container.childNodes);\n return fragment;\n }\n const tile = document.createElement(this.productTileTagName) as HTMLElement & {\n basketController?: BasketController;\n product?: SearchObject;\n };\n tile.className = \"orderly-product-grid__item\";\n configureProductGridItem(tile);\n tile.basketController = this.controller;\n tile.product = product;\n return tile;\n }\n\n private renderSort(): DocumentFragment | undefined {\n if (this.currentSortOptions.length === 0) {\n return undefined;\n }\n const root = cloneTemplate(this, \"sort\") ?? defaultSortControl();\n bindText(root, \"sort-label\", this.sortLabel);\n const select = root.querySelector(\"[data-orderly-action=\\\"sort\\\"]\") ?? root.querySelector(\"select\");\n if (select instanceof HTMLSelectElement) {\n select.replaceChildren(...this.currentSortOptions.map((option, index) => {\n const element = document.createElement(\"option\");\n element.value = String(index);\n element.textContent = option.label;\n return element;\n }));\n const selectedIndex = this.selectedSortIndex();\n if (selectedIndex >= 0) {\n select.value = String(selectedIndex);\n } else {\n select.selectedIndex = -1;\n }\n select.disabled = !this.resolvedQuery();\n select.addEventListener(\"change\", () => {\n const option = this.currentSortOptions[Number(select.value)];\n if (option) {\n void this.setSort(option.orderBy);\n }\n });\n }\n return root;\n }\n\n private renderContext(): DocumentFragment {\n const root = cloneTemplate(this, \"context\") ?? defaultGridContext();\n const query = this.resolvedQuery();\n const activeQuery = query?.Query?.trim() ?? \"\";\n const count = this.estimatedTotalCount ?? this.totalCount ?? this.currentProducts.length;\n bindText(root, \"resultCount\", query ? `${count} ${this.resultsLabel}` : \"\");\n bindText(root, \"activeQuery\", activeQuery ? `${this.searchingLabel} \"${activeQuery}\"` : \"\");\n bindText(root, \"clearSearchLabel\", this.clearSearchLabel);\n bindText(root, \"loadingLabel\", this.loading ? this.loadingLabel : \"\");\n root.querySelectorAll(\"[data-orderly-action=\\\"clear-search\\\"]\").forEach((control) => {\n if (control instanceof HTMLElement) {\n control.hidden = !activeQuery;\n control.addEventListener(\"click\", () => void this.clearSearch());\n }\n });\n root.querySelectorAll(\"[data-orderly-loading-indicator]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = !this.loading;\n }\n });\n return root;\n }\n\n private selectedSortIndex(): number {\n const orderBy = this.resolvedQuery()?.OrderBy ?? [];\n return this.currentSortOptions.findIndex((option) => stringArraysEqual(option.orderBy, orderBy));\n }\n\n private resolvedQuery(): SearchQuery | undefined {\n return this.currentQuery ?? declarativeSearchQuery(this);\n }\n\n private configureSortContainer(root: ParentNode): void {\n if (this.currentSortOptions.length > 0) {\n return;\n }\n root.querySelectorAll(\"[data-orderly-sort-container]\").forEach((element) => element.remove());\n }\n\n private configureLoadMore(root: ParentNode): void {\n root.querySelectorAll(\"[data-orderly-action=\\\"load-more\\\"]\").forEach((control) => {\n if (!(control instanceof HTMLElement)) {\n return;\n }\n if (this.paging !== \"button\" || !this.hasMore) {\n control.remove();\n return;\n }\n if (control instanceof HTMLButtonElement) {\n control.disabled = this.loading;\n }\n control.addEventListener(\"click\", () => void this.loadNextPage());\n });\n }\n\n private configureInfiniteScroll(root: HTMLElement): void {\n this.observer?.disconnect();\n if (!isDynamicPaging(this.paging) || !this.hasMore || typeof IntersectionObserver === \"undefined\") {\n return;\n }\n const sentinel = root.querySelector(\"[data-orderly-sentinel]\");\n if (!sentinel) {\n return;\n }\n this.observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n void this.loadNextPage();\n }\n });\n this.observer.observe(sentinel);\n }\n}\n\nexport function hasContinuationToken(token: ContinuationToken | undefined): boolean {\n return Boolean(token?.Token);\n}\n\nfunction nextContinuationToken(token: ContinuationToken | undefined): ContinuationToken | undefined {\n return hasContinuationToken(token) ? token : undefined;\n}\n\nfunction normalizePagingMode(value: string | null, fallback: ProductGridPagingMode): ProductGridPagingMode {\n if (value === \"dynamic\" || value === \"infinite\") {\n return \"infinite\";\n }\n if (value === \"manual\" || value === \"button\") {\n return value;\n }\n return fallback;\n}\n\nfunction isDynamicPaging(mode: ProductGridPagingMode): boolean {\n return mode === \"dynamic\" || mode === \"infinite\";\n}\n\nexport function unpackProducts(result: PageResult): SearchObject[] {\n return result.data\n .map((item) => anyUnpack(item, SearchObjectSchema))\n .filter((item): item is SearchObject => Boolean(item));\n}\n\nfunction defaultMessage(message: string): HTMLElement {\n const element = document.createElement(\"p\");\n element.className = \"orderly-product-grid__message\";\n element.textContent = message;\n return element;\n}\n\nfunction defaultSortControl(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const label = document.createElement(\"label\");\n label.className = \"orderly-product-grid__sort\";\n label.innerHTML = `\n <span class=\"orderly-product-grid__sort-label\" data-orderly-bind=\"sort-label\"></span>\n <select class=\"orderly-product-grid__sort-select\" data-orderly-action=\"sort\"></select>\n `;\n fragment.append(label);\n return fragment;\n}\n\nfunction defaultGridContext(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const container = document.createElement(\"div\");\n container.className = \"orderly-product-grid__context\";\n container.innerHTML = `\n <span class=\"orderly-product-grid__toolbar-loading\" data-orderly-loading-indicator data-orderly-bind=\"loadingLabel\"></span>\n `;\n fragment.append(container);\n return fragment;\n}\n\nfunction defaultLoadingProducts(count = 8): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (let index = 0; index < count; index += 1) {\n const article = document.createElement(\"article\");\n article.className = \"orderly-product-grid__item orderly-product-grid__loading-item orderly-product-tile\";\n article.setAttribute(\"aria-hidden\", \"true\");\n article.innerHTML = `\n <div class=\"orderly-product-grid__loading-heading\">\n <span class=\"orderly-skeleton orderly-product-grid__loading-title\"></span>\n <span class=\"orderly-skeleton orderly-product-grid__loading-subtitle\"></span>\n </div>\n <span class=\"orderly-skeleton orderly-product-grid__loading-image\"></span>\n <div class=\"orderly-product-grid__loading-body\">\n <span class=\"orderly-skeleton orderly-product-grid__loading-price\"></span>\n <span class=\"orderly-skeleton orderly-product-grid__loading-button\"></span>\n </div>\n `;\n fragment.append(article);\n }\n return fragment;\n}\n\nfunction defaultProductGrid(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const section = document.createElement(\"section\");\n section.className = \"orderly-product-grid\";\n section.innerHTML = `\n <div class=\"orderly-product-grid__toolbar\">\n <div class=\"orderly-product-grid__context-slot\" data-orderly-slot=\"context\"></div>\n <div class=\"orderly-product-grid__sort-slot\" data-orderly-sort-container data-orderly-slot=\"sort\"></div>\n </div>\n <div class=\"orderly-product-grid__status\" data-orderly-bind=\"status\"></div>\n <div class=\"orderly-product-grid__items\" data-orderly-slot=\"items\"></div>\n <button class=\"orderly-product-grid__load-more\" type=\"button\" data-orderly-action=\"load-more\">${uiText(\"loadMoreLabel\")}</button>\n <div class=\"orderly-product-grid__sentinel\" data-orderly-sentinel></div>\n `;\n fragment.append(section);\n return fragment;\n}\n\nfunction markProductGridItems(container: HTMLElement): void {\n [...container.children].forEach((element) => {\n if (element instanceof HTMLElement) {\n element.classList.add(\"orderly-product-grid__item\");\n configureProductGridItem(element);\n }\n });\n}\n\nfunction configureProductGridItem(element: HTMLElement): void {\n element.style.display ||= \"block\";\n element.style.height ||= \"100%\";\n element.style.minWidth ||= \"0\";\n}\n\nfunction stringArraysEqual(left: string[], right: string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n","import type { SearchObject, StoredImage } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport type { BasketController } from \"../basket.js\";\nimport { storedImageUrl } from \"../utils/format.js\";\nimport { bindCredit, bindImage, bindStoredImage, bindText, cloneTemplate, dispatch, render, replaceSlot, siblingTagName, upgradeFragment } from \"../utils/dom.js\";\nimport { bindProduct } from \"./product-tile.js\";\nimport { formatUiText, uiText } from \"../i18n.js\";\n\nexport class OrderlyProductPageElement extends OrderlyElement {\n static observedAttributes = [\"add-label\"];\n\n private currentProduct?: SearchObject;\n private currentImageIndex = 0;\n private imageOverlayOpen = false;\n\n basketController?: BasketController;\n\n get product(): SearchObject | undefined {\n return this.currentProduct;\n }\n\n set product(value: SearchObject | undefined) {\n this.currentProduct = value;\n this.currentImageIndex = 0;\n this.imageOverlayOpen = false;\n this.updateImageOverlayLock(false);\n this.requestRender();\n }\n\n get selectedImageIndex(): number {\n return this.normalizedImageIndex();\n }\n\n set selectedImageIndex(value: number) {\n this.selectImage(value);\n }\n\n get addLabel(): string {\n return this.getAttribute(\"add-label\") ?? uiText(\"productAddLabel\");\n }\n\n set addLabel(value: string) {\n this.setAttribute(\"add-label\", value);\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n disconnectedCallback(): void {\n this.updateImageOverlayLock(false);\n super.disconnectedCallback();\n }\n\n protected render(): void {\n const product = this.currentProduct;\n const custom = cloneTemplate(this, \"product\") ?? cloneTemplate(this, \"default\");\n const storedImageTagName = siblingTagName(this, \"product-page\", \"stored-image\");\n const root = custom ? upgradeFragment(custom) : defaultProductPage(storedImageTagName, siblingTagName(this, \"product-page\", \"credit\"));\n const image = this.selectedImage();\n bindProduct(root, product);\n bindText(root, \"title\", product?.Title);\n bindText(root, \"description\", product?.Description);\n bindText(root, \"brand\", product?.Brand);\n bindText(root, \"size\", product?.Size);\n bindText(root, \"color\", product?.Color);\n bindText(root, \"condition\", product?.Condition);\n bindCredit(root, \"price\", product?.Price);\n bindText(root, \"addLabel\", this.addLabel);\n bindText(root, \"closeLabel\", uiText(\"closeLabel\"));\n bindStoredImage(root, \"image\", image);\n bindImage(root, \"image\", storedImageUrl(image, \"object\"));\n replaceSlot(root, \"thumbnails\", this.renderThumbnails(storedImageTagName));\n const rendered = render(this, root);\n rendered.querySelector(\"[data-orderly-action=\\\"add-to-basket\\\"]\")?.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n if (product) {\n void this.basketController?.addProduct(product);\n dispatch(this, \"orderly-add-to-basket\", { product, controllerUpdated: Boolean(this.basketController) });\n }\n });\n rendered.querySelectorAll(\"[data-orderly-action=\\\"select-image\\\"]\").forEach((control) => {\n control.addEventListener(\"click\", (event) => {\n const target = event.currentTarget;\n if (target instanceof HTMLElement) {\n this.selectImage(Number(target.dataset.orderlyImageIndex ?? 0));\n }\n });\n });\n this.configureImageOverlay(rendered, image);\n }\n\n private selectedImage(): StoredImage | undefined {\n return this.currentProduct?.Images[this.normalizedImageIndex()];\n }\n\n private normalizedImageIndex(): number {\n const images = this.currentProduct?.Images ?? [];\n if (!images.length) {\n return 0;\n }\n if (this.currentImageIndex < 0) {\n return 0;\n }\n if (this.currentImageIndex >= images.length) {\n return images.length - 1;\n }\n return this.currentImageIndex;\n }\n\n private selectImage(index: number): void {\n const images = this.currentProduct?.Images ?? [];\n if (!images.length) {\n this.currentImageIndex = 0;\n return;\n }\n const requestedIndex = Number.isFinite(index) ? Math.trunc(index) : 0;\n const nextIndex = Math.max(0, Math.min(requestedIndex, images.length - 1));\n if (nextIndex === this.currentImageIndex) {\n return;\n }\n this.currentImageIndex = nextIndex;\n this.requestRender();\n dispatch(this, \"orderly-product-image-selected\", {\n product: this.currentProduct,\n image: images[nextIndex],\n index: nextIndex\n });\n }\n\n private configureImageOverlay(root: HTMLElement, image: StoredImage | undefined): void {\n root.querySelectorAll(\"[data-orderly-action=\\\"open-image\\\"]\").forEach((control) => {\n if (!(control instanceof HTMLElement)) {\n return;\n }\n control.setAttribute(\"aria-label\", uiText(\"productOpenImageLabel\"));\n control.setAttribute(\"title\", uiText(\"productOpenImageLabel\"));\n control.toggleAttribute(\"aria-disabled\", !image);\n if (control instanceof HTMLButtonElement) {\n control.disabled = !image;\n }\n control.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.openImageOverlay();\n });\n });\n\n root.querySelectorAll(\"[data-orderly-action=\\\"close-image-overlay\\\"]\").forEach((control) => {\n if (!(control instanceof HTMLElement)) {\n return;\n }\n control.setAttribute(\"aria-label\", uiText(\"closeLabel\"));\n control.addEventListener(\"click\", (event) => {\n event.preventDefault();\n this.closeImageOverlay();\n });\n });\n\n root.querySelectorAll(\"[data-orderly-image-overlay]\").forEach((element) => {\n if (!(element instanceof HTMLElement)) {\n return;\n }\n element.hidden = !this.imageOverlayOpen;\n element.setAttribute(\"aria-label\", uiText(\"productImageOverlayLabel\"));\n element.addEventListener(\"click\", (event) => {\n if (event.target === element) {\n this.closeImageOverlay();\n }\n });\n element.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n this.closeImageOverlay();\n }\n });\n });\n }\n\n private openImageOverlay(): void {\n if (!this.selectedImage()) {\n return;\n }\n this.imageOverlayOpen = true;\n this.updateImageOverlayLock(true);\n this.requestRender();\n queueMicrotask(() => {\n const close = this.querySelector(\"[data-orderly-action=\\\"close-image-overlay\\\"]\");\n if (close instanceof HTMLElement) {\n close.focus();\n }\n });\n }\n\n private closeImageOverlay(): void {\n if (!this.imageOverlayOpen) {\n return;\n }\n this.imageOverlayOpen = false;\n this.updateImageOverlayLock(false);\n this.requestRender();\n }\n\n private updateImageOverlayLock(open: boolean): void {\n globalThis.document?.body?.classList.toggle(\"orderly-product-image-overlay-open\", open);\n }\n\n private renderThumbnails(storedImageTagName: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const images = this.currentProduct?.Images ?? [];\n const selectedIndex = this.normalizedImageIndex();\n images.forEach((image, index) => {\n const custom = cloneTemplate(this, \"thumbnail\");\n const root = custom ? upgradeFragment(custom) : defaultThumbnail(storedImageTagName);\n bindStoredImage(root, \"thumbnail\", image);\n bindImage(root, \"thumbnail\", storedImageUrl(image));\n bindStoredImage(root, \"image\", image);\n bindImage(root, \"image\", storedImageUrl(image));\n bindText(root, \"index\", `${index + 1}`);\n configureThumbnail(root, index, selectedIndex, this.currentProduct?.Title);\n fragment.append(root);\n });\n return fragment;\n }\n}\n\nfunction defaultProductPage(storedImageTagName: string, creditTagName: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const section = document.createElement(\"section\");\n section.className = \"orderly-product-page\";\n section.innerHTML = `\n <div class=\"orderly-product-page__media\">\n <button class=\"orderly-product-page__image-button\" type=\"button\" data-orderly-action=\"open-image\">\n <${storedImageTagName} class=\"orderly-product-page__image\" data-orderly-bind=\"image\" fit=\"contain\" variant=\"object\"></${storedImageTagName}>\n </button>\n <div class=\"orderly-product-page__thumbnails\" data-orderly-slot=\"thumbnails\"></div>\n </div>\n <div class=\"orderly-product-page__details\">\n <p class=\"orderly-product-page__brand\" data-orderly-bind=\"brand\"></p>\n <h1 class=\"orderly-product-page__title\" data-orderly-bind=\"title\"></h1>\n <${creditTagName} class=\"orderly-product-page__price\" data-orderly-bind=\"price\"></${creditTagName}>\n <p class=\"orderly-product-page__description\" data-orderly-bind=\"description\"></p>\n <dl class=\"orderly-product-page__attributes\">\n <dt>${uiText(\"productDetailSizeLabel\")}</dt><dd data-orderly-bind=\"size\"></dd>\n <dt>${uiText(\"productDetailColorLabel\")}</dt><dd data-orderly-bind=\"color\"></dd>\n <dt>${uiText(\"productDetailConditionLabel\")}</dt><dd data-orderly-bind=\"condition\"></dd>\n </dl>\n <button class=\"orderly-product-page__add\" type=\"button\" data-orderly-action=\"add-to-basket\" data-orderly-bind=\"addLabel\"></button>\n </div>\n <div class=\"orderly-product-page__image-overlay\" data-orderly-image-overlay hidden role=\"dialog\" aria-modal=\"true\" tabindex=\"-1\">\n <button class=\"orderly-product-page__image-overlay-close\" type=\"button\" data-orderly-action=\"close-image-overlay\">\n <span data-orderly-bind=\"closeLabel\"></span>\n </button>\n <div class=\"orderly-product-page__image-overlay-frame\">\n <${storedImageTagName} class=\"orderly-product-page__image-overlay-image\" data-orderly-bind=\"image\" fit=\"contain\" variant=\"object\"></${storedImageTagName}>\n </div>\n </div>\n `;\n fragment.append(section);\n return fragment;\n}\n\nfunction defaultThumbnail(storedImageTagName: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const button = document.createElement(\"button\");\n button.className = \"orderly-product-page__thumbnail\";\n button.type = \"button\";\n button.dataset.orderlyAction = \"select-image\";\n button.innerHTML = `\n <${storedImageTagName} class=\"orderly-product-page__thumbnail-image\" data-orderly-bind=\"thumbnail\" fit=\"contain\"></${storedImageTagName}>\n `;\n fragment.append(button);\n return fragment;\n}\n\nfunction configureThumbnail(root: ParentNode, index: number, selectedIndex: number, title: string | undefined): void {\n root.querySelectorAll(\"[data-orderly-action=\\\"select-image\\\"]\").forEach((element) => {\n if (!(element instanceof HTMLElement)) {\n return;\n }\n element.dataset.orderlyImageIndex = String(index);\n element.dataset.orderlySelected = index === selectedIndex ? \"true\" : \"false\";\n element.setAttribute(\"aria-label\", `${title ? `${title}: ` : \"\"}${formatUiText(\"productImageLabel\", { index: index + 1 })}`);\n if (element instanceof HTMLButtonElement) {\n element.setAttribute(\"aria-pressed\", index === selectedIndex ? \"true\" : \"false\");\n }\n });\n}\n","import type { SearchQuery } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport type { BasketController } from \"../basket.js\";\nimport { defaultShopBaseUrl } from \"../default-shop.js\";\nimport { declarativeQueryAttributes, declarativeSearchQuery } from \"../query.js\";\nimport { bindText, cloneTemplate, render, replaceSlot, siblingTagName, template } from \"../utils/dom.js\";\nimport type { OrderlyProductGridElement } from \"./product-grid.js\";\nimport { uiText } from \"../i18n.js\";\n\n/**\n * Horizontal product list for homepages and editorial collection sections.\n *\n * The rail composes an internal ProductGrid, so it supports the same typed\n * SearchQuery model, default query merging, declarative query attributes, basket\n * controller wiring, and template override conventions as the grid.\n */\nexport class OrderlyProductRailElement extends OrderlyElement {\n static observedAttributes = [\"base-url\", \"title\", \"cta-label\", \"cta-href\", \"empty-label\", \"loading-label\", \"error-label\", ...declarativeQueryAttributes];\n\n private currentQuery?: SearchQuery;\n private currentDefaultQuery?: SearchQuery;\n private controller?: BasketController;\n\n /**\n * Optional shop-wide SearchQuery scope merged into this rail's query.\n *\n * Use this for tenant/account filters or other default restrictions. It is\n * cloned and merged by the internal product grid before SearchService.Search.\n */\n get defaultQuery(): SearchQuery | undefined {\n return this.currentDefaultQuery;\n }\n\n set defaultQuery(value: SearchQuery | undefined) {\n this.currentDefaultQuery = value;\n this.requestRender();\n }\n\n /**\n * Backward-compatible alias for defaultQuery.\n */\n get shopQuery(): SearchQuery | undefined {\n return this.defaultQuery;\n }\n\n set shopQuery(value: SearchQuery | undefined) {\n this.defaultQuery = value;\n }\n\n /**\n * Typed Core SearchQuery for the rail.\n *\n * When omitted, the element falls back to declarative query markup such as\n * `keywords`, `tags`, `order-by`, or a direct child `<query>` element.\n */\n get query(): SearchQuery | undefined {\n return this.currentQuery;\n }\n\n set query(value: SearchQuery | undefined) {\n this.currentQuery = value;\n this.requestRender();\n }\n\n /**\n * Shared basket controller passed to rendered product tiles.\n */\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n this.controller = value;\n this.requestRender();\n }\n\n get title(): string {\n return this.getAttribute(\"title\") ?? \"\";\n }\n\n set title(value: string) {\n this.setAttribute(\"title\", value);\n }\n\n get ctaLabel(): string {\n return this.getAttribute(\"cta-label\") ?? \"\";\n }\n\n set ctaLabel(value: string) {\n this.setAttribute(\"cta-label\", value);\n }\n\n get ctaHref(): string {\n return this.getAttribute(\"cta-href\") ?? \"\";\n }\n\n set ctaHref(value: string) {\n this.setAttribute(\"cta-href\", value);\n }\n\n get emptyLabel(): string {\n return this.getAttribute(\"empty-label\") ?? uiText(\"emptyLabel\");\n }\n\n set emptyLabel(value: string) {\n this.setAttribute(\"empty-label\", value);\n }\n\n get loadingLabel(): string {\n return this.getAttribute(\"loading-label\") ?? uiText(\"loadingLabel\");\n }\n\n set loadingLabel(value: string) {\n this.setAttribute(\"loading-label\", value);\n }\n\n get errorLabel(): string {\n return this.getAttribute(\"error-label\") ?? uiText(\"productsLoadError\");\n }\n\n set errorLabel(value: string) {\n this.setAttribute(\"error-label\", value);\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n const fragment = cloneTemplate(this, \"layout\") ?? defaultProductRail();\n bindText(fragment, \"title\", this.title);\n const grid = this.createGrid();\n configureCta(fragment, this.ctaLabel, this.ctaHref);\n replaceSlot(fragment, \"grid\", grid);\n const root = render(this, fragment);\n customElements.upgrade(root);\n this.configureGrid(root);\n }\n\n protected getDefaultBaseUrl(): string | undefined {\n return defaultShopBaseUrl();\n }\n\n private createGrid(): HTMLElement {\n const gridTagName = siblingTagName(this, \"product-rail\", \"product-grid\");\n const grid = document.createElement(gridTagName) as OrderlyProductGridElement;\n grid.className = \"orderly-product-rail__grid\";\n grid.setAttribute(\"paging\", \"manual\");\n grid.setAttribute(\"loading-label\", this.loadingLabel);\n grid.setAttribute(\"error-label\", this.errorLabel);\n grid.productTileTagName = siblingTagName(this, \"product-rail\", \"product-tile\");\n appendGridTemplate(grid, \"layout\", template(this, \"grid\") ?? defaultRailGridTemplate());\n appendGridTemplate(grid, \"product\", template(this, \"product\"));\n appendGridTemplate(grid, \"loading\", template(this, \"loading\"));\n appendGridTemplate(grid, \"empty\", template(this, \"empty\") ?? defaultRailEmptyTemplate(this.emptyLabel));\n return grid;\n }\n\n private configureGrid(root: ParentNode): void {\n const gridTagName = siblingTagName(this, \"product-rail\", \"product-grid\");\n const grid = root.querySelector(gridTagName) as OrderlyProductGridElement | null;\n if (!grid) {\n return;\n }\n if (this.client) {\n grid.client = this.client;\n } else {\n const baseUrl = this.baseUrl ?? this.getDefaultBaseUrl();\n if (baseUrl) {\n grid.setAttribute(\"base-url\", baseUrl);\n }\n }\n grid.basketController = this.controller;\n grid.defaultQuery = this.currentDefaultQuery;\n grid.query = this.currentQuery ?? declarativeSearchQuery(this);\n }\n}\n\nfunction defaultProductRail(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const section = document.createElement(\"section\");\n section.className = \"orderly-product-rail\";\n section.innerHTML = `\n <header class=\"orderly-product-rail__header\">\n <h2 class=\"orderly-product-rail__title\" data-orderly-bind=\"title\"></h2>\n <a class=\"orderly-product-rail__cta\" data-orderly-bind=\"ctaHref\">\n <span data-orderly-bind=\"ctaLabel\"></span>\n </a>\n </header>\n <div class=\"orderly-product-rail__grid-slot\" data-orderly-slot=\"grid\"></div>\n `;\n fragment.append(section);\n return fragment;\n}\n\nfunction defaultRailGridTemplate(): HTMLTemplateElement {\n const railTemplate = document.createElement(\"template\");\n railTemplate.innerHTML = `\n <section class=\"orderly-product-rail__grid-layout\">\n <div class=\"orderly-product-rail__status\" data-orderly-bind=\"status\"></div>\n <div\n class=\"orderly-product-rail__items\"\n data-orderly-slot=\"items\"\n ></div>\n </section>\n `;\n return railTemplate;\n}\n\nfunction defaultRailEmptyTemplate(label: string): HTMLTemplateElement {\n const emptyTemplate = document.createElement(\"template\");\n emptyTemplate.innerHTML = `<p class=\"orderly-product-rail__empty\">${escapeHtml(label)}</p>`;\n return emptyTemplate;\n}\n\nfunction appendGridTemplate(grid: HTMLElement, name: string, source: HTMLTemplateElement | undefined): void {\n if (!source) {\n return;\n }\n const gridTemplate = document.createElement(\"template\");\n gridTemplate.dataset.orderlyTemplate = name;\n gridTemplate.innerHTML = source.innerHTML;\n grid.append(gridTemplate);\n}\n\nfunction configureCta(root: ParentNode, label: string, href: string): void {\n bindText(root, \"ctaLabel\", label);\n root.querySelectorAll(\"[data-orderly-bind=\\\"ctaHref\\\"], .orderly-product-rail__cta\").forEach((element) => {\n if (element instanceof HTMLAnchorElement) {\n if (href) {\n element.href = href;\n } else {\n element.removeAttribute(\"href\");\n }\n }\n if (element instanceof HTMLElement) {\n element.hidden = !label;\n }\n });\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n","import { clone, create } from \"@bufbuild/protobuf\";\nimport { SearchQuerySchema, type SearchQuery } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport type { OrderlyProductGridElement } from \"./product-grid.js\";\nimport type { BasketController } from \"../basket.js\";\nimport { defaultShopBaseUrl } from \"../default-shop.js\";\nimport { declarativeQueryAttributes, declarativeSearchQuery } from \"../query.js\";\nimport type { SortOption } from \"../types.js\";\nimport { cloneTemplate, render, replaceSlot, siblingTagName, template } from \"../utils/dom.js\";\nimport { uiText } from \"../i18n.js\";\n\nexport type SearchBoxMode = \"textbox\" | \"icon\";\n\nexport class OrderlySearchBoxElement extends OrderlyElement {\n static observedAttributes = [\n \"base-url\",\n \"for\",\n \"mode\",\n \"placeholder\",\n \"label\",\n \"close-label\",\n \"prompt-label\",\n \"loading-label\",\n \"error-label\",\n \"empty-label\",\n \"debounce-ms\",\n ...declarativeQueryAttributes\n ];\n\n grid?: OrderlyProductGridElement;\n private currentQuery?: SearchQuery;\n private currentDefaultQuery?: SearchQuery;\n private controller?: BasketController;\n private overlayOpen = false;\n private inputValue = \"\";\n private activeSearchText = \"\";\n private debounceTimer?: ReturnType<typeof setTimeout>;\n private overlayPortal?: HTMLElement;\n\n get query(): SearchQuery | undefined {\n return this.currentQuery;\n }\n\n set query(value: SearchQuery | undefined) {\n this.currentQuery = value;\n this.requestRender();\n }\n\n get defaultQuery(): SearchQuery | undefined {\n return this.currentDefaultQuery;\n }\n\n set defaultQuery(value: SearchQuery | undefined) {\n this.currentDefaultQuery = value;\n this.requestRender();\n }\n\n get shopQuery(): SearchQuery | undefined {\n return this.defaultQuery;\n }\n\n set shopQuery(value: SearchQuery | undefined) {\n this.defaultQuery = value;\n }\n\n get basketController(): BasketController | undefined {\n return this.controller;\n }\n\n set basketController(value: BasketController | undefined) {\n this.controller = value;\n this.requestRender();\n }\n\n get mode(): SearchBoxMode {\n return normalizeSearchMode(this.getAttribute(\"mode\"));\n }\n\n set mode(value: SearchBoxMode) {\n this.setAttribute(\"mode\", value);\n }\n\n get placeholder(): string {\n return this.getAttribute(\"placeholder\") ?? uiText(\"searchPlaceholder\");\n }\n\n set placeholder(value: string) {\n this.setAttribute(\"placeholder\", value);\n }\n\n get label(): string {\n return this.getAttribute(\"label\") ?? uiText(\"searchLabel\");\n }\n\n set label(value: string) {\n this.setAttribute(\"label\", value);\n }\n\n get closeLabel(): string {\n return this.getAttribute(\"close-label\") ?? uiText(\"closeLabel\");\n }\n\n set closeLabel(value: string) {\n this.setAttribute(\"close-label\", value);\n }\n\n get promptLabel(): string {\n return this.getAttribute(\"prompt-label\") ?? uiText(\"searchPromptLabel\");\n }\n\n set promptLabel(value: string) {\n this.setAttribute(\"prompt-label\", value);\n }\n\n get loadingLabel(): string {\n return this.getAttribute(\"loading-label\") ?? uiText(\"loadingLabel\");\n }\n\n set loadingLabel(value: string) {\n this.setAttribute(\"loading-label\", value);\n }\n\n get errorLabel(): string {\n return this.getAttribute(\"error-label\") ?? uiText(\"productsLoadError\");\n }\n\n set errorLabel(value: string) {\n this.setAttribute(\"error-label\", value);\n }\n\n get emptyLabel(): string {\n return this.getAttribute(\"empty-label\") ?? uiText(\"emptyLabel\");\n }\n\n set emptyLabel(value: string) {\n this.setAttribute(\"empty-label\", value);\n }\n\n get debounceMs(): number {\n const attribute = this.getAttribute(\"debounce-ms\");\n if (attribute === null) {\n return 500;\n }\n const value = Number(attribute);\n return Number.isFinite(value) && value >= 0 ? value : 500;\n }\n\n set debounceMs(value: number) {\n this.setAttribute(\"debounce-ms\", String(value));\n }\n\n disconnectedCallback(): void {\n this.clearDebounce();\n this.removeOverlayPortal();\n this.updateOverlayLock(false);\n super.disconnectedCallback();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === \"mode\" && this.mode === \"textbox\") {\n this.closeOverlay();\n return;\n }\n this.requestRender();\n }\n\n protected render(): void {\n const root = cloneTemplate(this, \"search-box\") ?? (this.mode === \"icon\" ? defaultIconSearchBox() : defaultTextboxSearchBox());\n this.configureSearch(root);\n replaceSlot(root, \"results\", this.renderOverlayResults());\n const rendered = render(this, root);\n this.portalOverlay(rendered);\n }\n\n protected getDefaultBaseUrl(): string | undefined {\n return defaultShopBaseUrl();\n }\n\n private configureSearch(root: ParentNode): void {\n const input = root.querySelector(\"input\");\n if (input instanceof HTMLInputElement) {\n input.type = input.classList.contains(\"orderly-search-box__overlay-input\") ? \"text\" : \"search\";\n input.placeholder = this.placeholder;\n input.value = this.inputValue;\n input.setAttribute(\"aria-label\", this.label);\n if (input.classList.contains(\"orderly-search-box__overlay-input\")) {\n input.autocomplete = \"off\";\n input.setAttribute(\"inputmode\", \"search\");\n }\n input.addEventListener(\"input\", () => this.scheduleSearch(input.value));\n input.addEventListener(\"change\", () => this.scheduleSearch(input.value));\n }\n\n root.querySelectorAll(\"form\").forEach((form) => {\n form.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n this.commitSearch(input instanceof HTMLInputElement ? input.value : \"\");\n });\n });\n\n root.querySelectorAll(\"[data-orderly-action=\\\"search-open\\\"]\").forEach((control) => {\n if (control instanceof HTMLElement) {\n control.setAttribute(\"aria-label\", this.label);\n control.setAttribute(\"aria-expanded\", this.overlayOpen ? \"true\" : \"false\");\n control.addEventListener(\"click\", () => this.openOverlay());\n }\n });\n\n root.querySelectorAll(\"[data-orderly-action=\\\"search-close\\\"]\").forEach((control) => {\n if (control instanceof HTMLElement) {\n control.setAttribute(\"aria-label\", this.closeLabel);\n control.addEventListener(\"click\", () => this.closeOverlay());\n }\n });\n\n root.querySelectorAll(\"[data-orderly-bind=\\\"label\\\"]\").forEach((element) => {\n element.textContent = this.label;\n });\n root.querySelectorAll(\"[data-orderly-bind=\\\"closeLabel\\\"]\").forEach((element) => {\n element.textContent = this.closeLabel;\n });\n root.querySelectorAll(\"[data-orderly-bind=\\\"searchStatus\\\"]\").forEach((element) => {\n element.textContent = this.searchStatusText();\n });\n\n root.querySelectorAll(\"[data-orderly-search-overlay]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.hidden = this.mode !== \"icon\" || !this.overlayOpen;\n element.setAttribute(\"aria-modal\", this.overlayOpen ? \"true\" : \"false\");\n element.addEventListener(\"click\", (event) => {\n if (event.target === element) {\n this.closeOverlay();\n }\n });\n element.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n this.closeOverlay();\n }\n });\n element.addEventListener(\"orderly-product-selected\", (event) => this.forwardProductSelected(event as CustomEvent));\n }\n });\n }\n\n private portalOverlay(root: ParentNode): void {\n this.removeOverlayPortal();\n if (this.mode !== \"icon\" || !this.overlayOpen) {\n return;\n }\n const overlay = root.querySelector(\"[data-orderly-search-overlay]\");\n if (!(overlay instanceof HTMLElement) || typeof document === \"undefined\") {\n return;\n }\n overlay.dataset.orderlyPortal = \"body\";\n overlay.remove();\n document.body.append(overlay);\n this.overlayPortal = overlay;\n }\n\n private removeOverlayPortal(): void {\n this.overlayPortal?.remove();\n this.overlayPortal = undefined;\n }\n\n private renderOverlayResults(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n if (this.mode !== \"icon\" || !this.overlayOpen || !this.activeSearchText) {\n return fragment;\n }\n const grid = this.createOverlayGrid();\n fragment.append(grid);\n return fragment;\n }\n\n private createOverlayGrid(): OrderlyProductGridElement {\n const gridTagName = siblingTagName(this, \"search-box\", \"product-grid\");\n const grid = document.createElement(gridTagName) as OrderlyProductGridElement;\n grid.className = \"orderly-search-box__results-grid\";\n grid.setAttribute(\"paging\", \"dynamic\");\n grid.setAttribute(\"loading-label\", this.loadingLabel);\n grid.setAttribute(\"error-label\", this.errorLabel);\n grid.productTileTagName = siblingTagName(this, \"search-box\", \"product-tile\");\n const targetGrid = this.resolveGrid();\n if (this.client) {\n grid.client = this.client;\n } else if (targetGrid?.client) {\n grid.client = targetGrid.client;\n } else {\n grid.baseUrl = this.baseUrl ?? this.getDefaultBaseUrl();\n }\n grid.basketController = this.controller ?? targetGrid?.basketController;\n grid.defaultQuery = this.currentDefaultQuery ?? targetGrid?.defaultQuery;\n appendSearchGridTemplate(grid, \"product\", template(this, \"product\") ?? (targetGrid ? template(targetGrid, \"product\") : undefined));\n appendSearchGridTemplate(grid, \"loading\", template(this, \"loading\") ?? (targetGrid ? template(targetGrid, \"loading\") : undefined));\n appendSearchGridTemplate(grid, \"empty\", template(this, \"empty\") ?? (targetGrid ? template(targetGrid, \"empty\") : undefined) ?? defaultSearchEmptyTemplate(this.emptyLabel));\n grid.query = this.searchQuery(this.activeSearchText);\n return grid;\n }\n\n private searchQuery(value: string): SearchQuery {\n const base = this.currentQuery ? clone(SearchQuerySchema, this.currentQuery) : declarativeSearchQuery(this) ?? create(SearchQuerySchema, {});\n base.Query = value;\n base.Continuation = undefined;\n return base;\n }\n\n private searchStatusText(): string {\n if (this.mode !== \"icon\" || !this.overlayOpen || this.activeSearchText) {\n return \"\";\n }\n return this.promptLabel;\n }\n\n private scheduleSearch(value: string): void {\n this.inputValue = value;\n this.clearDebounce();\n this.debounceTimer = setTimeout(() => this.commitSearch(value), this.debounceMs);\n }\n\n private commitSearch(value: string): void {\n this.clearDebounce();\n this.inputValue = value;\n const next = value.trim();\n if (this.mode === \"icon\" && this.overlayOpen) {\n if (this.activeSearchText !== next) {\n this.activeSearchText = next;\n this.requestRender();\n }\n return;\n }\n this.applySearch(next);\n }\n\n private clearDebounce(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = undefined;\n }\n }\n\n private applySearch(value: string): void {\n const grid = this.resolveGrid();\n if (!grid) {\n return;\n }\n const next = grid.query ? clone(SearchQuerySchema, grid.query) : create(SearchQuerySchema, {});\n next.Query = value.trim();\n grid.query = next;\n }\n\n private openOverlay(): void {\n if (this.mode !== \"icon\") {\n return;\n }\n this.overlayOpen = true;\n this.updateOverlayLock(true);\n this.requestRender();\n queueMicrotask(() => this.focusInput());\n }\n\n private closeOverlay(): void {\n this.clearDebounce();\n this.overlayOpen = false;\n this.updateOverlayLock(false);\n this.removeOverlayPortal();\n this.requestRender();\n }\n\n private updateOverlayLock(open: boolean): void {\n globalThis.document?.body?.classList.toggle(\"orderly-search-overlay-open\", open);\n }\n\n private focusInput(): void {\n const input = this.overlayPortal?.querySelector(\"input\") ?? this.querySelector(\"input\");\n if (input instanceof HTMLInputElement) {\n input.focus();\n input.select();\n }\n }\n\n private resolveGrid(): OrderlyProductGridElement | undefined {\n if (this.grid) {\n return this.grid;\n }\n const id = this.getAttribute(\"for\");\n return id ? document.getElementById(id) as OrderlyProductGridElement | null ?? undefined : undefined;\n }\n\n private forwardProductSelected(event: CustomEvent): void {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent(\"orderly-product-selected\", {\n bubbles: true,\n composed: true,\n detail: event.detail\n }));\n }\n}\n\nexport class OrderlySortSelectElement extends OrderlyElement {\n grid?: OrderlyProductGridElement;\n options: SortOption[] = [];\n\n protected render(): void {\n const root = cloneTemplate(this, \"sort-select\") ?? defaultSortSelect();\n const select = root.querySelector(\"select\");\n if (!(select instanceof HTMLSelectElement)) {\n render(this, root);\n return;\n }\n select.replaceChildren(...this.options.map((option, index) => {\n const element = document.createElement(\"option\");\n element.value = String(index);\n element.textContent = option.label;\n return element;\n }));\n select.addEventListener(\"change\", () => {\n const option = this.options[Number(select.value)];\n if (option) {\n void this.resolveGrid()?.setSort(option.orderBy);\n }\n });\n render(this, root);\n }\n\n private resolveGrid(): OrderlyProductGridElement | undefined {\n if (this.grid) {\n return this.grid;\n }\n const id = this.getAttribute(\"for\");\n return id ? document.getElementById(id) as OrderlyProductGridElement | null ?? undefined : undefined;\n }\n}\n\nexport class OrderlyFilterPanelElement extends OrderlyElement {\n grid?: OrderlyProductGridElement;\n\n protected render(): void {\n render(this, cloneTemplate(this, \"filter-panel\") ?? defaultFilterPanel());\n }\n}\n\nexport class OrderlyLoadMoreElement extends OrderlyElement {\n grid?: OrderlyProductGridElement;\n\n protected render(): void {\n const root = cloneTemplate(this, \"load-more\") ?? defaultLoadMore();\n const button = root.querySelector(\"[data-orderly-action=\\\"load-more\\\"]\") ?? root.querySelector(\"button\");\n if (!(button instanceof HTMLButtonElement)) {\n render(this, root);\n return;\n }\n button.textContent = this.getAttribute(\"label\") ?? (button.textContent?.trim() || this.textContent?.trim() || uiText(\"loadMoreLabel\"));\n button.addEventListener(\"click\", () => void this.resolveGrid()?.loadNextPage());\n render(this, root);\n }\n\n private resolveGrid(): OrderlyProductGridElement | undefined {\n if (this.grid) {\n return this.grid;\n }\n const id = this.getAttribute(\"for\");\n return id ? document.getElementById(id) as OrderlyProductGridElement | null ?? undefined : undefined;\n }\n}\n\nfunction normalizeSearchMode(value: string | null): SearchBoxMode {\n return value === \"icon\" ? \"icon\" : \"textbox\";\n}\n\nfunction defaultTextboxSearchBox(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const input = document.createElement(\"input\");\n input.className = \"orderly-search-box\";\n input.type = \"search\";\n input.placeholder = uiText(\"searchPlaceholder\");\n fragment.append(input);\n return fragment;\n}\n\nfunction defaultIconSearchBox(): DocumentFragment {\n const template = document.createElement(\"template\");\n template.innerHTML = `\n <div class=\"orderly-search-box-shell orderly-search-box--icon\">\n <button class=\"orderly-search-box__trigger\" type=\"button\" data-orderly-action=\"search-open\">\n <svg class=\"orderly-search-box__trigger-icon\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\" width=\"22\" height=\"22\">\n <path fill=\"currentColor\" d=\"M10.8 4a6.8 6.8 0 0 1 5.4 10.93l3.43 3.44-1.42 1.41-3.42-3.42A6.8 6.8 0 1 1 10.8 4Zm0 2a4.8 4.8 0 1 0 0 9.6 4.8 4.8 0 0 0 0-9.6Z\"></path>\n </svg>\n </button>\n <div class=\"orderly-search-box__overlay\" data-orderly-search-overlay hidden role=\"dialog\">\n <div class=\"orderly-search-box__overlay-shell\">\n <form class=\"orderly-search-box__overlay-form\" role=\"search\">\n <label class=\"orderly-search-box__overlay-label\" data-orderly-bind=\"label\"></label>\n <input class=\"orderly-search-box__overlay-input\" type=\"text\" autocomplete=\"off\" inputmode=\"search\">\n <button class=\"orderly-search-box__close\" type=\"button\" data-orderly-action=\"search-close\">\n <span class=\"orderly-search-box__close-label\" data-orderly-bind=\"closeLabel\"></span>\n <svg class=\"orderly-search-box__close-icon\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\" width=\"20\" height=\"20\">\n <path fill=\"currentColor\" d=\"m6.4 5 5.6 5.6L17.6 5 19 6.4 13.4 12l5.6 5.6-1.4 1.4-5.6-5.6L6.4 19 5 17.6l5.6-5.6L5 6.4 6.4 5Z\"></path>\n </svg>\n </button>\n </form>\n <p class=\"orderly-search-box__overlay-status\" data-orderly-bind=\"searchStatus\"></p>\n <div class=\"orderly-search-box__overlay-results\" data-orderly-slot=\"results\"></div>\n </div>\n </div>\n </div>\n `;\n return template.content.cloneNode(true) as DocumentFragment;\n}\n\nfunction defaultSearchEmptyTemplate(label: string): HTMLTemplateElement {\n const templateElement = document.createElement(\"template\");\n templateElement.dataset.orderlyTemplate = \"empty\";\n templateElement.innerHTML = `<p class=\"orderly-search-box__empty\">${label}</p>`;\n return templateElement;\n}\n\nfunction appendSearchGridTemplate(grid: HTMLElement, name: string, source: HTMLTemplateElement | undefined): void {\n if (!source) {\n return;\n }\n const copy = source.cloneNode(true) as HTMLTemplateElement;\n copy.dataset.orderlyTemplate = name;\n grid.append(copy);\n}\n\nfunction defaultSortSelect(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const select = document.createElement(\"select\");\n select.className = \"orderly-sort-select\";\n fragment.append(select);\n return fragment;\n}\n\nfunction defaultFilterPanel(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const panel = document.createElement(\"section\");\n panel.className = \"orderly-filter-panel\";\n panel.innerHTML = `<slot></slot>`;\n fragment.append(panel);\n return fragment;\n}\n\nfunction defaultLoadMore(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const button = document.createElement(\"button\");\n button.className = \"orderly-load-more\";\n button.type = \"button\";\n button.dataset.orderlyAction = \"load-more\";\n button.textContent = uiText(\"loadMoreLabel\");\n fragment.append(button);\n return fragment;\n}\n","import type { StoredImage } from \"@orderlyshop/core-client\";\nimport { OrderlyElement } from \"../base.js\";\nimport { cloneTemplate, render } from \"../utils/dom.js\";\nimport { storedImageUrl, type StoredImageUrlVariant } from \"../utils/format.js\";\n\nexport class OrderlyStoredImageElement extends OrderlyElement {\n static observedAttributes = [\"alt\", \"fit\", \"variant\", \"loading\", \"decoding\"];\n\n private currentImage?: StoredImage;\n\n get image(): StoredImage | undefined {\n return this.currentImage;\n }\n\n set image(value: StoredImage | undefined) {\n this.currentImage = value;\n this.requestRender();\n }\n\n get alt(): string {\n return this.getAttribute(\"alt\") ?? \"\";\n }\n\n set alt(value: string) {\n this.setAttribute(\"alt\", value);\n }\n\n get fit(): \"cover\" | \"contain\" {\n return this.getAttribute(\"fit\") === \"contain\" ? \"contain\" : \"cover\";\n }\n\n set fit(value: \"cover\" | \"contain\") {\n this.setAttribute(\"fit\", value);\n }\n\n get variant(): StoredImageUrlVariant {\n return this.getAttribute(\"variant\") === \"object\" ? \"object\" : \"thumbnail\";\n }\n\n set variant(value: StoredImageUrlVariant) {\n this.setAttribute(\"variant\", value);\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n protected render(): void {\n const image = this.currentImage;\n const url = storedImageUrl(image, this.variant);\n const root = cloneTemplate(this, \"image\") ?? defaultStoredImage();\n const frame = findImageFrame(root);\n if (frame) {\n setFrameStyle(frame);\n }\n\n if (!image || !url) {\n frame?.setAttribute(\"data-orderly-empty-image\", \"\");\n const img = findImageElement(root);\n img?.removeAttribute(\"src\");\n this.toggleAttribute(\"data-orderly-empty-image\", true);\n const rendered = render(this, root);\n rendered.style.display = \"contents\";\n return;\n }\n\n this.toggleAttribute(\"data-orderly-empty-image\", false);\n const presentation = imagePresentation(image, { crop: this.fit !== \"contain\" });\n if (frame && presentation.aspectRatio) {\n frame.style.aspectRatio = presentation.aspectRatio;\n }\n if (frame && presentation.hasCrop) {\n frame.dataset.orderlyCrop = \"\";\n }\n\n const img = findImageElement(root);\n if (img) {\n img.hidden = false;\n img.addEventListener(\"load\", () => {\n frame?.removeAttribute(\"data-orderly-image-error\");\n img.hidden = false;\n });\n img.addEventListener(\"error\", () => {\n frame?.setAttribute(\"data-orderly-image-error\", \"\");\n img.removeAttribute(\"src\");\n img.hidden = true;\n });\n img.src = url;\n img.alt = this.alt;\n img.loading = (this.getAttribute(\"loading\") as HTMLImageElement[\"loading\"] | null) ?? \"lazy\";\n img.decoding = (this.getAttribute(\"decoding\") as HTMLImageElement[\"decoding\"] | null) ?? \"async\";\n applyImageStyle(img, this.fit, presentation);\n }\n\n const rendered = render(this, root);\n rendered.style.display = \"contents\";\n }\n}\n\nexport interface StoredImagePresentation {\n aspectRatio?: string;\n hasCrop: boolean;\n left: string;\n top: string;\n width: string;\n height: string;\n objectFit: \"cover\" | \"contain\" | \"fill\";\n transform: string;\n transformOrigin: string;\n}\n\nexport function imagePresentation(image: StoredImage, options: { crop?: boolean } = {}): StoredImagePresentation {\n const rotation = normalizeRotation(image.RotationDeg);\n const fullWidth = positive(image.FullWidth);\n const fullHeight = positive(image.FullHeight);\n const crop = options.crop === false ? undefined : normalizedCrop(image, fullWidth, fullHeight);\n if (crop && fullWidth && fullHeight) {\n const cropWidth = crop.right - crop.left;\n const cropHeight = crop.bottom - crop.top;\n return {\n aspectRatio: `${cropWidth} / ${cropHeight}`,\n hasCrop: true,\n left: `${(-crop.left / cropWidth) * 100}%`,\n top: `${(-crop.top / cropHeight) * 100}%`,\n width: `${(fullWidth / cropWidth) * 100}%`,\n height: `${(fullHeight / cropHeight) * 100}%`,\n objectFit: \"fill\",\n transform: rotation ? `rotate(${rotation}deg)` : \"\",\n transformOrigin: `${((crop.left + cropWidth / 2) / fullWidth) * 100}% ${((crop.top + cropHeight / 2) / fullHeight) * 100}%`\n };\n }\n return {\n aspectRatio: fullWidth && fullHeight ? `${fullWidth} / ${fullHeight}` : undefined,\n hasCrop: false,\n left: \"0\",\n top: \"0\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n transform: rotation ? `rotate(${rotation}deg)` : \"\",\n transformOrigin: \"center\"\n };\n}\n\nfunction setFrameStyle(frame: HTMLElement): void {\n frame.style.position = \"relative\";\n frame.style.display = \"block\";\n frame.style.width = \"100%\";\n frame.style.height = \"100%\";\n frame.style.minWidth = \"0\";\n frame.style.minHeight = \"0\";\n frame.style.overflow = \"hidden\";\n}\n\nfunction applyImageStyle(img: HTMLImageElement, fit: \"cover\" | \"contain\", presentation: StoredImagePresentation): void {\n img.style.position = \"absolute\";\n img.style.inset = \"auto\";\n img.style.left = presentation.left;\n img.style.top = presentation.top;\n img.style.width = presentation.width;\n img.style.height = presentation.height;\n img.style.maxWidth = \"none\";\n img.style.maxHeight = \"none\";\n img.style.objectFit = presentation.hasCrop ? presentation.objectFit : fit;\n img.style.transform = presentation.transform;\n img.style.transformOrigin = presentation.transformOrigin;\n}\n\nfunction defaultStoredImage(): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const frame = document.createElement(\"span\");\n frame.className = \"orderly-stored-image__frame\";\n frame.setAttribute(\"data-orderly-stored-image-frame\", \"\");\n const img = document.createElement(\"img\");\n img.className = \"orderly-stored-image__img\";\n img.setAttribute(\"data-orderly-bind\", \"image\");\n frame.append(img);\n fragment.append(frame);\n return fragment;\n}\n\nfunction findImageFrame(root: ParentNode): HTMLElement | undefined {\n const explicit = root.querySelector(\"[data-orderly-stored-image-frame], [data-orderly-bind=\\\"frame\\\"]\");\n if (explicit instanceof HTMLElement) {\n return explicit;\n }\n const img = findImageElement(root);\n return img?.parentElement ?? undefined;\n}\n\nfunction findImageElement(root: ParentNode): HTMLImageElement | undefined {\n const img = root.querySelector(\"img[data-orderly-bind=\\\"image\\\"], img\");\n return img instanceof HTMLImageElement ? img : undefined;\n}\n\nfunction normalizedCrop(image: StoredImage, fullWidth: number | undefined, fullHeight: number | undefined): { left: number; top: number; right: number; bottom: number } | undefined {\n const left = finite(image.CropTopX);\n const top = finite(image.CropTopY);\n const right = finite(image.CropBottomX);\n const bottom = finite(image.CropBottomY);\n if (left === undefined || top === undefined || right === undefined || bottom === undefined || right <= left || bottom <= top) {\n return undefined;\n }\n if (fullWidth && fullHeight) {\n const looksLikePercent = right <= 100 && bottom <= 100;\n return looksLikePercent\n ? {\n left: (left / 100) * fullWidth,\n top: (top / 100) * fullHeight,\n right: (right / 100) * fullWidth,\n bottom: (bottom / 100) * fullHeight\n }\n : { left, top, right, bottom };\n }\n return undefined;\n}\n\nfunction normalizeRotation(value: number | undefined): number {\n if (!value) {\n return 0;\n }\n const normalized = value % 360;\n return normalized < 0 ? normalized + 360 : normalized;\n}\n\nfunction finite(value: number | undefined): number | undefined {\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction positive(value: number | undefined): number | undefined {\n return value !== undefined && value > 0 ? value : undefined;\n}\n","export const ORDERLY_LAZY_LOAD_CSS = `\norderly-page-layout,\norderly-home-page,\norderly-collection-page,\norderly-product-grid,\norderly-product-detail-page,\norderly-product-rail,\norderly-product-tile,\norderly-product-page,\norderly-basket,\norderly-basket-icon,\norderly-checkout,\norderly-checkout-page,\norderly-navigation,\norderly-shop-footer,\norderly-stored-image {\n box-sizing: border-box;\n}\n\norderly-page-layout:not(:defined),\norderly-page-layout:not([data-orderly-ready]) {\n display: block;\n min-height: 100vh;\n background: var(--orderly-loading-page-background, #ffffff);\n}\n\norderly-page-layout:not(:defined) > :not(template),\norderly-page-layout:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]) {\n display: none !important;\n}\n\norderly-collection-page > query,\norderly-product-grid > query,\norderly-product-rail > query {\n display: none !important;\n}\n\norderly-home-page:not(:defined),\norderly-home-page:not([data-orderly-ready]) {\n display: block;\n min-height: 100vh;\n background: var(--orderly-loading-page-background, #ffffff);\n}\n\norderly-home-page:not(:defined) > :not(template),\norderly-home-page:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]) {\n display: none !important;\n}\n\norderly-home-page:not(:defined)::before,\norderly-home-page:not([data-orderly-ready])::before {\n content: \"\";\n display: block;\n height: var(--orderly-loading-header-height, 62px);\n border-bottom: 1px solid var(--orderly-loading-border, #d8dee3);\n background: var(--orderly-loading-surface, #ffffff);\n}\n\norderly-home-page:not(:defined)::after,\norderly-home-page:not([data-orderly-ready])::after {\n content: \"\";\n display: block;\n min-height: calc(100vh - var(--orderly-loading-header-height, 62px));\n background:\n linear-gradient(90deg, var(--orderly-loading-surface, #ffffff) 0 280px, transparent 280px),\n linear-gradient(90deg, transparent 0 300px, var(--orderly-loading-highlight, #eef2f4) 300px 100%);\n}\n\norderly-page-layout:not(:defined)::before,\norderly-page-layout:not([data-orderly-ready])::before {\n content: \"\";\n display: block;\n height: var(--orderly-loading-header-height, 62px);\n border-bottom: 1px solid var(--orderly-loading-border, #d8dee3);\n background:\n linear-gradient(90deg, var(--orderly-loading-highlight, #f6f8f9) 0 120px, transparent 120px),\n var(--orderly-loading-surface, #ffffff);\n}\n\norderly-page-layout:not(:defined)::after,\norderly-page-layout:not([data-orderly-ready])::after {\n content: \"\";\n display: block;\n min-height: calc(100vh - var(--orderly-loading-header-height, 62px));\n background:\n linear-gradient(90deg, var(--orderly-loading-surface, #ffffff) 0 280px, transparent 280px),\n linear-gradient(90deg, transparent 0 300px, var(--orderly-loading-highlight, #eef2f4) 300px 100%);\n}\n\norderly-collection-page:not([data-orderly-ready]),\norderly-product-grid:not([data-orderly-ready]),\norderly-product-detail-page:not([data-orderly-ready]),\norderly-product-rail:not([data-orderly-ready]),\norderly-product-page:not([data-orderly-ready]),\norderly-basket:not([data-orderly-ready]),\norderly-checkout:not([data-orderly-ready]),\norderly-checkout-page:not([data-orderly-ready]),\norderly-navigation:not([data-orderly-ready]),\norderly-shop-footer:not([data-orderly-ready]) {\n display: block;\n min-height: var(--orderly-loading-block-min-height, 120px);\n}\n\norderly-collection-page:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]),\norderly-product-grid:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]),\norderly-product-detail-page:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]),\norderly-product-rail:not([data-orderly-ready]) > :not(template):not(query):not([data-orderly-render-root]),\norderly-product-page:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]),\norderly-basket:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]),\norderly-checkout:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]),\norderly-checkout-page:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]),\norderly-navigation:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]),\norderly-shop-footer:not([data-orderly-ready]) > :not(template):not([data-orderly-render-root]) {\n display: none !important;\n}\n\norderly-collection-page:not([data-orderly-ready])::before,\norderly-product-grid:not([data-orderly-ready])::before,\norderly-product-detail-page:not([data-orderly-ready])::before,\norderly-product-rail:not([data-orderly-ready])::before,\norderly-product-page:not([data-orderly-ready])::before,\norderly-basket:not([data-orderly-ready])::before,\norderly-checkout:not([data-orderly-ready])::before,\norderly-checkout-page:not([data-orderly-ready])::before,\norderly-navigation:not([data-orderly-ready])::before,\norderly-shop-footer:not([data-orderly-ready])::before {\n content: \"\";\n display: block;\n min-height: var(--orderly-loading-block-min-height, 120px);\n border-radius: var(--orderly-loading-radius, 8px);\n background: linear-gradient(\n 90deg,\n var(--orderly-skeleton-base, #eef2f4),\n var(--orderly-skeleton-highlight, #f8fafb),\n var(--orderly-skeleton-base, #eef2f4)\n );\n background-size: 200% 100%;\n}\n\n.orderly-skeleton {\n background: linear-gradient(\n 90deg,\n var(--orderly-skeleton-base, #eef2f4),\n var(--orderly-skeleton-highlight, #f8fafb),\n var(--orderly-skeleton-base, #eef2f4)\n );\n background-size: 200% 100%;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .orderly-skeleton,\n orderly-collection-page:not([data-orderly-ready])::before,\n orderly-product-grid:not([data-orderly-ready])::before,\n orderly-product-detail-page:not([data-orderly-ready])::before,\n orderly-product-rail:not([data-orderly-ready])::before,\n orderly-product-page:not([data-orderly-ready])::before,\n orderly-basket:not([data-orderly-ready])::before,\n orderly-checkout:not([data-orderly-ready])::before,\n orderly-checkout-page:not([data-orderly-ready])::before,\n orderly-navigation:not([data-orderly-ready])::before,\n orderly-shop-footer:not([data-orderly-ready])::before {\n animation: orderly-skeleton-loading 1.2s ease-in-out infinite;\n }\n}\n\n@keyframes orderly-skeleton-loading {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n`;\n\nexport function installOrderlyLazyLoadStyles(target: Document | undefined = globalThis.document): HTMLStyleElement | undefined {\n if (!target?.head) {\n return undefined;\n }\n const existing = target.getElementById(\"orderly-lazy-load-styles\");\n if (existing instanceof HTMLStyleElement) {\n return existing;\n }\n const style = target.createElement(\"style\");\n style.id = \"orderly-lazy-load-styles\";\n style.dataset.orderlyLazyLoad = \"\";\n style.textContent = ORDERLY_LAZY_LOAD_CSS;\n target.head.append(style);\n return style;\n}\n","import type { UIMenu, WebsitePage } from \"@orderlyshop/core-client\";\nimport type { NavigationItem, NavigationSelectionDetail } from \"./types.js\";\nimport { bindText, cloneTemplate, dispatch, observeResponsiveTemplateChanges, render, replaceSlot } from \"./utils/dom.js\";\nimport { formatUiText, uiText } from \"./i18n.js\";\n\nexport class NavigationController extends EventTarget {\n items: NavigationItem[] = [];\n activePath = locationPath();\n expandedIds = new Set<string>();\n menuOpen = false;\n\n setItems(items: NavigationItem[]): void {\n this.items = items;\n this.emitChange();\n }\n\n setActivePath(path: string): void {\n this.activePath = path;\n this.emitChange();\n }\n\n toggle(id: string): void {\n if (this.expandedIds.has(id)) {\n this.expandedIds.delete(id);\n } else {\n this.expandedIds.add(id);\n }\n this.emitChange();\n }\n\n closeAll(): void {\n this.expandedIds.clear();\n this.emitChange();\n }\n\n openMenu(): void {\n if (!this.menuOpen) {\n this.menuOpen = true;\n this.emitChange();\n }\n }\n\n closeMenu(): void {\n if (this.menuOpen) {\n this.menuOpen = false;\n this.emitChange();\n }\n }\n\n toggleMenu(): void {\n this.menuOpen = !this.menuOpen;\n this.emitChange();\n }\n\n select(item: NavigationItem): void {\n this.dispatchEvent(new CustomEvent<NavigationSelectionDetail>(\"select\", {\n detail: { item }\n }));\n }\n\n isActive(item: NavigationItem): boolean {\n return Boolean(item.href && normalizePath(item.href) === normalizePath(this.activePath));\n }\n\n private emitChange(): void {\n this.dispatchEvent(new Event(\"change\"));\n }\n}\n\nexport abstract class OrderlyNavigationElement extends HTMLElement {\n static observedAttributes = [\"sticky\"];\n\n readonly controller = new NavigationController();\n private readonly menuPanelId = `orderly-navigation-panel-${nextNavigationId()}`;\n private disconnectResponsiveTemplates?: () => void;\n\n get sticky(): boolean {\n return booleanAttribute(this.getAttribute(\"sticky\"), true);\n }\n\n set sticky(value: boolean) {\n if (value) {\n this.removeAttribute(\"sticky\");\n } else {\n this.setAttribute(\"sticky\", \"false\");\n }\n }\n\n connectedCallback(): void {\n this.disconnectResponsiveTemplates?.();\n this.disconnectResponsiveTemplates = observeResponsiveTemplateChanges(() => this.render());\n this.controller.addEventListener(\"change\", this.onControllerChange);\n this.controller.addEventListener(\"select\", this.onControllerSelect as EventListener);\n this.controller.setItems(this.getNavigationItems());\n this.addEventListener(\"click\", this.onClick);\n this.addEventListener(\"keydown\", this.onKeyDown);\n this.render();\n }\n\n attributeChangedCallback(): void {\n this.updateStickyState();\n if (this.isConnected) {\n this.render();\n }\n }\n\n disconnectedCallback(): void {\n this.controller.removeEventListener(\"change\", this.onControllerChange);\n this.controller.removeEventListener(\"select\", this.onControllerSelect as EventListener);\n this.removeEventListener(\"click\", this.onClick);\n this.removeEventListener(\"keydown\", this.onKeyDown);\n updateBodyNavigationLock(this, false);\n this.disconnectResponsiveTemplates?.();\n this.disconnectResponsiveTemplates = undefined;\n }\n\n refresh(): void {\n this.controller.setItems(this.getNavigationItems());\n }\n\n closeAll(): void {\n this.controller.closeAll();\n }\n\n openMenu(): void {\n this.controller.openMenu();\n }\n\n closeMenu(): void {\n this.controller.closeMenu();\n }\n\n toggleMenu(): void {\n this.controller.toggleMenu();\n }\n\n protected abstract getNavigationItems(): NavigationItem[];\n\n protected render(): void {\n const root = cloneTemplate(this, \"navigation\") ?? defaultNavigation(this.getAttribute(\"aria-label\") ?? uiText(\"mainNavigationLabel\"));\n this.updateStickyState();\n bindNavigationMenu(root, this.controller, this.menuPanelId, this.sticky);\n replaceSlot(root, \"items\", renderItems(this.controller, this.controller.items, this));\n render(this, root);\n }\n\n private updateStickyState(): void {\n this.dataset.orderlyNavigationHost = \"\";\n this.dataset.orderlySticky = String(this.sticky);\n }\n\n private readonly onControllerChange = (): void => {\n updateBodyNavigationLock(this, this.controller.menuOpen);\n this.render();\n };\n\n private readonly onControllerSelect = (event: CustomEvent<NavigationSelectionDetail>): void => {\n dispatch(this, \"orderly-navigation-select\", event.detail);\n };\n\n private readonly onClick = (event: MouseEvent): void => {\n const target = event.target as HTMLElement | null;\n const menuToggle = target?.closest(\"[data-orderly-nav-menu-toggle], [data-orderly-action=\\\"menu-toggle\\\"]\");\n const menuClose = target?.closest(\"[data-orderly-action=\\\"menu-close\\\"]\");\n const toggle = target?.closest(\"[data-orderly-nav-toggle]\");\n const link = target?.closest(\"[data-orderly-nav-id]\");\n const parent = target?.closest(\"[data-orderly-nav-parent]\");\n if (menuToggle instanceof HTMLElement) {\n event.preventDefault();\n this.controller.toggleMenu();\n return;\n }\n if (menuClose instanceof HTMLElement) {\n event.preventDefault();\n this.controller.closeMenu();\n return;\n }\n if (toggle instanceof HTMLElement) {\n event.preventDefault();\n this.controller.toggle(toggle.dataset.orderlyNavToggle ?? \"\");\n return;\n }\n if (link instanceof HTMLElement) {\n const item = findItem(this.controller.items, link.dataset.orderlyNavId ?? \"\");\n if (item) {\n if (item.children?.length && !this.controller.expandedIds.has(item.id)) {\n event.preventDefault();\n this.controller.toggle(item.id);\n return;\n }\n this.controller.select(item);\n this.controller.closeMenu();\n }\n return;\n }\n if (parent instanceof HTMLElement && target === parent) {\n this.controller.toggle(parent.dataset.orderlyNavParent ?? \"\");\n }\n };\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n this.controller.closeAll();\n this.controller.closeMenu();\n }\n };\n}\n\nexport class OrderlyNavigationMenuElement extends OrderlyNavigationElement {\n items: NavigationItem[] = [];\n\n protected getNavigationItems(): NavigationItem[] {\n return this.items;\n }\n}\n\nexport function navigationItemsFromUIMenu(menus: UIMenu[]): NavigationItem[] {\n return menus.map((menu, index) => {\n const label = menu.Link?.DisplayName ?? menu.Link?.URL ?? formatUiText(\"navigationItemFallbackLabel\", { index: index + 1 });\n return {\n id: menu.Link?.URL ?? `${index}`,\n label,\n href: menu.Link?.URL,\n menu,\n children: navigationItemsFromUIMenu(menu.Children)\n };\n });\n}\n\nexport function navigationItemsFromWebsitePages(pages: WebsitePage[]): NavigationItem[] {\n return pages.map((page) => ({\n id: page.Id?.Id?.Value ?? page.Path,\n label: page.DisplayName,\n href: page.Path,\n page\n }));\n}\n\nfunction renderItems(controller: NavigationController, items: NavigationItem[], host: HTMLElement, listId?: string): HTMLUListElement {\n const list = document.createElement(\"ul\");\n list.className = \"orderly-navigation__list\";\n if (listId) {\n list.id = listId;\n }\n for (const item of items) {\n const custom = cloneTemplate(host, \"item\");\n if (custom) {\n bindNavigationItem(custom, controller, item, host);\n list.append(custom);\n continue;\n }\n const element = document.createElement(\"li\");\n element.className = \"orderly-navigation__item\";\n element.dataset.orderlyItem = item.id;\n const link = document.createElement(\"a\");\n link.className = \"orderly-navigation__link\";\n link.dataset.orderlyNavId = item.id;\n link.textContent = item.label;\n link.href = item.href ?? \"#\";\n if (item.target) {\n link.target = item.target;\n }\n if (controller.isActive(item)) {\n link.setAttribute(\"aria-current\", \"page\");\n }\n if (item.disabled) {\n link.setAttribute(\"aria-disabled\", \"true\");\n }\n element.append(link);\n if (item.children?.length) {\n const childListId = `orderly-navigation-children-${safeDomId(item.id)}`;\n element.dataset.orderlyHasChildren = \"true\";\n element.dataset.orderlyNavParent = item.id;\n const button = document.createElement(\"button\");\n button.className = \"orderly-navigation__toggle\";\n button.type = \"button\";\n button.dataset.orderlyNavToggle = item.id;\n button.setAttribute(\"aria-expanded\", String(controller.expandedIds.has(item.id)));\n button.setAttribute(\"aria-controls\", childListId);\n button.setAttribute(\"aria-label\", controller.expandedIds.has(item.id) ? formatUiText(\"collapseLabel\", { label: item.label }) : formatUiText(\"expandLabel\", { label: item.label }));\n button.innerHTML = `\n <svg class=\"orderly-navigation__chevron\" viewBox=\"0 0 20 20\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"m7 5 5 5-5 5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n `;\n element.append(button);\n if (controller.expandedIds.has(item.id)) {\n element.append(renderItems(controller, item.children, host, childListId));\n }\n }\n list.append(element);\n }\n return list;\n}\n\nfunction defaultNavigation(label: string): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const nav = document.createElement(\"nav\");\n nav.className = \"orderly-navigation\";\n nav.setAttribute(\"aria-label\", label);\n nav.innerHTML = `\n <button class=\"orderly-navigation__menu-button\" type=\"button\" data-orderly-action=\"menu-toggle\">\n <span class=\"orderly-navigation__menu-icon\" aria-hidden=\"true\"></span>\n <span class=\"orderly-navigation__menu-label\">${uiText(\"menuLabel\")}</span>\n </button>\n <button class=\"orderly-navigation__backdrop\" type=\"button\" data-orderly-action=\"menu-close\" aria-label=\"${uiText(\"closeMenuLabel\")}\"></button>\n <div class=\"orderly-navigation__panel\" data-orderly-menu-panel>\n <button class=\"orderly-navigation__close\" type=\"button\" data-orderly-action=\"menu-close\" aria-label=\"${uiText(\"closeMenuLabel\")}\">\n <span aria-hidden=\"true\">×</span>\n </button>\n <div data-orderly-slot=\"items\"></div>\n </div>\n `;\n fragment.append(nav);\n return fragment;\n}\n\nfunction bindNavigationMenu(root: ParentNode, controller: NavigationController, panelId: string, sticky: boolean): void {\n let resolvedPanelId = panelId;\n root.querySelectorAll(\".orderly-navigation, [data-orderly-navigation]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.dataset.orderlyMenuOpen = String(controller.menuOpen);\n element.dataset.orderlySticky = String(sticky);\n }\n });\n\n root.querySelectorAll(\"[data-orderly-menu-panel]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.id ||= panelId;\n resolvedPanelId = element.id;\n element.dataset.orderlyMenuOpen = String(controller.menuOpen);\n }\n });\n\n root.querySelectorAll(\"[data-orderly-nav-menu-toggle], [data-orderly-action=\\\"menu-toggle\\\"]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.dataset.orderlyNavMenuToggle = \"\";\n element.setAttribute(\"aria-expanded\", String(controller.menuOpen));\n element.setAttribute(\"aria-controls\", resolvedPanelId);\n }\n });\n}\n\nfunction bindNavigationItem(root: ParentNode, controller: NavigationController, item: NavigationItem, host: HTMLElement): void {\n const active = controller.isActive(item);\n bindText(root, \"label\", item.label);\n root.querySelectorAll(\"[data-orderly-item]\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.dataset.orderlyItem = item.id;\n element.toggleAttribute(\"data-orderly-active\", active);\n element.toggleAttribute(\"data-orderly-disabled\", Boolean(item.disabled));\n element.toggleAttribute(\"data-orderly-has-children\", Boolean(item.children?.length));\n if (item.children?.length) {\n element.dataset.orderlyNavParent = item.id;\n } else {\n element.removeAttribute(\"data-orderly-nav-parent\");\n }\n }\n });\n\n const link = root.querySelector(\"[data-orderly-action=\\\"select\\\"], a\");\n if (link instanceof HTMLElement) {\n link.dataset.orderlyNavId = item.id;\n if (link instanceof HTMLAnchorElement) {\n link.href = item.href ?? \"#\";\n if (item.target) {\n link.target = item.target;\n }\n }\n if (active) {\n link.setAttribute(\"aria-current\", \"page\");\n } else {\n link.removeAttribute(\"aria-current\");\n }\n if (item.disabled) {\n link.setAttribute(\"aria-disabled\", \"true\");\n } else {\n link.removeAttribute(\"aria-disabled\");\n }\n }\n\n const toggle = root.querySelector(\"[data-orderly-action=\\\"toggle\\\"], button\");\n if (toggle instanceof HTMLElement) {\n if (item.children?.length) {\n toggle.hidden = false;\n toggle.dataset.orderlyNavToggle = item.id;\n toggle.setAttribute(\"aria-expanded\", String(controller.expandedIds.has(item.id)));\n toggle.setAttribute(\"aria-controls\", `orderly-navigation-children-${safeDomId(item.id)}`);\n toggle.setAttribute(\"aria-label\", controller.expandedIds.has(item.id) ? formatUiText(\"collapseLabel\", { label: item.label }) : formatUiText(\"expandLabel\", { label: item.label }));\n } else {\n toggle.hidden = true;\n toggle.removeAttribute(\"data-orderly-nav-toggle\");\n toggle.removeAttribute(\"aria-controls\");\n }\n }\n\n const children = item.children?.length && controller.expandedIds.has(item.id)\n ? renderItems(controller, item.children, host, `orderly-navigation-children-${safeDomId(item.id)}`)\n : undefined;\n replaceSlot(root, \"children\", children);\n}\n\nfunction findItem(items: NavigationItem[], id: string): NavigationItem | undefined {\n for (const item of items) {\n if (item.id === id) {\n return item;\n }\n const child = item.children ? findItem(item.children, id) : undefined;\n if (child) {\n return child;\n }\n }\n return undefined;\n}\n\nfunction normalizePath(path: string): string {\n try {\n const url = new URL(path, \"https://orderly.local\");\n return `${url.pathname}${url.search}${url.hash}`;\n } catch {\n return path;\n }\n}\n\nfunction locationPath(): string {\n try {\n const current = globalThis.location;\n return current ? `${current.pathname}${current.search}${current.hash}` : \"/\";\n } catch {\n return \"/\";\n }\n}\n\nfunction booleanAttribute(value: string | null, fallback: boolean): boolean {\n if (value === null) {\n return fallback;\n }\n const normalized = value.trim().toLowerCase();\n return normalized !== \"false\" && normalized !== \"0\" && normalized !== \"off\";\n}\n\nlet navigationId = 0;\nconst openNavigationMenus = new Set<HTMLElement>();\n\nfunction nextNavigationId(): number {\n navigationId += 1;\n return navigationId;\n}\n\nfunction safeDomId(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]+/g, \"-\");\n}\n\nfunction updateBodyNavigationLock(host: HTMLElement, open: boolean): void {\n if (typeof document === \"undefined\") {\n return;\n }\n if (open) {\n openNavigationMenus.add(host);\n } else {\n openNavigationMenus.delete(host);\n }\n document.body?.classList.toggle(\"orderly-navigation-menu-open\", openNavigationMenus.size > 0);\n}\n","export const ORDERLY_DEFAULT_CSS = `\n:root {\n --orderly-color-text: #1e1e1e;\n --orderly-color-muted: #6d6d6d;\n --orderly-color-border: #e5e5e5;\n --orderly-color-surface: #ffffff;\n --orderly-color-page: #f4f4f4;\n --orderly-color-accent: #ef5a24;\n --orderly-color-accent-soft: #fff1ed;\n --orderly-color-danger: #b91c1c;\n --orderly-color-on-dark: #ffffff;\n --orderly-color-strong: #111111;\n --orderly-color-text-soft: #222222;\n --orderly-color-border-subtle: #ececec;\n --orderly-color-border-strong: #d4d4d4;\n --orderly-color-control-border: #cfcfcf;\n --orderly-color-control-muted-border: #aeb8c2;\n --orderly-color-card-border: #e4e4e4;\n --orderly-color-image-border: #e7e4dc;\n --orderly-color-selected-soft: #fff5ef;\n --orderly-shadow-sm: 0 4px 16px rgba(20, 20, 20, 0.05);\n --orderly-shadow-md: 0 8px 24px rgba(20, 20, 20, 0.08);\n --orderly-radius: 3px;\n --orderly-radius-control: 8px;\n --orderly-radius-pill: 999px;\n --orderly-border: 1px solid var(--orderly-color-border);\n --orderly-border-control: 1px solid var(--orderly-color-control-border);\n --orderly-border-card: 1px solid var(--orderly-color-card-border);\n --orderly-border-subtle: 1px solid var(--orderly-color-border-subtle);\n --orderly-focus-ring: 0 0 0 3px rgba(239, 90, 36, 0.22);\n --orderly-focus-outline: 3px solid rgba(239, 90, 36, 0.32);\n --orderly-control-height: 42px;\n --orderly-control-padding-x: 12px;\n --orderly-icon-button-size: 42px;\n --orderly-icon-button-radius: var(--orderly-radius-control);\n --orderly-panel-padding: 24px;\n --orderly-card-padding: 14px 16px;\n --orderly-section-gap: 18px;\n --orderly-item-gap: 12px;\n --orderly-product-action-width: 42px;\n --orderly-product-action-height: 34px;\n --orderly-content-max-width: 1280px;\n color: var(--orderly-color-text);\n font-family: Roboto, \"Segoe UI\", Arial, sans-serif;\n line-height: 1.5;\n}\n\nbody:has(orderly-home-page),\nbody:has(orderly-category-page),\nbody:has(orderly-product-detail-page),\nbody:has(orderly-checkout-page) {\n min-width: 320px;\n margin: 0;\n overflow-x: hidden;\n background: var(--orderly-color-page);\n color: var(--orderly-color-text);\n -webkit-font-smoothing: antialiased;\n}\n\nbody.orderly-navigation-menu-open {\n overflow: hidden;\n}\n\nbody.orderly-search-overlay-open {\n overflow: hidden;\n}\n\nbody.orderly-product-image-overlay-open {\n overflow: hidden;\n}\n\n.orderly-page-layout *,\n.orderly-product-grid *,\n.orderly-product-rail *,\n.orderly-product-tile *,\n.orderly-product-page *,\n.orderly-basket *,\n.orderly-checkout *,\n.orderly-shop-footer *,\n.orderly-navigation *,\n.orderly-search-box *,\n.orderly-search-box-shell *,\n.orderly-search-box__overlay *,\n.orderly-credit * {\n box-sizing: border-box;\n}\n\n.orderly-page-layout button,\n.orderly-product-grid button,\n.orderly-product-rail button,\n.orderly-product-tile button,\n.orderly-product-page button,\n.orderly-basket button,\n.orderly-checkout button,\n.orderly-navigation button,\n.orderly-search-box button,\n.orderly-search-box__trigger,\n.orderly-search-box__close,\n.orderly-page-layout input,\n.orderly-product-grid input,\n.orderly-basket input,\n.orderly-checkout input,\n.orderly-search-box input,\ninput.orderly-search-box,\n.orderly-search-box__overlay-input,\n.orderly-product-grid select,\n.orderly-checkout select {\n font: inherit;\n}\n\n.orderly-page-layout button,\n.orderly-product-grid button,\n.orderly-product-rail button,\n.orderly-product-tile button,\n.orderly-product-page button,\n.orderly-basket button,\n.orderly-checkout button,\n.orderly-navigation button,\n.orderly-search-box button {\n border: 1px solid var(--orderly-color-text);\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-text);\n color: var(--orderly-color-on-dark);\n cursor: pointer;\n}\n\n.orderly-page-layout button:hover,\n.orderly-product-grid button:hover,\n.orderly-product-rail button:hover,\n.orderly-product-tile button:hover,\n.orderly-product-page button:hover,\n.orderly-basket button:hover,\n.orderly-checkout button:hover,\n.orderly-navigation button:hover,\n.orderly-search-box button:hover {\n border-color: var(--orderly-color-accent);\n background: var(--orderly-color-accent);\n}\n\n.orderly-page-layout a,\n.orderly-product-grid a,\n.orderly-product-rail a,\n.orderly-product-tile a,\n.orderly-product-page a,\n.orderly-basket a,\n.orderly-checkout a,\n.orderly-shop-footer a,\n.orderly-navigation a {\n color: inherit;\n}\n\n[data-orderly-ssr-fallback][hidden] {\n display: none !important;\n}\n\n.orderly-ssr-home,\n.orderly-ssr-category {\n display: grid;\n gap: clamp(22px, 4vw, 44px);\n width: min(var(--orderly-content-max-width), 100%);\n margin: 0 auto;\n padding: clamp(18px, 4vw, 44px);\n}\n\n.orderly-ssr-product-detail {\n display: grid;\n grid-template-columns: minmax(0, 0.95fr) minmax(280px, 0.75fr);\n align-items: start;\n gap: clamp(20px, 4vw, 48px);\n width: min(var(--orderly-content-max-width), 100%);\n margin: 0 auto;\n padding: clamp(18px, 4vw, 44px);\n}\n\n.orderly-ssr-product-detail__image {\n display: grid;\n place-items: center;\n aspect-ratio: 1;\n border: var(--orderly-border-card);\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-surface);\n overflow: hidden;\n}\n\n.orderly-ssr-product-detail__image img {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n\n.orderly-ssr-product-detail__text {\n display: grid;\n gap: 10px;\n}\n\n.orderly-ssr-product-detail__text h1,\n.orderly-ssr-product-detail__text p {\n margin: 0;\n}\n\n.orderly-ssr-product-detail__text h1 {\n font-size: clamp(2rem, 4vw, 3.6rem);\n line-height: 1;\n}\n\n.orderly-ssr-home__intro,\n.orderly-ssr-category__hero {\n display: grid;\n gap: 10px;\n}\n\n.orderly-ssr-home__intro h1,\n.orderly-ssr-category__text h1 {\n margin: 0;\n font-size: clamp(2rem, 5vw, 4.4rem);\n line-height: 1;\n}\n\n.orderly-ssr-home__eyebrow,\n.orderly-ssr-category__eyebrow,\n.orderly-ssr-product__text p {\n margin: 0;\n color: var(--orderly-color-muted);\n}\n\n.orderly-ssr-home__rails {\n display: grid;\n gap: clamp(26px, 5vw, 52px);\n}\n\n.orderly-ssr-rail,\n.orderly-ssr-category__text {\n display: grid;\n gap: 14px;\n}\n\n.orderly-ssr-rail__header {\n display: flex;\n align-items: end;\n justify-content: space-between;\n gap: 16px;\n}\n\n.orderly-ssr-rail__header h2,\n.orderly-ssr-rail__header p,\n.orderly-ssr-product__text h3,\n.orderly-ssr-product__text p {\n margin: 0;\n}\n\n.orderly-ssr-rail__items {\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: minmax(160px, 220px);\n gap: 14px;\n overflow-x: auto;\n padding-bottom: 8px;\n}\n\n.orderly-ssr-product-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n gap: 14px;\n}\n\n.orderly-ssr-product {\n min-width: 0;\n border: var(--orderly-border-card);\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-surface);\n overflow: hidden;\n}\n\n.orderly-ssr-product__link {\n display: grid;\n height: 100%;\n color: inherit;\n text-decoration: none;\n}\n\n.orderly-ssr-product__image {\n display: grid;\n place-items: center;\n aspect-ratio: 1;\n background: var(--orderly-color-surface);\n}\n\n.orderly-ssr-product__image img {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n\n.orderly-ssr-product__text {\n display: grid;\n gap: 4px;\n padding: 12px;\n}\n\n.orderly-ssr-breadcrumb {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n color: var(--orderly-color-muted);\n font-size: 0.9rem;\n}\n\n.orderly-ssr-breadcrumb a {\n color: inherit;\n}\n\n.orderly-ssr-category__hero {\n overflow: hidden;\n border: var(--orderly-border-card);\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-surface);\n}\n\n.orderly-ssr-category__hero img {\n width: 100%;\n max-height: 320px;\n object-fit: cover;\n}\n\n.orderly-ssr-category__text {\n padding: clamp(18px, 4vw, 34px);\n}\n\n.orderly-page-layout {\n min-height: 100vh;\n max-width: 100%;\n overflow-x: clip;\n background: var(--orderly-color-page);\n}\n\n.orderly-page-layout__utility {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: 6px 8px;\n min-height: 34px;\n padding: 6px 24px;\n border-bottom: var(--orderly-border);\n background: var(--orderly-color-text);\n color: var(--orderly-color-on-dark);\n font-size: 0.88rem;\n font-weight: 700;\n}\n\n.orderly-page-layout__utility:empty {\n display: none;\n}\n\n.orderly-page-layout__utility > * {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(150px, 100%), 1fr));\n align-items: center;\n justify-items: center;\n gap: 6px clamp(18px, 5vw, 72px);\n width: min(var(--orderly-content-max-width), 100%);\n min-width: 0;\n margin: 0 auto;\n}\n\n.orderly-page-layout__utility > :empty {\n display: none;\n}\n\n.orderly-page-layout__utility > * > * {\n min-width: 0;\n text-align: center;\n}\n\n.orderly-page-layout__header {\n position: sticky;\n top: 0;\n z-index: 30;\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 16px;\n padding: 14px 24px;\n border-bottom: var(--orderly-border);\n background: rgba(255, 255, 255, 0.96);\n box-shadow: none;\n backdrop-filter: blur(12px);\n}\n\n.orderly-page-layout__header-main,\n.orderly-page-layout__header-actions {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.orderly-page-layout__header-main {\n flex: 1 1 auto;\n gap: 10px;\n}\n\n.orderly-page-layout__header-actions {\n flex: 0 0 auto;\n gap: 10px;\n}\n\n.orderly-page-layout__logo {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n}\n\n.orderly-page-layout__logo-image {\n display: block;\n width: 36px;\n height: 36px;\n}\n\n.orderly-category-page__brand,\n.orderly-home-page__brand,\n.orderly-checkout-page__brand,\n.orderly-product-detail-page__brand {\n color: var(--orderly-color-text);\n font-size: 1.08rem;\n font-weight: 800;\n letter-spacing: 0;\n text-decoration: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n overflow-wrap: anywhere;\n}\n\n.orderly-page-layout__primary-nav {\n --orderly-navigation-sticky-top: var(--orderly-page-layout-sticky-top, 65px);\n border-bottom: 1px solid var(--orderly-color-border);\n background: var(--orderly-color-surface);\n}\n\n.orderly-page-layout__body {\n display: grid;\n grid-template-columns: minmax(220px, 280px) minmax(0, 1fr);\n min-height: calc(100vh - 62px);\n max-width: 100%;\n overflow-x: clip;\n}\n\n.orderly-page-layout__left {\n --orderly-navigation-sticky-top: var(--orderly-page-layout-sticky-top, 65px);\n border-right: 1px solid var(--orderly-color-border);\n background: var(--orderly-color-surface);\n}\n\n.orderly-page-layout__right {\n --orderly-navigation-sticky-top: var(--orderly-page-layout-sticky-top, 65px);\n}\n\n.orderly-page-layout__content {\n min-width: 0;\n max-width: 100%;\n}\n\n.orderly-page-layout__left:empty,\n.orderly-page-layout__right:empty,\n.orderly-page-layout__footer:empty,\n.orderly-page-layout__primary-nav:empty,\n.orderly-page-layout__primary-nav[hidden] {\n display: none;\n}\n\n.orderly-page-layout__body:has(.orderly-page-layout__left:empty) {\n grid-template-columns: 1fr;\n}\n\n.orderly-page-layout__footer {\n border-top: 1px solid var(--orderly-color-border);\n background: var(--orderly-color-surface);\n}\n\n.orderly-navigation {\n padding: 18px 16px 22px;\n}\n\n[data-orderly-navigation-host][data-orderly-sticky=\"true\"] {\n position: sticky;\n top: var(--orderly-navigation-sticky-top, 0px);\n z-index: var(--orderly-navigation-sticky-z-index, 25);\n display: block;\n align-self: start;\n max-height: calc(100vh - var(--orderly-navigation-sticky-top, 0px));\n overflow: auto;\n overscroll-behavior: contain;\n}\n\n.orderly-navigation[data-orderly-sticky=\"true\"] {\n position: sticky;\n top: var(--orderly-navigation-sticky-top, 0px);\n z-index: var(--orderly-navigation-sticky-z-index, 25);\n}\n\n[data-orderly-navigation-host][data-orderly-sticky=\"false\"],\n.orderly-navigation[data-orderly-sticky=\"false\"] {\n position: static;\n max-height: none;\n overflow: visible;\n}\n\n.orderly-navigation__menu-button {\n display: none;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n min-height: 44px;\n padding: 0 12px;\n}\n\n.orderly-navigation__menu-icon {\n position: relative;\n width: 18px;\n height: 12px;\n border-top: 2px solid currentColor;\n border-bottom: 2px solid currentColor;\n}\n\n.orderly-navigation__menu-icon::before {\n position: absolute;\n top: 3px;\n left: 0;\n width: 18px;\n border-top: 2px solid currentColor;\n content: \"\";\n}\n\n.orderly-navigation__backdrop,\n.orderly-navigation__close {\n display: none;\n}\n\n.orderly-navigation__list {\n display: grid;\n gap: 0;\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.orderly-navigation__item {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 4px;\n}\n\n.orderly-navigation__item .orderly-navigation__list {\n grid-column: 1 / -1;\n margin-left: 8px;\n padding-left: 12px;\n border-left: 1px solid var(--orderly-color-border);\n}\n\n.orderly-navigation__link {\n min-width: 0;\n padding: 10px 8px;\n border-radius: 0;\n color: var(--orderly-color-text);\n font-size: 0.95rem;\n font-weight: 800;\n overflow-wrap: anywhere;\n text-decoration: none;\n}\n\n.orderly-navigation__item .orderly-navigation__item .orderly-navigation__link {\n color: var(--orderly-color-muted);\n font-size: 0.92rem;\n font-weight: 600;\n}\n\n.orderly-navigation__link:hover {\n background: transparent;\n color: var(--orderly-color-accent);\n}\n\n.orderly-navigation__link[aria-current=\"page\"] {\n background: transparent;\n color: var(--orderly-color-text);\n}\n\n.orderly-navigation .orderly-navigation__toggle {\n display: inline-grid;\n place-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--orderly-color-muted);\n box-shadow: none;\n}\n\n.orderly-navigation .orderly-navigation__toggle:hover {\n border: 0;\n background: var(--orderly-color-page);\n color: var(--orderly-color-accent);\n}\n\n.orderly-navigation__chevron {\n width: 18px;\n height: 18px;\n transition: transform 160ms ease;\n}\n\n.orderly-navigation__toggle[aria-expanded=\"true\"] .orderly-navigation__chevron {\n transform: rotate(90deg);\n}\n\n.orderly-search-box--icon,\n.orderly-basket-icon {\n display: inline-flex;\n align-items: center;\n}\n\n.orderly-search-box-shell.orderly-search-box--icon {\n display: contents;\n}\n\n.orderly-search-box__trigger,\n.orderly-search-box__close,\n.orderly-basket-icon,\n.orderly-basket-icon button {\n width: var(--orderly-icon-button-size);\n min-width: var(--orderly-icon-button-size);\n height: var(--orderly-icon-button-size);\n padding: 0;\n}\n\n.orderly-basket-icon {\n position: relative;\n display: inline-grid;\n place-items: center;\n}\n\n.orderly-search-box__trigger,\n.orderly-search-box__close,\n.orderly-basket-icon {\n display: inline-grid;\n place-items: center;\n border: var(--orderly-border-control);\n border-radius: var(--orderly-icon-button-radius);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n box-shadow: none;\n cursor: pointer;\n}\n\n.orderly-search-box__trigger:hover,\n.orderly-search-box__close:hover,\n.orderly-basket-icon:hover {\n border-color: var(--orderly-color-text);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n}\n\n.orderly-basket-icon__glyph {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.orderly-basket-icon__svg {\n display: block;\n width: 24px;\n height: 24px;\n}\n\n.orderly-basket-icon__count {\n position: absolute;\n top: -8px;\n right: -10px;\n display: inline-grid;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n place-items: center;\n border-radius: var(--orderly-radius-pill);\n background: var(--orderly-basket-icon-badge-background, var(--orderly-color-accent));\n color: var(--orderly-basket-icon-badge-color, var(--orderly-color-on-dark));\n font-size: 0.72rem;\n font-weight: 700;\n line-height: 1;\n}\n\n.orderly-search-box__trigger-icon,\n.orderly-search-box__close-icon {\n display: block;\n width: 22px;\n height: 22px;\n}\n\n.orderly-search-box__close-icon {\n width: 20px;\n height: 20px;\n}\n\n.orderly-search-box__close-label {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n}\n\n.orderly-page-layout .orderly-search-box__trigger,\n.orderly-page-layout .orderly-basket-icon {\n display: inline-grid;\n place-items: center;\n width: var(--orderly-icon-button-size);\n min-width: var(--orderly-icon-button-size);\n height: var(--orderly-icon-button-size);\n padding: 0;\n border: var(--orderly-border-control);\n border-radius: var(--orderly-icon-button-radius);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n box-shadow: none;\n --orderly-basket-icon-badge-background: var(--orderly-color-accent);\n}\n\n.orderly-page-layout .orderly-search-box__trigger:hover,\n.orderly-page-layout .orderly-basket-icon:hover {\n border-color: var(--orderly-color-text);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n}\n\n.orderly-search-box__overlay[hidden] {\n display: none !important;\n}\n\n.orderly-search-box__overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: block;\n padding: clamp(var(--orderly-section-gap), 4vw, 48px);\n overflow: auto;\n background: rgba(244, 244, 244, 0.98);\n color: var(--orderly-color-text);\n}\n\n.orderly-search-box__overlay-shell {\n display: grid;\n gap: var(--orderly-panel-padding);\n width: min(var(--orderly-content-max-width), 100%);\n min-width: 0;\n margin: 0 auto;\n}\n\n.orderly-search-box__overlay-form {\n position: sticky;\n top: 0;\n z-index: 1;\n display: grid;\n grid-template-columns: minmax(0, 1fr) var(--orderly-icon-button-size);\n gap: 10px;\n align-items: center;\n padding: 0 0 18px;\n background: rgba(244, 244, 244, 0.98);\n}\n\n.orderly-search-box__overlay-label {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n}\n\n.orderly-search-box__overlay-input,\ninput.orderly-search-box,\n.orderly-sort-select,\n.orderly-product-grid__sort-select,\n.orderly-checkout input,\n.orderly-checkout select,\n.orderly-basket__quantity {\n width: 100%;\n min-height: var(--orderly-control-height);\n border: var(--orderly-border-control);\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n}\n\n.orderly-search-box__overlay-input,\ninput.orderly-search-box,\n.orderly-sort-select,\n.orderly-product-grid__sort-select,\n.orderly-checkout input,\n.orderly-checkout select {\n padding: 0 var(--orderly-control-padding-x);\n}\n\n.orderly-search-box__overlay-input {\n min-height: var(--orderly-control-height);\n padding: 0 var(--orderly-control-padding-x);\n border: var(--orderly-border-control);\n border-radius: var(--orderly-radius-control);\n background: var(--orderly-color-surface);\n font-size: 1rem;\n font-weight: 500;\n line-height: 1.4;\n}\n\n.orderly-search-box__overlay-status,\n.orderly-search-box__empty {\n max-width: 720px;\n margin: 0;\n color: var(--orderly-color-muted);\n font-size: 1rem;\n}\n\n.orderly-search-box__overlay-status:empty {\n display: none;\n}\n\n.orderly-search-box__overlay-results {\n min-width: 0;\n}\n\n.orderly-search-box__overlay-results .orderly-product-grid {\n padding: 0;\n}\n\n.orderly-search-box__overlay-results .orderly-product-grid__items {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.orderly-search-box__overlay-results .orderly-product-grid__toolbar {\n display: none;\n}\n\n.orderly-home-page,\n.orderly-product-detail-page {\n display: grid;\n gap: 34px;\n max-width: 100%;\n min-width: 0;\n padding: 30px 0 48px;\n overflow: hidden;\n}\n\n.orderly-home-page__intro,\n.orderly-product-detail-page,\n.orderly-product-detail-page__product {\n width: min(var(--orderly-content-max-width), 100%);\n margin: 0 auto;\n padding-right: 24px;\n padding-left: 24px;\n}\n\n.orderly-home-page__eyebrow {\n margin: 0 0 6px;\n color: var(--orderly-color-accent);\n font-size: 0.82rem;\n font-weight: 800;\n text-transform: uppercase;\n}\n\n.orderly-home-page__intro h1 {\n max-width: 780px;\n margin: 0;\n font-size: clamp(2.3rem, 5vw, 5.4rem);\n line-height: 0.98;\n}\n\n.orderly-home-page__rails {\n display: grid;\n gap: 38px;\n min-width: 0;\n}\n\n.orderly-product-rail {\n --orderly-product-rail-padding: 2px 24px 16px;\n display: grid;\n gap: 14px;\n max-width: 100vw;\n overflow: hidden;\n}\n\n.orderly-product-rail__header {\n display: flex;\n align-items: end;\n justify-content: space-between;\n gap: 18px;\n width: min(var(--orderly-content-max-width), 100%);\n margin: 0 auto;\n padding: 0 24px;\n}\n\n.orderly-product-rail__title {\n margin: 0;\n font-size: clamp(1.3rem, 2.5vw, 2.05rem);\n line-height: 1.05;\n}\n\n.orderly-product-rail__cta {\n color: var(--orderly-color-text);\n font-size: 0.92rem;\n font-weight: 800;\n text-decoration: none;\n}\n\n.orderly-product-rail__cta:hover {\n color: var(--orderly-color-accent);\n}\n\n.orderly-product-rail__grid-slot,\n.orderly-product-rail__grid,\n.orderly-product-rail__grid-layout {\n min-width: 0;\n}\n\n.orderly-product-rail__grid-layout {\n display: grid;\n gap: 10px;\n}\n\n.orderly-product-rail__items {\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: var(--orderly-product-rail-item-width, minmax(210px, 240px));\n gap: var(--orderly-product-rail-gap, 16px);\n align-items: stretch;\n width: min(var(--orderly-content-max-width), 100%);\n margin: 0 auto;\n overflow-x: auto;\n overscroll-behavior-x: contain;\n padding: var(--orderly-product-rail-padding, 2px 24px 16px);\n scroll-padding-inline: 24px;\n scroll-snap-type: x proximity;\n scrollbar-width: thin;\n}\n\n.orderly-product-rail__items > * {\n scroll-snap-align: start;\n}\n\n.orderly-product-rail__status,\n.orderly-product-rail__empty {\n width: min(var(--orderly-content-max-width), 100%);\n margin: 0 auto;\n padding: 0 24px;\n}\n\n.orderly-checkout__error,\n.orderly-basket__line-error {\n color: var(--orderly-color-danger);\n}\n\n.orderly-product-rail__status:not(:empty),\n.orderly-product-grid__status:not(:empty) {\n color: var(--orderly-color-muted);\n font-size: 0.92rem;\n}\n\n.orderly-product-rail__status:not(:empty) {\n width: min(var(--orderly-content-max-width), calc(100% - 48px));\n padding: var(--orderly-card-padding);\n border: var(--orderly-border);\n background: var(--orderly-color-surface);\n}\n\n.orderly-product-rail__empty,\n.orderly-product-grid__context,\n.orderly-product-tile__brand,\n.orderly-product-tile__description,\n.orderly-basket__delivery-note,\n.orderly-basket__checkout-disabled,\n.orderly-shop-footer__about,\n.orderly-shop-footer__address,\n.orderly-shop-footer__list,\n.orderly-shop-footer__hours {\n color: var(--orderly-color-muted);\n}\n\n.orderly-collection-page__hero {\n position: relative;\n display: grid;\n height: clamp(210px, 24vw, 320px);\n min-height: 0;\n overflow: hidden;\n background: var(--orderly-color-text);\n color: var(--orderly-color-on-dark);\n}\n\n.orderly-collection-page__hero-image {\n grid-area: 1 / 1;\n width: 100%;\n height: 100%;\n min-height: 0;\n object-fit: cover;\n opacity: 0.5;\n}\n\n.orderly-collection-page__intro {\n grid-area: 1 / 1;\n align-self: center;\n max-width: 820px;\n padding: 42px clamp(24px, 6vw, 72px);\n}\n\n.orderly-collection-page__title {\n margin: 0;\n font-size: clamp(2.2rem, 5vw, 4.5rem);\n line-height: 1.08;\n}\n\n.orderly-collection-page__description {\n max-width: 620px;\n margin: 12px 0 0;\n font-size: 1.05rem;\n}\n\n.orderly-collection-page__cta {\n display: inline-flex;\n align-items: center;\n min-height: var(--orderly-control-height);\n margin-top: 22px;\n padding: 0 18px;\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n font-weight: 800;\n text-decoration: none;\n}\n\n.orderly-collection-page__cta[hidden] {\n display: none !important;\n}\n\n.orderly-product-grid {\n padding: var(--orderly-panel-padding);\n}\n\n.orderly-product-grid__toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.orderly-product-grid__sort {\n display: grid;\n gap: 6px;\n width: min(100%, 220px);\n}\n\n.orderly-product-grid__sort-label {\n color: var(--orderly-color-muted);\n font-size: 0.78rem;\n font-weight: 700;\n text-transform: uppercase;\n}\n\n.orderly-product-grid__status {\n min-height: 0;\n}\n\n.orderly-product-grid__status:not(:empty) {\n margin-bottom: 16px;\n padding: var(--orderly-card-padding);\n border: var(--orderly-border);\n background: var(--orderly-color-surface);\n}\n\n.orderly-product-grid__items {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 1.05rem;\n align-items: stretch;\n}\n\n.orderly-product-grid__item,\n.orderly-category-page__product-card {\n display: block;\n height: 100%;\n min-width: 0;\n}\n\n.orderly-category-page__product-card > [data-orderly-render-root] {\n height: 100%;\n min-width: 0;\n}\n\n.orderly-product-grid__loading-item,\n.orderly-product-tile {\n overflow: hidden;\n border: var(--orderly-border-card);\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-surface);\n box-shadow: none;\n}\n\n.orderly-product-grid__loading-item.orderly-product-tile {\n display: grid;\n grid-template-rows: auto auto minmax(0, 1fr);\n height: 100%;\n min-height: 360px;\n}\n\n.orderly-product-grid__loading-heading,\n.orderly-product-grid__loading-body {\n display: grid;\n}\n\n.orderly-product-grid__loading-heading {\n gap: 8px;\n padding: 15px 15px 0;\n}\n\n.orderly-product-grid__loading-body {\n gap: 10px;\n align-content: end;\n padding: 0 15px 15px;\n}\n\n.orderly-product-grid__loading-title,\n.orderly-product-grid__loading-subtitle,\n.orderly-product-grid__loading-price,\n.orderly-product-grid__loading-button,\n.orderly-product-grid__loading-image {\n display: block;\n}\n\n.orderly-product-grid__loading-title {\n width: 76%;\n height: 18px;\n border-radius: 6px;\n}\n\n.orderly-product-grid__loading-subtitle {\n width: 42%;\n height: 12px;\n border-radius: 6px;\n}\n\n.orderly-product-grid__loading-image {\n width: 100%;\n aspect-ratio: 1 / 1;\n}\n\n.orderly-product-grid__loading-price {\n width: 54%;\n height: 18px;\n border-radius: 6px;\n}\n\n.orderly-product-grid__loading-button {\n justify-self: end;\n width: 40px;\n height: 40px;\n border-radius: var(--orderly-radius-control);\n}\n\n.orderly-product-tile {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 100%;\n min-width: 0;\n transition: border-color 140ms ease;\n}\n\n.orderly-product-tile,\norderly-product-tile[data-orderly-clickable] {\n cursor: pointer;\n}\n\n.orderly-product-tile:hover {\n border-color: var(--orderly-color-border-strong);\n}\n\norderly-product-tile[data-orderly-clickable]:focus-visible {\n outline: var(--orderly-focus-outline);\n outline-offset: 3px;\n}\n\n.orderly-product-tile__image,\n.orderly-product-page__image,\n.orderly-product-page__thumbnail-image,\n.orderly-basket__line-image {\n display: block;\n width: 100%;\n min-width: 0;\n aspect-ratio: 1 / 1;\n overflow: hidden;\n background: var(--orderly-color-surface);\n}\n\n.orderly-product-tile__image {\n background: var(--orderly-color-surface);\n}\n\n.orderly-stored-image__frame {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n background: var(--orderly-color-surface);\n}\n\n.orderly-stored-image__frame[data-orderly-empty-image],\n.orderly-stored-image__frame[data-orderly-image-error] {\n background:\n linear-gradient(135deg, transparent 0 48%, #eeeeee 48% 52%, transparent 52%),\n var(--orderly-color-surface);\n}\n\n.orderly-stored-image__img {\n display: block;\n max-width: none;\n max-height: none;\n}\n\n.orderly-product-tile__body {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n flex: 1;\n height: 100%;\n min-width: 0;\n padding: 0.75rem;\n}\n\n.orderly-product-tile__title {\n margin: 0;\n color: var(--orderly-color-text);\n font-size: 0.95rem;\n font-weight: 400;\n line-height: 1.32;\n overflow-wrap: anywhere;\n}\n\n.orderly-product-tile__brand,\n.orderly-product-tile__price,\n.orderly-product-tile__description {\n margin: 0;\n}\n\n.orderly-product-tile__price,\n.orderly-product-page__price {\n color: var(--orderly-color-text-soft);\n font-weight: 700;\n}\n\n.orderly-credit {\n display: inline-flex;\n align-items: baseline;\n gap: 0.25em;\n white-space: nowrap;\n}\n\n.orderly-credit__prefix,\n.orderly-credit__amount {\n display: inline;\n}\n\n.orderly-product-tile__brand {\n color: var(--orderly-color-muted);\n font-size: 0.86rem;\n}\n\n.orderly-product-tile__footer {\n position: relative;\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 0.65rem;\n align-items: center;\n min-height: 40px;\n margin-top: auto;\n padding-top: 0.5rem;\n}\n\n.orderly-product-tile__price {\n font-size: 1.2rem;\n text-align: left;\n}\n\n.orderly-product-tile__offer {\n min-width: 0;\n}\n\n.orderly-product-tile__add {\n display: inline-grid;\n place-items: center;\n width: var(--orderly-product-action-width);\n min-width: var(--orderly-product-action-width);\n height: var(--orderly-product-action-height);\n min-height: var(--orderly-product-action-height);\n padding: 0;\n border: 0;\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-strong);\n color: var(--orderly-color-on-dark);\n line-height: 1;\n transition: opacity 140ms ease, transform 140ms ease, background-color 140ms ease, color 140ms ease, border-color 140ms ease;\n}\n\n.orderly-product-tile__add:hover,\n.orderly-product-tile__add:focus-visible {\n border-color: var(--orderly-color-strong);\n background: var(--orderly-color-strong);\n color: var(--orderly-color-on-dark);\n box-shadow: inset 0 -3px 0 var(--orderly-color-accent);\n}\n\n.orderly-product-tile__add[data-orderly-basket-action=\"remove\"] {\n border: 1px solid var(--orderly-color-strong);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-strong);\n opacity: 1;\n pointer-events: auto;\n}\n\n.orderly-product-tile__add-icon {\n display: inline-grid;\n place-items: center;\n line-height: 0;\n}\n\n.orderly-product-tile__add-svg,\n.orderly-product-tile__remove-svg {\n display: block;\n width: 20px;\n height: 20px;\n}\n\n.orderly-category-page__empty-state,\n.orderly-product-grid__message,\n.orderly-basket__empty-state {\n margin: 0;\n padding: var(--orderly-panel-padding);\n border: 1px dashed var(--orderly-color-control-muted-border);\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-surface);\n}\n\n.orderly-category-page__basket-panel {\n position: fixed;\n inset: 0 0 0 auto;\n z-index: 60;\n width: min(460px, 100vw);\n max-width: 100vw;\n padding: 20px;\n overflow: auto;\n border-left: var(--orderly-border);\n background: var(--orderly-color-surface);\n box-shadow: -18px 0 40px rgba(20, 20, 20, 0.18);\n}\n\n.orderly-category-page__basket-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n}\n\n.orderly-category-page__product-dialog {\n width: min(1120px, calc(100vw - 32px));\n max-width: calc(100vw - 32px);\n max-height: calc(100vh - 32px);\n overflow: auto;\n border: 0;\n border-radius: var(--orderly-radius);\n padding: 0;\n}\n\n.orderly-category-page__product-dialog::backdrop {\n background: rgba(20, 20, 20, 0.55);\n}\n\n.orderly-category-page__product-dialog-actions {\n position: sticky;\n top: 0;\n z-index: 2;\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 14px 14px 0;\n pointer-events: none;\n}\n\n.orderly-category-page__product-dialog-expand,\n.orderly-category-page__product-dialog-close {\n pointer-events: auto;\n}\n\n.orderly-category-page__product-dialog-expand {\n display: inline-grid;\n place-items: center;\n width: 38px;\n height: 38px;\n min-width: 38px;\n min-height: 38px;\n padding: 0;\n border: 1px solid var(--orderly-color-strong);\n border-radius: 3px;\n background: var(--orderly-color-surface);\n color: var(--orderly-color-strong);\n text-decoration: none;\n box-shadow: 0 2px 10px rgba(17, 17, 17, 0.14);\n}\n\n.orderly-category-page__product-dialog-expand:hover,\n.orderly-category-page__product-dialog-expand:focus-visible {\n border-color: var(--orderly-color-strong);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-strong);\n box-shadow: inset 0 -3px 0 var(--orderly-color-accent);\n}\n\n.orderly-category-page__product-dialog-close {\n display: inline-grid;\n place-items: center;\n width: 38px;\n min-width: 38px;\n height: 38px;\n min-height: 38px;\n padding: 0;\n border: 1px solid var(--orderly-color-strong);\n border-radius: 3px;\n background: var(--orderly-color-surface);\n color: var(--orderly-color-strong);\n box-shadow: 0 2px 10px rgba(17, 17, 17, 0.14);\n}\n\n.orderly-category-page__product-dialog-close:hover,\n.orderly-category-page__product-dialog-close:focus-visible {\n border-color: var(--orderly-color-strong);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-strong);\n box-shadow: inset 0 -3px 0 var(--orderly-color-accent);\n}\n\n.orderly-product-page {\n display: grid;\n grid-template-columns: minmax(0, 1.1fr) minmax(320px, 0.9fr);\n gap: 2rem;\n align-items: start;\n clear: both;\n min-width: 0;\n max-width: 100%;\n padding: 1.25rem;\n border: var(--orderly-border);\n background: var(--orderly-color-surface);\n}\n\n.orderly-product-page__media {\n display: grid;\n gap: 0.85rem;\n align-content: start;\n justify-self: stretch;\n width: 100%;\n min-width: 0;\n}\n\n.orderly-product-page__image-button {\n display: block;\n width: 100%;\n min-width: 0;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: inherit;\n cursor: zoom-in;\n}\n\n.orderly-product-page__image-button:hover,\n.orderly-product-page__image-button:focus-visible {\n border: 0;\n background: transparent;\n color: inherit;\n box-shadow: none;\n outline: var(--orderly-focus-outline);\n outline-offset: 3px;\n}\n\n.orderly-product-page__image-button:disabled {\n cursor: default;\n}\n\n.orderly-product-page__image {\n border: 1px solid var(--orderly-color-image-border);\n border-radius: 0;\n}\n\n.orderly-product-page__image-overlay[hidden] {\n display: none !important;\n}\n\n.orderly-product-page__image-overlay {\n position: fixed;\n inset: 0;\n z-index: 1300;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n gap: 18px;\n padding: clamp(16px, 3vw, 36px);\n background: rgba(17, 17, 17, 0.92);\n}\n\n.orderly-product-page__image-overlay-close {\n justify-self: end;\n min-height: var(--orderly-control-height);\n padding: 0 16px;\n border: 1px solid rgba(255, 255, 255, 0.72);\n border-radius: 3px;\n background: var(--orderly-color-surface);\n color: var(--orderly-color-strong);\n font-weight: 800;\n}\n\n.orderly-product-page__image-overlay-close:hover,\n.orderly-product-page__image-overlay-close:focus-visible {\n border-color: var(--orderly-color-on-dark);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-strong);\n box-shadow: inset 0 -3px 0 var(--orderly-color-accent);\n}\n\n.orderly-product-page__image-overlay-frame {\n display: grid;\n place-items: center;\n min-width: 0;\n min-height: 0;\n}\n\n.orderly-product-page__image-overlay-image {\n display: block;\n width: min(100%, 1400px);\n height: 100%;\n max-height: calc(100vh - 112px);\n min-width: 0;\n min-height: 0;\n background: var(--orderly-color-surface);\n}\n\n.orderly-product-page__thumbnails {\n display: flex;\n gap: 0.55rem;\n min-width: 0;\n overflow-x: auto;\n padding-bottom: 2px;\n scrollbar-width: thin;\n}\n\n.orderly-product-page__thumbnail {\n flex: 0 0 clamp(54px, 7vw, 76px);\n width: clamp(54px, 7vw, 76px);\n min-width: 0;\n padding: 0;\n border: 1px solid var(--orderly-color-image-border);\n border-radius: 0;\n background: var(--orderly-color-surface);\n}\n\n.orderly-product-page__thumbnail:hover,\n.orderly-product-page__thumbnail[data-orderly-selected=\"true\"],\n.orderly-product-page__thumbnail[aria-pressed=\"true\"] {\n border-color: var(--orderly-color-strong);\n background: var(--orderly-color-surface);\n box-shadow: inset 0 0 0 1px var(--orderly-color-strong);\n}\n\n.orderly-product-page__thumbnail-image {\n border-radius: 0;\n}\n\n.orderly-product-page__details {\n display: grid;\n gap: 1rem;\n align-content: start;\n min-width: 0;\n}\n\n.orderly-product-page__brand,\n.orderly-product-page__description {\n margin: 0;\n}\n\n.orderly-product-page__brand {\n color: var(--orderly-color-muted);\n font-size: 0.9rem;\n}\n\n.orderly-product-page__title {\n margin: 0;\n font-size: 2.25rem;\n line-height: 1.06;\n overflow-wrap: anywhere;\n}\n\n.orderly-product-page__price {\n margin: 0;\n font-size: 1.9rem;\n font-weight: 600;\n letter-spacing: -0.02em;\n}\n\n.orderly-product-page__description {\n color: var(--orderly-color-text);\n font-size: 0.95rem;\n line-height: 1.55;\n}\n\n.orderly-product-page__attributes {\n display: grid;\n grid-template-columns: 150px minmax(0, 1fr);\n margin: 0;\n border-top: var(--orderly-border-subtle);\n border-bottom: var(--orderly-border-subtle);\n}\n\n.orderly-product-page__attributes dt,\n.orderly-product-page__attributes dd {\n margin: 0;\n padding: 0.8rem 0;\n border-top: 1px solid #f1f1f1;\n}\n\n.orderly-product-page__attributes dt:first-of-type,\n.orderly-product-page__attributes dt:first-of-type + dd {\n border-top: 0;\n}\n\n.orderly-product-page__attributes dt {\n color: #6a6a6a;\n}\n\n.orderly-product-page__attributes dd {\n color: var(--orderly-color-strong);\n}\n\n.orderly-product-page__add {\n width: 100%;\n min-height: 52px;\n margin-top: 8px;\n border: 0;\n border-radius: 3px;\n background: var(--orderly-color-strong);\n color: var(--orderly-color-on-dark);\n font-size: 0.94rem;\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n\n.orderly-product-page__add:hover,\n.orderly-product-page__add:focus-visible {\n border-color: var(--orderly-color-strong);\n background: var(--orderly-color-strong);\n color: var(--orderly-color-on-dark);\n box-shadow: inset 0 -3px 0 var(--orderly-color-accent);\n}\n\n.orderly-basket__lines {\n display: grid;\n gap: var(--orderly-item-gap);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.orderly-basket [hidden],\n.orderly-checkout [hidden] {\n display: none !important;\n}\n\n.orderly-basket__empty-state {\n display: grid;\n gap: var(--orderly-item-gap);\n background: #f6f8f9;\n}\n\n.orderly-basket__empty-text {\n margin: 0;\n color: var(--orderly-color-text);\n font-weight: 800;\n}\n\n.orderly-basket__continue {\n color: var(--orderly-color-accent);\n font-weight: 800;\n}\n\n.orderly-basket__line {\n display: grid;\n grid-template-columns: 84px minmax(0, 1fr) auto auto;\n gap: var(--orderly-item-gap);\n align-items: center;\n padding: 10px;\n border: var(--orderly-border-subtle);\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-surface);\n}\n\n.orderly-basket__line-image {\n width: 84px;\n height: 84px;\n border-radius: var(--orderly-radius);\n}\n\n.orderly-basket__line-content {\n display: grid;\n gap: 3px;\n min-width: 0;\n}\n\n.orderly-basket__line-title {\n color: var(--orderly-color-text);\n font-weight: 700;\n line-height: 1.25;\n overflow-wrap: anywhere;\n}\n\n.orderly-basket__line-sku {\n color: var(--orderly-color-muted);\n font-size: 0.82rem;\n}\n\n.orderly-basket__line-sku:empty {\n display: none;\n}\n\n.orderly-basket__line-price,\n.orderly-basket__summary-amount,\n.orderly-basket__summary-total-amount {\n color: var(--orderly-color-text);\n font-weight: 800;\n white-space: nowrap;\n}\n\n.orderly-basket__quantity-text {\n color: var(--orderly-color-muted);\n font-size: 0.86rem;\n white-space: nowrap;\n}\n\n.orderly-basket__remove {\n display: inline-grid;\n width: 36px;\n height: 36px;\n padding: 0;\n place-items: center;\n border: 1px solid var(--orderly-color-border-strong);\n border-radius: var(--orderly-radius-pill);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n}\n\n.orderly-basket__remove-icon {\n display: block;\n}\n\n.orderly-basket__remove-label,\n.orderly-checkout-page__visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.orderly-basket__summary {\n display: grid;\n gap: 12px;\n margin-top: 18px;\n padding-top: 16px;\n border-top: var(--orderly-border-subtle);\n}\n\n.orderly-basket__summary-row,\n.orderly-basket__summary-total {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n}\n\n.orderly-basket__delivery-note {\n margin: -4px 0 0;\n font-size: 0.82rem;\n}\n\n.orderly-basket__summary-total {\n align-items: baseline;\n padding-top: 12px;\n border-top: var(--orderly-border-subtle);\n font-size: 1.15rem;\n font-weight: 800;\n}\n\n.orderly-basket__summary-total-note {\n display: block;\n color: var(--orderly-color-muted);\n font-size: 0.78rem;\n font-weight: 500;\n}\n\n.orderly-basket__count {\n display: none;\n}\n\n.orderly-basket__checkout {\n display: grid;\n min-height: var(--orderly-control-height);\n margin-top: 16px;\n place-items: center;\n border-radius: var(--orderly-radius);\n background: var(--orderly-color-text);\n color: var(--orderly-color-on-dark);\n font-weight: 700;\n text-decoration: none;\n}\n\n.orderly-basket a.orderly-basket__checkout,\n.orderly-basket a.orderly-basket__checkout:visited {\n color: var(--orderly-color-on-dark);\n}\n\n.orderly-basket__checkout:hover,\n.orderly-basket__checkout:focus-visible {\n background: var(--orderly-color-accent);\n color: var(--orderly-color-on-dark);\n}\n\n.orderly-basket__checkout[data-orderly-disabled] {\n background: var(--orderly-color-control-muted-border);\n color: var(--orderly-color-on-dark);\n cursor: not-allowed;\n}\n\n.orderly-basket__clear {\n margin-top: 10px;\n border-color: var(--orderly-color-control-muted-border);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n}\n\n.orderly-checkout {\n display: grid;\n gap: 18px;\n margin: 0;\n}\n\n.orderly-checkout fieldset {\n padding: 0;\n border: 0;\n}\n\n.orderly-checkout__section {\n display: grid;\n gap: 12px;\n padding-top: 18px;\n border-top: var(--orderly-border-subtle);\n}\n\n.orderly-checkout__section:first-child {\n padding-top: 0;\n border-top: 0;\n}\n\n.orderly-checkout__section-title {\n margin: 0;\n font-size: 1.45rem;\n line-height: 1.15;\n}\n\n.orderly-checkout__field-grid,\n.orderly-checkout__delivery-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.orderly-checkout__field {\n display: grid;\n gap: 5px;\n min-width: 0;\n}\n\n.orderly-checkout__field--full {\n grid-column: 1 / -1;\n}\n\n.orderly-checkout__field span {\n color: #2c2b2a;\n font-size: 0.78rem;\n font-weight: 800;\n text-transform: uppercase;\n}\n\n.orderly-checkout__delivery-prompt {\n margin: 0;\n color: var(--orderly-color-muted);\n}\n\n.orderly-checkout__option-grid,\n.orderly-checkout__option-list {\n display: grid;\n gap: 10px;\n}\n\n.orderly-checkout__option-grid--delivery {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.orderly-checkout__option {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 10px;\n align-items: start;\n min-width: 0;\n border: var(--orderly-border);\n border-radius: 0;\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n cursor: pointer;\n}\n\n.orderly-checkout__option:hover,\n.orderly-checkout__option.is-selected {\n border-color: var(--orderly-color-accent);\n background: var(--orderly-color-selected-soft);\n}\n\n.orderly-checkout__option--delivery {\n min-height: 84px;\n padding: 13px 14px;\n}\n\n.orderly-checkout__option--service-point {\n min-height: 65px;\n padding: 13px 14px;\n}\n\n.orderly-checkout .orderly-checkout__option-input {\n width: 18px;\n min-height: 18px;\n margin: 2px 0 0;\n padding: 0;\n border: 2px solid var(--orderly-color-control-muted-border);\n border-radius: 0;\n appearance: none;\n background: var(--orderly-color-surface);\n}\n\n.orderly-checkout .orderly-checkout__option-input:checked {\n border: 4px solid var(--orderly-color-accent);\n}\n\n.orderly-checkout__option-copy {\n display: grid;\n gap: 4px;\n min-width: 0;\n}\n\n.orderly-checkout__option-title {\n font-weight: 800;\n line-height: 1.25;\n}\n\n.orderly-checkout__option-meta {\n color: var(--orderly-color-muted);\n font-size: 0.9rem;\n line-height: 1.35;\n}\n\n.orderly-checkout__option-meta .orderly-credit {\n display: inline-flex;\n}\n\n.orderly-checkout__subsection-title {\n margin: 18px 0 0;\n font-size: 1.3rem;\n line-height: 1.15;\n}\n\n.orderly-checkout__service-point-help {\n margin: -4px 0 10px;\n color: var(--orderly-color-muted);\n}\n\n.orderly-checkout input:focus,\n.orderly-checkout select:focus,\n.orderly-search-box__overlay-input:focus,\n.orderly-product-grid__sort-select:focus {\n border-color: var(--orderly-color-accent);\n box-shadow: var(--orderly-focus-ring);\n outline: 0;\n}\n\n.orderly-checkout__terms {\n display: flex;\n align-items: center;\n gap: 9px;\n color: #4f4f4f;\n font-size: 0.9rem;\n}\n\n.orderly-checkout__terms input {\n width: 18px;\n min-height: 18px;\n accent-color: var(--orderly-color-text);\n}\n\n.orderly-checkout__submit {\n width: 100%;\n min-height: 52px;\n border: 0;\n font-weight: 800;\n text-transform: uppercase;\n}\n\n.orderly-checkout-page {\n display: grid;\n gap: var(--orderly-section-gap);\n padding: 22px 28px 32px;\n}\n\n.orderly-checkout-page__header,\n.orderly-checkout-page__card {\n border: var(--orderly-border);\n background: var(--orderly-color-surface);\n box-shadow: var(--orderly-shadow-md);\n}\n\n.orderly-checkout-page__header {\n width: min(1080px, 100%);\n max-width: 1080px;\n margin: 0 auto;\n padding: var(--orderly-panel-padding);\n text-align: center;\n}\n\n.orderly-checkout-page__header h1 {\n margin: 0;\n font-size: clamp(2rem, 2.3vw, 2.6rem);\n}\n\n.orderly-checkout-page__header p:last-child {\n margin: 8px 0 0;\n color: var(--orderly-color-muted);\n}\n\n.orderly-checkout-page__grid {\n display: grid;\n grid-template-columns: minmax(0, 1.25fr) minmax(320px, 0.75fr);\n gap: var(--orderly-section-gap);\n width: min(1080px, 100%);\n margin: 0 auto;\n align-items: start;\n}\n\n.orderly-checkout-page__card {\n min-width: 0;\n padding: var(--orderly-section-gap);\n}\n\n.orderly-checkout-page__card--summary {\n position: sticky;\n top: 128px;\n}\n\n.orderly-content-page {\n display: grid;\n gap: var(--orderly-section-gap);\n padding: 22px 28px 32px;\n}\n\n.orderly-content-page__header,\n.orderly-content-page__card {\n width: min(1080px, 100%);\n margin: 0 auto;\n border: var(--orderly-border);\n background: var(--orderly-color-surface);\n box-shadow: var(--orderly-shadow-md);\n}\n\n.orderly-content-page__header {\n padding: var(--orderly-panel-padding);\n text-align: center;\n}\n\n.orderly-content-page__header h1 {\n margin: 0;\n font-size: clamp(2rem, 2.3vw, 2.6rem);\n}\n\n.orderly-content-page__header p:last-child {\n margin: 8px 0 0;\n color: var(--orderly-color-muted);\n}\n\n.orderly-content-page__card {\n min-width: 0;\n padding: var(--orderly-panel-padding);\n}\n\n.orderly-content-page__body {\n color: var(--orderly-color-text);\n line-height: 1.65;\n}\n\n.orderly-content-page__body h2 {\n margin: 28px 0 8px;\n font-size: 1.25rem;\n line-height: 1.2;\n}\n\n.orderly-content-page__body h2:first-child {\n margin-top: 0;\n}\n\n.orderly-content-page__body p {\n margin: 0 0 14px;\n}\n\n.orderly-shop-footer {\n display: grid;\n grid-template-columns: minmax(240px, 1.4fr) repeat(4, minmax(150px, 1fr));\n gap: 28px;\n max-width: var(--orderly-content-max-width);\n margin: 0 auto;\n padding: 34px 24px;\n}\n\n.orderly-shop-footer__brand,\n.orderly-shop-footer__contact-item,\n.orderly-shop-footer__hours-row {\n display: grid;\n gap: 8px;\n}\n\n.orderly-shop-footer__logo {\n display: inline-flex;\n width: max-content;\n}\n\n.orderly-shop-footer__logo-image {\n width: var(--orderly-icon-button-size);\n height: var(--orderly-icon-button-size);\n}\n\n.orderly-shop-footer__heading {\n margin: 0 0 10px;\n color: var(--orderly-color-text);\n font-size: 0.9rem;\n text-transform: uppercase;\n}\n\n.orderly-shop-footer__address,\n.orderly-shop-footer__list,\n.orderly-shop-footer__hours {\n display: grid;\n gap: 8px;\n margin: 0;\n padding: 0;\n font-style: normal;\n list-style: none;\n}\n\n.orderly-shop-footer a {\n color: var(--orderly-color-accent);\n text-decoration: none;\n}\n\n.orderly-shop-footer a:hover {\n text-decoration: underline;\n}\n\n@media (min-width: 700px) {\n .orderly-search-box__overlay-results .orderly-product-grid__items {\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n }\n}\n\n@media (max-width: 1024px) {\n .orderly-product-grid__items {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n .orderly-product-page {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 640px) {\n .orderly-product-grid__items {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 0.4rem;\n }\n}\n\n@media (max-width: 860px) {\n .orderly-page-layout__utility {\n padding-right: 12px;\n padding-left: 12px;\n font-size: 0.78rem;\n }\n\n .orderly-page-layout__utility > * {\n gap: 4px 8px;\n }\n\n .orderly-page-layout__utility > * > * {\n line-height: 1.2;\n overflow-wrap: anywhere;\n }\n\n .orderly-page-layout__header {\n padding: 12px 16px;\n }\n\n .orderly-page-layout__body {\n grid-template-columns: 1fr;\n }\n\n .orderly-ssr-product-detail {\n grid-template-columns: 1fr;\n }\n\n .orderly-page-layout__left {\n border-right: 0;\n border-bottom: 1px solid var(--orderly-color-border);\n }\n\n .orderly-navigation {\n padding: 12px 16px;\n }\n\n .orderly-navigation .orderly-navigation__menu-button {\n display: inline-flex;\n width: auto;\n min-width: 116px;\n border-color: var(--orderly-color-control-muted-border);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n }\n\n .orderly-navigation .orderly-navigation__menu-button:hover {\n border-color: var(--orderly-color-text);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n }\n\n .orderly-navigation__backdrop {\n position: fixed;\n inset: 0;\n z-index: 39;\n border: 0;\n border-radius: 0;\n background: rgba(20, 20, 20, 0.46);\n }\n\n .orderly-navigation__panel {\n display: none;\n position: fixed;\n inset: 0 auto 0 0;\n z-index: 40;\n width: min(360px, 88vw);\n max-height: none;\n margin-top: 0;\n padding: 60px 18px 24px;\n overflow: auto;\n background: var(--orderly-color-surface);\n box-shadow: 18px 0 40px rgba(20, 20, 20, 0.18);\n }\n\n .orderly-navigation[data-orderly-menu-open=\"true\"] .orderly-navigation__backdrop,\n .orderly-navigation[data-orderly-menu-open=\"true\"] .orderly-navigation__panel {\n display: block;\n }\n\n .orderly-navigation .orderly-navigation__close {\n position: absolute;\n top: 14px;\n right: 14px;\n display: inline-grid;\n place-items: center;\n width: 38px;\n height: 38px;\n padding: 0;\n border-color: var(--orderly-color-control-border);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n }\n\n .orderly-navigation .orderly-navigation__close:hover {\n border-color: var(--orderly-color-text);\n background: var(--orderly-color-surface);\n color: var(--orderly-color-text);\n }\n\n .orderly-product-grid__toolbar,\n .orderly-checkout-page__grid,\n .orderly-checkout__field-grid,\n .orderly-checkout__delivery-grid,\n .orderly-checkout__option-grid--delivery,\n .orderly-product-page {\n grid-template-columns: 1fr;\n }\n\n .orderly-product-grid__toolbar {\n display: grid;\n align-items: stretch;\n }\n\n .orderly-product-grid__sort {\n width: 100%;\n }\n\n .orderly-home-page {\n gap: 28px;\n padding: 24px 0 36px;\n }\n\n .orderly-home-page__intro,\n .orderly-product-rail__header,\n .orderly-product-rail__status,\n .orderly-product-rail__empty {\n padding-right: 18px;\n padding-left: 18px;\n }\n\n .orderly-product-rail {\n --orderly-product-rail-item-width: minmax(190px, 76vw);\n --orderly-product-rail-padding: 2px 18px 16px;\n }\n\n .orderly-product-tile__footer {\n justify-content: space-between;\n }\n\n .orderly-product-tile__price {\n text-align: left;\n }\n\n .orderly-product-tile__add {\n position: static;\n opacity: 1;\n pointer-events: auto;\n transform: none;\n }\n\n .orderly-product-page {\n padding: 0;\n }\n\n .orderly-product-page__details {\n padding: 0 1rem 1rem;\n }\n\n .orderly-product-page__title {\n font-size: 1.7rem;\n }\n\n .orderly-product-page__price {\n font-size: 1.55rem;\n }\n\n .orderly-product-page__attributes {\n grid-template-columns: 108px minmax(0, 1fr);\n }\n\n .orderly-product-page__add {\n position: static;\n }\n\n .orderly-search-box__overlay-form {\n grid-template-columns: minmax(0, 1fr) 42px;\n margin-top: 0;\n }\n\n .orderly-search-box__submit {\n grid-column: 1 / -1;\n grid-row: 2;\n }\n\n .orderly-checkout-page {\n padding: 18px;\n }\n\n .orderly-content-page {\n padding: 18px;\n }\n\n .orderly-content-page__card {\n padding: 18px;\n }\n\n .orderly-checkout-page__card--summary {\n position: static;\n }\n\n .orderly-basket__line {\n grid-template-columns: 72px minmax(0, 1fr) auto;\n }\n\n .orderly-basket__line-image {\n width: 72px;\n height: 72px;\n }\n\n .orderly-basket__line-price {\n grid-column: 2;\n }\n\n .orderly-basket__remove {\n grid-column: 3;\n grid-row: 1 / span 2;\n }\n\n .orderly-shop-footer {\n grid-template-columns: 1fr;\n padding: 28px 18px;\n }\n}\n\n`;\n\nexport function installOrderlyDefaultStyles(target: Document | undefined = globalThis.document): HTMLStyleElement | undefined {\n if (!target?.head) {\n return undefined;\n }\n const existing = target.getElementById(\"orderly-default-styles\");\n if (existing instanceof HTMLStyleElement) {\n return existing;\n }\n const style = target.createElement(\"style\");\n style.id = \"orderly-default-styles\";\n style.dataset.orderlyDefaultStyles = \"\";\n style.textContent = ORDERLY_DEFAULT_CSS;\n target.head.append(style);\n return style;\n}\n","import { OrderlyBasketElement } from \"./components/basket.js\";\nimport { OrderlyBasketIconElement } from \"./components/basket-icon.js\";\nimport { OrderlyCategoryPageElement } from \"./components/category-page.js\";\nimport { OrderlyCheckoutElement } from \"./components/checkout.js\";\nimport { OrderlyCheckoutPageElement } from \"./components/checkout-page.js\";\nimport { OrderlyCollectionPageElement } from \"./components/collection-page.js\";\nimport { OrderlyCreditElement } from \"./components/credit.js\";\nimport { OrderlyHomePageElement } from \"./components/home-page.js\";\nimport { OrderlyPageLayoutElement } from \"./components/page-layout.js\";\nimport { OrderlyProductDetailPageElement } from \"./components/product-detail-page.js\";\nimport { OrderlyProductGridElement } from \"./components/product-grid.js\";\nimport { OrderlyProductPageElement } from \"./components/product-page.js\";\nimport { OrderlyProductRailElement } from \"./components/product-rail.js\";\nimport { OrderlyProductTileElement } from \"./components/product-tile.js\";\nimport { OrderlyFilterPanelElement, OrderlyLoadMoreElement, OrderlySearchBoxElement, OrderlySortSelectElement } from \"./components/search-controls.js\";\nimport { OrderlyShopFooterElement } from \"./components/shop-footer.js\";\nimport { OrderlyStoredImageElement } from \"./components/stored-image.js\";\nimport { installOrderlyLazyLoadStyles } from \"./lazy-load.js\";\nimport { OrderlyNavigationMenuElement } from \"./navigation.js\";\nimport { installOrderlyDefaultStyles } from \"./styles.js\";\n\ntype ElementConstructor = new () => HTMLElement;\n\nexport interface DefineOrderlyWebComponentsOptions {\n prefix?: string;\n}\n\nconst definitions: Record<string, ElementConstructor> = {\n \"shop-footer\": OrderlyShopFooterElement,\n \"page-layout\": OrderlyPageLayoutElement,\n \"home-page\": OrderlyHomePageElement,\n \"category-page\": OrderlyCategoryPageElement,\n \"product-detail-page\": OrderlyProductDetailPageElement,\n \"product-tile\": OrderlyProductTileElement,\n \"product-page\": OrderlyProductPageElement,\n credit: OrderlyCreditElement,\n \"stored-image\": OrderlyStoredImageElement,\n \"product-grid\": OrderlyProductGridElement,\n \"product-rail\": OrderlyProductRailElement,\n \"collection-page\": OrderlyCollectionPageElement,\n \"basket-icon\": OrderlyBasketIconElement,\n basket: OrderlyBasketElement,\n checkout: OrderlyCheckoutElement,\n \"checkout-page\": OrderlyCheckoutPageElement,\n navigation: OrderlyNavigationMenuElement,\n \"search-box\": OrderlySearchBoxElement,\n \"sort-select\": OrderlySortSelectElement,\n \"filter-panel\": OrderlyFilterPanelElement,\n \"load-more\": OrderlyLoadMoreElement\n};\n\nexport function defineOrderlyWebComponents(options: DefineOrderlyWebComponentsOptions = {}): void {\n installOrderlyLazyLoadStyles();\n installOrderlyDefaultStyles();\n const prefix = options.prefix ?? \"orderly\";\n for (const [name, constructor] of Object.entries(definitions)) {\n const tagName = `${prefix}-${name}`;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, class extends constructor {});\n }\n }\n}\n","import { configureDefaultShop, type DefaultShopConfig } from \"./default-shop.js\";\nimport { configurePageLayout, type PageLayoutConfig } from \"./components/page-layout.js\";\nimport { configureShopFooter, type ShopFooterConfig } from \"./components/shop-footer.js\";\nimport { defineOrderlyWebComponents, type DefineOrderlyWebComponentsOptions } from \"./registry.js\";\nimport { configureResponsiveTemplates, type ResponsiveTemplateConfig } from \"./utils/dom.js\";\nimport { configureStoredImageUrls, type StoredImageUrlConfig } from \"./utils/format.js\";\nimport type { UiLanguage } from \"./i18n.js\";\n\nexport interface ShopConfig {\n /** UI language for built-in component copy. Defaults to Danish (\"DA\"). */\n uiLanguage?: UiLanguage | string;\n /** Shop-wide backend, navigation, query, basket, checkout, and copy defaults. */\n defaultShop?: DefaultShopConfig;\n /** Structural page layout defaults, including logo and optional layout template. */\n pageLayout?: PageLayoutConfig;\n /** Shared responsive template breakpoint configuration. */\n responsiveTemplates?: ResponsiveTemplateConfig;\n /** Default shop footer data when a shop does not provide a footer template. */\n shopFooter?: ShopFooterConfig;\n /** StoredImage URL resolver and CDN prefix configuration. */\n storedImageUrls?: StoredImageUrlConfig;\n /** Custom element registration options. Pass false when elements are registered elsewhere. */\n components?: DefineOrderlyWebComponentsOptions | false;\n}\n\n/** Configure the storefront defaults and register web components. */\nexport function configureShop(config: ShopConfig = {}): void {\n if (config.defaultShop || config.uiLanguage) {\n configureDefaultShop({\n ...config.defaultShop,\n uiLanguage: config.defaultShop?.uiLanguage ?? config.uiLanguage\n });\n }\n if (config.responsiveTemplates) {\n configureResponsiveTemplates(config.responsiveTemplates);\n }\n if (config.pageLayout) {\n configurePageLayout(config.pageLayout);\n }\n if (config.shopFooter) {\n configureShopFooter(config.shopFooter);\n }\n if (config.storedImageUrls) {\n configureStoredImageUrls(config.storedImageUrls);\n }\n if (config.components !== false) {\n defineOrderlyWebComponents(config.components);\n }\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAo4E5B,SAAS,4BAA4B,SAA+B,WAAW,UAAwC;AAC5H,MAAI,CAAC,QAAQ,MAAM;AACjB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,OAAO,eAAe,wBAAwB;AAC/D,MAAI,oBAAoB,kBAAkB;AACxC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,cAAc,OAAO;AAC1C,QAAM,KAAK;AACX,QAAM,QAAQ,uBAAuB;AACrC,QAAM,cAAc;AACpB,SAAO,KAAK,OAAO,KAAK;AACxB,SAAO;AACT;;;ACv3EA,IAAM,cAAkD;AAAA,EACtD,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,aAAa;AACf;AAEO,SAAS,2BAA2B,UAA6C,CAAC,GAAS;AAChG,+BAA6B;AAC7B,8BAA4B;AAC5B,QAAM,SAAS,QAAQ,UAAU;AACjC,aAAW,CAAC,MAAM,WAAW,KAAK,OAAO,QAAQ,WAAW,GAAG;AAC7D,UAAM,UAAU,GAAG,MAAM,IAAI,IAAI;AACjC,QAAI,CAAC,eAAe,IAAI,OAAO,GAAG;AAChC,qBAAe,OAAO,SAAS,cAAc,YAAY;AAAA,MAAC,CAAC;AAAA,IAC7D;AAAA,EACF;AACF;;;ACnCO,SAAS,cAAc,SAAqB,CAAC,GAAS;AAC3D,MAAI,OAAO,eAAe,OAAO,YAAY;AAC3C,yBAAqB;AAAA,MACnB,GAAG,OAAO;AAAA,MACV,YAAY,OAAO,aAAa,cAAc,OAAO;AAAA,IACvD,CAAC;AAAA,EACH;AACA,MAAI,OAAO,qBAAqB;AAC9B,iCAA6B,OAAO,mBAAmB;AAAA,EACzD;AACA,MAAI,OAAO,YAAY;AACrB,wBAAoB,OAAO,UAAU;AAAA,EACvC;AACA,MAAI,OAAO,YAAY;AACrB,wBAAoB,OAAO,UAAU;AAAA,EACvC;AACA,MAAI,OAAO,iBAAiB;AAC1B,6BAAyB,OAAO,eAAe;AAAA,EACjD;AACA,MAAI,OAAO,eAAe,OAAO;AAC/B,+BAA2B,OAAO,UAAU;AAAA,EAC9C;AACF;","names":["create","SearchQuerySchema","definitions","SearchQuerySchema","location","create","clone","create","SearchQuerySchema","clone","SearchQuerySchema","create","currentLocationUrl","template","create","create","create","create","clone","SearchQuerySchema","category","currentLocationUrl","template","clone","SearchQuerySchema","create","AddressSchema","PhoneNumberSchema","create","AddressSchema","PhoneNumberSchema","applyBasketLabels","clone","SearchQuerySchema","applyBasketLabels","hideSsrFallbackWhenReady","resetHorizontalScroll","configureProductExpandLink","categoryQueryWithDefaultSort","appendChildTemplate","clone","SearchQuerySchema","create","SearchQuerySchema","clone","anyUnpack","SearchQuerySchema","clone","SearchQuerySchema","tile","anyUnpack","ORDERLY_SHARE_URL_PREFIX","locationPath","appendChildTemplate","hideSsrFallbackWhenReady","applyBasketLabels","create","SearchQuerySchema","clone","create","SearchQuerySchema","clone","SearchQuerySchema","create","template","img","rendered","locationPath","locationPath"]}
|