[{"data":1,"prerenderedAt":4001},["ShallowReactive",2],{"navigation_docs":3,"-frontend-orchestr-recipes-translating-vendor-errors":1474,"-frontend-orchestr-recipes-translating-vendor-errors-surround":3996},[4,132,442,591,1159,1231,1237,1243,1302,1401],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","/getting-started","0.getting-started/0.index",[9,10,14,18,56,81,115,128],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Starting new project","/getting-started/starting-new-project","0.getting-started/1.starting-new-project",{"title":15,"path":16,"stem":17},"What is Laioutr?","/getting-started/what-is-laioutr","0.getting-started/2.what-is-laioutr",{"title":19,"path":20,"stem":21,"children":22,"page":55},"Key Concepts","/getting-started/key-concepts","0.getting-started/3.key-concepts",[23,27,31,35,39,43,47,51],{"title":24,"path":25,"stem":26},"Architecture","/getting-started/key-concepts/architecture","0.getting-started/3.key-concepts/1.architecture",{"title":28,"path":29,"stem":30},"Data Model","/getting-started/key-concepts/data-model","0.getting-started/3.key-concepts/2.data-model",{"title":32,"path":33,"stem":34},"Internationalization","/getting-started/key-concepts/5.internationalization","0.getting-started/3.key-concepts/3.5.internationalization",{"title":36,"path":37,"stem":38},"Data Flow","/getting-started/key-concepts/data-flow","0.getting-started/3.key-concepts/3.data-flow",{"title":40,"path":41,"stem":42},"Extensibility","/getting-started/key-concepts/extensibility","0.getting-started/3.key-concepts/4.extensibility",{"title":44,"path":45,"stem":46},"Philosophy","/getting-started/key-concepts/philosophy","0.getting-started/3.key-concepts/5.philosophy",{"title":48,"path":49,"stem":50},"CI/CD Pipeline","/getting-started/key-concepts/ci-cd-pipeline","0.getting-started/3.key-concepts/6.ci-cd-pipeline",{"title":52,"path":53,"stem":54},"Multi-tenancy","/getting-started/key-concepts/multi-tenancy","0.getting-started/3.key-concepts/multi-tenancy",false,{"title":57,"path":58,"stem":59,"children":60,"page":55},"Next Steps","/getting-started/next-steps","0.getting-started/4.next-steps",[61,65,69,73,77],{"title":62,"path":63,"stem":64},"Create Organization and Project","/getting-started/next-steps/create-org-and-project","0.getting-started/4.next-steps/0.create-org-and-project",{"title":66,"path":67,"stem":68},"First Project Configuration","/getting-started/next-steps/first-project-config","0.getting-started/4.next-steps/1.first-project-config",{"title":70,"path":71,"stem":72},"Setup Local Development Environment","/getting-started/next-steps/local-setup","0.getting-started/4.next-steps/3.local-setup",{"title":74,"path":75,"stem":76},"Create your first custom app","/getting-started/next-steps/create-custom-app","0.getting-started/4.next-steps/4.create-custom-app",{"title":78,"path":79,"stem":80},"CLI","/getting-started/next-steps/cli","0.getting-started/4.next-steps/5.cli",{"title":82,"path":83,"stem":84,"children":85},"Changelogs","/getting-started/changelogs","0.getting-started/5.Changelogs/0.index",[86,87,91,95,99,103,107,111],{"title":82,"path":83,"stem":84},{"title":88,"path":89,"stem":90},"CLI Changelog","/getting-started/changelogs/cli-changelog","0.getting-started/5.Changelogs/cli-changelog",{"title":92,"path":93,"stem":94},"Cockpit Changelog","/getting-started/changelogs/cockpit-changelog","0.getting-started/5.Changelogs/cockpit-changelog",{"title":96,"path":97,"stem":98},"Figma Kit Changelog","/getting-started/changelogs/figma-kit-changelog","0.getting-started/5.Changelogs/figma-kit-changelog",{"title":100,"path":101,"stem":102},"Frontend Changelog","/getting-started/changelogs/frontend-changelog","0.getting-started/5.Changelogs/frontend-changelog",{"title":104,"path":105,"stem":106},"Orchestr Changelog","/getting-started/changelogs/orchestr-changelog","0.getting-started/5.Changelogs/orchestr-changelog",{"title":108,"path":109,"stem":110},"Orchestr Devtools Changelog","/getting-started/changelogs/orchestr-devtools-changelog","0.getting-started/5.Changelogs/orchestr-devtools-changelog",{"title":112,"path":113,"stem":114},"UI Changelog","/getting-started/changelogs/ui-changelog","0.getting-started/5.Changelogs/ui-changelog",{"title":116,"path":117,"stem":118,"children":119,"page":55},"Hints And Tips","/getting-started/hints-and-tips","0.getting-started/6.Hints-and-Tips",[120,124],{"title":121,"path":122,"stem":123},"Introduction","/getting-started/hints-and-tips/introduction","0.getting-started/6.Hints-and-Tips/0.introduction",{"title":125,"path":126,"stem":127},"Developer tools","/getting-started/hints-and-tips/developer-tools","0.getting-started/6.Hints-and-Tips/1.developer-tools",{"title":129,"path":130,"stem":131},"MCP Server","/getting-started/mcp-server","0.getting-started/7.mcp-server",{"title":133,"path":134,"stem":135,"children":136},"Frontend","/frontend","1.Frontend/0.index",[137,138,149,211,237,301],{"title":133,"path":134,"stem":135},{"title":121,"path":139,"stem":140,"children":141,"page":55},"/frontend/introduction","1.Frontend/1.Introduction",[142,145],{"title":19,"path":143,"stem":144},"/frontend/introduction/key-concepts","1.Frontend/1.Introduction/0.key-concepts",{"title":146,"path":147,"stem":148},"Tech Stack","/frontend/introduction/tech-stack","1.Frontend/1.Introduction/1.tech-stack",{"title":150,"path":151,"stem":152,"children":153},"Features","/frontend/features","1.Frontend/2.Features/0.index",[154,155,159,163,167,171,175,179,183,187,191,195,199,203,207],{"title":150,"path":151,"stem":152},{"title":156,"path":157,"stem":158},"Consent Management","/frontend/features/consent-management","1.Frontend/2.Features/consent-management",{"title":160,"path":161,"stem":162},"Currencies","/frontend/features/currencies","1.Frontend/2.Features/currencies",{"title":164,"path":165,"stem":166},"Environments & Staging","/frontend/features/environments","1.Frontend/2.Features/environments",{"title":168,"path":169,"stem":170},"Hooks","/frontend/features/hooks","1.Frontend/2.Features/hooks",{"title":172,"path":173,"stem":174},"Media and Media Library","/frontend/features/media","1.Frontend/2.Features/media",{"title":176,"path":177,"stem":178},"Multi-language Support","/frontend/features/multi-language-support","1.Frontend/2.Features/multi-language-support",{"title":180,"path":181,"stem":182},"Multi-market","/frontend/features/multi-market","1.Frontend/2.Features/multi-market",{"title":184,"path":185,"stem":186},"Page Types","/frontend/features/pagetypes","1.Frontend/2.Features/pagetypes",{"title":188,"path":189,"stem":190},"PWA","/frontend/features/pwa","1.Frontend/2.Features/pwa",{"title":192,"path":193,"stem":194},"Redirects","/frontend/features/redirects","1.Frontend/2.Features/redirects",{"title":196,"path":197,"stem":198},"Routing","/frontend/features/routing","1.Frontend/2.Features/routing",{"title":200,"path":201,"stem":202},"Server-Side Rendering (SSR) and Caching","/frontend/features/ssr-and-caching","1.Frontend/2.Features/ssr-and-caching",{"title":204,"path":205,"stem":206},"Tracking","/frontend/features/tracking","1.Frontend/2.Features/tracking",{"title":208,"path":209,"stem":210},"Z-Ordering","/frontend/features/z-ordering","1.Frontend/2.Features/z-ordering",{"title":212,"path":213,"stem":214,"children":215},"SEO","/frontend/seo","1.Frontend/3.SEO/0.index",[216,217,221,225,229,233],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Link Checker","/frontend/seo/link-checker","1.Frontend/3.SEO/link-checker",{"title":222,"path":223,"stem":224},"OG Image","/frontend/seo/og-image","1.Frontend/3.SEO/og-image",{"title":226,"path":227,"stem":228},"Robots.txt","/frontend/seo/robots-txt","1.Frontend/3.SEO/robots-txt",{"title":230,"path":231,"stem":232},"Schema.org","/frontend/seo/schema-org","1.Frontend/3.SEO/schema-org",{"title":234,"path":235,"stem":236},"Sitemap","/frontend/seo/sitemap","1.Frontend/3.SEO/sitemap",{"title":238,"path":239,"stem":240,"children":241},"Backend for Frontend","/frontend/orchestr","1.Frontend/4.Orchestr/0.index",[242,243,269,273,277,281,285,289,293,297],{"title":238,"path":239,"stem":240},{"title":244,"path":245,"stem":246,"children":247},"Recipes","/frontend/orchestr/recipes","1.Frontend/4.Orchestr/99.recipes/0.index",[248,249,253,257,261,265],{"title":244,"path":245,"stem":246},{"title":250,"path":251,"stem":252},"Analytics components from query handlers","/frontend/orchestr/recipes/analytics-from-query-handlers","1.Frontend/4.Orchestr/99.recipes/analytics-from-query-handlers",{"title":254,"path":255,"stem":256},"Identity cookies (cart and visitor IDs)","/frontend/orchestr/recipes/identity-cookies","1.Frontend/4.Orchestr/99.recipes/identity-cookies",{"title":258,"path":259,"stem":260},"System bootstrap in extendRequest","/frontend/orchestr/recipes/system-bootstrap","1.Frontend/4.Orchestr/99.recipes/system-bootstrap",{"title":262,"path":263,"stem":264},"Translating vendor errors","/frontend/orchestr/recipes/translating-vendor-errors","1.Frontend/4.Orchestr/99.recipes/translating-vendor-errors",{"title":266,"path":267,"stem":268},"Userland cache patterns","/frontend/orchestr/recipes/userland-cache-patterns","1.Frontend/4.Orchestr/99.recipes/userland-cache-patterns",{"title":270,"path":271,"stem":272},"Actions","/frontend/orchestr/actions","1.Frontend/4.Orchestr/Actions",{"title":274,"path":275,"stem":276},"Caching","/frontend/orchestr/caching","1.Frontend/4.Orchestr/Caching",{"title":278,"path":279,"stem":280},"Middleware","/frontend/orchestr/middleware","1.Frontend/4.Orchestr/Middleware",{"title":282,"path":283,"stem":284},"Queries & Links","/frontend/orchestr/queries","1.Frontend/4.Orchestr/Queries",{"title":286,"path":287,"stem":288},"Component Resolvers","/frontend/orchestr/component-resolvers","1.Frontend/4.Orchestr/component-resolvers",{"title":290,"path":291,"stem":292},"Filters","/frontend/orchestr/filters","1.Frontend/4.Orchestr/filters",{"title":294,"path":295,"stem":296},"URL Query Parameters","/frontend/orchestr/url-query-params","1.Frontend/4.Orchestr/url-query-params",{"title":298,"path":299,"stem":300},"Orchestr Wire Format","/frontend/orchestr/wire-format","1.Frontend/4.Orchestr/wire-format",{"title":302,"path":303,"stem":304,"children":305},"API Reference","/frontend/api-reference","1.Frontend/99.api-reference/0.index",[306,307,364,367,392,408,416,427,435],{"title":302,"path":303,"stem":304},{"title":308,"path":309,"stem":310,"children":311,"page":55},"Entities","/frontend/api-reference/entities","1.Frontend/99.api-reference/01.entities",[312,316,320,324,328,332,336,340,344,348,352,356,360],{"title":313,"path":314,"stem":315},"Product","/frontend/api-reference/entities/product","1.Frontend/99.api-reference/01.entities/1.product",{"title":317,"path":318,"stem":319},"SuggestedSearch","/frontend/api-reference/entities/suggested-search","1.Frontend/99.api-reference/01.entities/10.suggested-search",{"title":321,"path":322,"stem":323},"SuggestedSearchEntry","/frontend/api-reference/entities/suggested-search-entry","1.Frontend/99.api-reference/01.entities/11.suggested-search-entry",{"title":325,"path":326,"stem":327},"BlogCollection","/frontend/api-reference/entities/blog-collection","1.Frontend/99.api-reference/01.entities/12.blog-collection",{"title":329,"path":330,"stem":331},"Comment","/frontend/api-reference/entities/comment","1.Frontend/99.api-reference/01.entities/13.comment",{"title":333,"path":334,"stem":335},"ProductVariant","/frontend/api-reference/entities/product-variant","1.Frontend/99.api-reference/01.entities/2.product-variant",{"title":337,"path":338,"stem":339},"Category","/frontend/api-reference/entities/category","1.Frontend/99.api-reference/01.entities/3.category",{"title":341,"path":342,"stem":343},"Cart","/frontend/api-reference/entities/cart","1.Frontend/99.api-reference/01.entities/4.cart",{"title":345,"path":346,"stem":347},"CartItem","/frontend/api-reference/entities/cart-item","1.Frontend/99.api-reference/01.entities/5.cart-item",{"title":349,"path":350,"stem":351},"Review","/frontend/api-reference/entities/review","1.Frontend/99.api-reference/01.entities/6.review",{"title":353,"path":354,"stem":355},"BreadcrumbItem","/frontend/api-reference/entities/breadcrumb-item","1.Frontend/99.api-reference/01.entities/7.breadcrumb-item",{"title":357,"path":358,"stem":359},"MenuItem","/frontend/api-reference/entities/menu-item","1.Frontend/99.api-reference/01.entities/8.menu-item",{"title":361,"path":362,"stem":363},"BlogPost","/frontend/api-reference/entities/blog-post","1.Frontend/99.api-reference/01.entities/9.blog-post",{"title":184,"path":365,"stem":366},"/frontend/api-reference/page-types","1.Frontend/99.api-reference/02.page-types",{"title":368,"path":369,"stem":370,"children":371,"page":55},"Common Types","/frontend/api-reference/common-types","1.Frontend/99.api-reference/03.common-types",[372,376,380,384,388],{"title":373,"path":374,"stem":375},"Link","/frontend/api-reference/common-types/link","1.Frontend/99.api-reference/03.common-types/1.link",{"title":377,"path":378,"stem":379},"Media","/frontend/api-reference/common-types/media","1.Frontend/99.api-reference/03.common-types/2.media",{"title":381,"path":382,"stem":383},"Money","/frontend/api-reference/common-types/money","1.Frontend/99.api-reference/03.common-types/3.money",{"title":385,"path":386,"stem":387},"UnitPrice","/frontend/api-reference/common-types/unit-price","1.Frontend/99.api-reference/03.common-types/4.unit-price",{"title":389,"path":390,"stem":391},"Measurement","/frontend/api-reference/common-types/measurement","1.Frontend/99.api-reference/03.common-types/5.measurement",{"title":393,"path":394,"stem":395,"children":396,"page":55},"Ecommerce","/frontend/api-reference/ecommerce","1.Frontend/99.api-reference/10.ecommerce",[397,400,404],{"title":270,"path":398,"stem":399},"/frontend/api-reference/ecommerce/actions","1.Frontend/99.api-reference/10.ecommerce/1.actions",{"title":401,"path":402,"stem":403},"Queries","/frontend/api-reference/ecommerce/queries","1.Frontend/99.api-reference/10.ecommerce/2.queries",{"title":405,"path":406,"stem":407},"Errors","/frontend/api-reference/ecommerce/errors","1.Frontend/99.api-reference/10.ecommerce/3.errors",{"title":409,"path":410,"stem":411,"children":412,"page":55},"Newsletter","/frontend/api-reference/newsletter","1.Frontend/99.api-reference/11.newsletter",[413],{"title":270,"path":414,"stem":415},"/frontend/api-reference/newsletter/actions","1.Frontend/99.api-reference/11.newsletter/1.actions",{"title":417,"path":418,"stem":419,"children":420,"page":55},"Blog","/frontend/api-reference/blog","1.Frontend/99.api-reference/12.blog",[421,424],{"title":401,"path":422,"stem":423},"/frontend/api-reference/blog/queries","1.Frontend/99.api-reference/12.blog/1.queries",{"title":405,"path":425,"stem":426},"/frontend/api-reference/blog/errors","1.Frontend/99.api-reference/12.blog/2.errors",{"title":428,"path":429,"stem":430,"children":431,"page":55},"Suggested Search","/frontend/api-reference/suggested-search","1.Frontend/99.api-reference/13.suggested-search",[432],{"title":401,"path":433,"stem":434},"/frontend/api-reference/suggested-search/queries","1.Frontend/99.api-reference/13.suggested-search/1.queries",{"title":204,"path":436,"stem":437,"children":438,"page":55},"/frontend/api-reference/tracking","1.Frontend/99.api-reference/14.tracking",[439],{"title":270,"path":440,"stem":441},"/frontend/api-reference/tracking/actions","1.Frontend/99.api-reference/14.tracking/1.actions",{"title":443,"path":444,"stem":445,"children":446},"Apps","/apps","2.Apps/0.index",[447,448,502,575],{"title":443,"path":444,"stem":445},{"title":449,"path":450,"stem":451,"children":452},"App Development","/apps/app-development","2.Apps/app-development/0.index",[453,454,458,462,466,470,474,478,482,486,490,494,498],{"title":449,"path":450,"stem":451},{"title":455,"path":456,"stem":457},"App Configuration","/apps/app-development/app-configuration","2.Apps/app-development/app-configuration",{"title":459,"path":460,"stem":461},"App Starter","/apps/app-development/app-starter","2.Apps/app-development/app-starter",{"title":463,"path":464,"stem":465},"Best Practice","/apps/app-development/best-practice","2.Apps/app-development/best-practice",{"title":467,"path":468,"stem":469},"Block Definitions","/apps/app-development/block-definitions","2.Apps/app-development/block-definitions",{"title":471,"path":472,"stem":473},"Coding Standards","/apps/app-development/coding-standards","2.Apps/app-development/coding-standards",{"title":475,"path":476,"stem":477},"Consent Adapters","/apps/app-development/consent-adapters","2.Apps/app-development/consent-adapters",{"title":479,"path":480,"stem":481},"Consuming Query Fields","/apps/app-development/consuming-query-fields","2.Apps/app-development/consuming-query-fields",{"title":483,"path":484,"stem":485},"Implementation Overview","/apps/app-development/implementation-overview","2.Apps/app-development/implementation-overview",{"title":487,"path":488,"stem":489},"Platform Dependencies","/apps/app-development/platform-dependencies","2.Apps/app-development/platform-dependencies",{"title":491,"path":492,"stem":493},"Schema Fields","/apps/app-development/schema-fields","2.Apps/app-development/schema-fields",{"title":495,"path":496,"stem":497},"Section Definitions","/apps/app-development/section-definitions","2.Apps/app-development/section-definitions",{"title":499,"path":500,"stem":501},"Studio Icons","/apps/app-development/studio-icons","2.Apps/app-development/studio-icons",{"title":503,"path":504,"stem":505,"children":506,"page":55},"App Docs","/apps/app-docs","2.Apps/app-docs",[507,511,515,519,523,527,531,535,539,543,547,551,555,559,563,567,571],{"title":508,"path":509,"stem":510},"Adobe Commerce","/apps/app-docs/adobe-commerce","2.Apps/app-docs/adobe-commerce",{"title":512,"path":513,"stem":514},"B2Bsellers","/apps/app-docs/b2bsellers","2.Apps/app-docs/b2bsellers",{"title":516,"path":517,"stem":518},"Battery Included","/apps/app-docs/battery-included","2.Apps/app-docs/battery-included",{"title":520,"path":521,"stem":522},"CCM19","/apps/app-docs/ccm19","2.Apps/app-docs/ccm19",{"title":524,"path":525,"stem":526},"Cookiebot","/apps/app-docs/cookiebot","2.Apps/app-docs/cookiebot",{"title":528,"path":529,"stem":530},"Google Tag Manager (GTM)","/apps/app-docs/gtm","2.Apps/app-docs/gtm",{"title":532,"path":533,"stem":534},"Hygraph","/apps/app-docs/hygraph","2.Apps/app-docs/hygraph",{"title":536,"path":537,"stem":538},"Nimstrata Google Retail API","/apps/app-docs/nimstrata","2.Apps/app-docs/nimstrata",{"title":540,"path":541,"stem":542},"Pimcore","/apps/app-docs/pimcore","2.Apps/app-docs/pimcore",{"title":544,"path":545,"stem":546},"Commercetools","/apps/app-docs/commercetools","2.apps/app-docs/commercetools",{"title":548,"path":549,"stem":550},"Emporix","/apps/app-docs/emporix","2.apps/app-docs/emporix",{"title":552,"path":553,"stem":554},"Klaviyo","/apps/app-docs/klaviyo","2.apps/app-docs/klaviyo",{"title":556,"path":557,"stem":558},"OXID eShop","/apps/app-docs/oxid","2.apps/app-docs/oxid",{"title":560,"path":561,"stem":562},"Shopify","/apps/app-docs/shopify","2.apps/app-docs/shopify",{"title":564,"path":565,"stem":566},"Shopware","/apps/app-docs/shopware","2.apps/app-docs/shopware",{"title":568,"path":569,"stem":570},"Vercel Analytics","/apps/app-docs/vercel-analytics","2.apps/app-docs/vercel-analytics",{"title":572,"path":573,"stem":574},"Vercel Speed Insights","/apps/app-docs/vercel-speed-insights","2.apps/app-docs/vercel-speed-insights",{"title":576,"path":577,"stem":578,"children":579,"page":55},"Essentials","/apps/essentials","2.Apps/essentials",[580,584,588],{"title":581,"path":582,"stem":583},"Legal","/apps/essentials/legal","2.Apps/essentials/legal",{"title":585,"path":586,"stem":587},"Mailer","/apps/essentials/mailer","2.Apps/essentials/mailer",{"title":212,"path":589,"stem":590},"/apps/essentials/seo","2.Apps/essentials/seo",{"title":592,"path":593,"stem":594,"children":595},"Laioutr UI","/laioutr-ui","3.laioutr-ui/0.index",[596,597,621,627,633,739,745,751,805,827,880],{"title":592,"path":593,"stem":594},{"title":5,"path":598,"stem":599,"children":600},"/laioutr-ui/getting-started","3.laioutr-ui/01.getting-started/0.index",[601,602,606,610,614,618],{"title":5,"path":598,"stem":599},{"title":603,"path":604,"stem":605},"Browser support","/laioutr-ui/getting-started/browser-support","3.laioutr-ui/01.getting-started/1.browser-support",{"title":607,"path":608,"stem":609},"Common Data","/laioutr-ui/getting-started/common-data","3.laioutr-ui/01.getting-started/99.common-data",{"title":611,"path":612,"stem":613},"Figma Kit","/laioutr-ui/getting-started/figma-kit","3.laioutr-ui/01.getting-started/figma-kit",{"title":615,"path":616,"stem":617},"Theming","/laioutr-ui/getting-started/theming","3.laioutr-ui/01.getting-started/theming",{"title":208,"path":619,"stem":620},"/laioutr-ui/getting-started/z-ordering","3.laioutr-ui/01.getting-started/z-ordering",{"title":622,"path":623,"stem":624,"children":625},"B2B","/laioutr-ui/b2b","3.laioutr-ui/b2b/0.index",[626],{"title":622,"path":623,"stem":624},{"title":628,"path":629,"stem":630,"children":631},"Booking","/laioutr-ui/booking","3.laioutr-ui/booking/0.index",[632],{"title":628,"path":629,"stem":630},{"title":634,"path":635,"stem":636,"children":637},"CMS","/laioutr-ui/cms","3.laioutr-ui/cms/0.index",[638,639,664,672,684,693,714],{"title":634,"path":635,"stem":636},{"title":640,"path":641,"stem":642,"children":643,"page":55},"Banner","/laioutr-ui/cms/banner","3.laioutr-ui/cms/banner",[644,648,652,656,660],{"title":645,"path":646,"stem":647},"Banner Slider","/laioutr-ui/cms/banner/bannerslider","3.laioutr-ui/cms/banner/BannerSlider",{"title":649,"path":650,"stem":651},"Basic Banner with Image and Text","/laioutr-ui/cms/banner/basicbannerwithimageandtext","3.laioutr-ui/cms/banner/BasicBannerWithImageAndText",{"title":653,"path":654,"stem":655},"Content with Image and Text","/laioutr-ui/cms/banner/contentwithimageandtext","3.laioutr-ui/cms/banner/ContentWithImageAndText",{"title":657,"path":658,"stem":659},"Content With Text Columns","/laioutr-ui/cms/banner/contentwithtextcolumns","3.laioutr-ui/cms/banner/ContentWithTextColumns",{"title":661,"path":662,"stem":663},"USP Banner","/laioutr-ui/cms/banner/uspbanner","3.laioutr-ui/cms/banner/UspBanner",{"title":417,"path":665,"stem":666,"children":667,"page":55},"/laioutr-ui/cms/blog","3.laioutr-ui/cms/blog",[668],{"title":669,"path":670,"stem":671},"Blog Post","/laioutr-ui/cms/blog/blogpost","3.laioutr-ui/cms/blog/BlogPost",{"title":409,"path":673,"stem":674,"children":675,"page":55},"/laioutr-ui/cms/newsletter","3.laioutr-ui/cms/newsletter",[676,680],{"title":677,"path":678,"stem":679},"Input for Newsletter","/laioutr-ui/cms/newsletter/inputnewsletter","3.laioutr-ui/cms/newsletter/InputNewsletter",{"title":681,"path":682,"stem":683},"Newsletter Registration","/laioutr-ui/cms/newsletter/newsletterregistration","3.laioutr-ui/cms/newsletter/NewsletterRegistration",{"title":685,"path":686,"stem":687,"children":688,"page":55},"Quotes","/laioutr-ui/cms/quotes","3.laioutr-ui/cms/quotes",[689],{"title":690,"path":691,"stem":692},"Personal Quote with Text and Image","/laioutr-ui/cms/quotes/personalquote","3.laioutr-ui/cms/quotes/PersonalQuote",{"title":694,"path":695,"stem":696,"children":697,"page":55},"Reviews","/laioutr-ui/cms/reviews","3.laioutr-ui/cms/reviews",[698,702,706,710],{"title":699,"path":700,"stem":701},"Quote Card","/laioutr-ui/cms/reviews/quotecard","3.laioutr-ui/cms/reviews/QuoteCard",{"title":703,"path":704,"stem":705},"Rating","/laioutr-ui/cms/reviews/rating","3.laioutr-ui/cms/reviews/Rating",{"title":707,"path":708,"stem":709},"Rating Form","/laioutr-ui/cms/reviews/ratingform","3.laioutr-ui/cms/reviews/RatingForm",{"title":711,"path":712,"stem":713},"Review Section","/laioutr-ui/cms/reviews/reviewsection","3.laioutr-ui/cms/reviews/ReviewSection",{"title":715,"path":716,"stem":717,"children":718,"page":55},"Slider","/laioutr-ui/cms/slider","3.laioutr-ui/cms/slider",[719,723,727,731,735],{"title":720,"path":721,"stem":722},"Hero Slider","/laioutr-ui/cms/slider/heroslider","3.laioutr-ui/cms/slider/HeroSlider",{"title":724,"path":725,"stem":726},"Logo Slider","/laioutr-ui/cms/slider/logoslider","3.laioutr-ui/cms/slider/LogoSlider",{"title":728,"path":729,"stem":730},"Swiper Navigation with Bullets","/laioutr-ui/cms/slider/swipernavigationbullets","3.laioutr-ui/cms/slider/SwiperNavigationBullets",{"title":732,"path":733,"stem":734},"Swiper Navigation Compact","/laioutr-ui/cms/slider/swipernavigationcompact","3.laioutr-ui/cms/slider/SwiperNavigationCompact",{"title":736,"path":737,"stem":738},"Swiper Navigation with Numbers","/laioutr-ui/cms/slider/swipernavigationnumbers","3.laioutr-ui/cms/slider/SwiperNavigationNumbers",{"title":740,"path":741,"stem":742,"children":743},"Marketplace","/laioutr-ui/marketplace","3.laioutr-ui/marketplace/0.index",[744],{"title":740,"path":741,"stem":742},{"title":746,"path":747,"stem":748,"children":749},"Multichannel","/laioutr-ui/multichannel","3.laioutr-ui/multichannel/0.index",[750],{"title":746,"path":747,"stem":748},{"title":752,"path":753,"stem":754,"children":755},"Navigation & Headers","/laioutr-ui/navigation","3.laioutr-ui/navigation/0.index",[756,757,761,765,769,773,777,781,785,789,793,797,801],{"title":752,"path":753,"stem":754},{"title":758,"path":759,"stem":760},"Basic Header","/laioutr-ui/navigation/basicheader","3.laioutr-ui/navigation/BasicHeader",{"title":762,"path":763,"stem":764},"Color Mode Switch","/laioutr-ui/navigation/colormodeswitch","3.laioutr-ui/navigation/ColorModeSwitch",{"title":766,"path":767,"stem":768},"Desktop Side By Side Menu","/laioutr-ui/navigation/desktopsidebysidemenu","3.laioutr-ui/navigation/DesktopSideBySideMenu",{"title":770,"path":771,"stem":772},"Header with Text Links","/laioutr-ui/navigation/headerwithtextlinks","3.laioutr-ui/navigation/HeaderWithTextLinks",{"title":774,"path":775,"stem":776},"Locale Select","/laioutr-ui/navigation/localeselect","3.laioutr-ui/navigation/LocaleSelect",{"title":778,"path":779,"stem":780},"Mega Menu Desktop","/laioutr-ui/navigation/megamenudesktop","3.laioutr-ui/navigation/MegaMenuDesktop",{"title":782,"path":783,"stem":784},"Mobile Menu","/laioutr-ui/navigation/mobilemenu","3.laioutr-ui/navigation/MobileMenu",{"title":786,"path":787,"stem":788},"Search Overlay Input","/laioutr-ui/navigation/searchoverlayinput","3.laioutr-ui/navigation/SearchOverlayInput",{"title":790,"path":791,"stem":792},"Shop Header","/laioutr-ui/navigation/shopheader","3.laioutr-ui/navigation/ShopHeader",{"title":794,"path":795,"stem":796},"Top Bar","/laioutr-ui/navigation/topbar","3.laioutr-ui/navigation/TopBar",{"title":798,"path":799,"stem":800},"Breadcrumb","/laioutr-ui/navigation/breadcrumb","3.laioutr-ui/navigation/breadcrumb",{"title":802,"path":803,"stem":804},"Footer","/laioutr-ui/navigation/footer","3.laioutr-ui/navigation/footer",{"title":806,"path":807,"stem":808,"children":809},"SaaS","/laioutr-ui/saas","3.laioutr-ui/saas/0.index",[810,811,815,819,823],{"title":806,"path":807,"stem":808},{"title":812,"path":813,"stem":814},"Billing Cycle Switch","/laioutr-ui/saas/billingcycleswitch","3.laioutr-ui/saas/BillingCycleSwitch",{"title":816,"path":817,"stem":818},"Pricing Plan","/laioutr-ui/saas/pricingplan","3.laioutr-ui/saas/pricingplan",{"title":820,"path":821,"stem":822},"Pricing Plans","/laioutr-ui/saas/pricingplans","3.laioutr-ui/saas/pricingplans",{"title":824,"path":825,"stem":826},"Pricing Table","/laioutr-ui/saas/pricingtable","3.laioutr-ui/saas/pricingtable",{"title":828,"path":829,"stem":830,"children":831},"Shop","/laioutr-ui/shop","3.laioutr-ui/shop/0.index",[832,833,837,841,845,849,853,857,861,865,869,873,877],{"title":828,"path":829,"stem":830},{"title":834,"path":835,"stem":836},"Cards Container","/laioutr-ui/shop/cardscontainer","3.laioutr-ui/shop/CardsContainer",{"title":838,"path":839,"stem":840},"Grid Card Content","/laioutr-ui/shop/gridcardcontent","3.laioutr-ui/shop/GridCardContent",{"title":842,"path":843,"stem":844},"Grid Card Text Content","/laioutr-ui/shop/gridcardtextcontent","3.laioutr-ui/shop/GridCardTextContent",{"title":846,"path":847,"stem":848},"Inpage Navigation Basic Grid","/laioutr-ui/shop/inpagenavigationbasicgrid","3.laioutr-ui/shop/InpageNavigationBasicGrid",{"title":850,"path":851,"stem":852},"Inpage Navigation Basic Slider","/laioutr-ui/shop/inpagenavigationbasicslider","3.laioutr-ui/shop/InpageNavigationBasicSlider",{"title":854,"path":855,"stem":856},"Inpage Navigation Big Grid","/laioutr-ui/shop/inpagenavigationbiggrid","3.laioutr-ui/shop/InpageNavigationBigGrid",{"title":858,"path":859,"stem":860},"Inpage Navigation Big Slider","/laioutr-ui/shop/inpagenavigationbigslider","3.laioutr-ui/shop/InpageNavigationBigSlider",{"title":862,"path":863,"stem":864},"Inpage Navigation Compact Grid","/laioutr-ui/shop/inpagenavigationcompactgrid","3.laioutr-ui/shop/InpageNavigationCompactGrid",{"title":866,"path":867,"stem":868},"Inpage Navigation Compact Slider","/laioutr-ui/shop/inpagenavigationcompactslider","3.laioutr-ui/shop/InpageNavigationCompactSlider",{"title":870,"path":871,"stem":872},"Product Card","/laioutr-ui/shop/productcard","3.laioutr-ui/shop/ProductCard",{"title":874,"path":875,"stem":876},"Product Slider","/laioutr-ui/shop/productslider","3.laioutr-ui/shop/ProductSlider",{"title":290,"path":878,"stem":879},"/laioutr-ui/shop/filters","3.laioutr-ui/shop/filters",{"title":881,"path":882,"stem":883,"children":884},"UI Kit","/laioutr-ui/ui-kit","3.laioutr-ui/ui-kit/0.index",[885,886,962,982,1003,1036,1057,1122],{"title":881,"path":882,"stem":883},{"title":887,"path":888,"stem":889,"children":890,"page":55},"General","/laioutr-ui/ui-kit/general","3.laioutr-ui/ui-kit/01.general",[891,895,899,903,907,911,915,919,923,927,931,935,938,942,946,950,954,958],{"title":892,"path":893,"stem":894},"Accordion","/laioutr-ui/ui-kit/general/accordion","3.laioutr-ui/ui-kit/01.general/Accordion",{"title":896,"path":897,"stem":898},"Avatar","/laioutr-ui/ui-kit/general/avatar","3.laioutr-ui/ui-kit/01.general/Avatar",{"title":900,"path":901,"stem":902},"Backdrop","/laioutr-ui/ui-kit/general/backdrop","3.laioutr-ui/ui-kit/01.general/Backdrop",{"title":904,"path":905,"stem":906},"Color Swatch","/laioutr-ui/ui-kit/general/colorswatch","3.laioutr-ui/ui-kit/01.general/ColorSwatch",{"title":908,"path":909,"stem":910},"Dropdown Menu","/laioutr-ui/ui-kit/general/dropdownmenu","3.laioutr-ui/ui-kit/01.general/DropdownMenu",{"title":912,"path":913,"stem":914},"Edge Glow","/laioutr-ui/ui-kit/general/edgeglow","3.laioutr-ui/ui-kit/01.general/EdgeGlow",{"title":916,"path":917,"stem":918},"Empty State","/laioutr-ui/ui-kit/general/emptystate","3.laioutr-ui/ui-kit/01.general/EmptyState",{"title":920,"path":921,"stem":922},"Icon","/laioutr-ui/ui-kit/general/icon","3.laioutr-ui/ui-kit/01.general/Icon",{"title":924,"path":925,"stem":926},"Image Contrast Overlay","/laioutr-ui/ui-kit/general/imagecontrastoverlay","3.laioutr-ui/ui-kit/01.general/ImageContrastOverlay",{"title":928,"path":929,"stem":930},"Image Variant Thumbnail","/laioutr-ui/ui-kit/general/imagevariantthumbnail","3.laioutr-ui/ui-kit/01.general/ImageVariantThumbnail",{"title":932,"path":933,"stem":934},"Loading Spinner","/laioutr-ui/ui-kit/general/loadingspinner","3.laioutr-ui/ui-kit/01.general/LoadingSpinner",{"title":377,"path":936,"stem":937},"/laioutr-ui/ui-kit/general/media","3.laioutr-ui/ui-kit/01.general/Media",{"title":939,"path":940,"stem":941},"Navigation Bullets","/laioutr-ui/ui-kit/general/navigationbullets","3.laioutr-ui/ui-kit/01.general/NavigationBullets",{"title":943,"path":944,"stem":945},"Placeholder","/laioutr-ui/ui-kit/general/placeholder","3.laioutr-ui/ui-kit/01.general/Placeholder",{"title":947,"path":948,"stem":949},"Progress Bar","/laioutr-ui/ui-kit/general/progressbar","3.laioutr-ui/ui-kit/01.general/ProgressBar",{"title":951,"path":952,"stem":953},"Scrollbar","/laioutr-ui/ui-kit/general/scrollbar","3.laioutr-ui/ui-kit/01.general/Scrollbar",{"title":955,"path":956,"stem":957},"Swatch Preview","/laioutr-ui/ui-kit/general/swatchpreview","3.laioutr-ui/ui-kit/01.general/SwatchPreview",{"title":959,"path":960,"stem":961},"Thumbnail","/laioutr-ui/ui-kit/general/thumbnail","3.laioutr-ui/ui-kit/01.general/Thumbnail",{"title":963,"path":964,"stem":965,"children":966,"page":55},"Typography","/laioutr-ui/ui-kit/typography","3.laioutr-ui/ui-kit/02.typography",[967,971,974,978],{"title":968,"path":969,"stem":970},"Icon List","/laioutr-ui/ui-kit/typography/iconlist","3.laioutr-ui/ui-kit/02.typography/IconList",{"title":373,"path":972,"stem":973},"/laioutr-ui/ui-kit/typography/link","3.laioutr-ui/ui-kit/02.typography/Link",{"title":975,"path":976,"stem":977},"Rich Content","/laioutr-ui/ui-kit/typography/richcontent","3.laioutr-ui/ui-kit/02.typography/RichContent",{"title":979,"path":980,"stem":981},"Text","/laioutr-ui/ui-kit/typography/text","3.laioutr-ui/ui-kit/02.typography/Text",{"title":983,"path":984,"stem":985,"children":986,"page":55},"Layout","/laioutr-ui/ui-kit/layout","3.laioutr-ui/ui-kit/03.layout",[987,991,995,999],{"title":988,"path":989,"stem":990},"Grid Fill","/laioutr-ui/ui-kit/layout/gridfill","3.laioutr-ui/ui-kit/03.layout/GridFill",{"title":992,"path":993,"stem":994},"Grid Masonry","/laioutr-ui/ui-kit/layout/gridmasonry","3.laioutr-ui/ui-kit/03.layout/GridMasonry",{"title":996,"path":997,"stem":998},"Scroll Area","/laioutr-ui/ui-kit/layout/scrollarea","3.laioutr-ui/ui-kit/03.layout/ScrollArea",{"title":1000,"path":1001,"stem":1002},"Separator","/laioutr-ui/ui-kit/layout/separator","3.laioutr-ui/ui-kit/03.layout/Separator",{"title":1004,"path":1005,"stem":1006,"children":1007,"page":55},"Content","/laioutr-ui/ui-kit/content","3.laioutr-ui/ui-kit/04.content",[1008,1012,1016,1020,1024,1028,1032],{"title":1009,"path":1010,"stem":1011},"Card","/laioutr-ui/ui-kit/content/card","3.laioutr-ui/ui-kit/04.content/Card",{"title":1013,"path":1014,"stem":1015},"CTA Banner Basic","/laioutr-ui/ui-kit/content/ctabannerbasic","3.laioutr-ui/ui-kit/04.content/CtaBannerBasic",{"title":1017,"path":1018,"stem":1019},"CTA Banner Integrated","/laioutr-ui/ui-kit/content/ctabannerintegrated","3.laioutr-ui/ui-kit/04.content/CtaBannerIntegrated",{"title":1021,"path":1022,"stem":1023},"CTA Banner Showcase","/laioutr-ui/ui-kit/content/ctabannershowcase","3.laioutr-ui/ui-kit/04.content/CtaBannerShowcase",{"title":1025,"path":1026,"stem":1027},"Link Tile Basic","/laioutr-ui/ui-kit/content/linktilebasic","3.laioutr-ui/ui-kit/04.content/LinkTileBasic",{"title":1029,"path":1030,"stem":1031},"Link Tile Big","/laioutr-ui/ui-kit/content/linktilebig","3.laioutr-ui/ui-kit/04.content/LinkTileBig",{"title":1033,"path":1034,"stem":1035},"Link Tile Compact","/laioutr-ui/ui-kit/content/linktilecompact","3.laioutr-ui/ui-kit/04.content/LinkTileCompact",{"title":1037,"path":1038,"stem":1039,"children":1040,"page":55},"Surfaces","/laioutr-ui/ui-kit/surfaces","3.laioutr-ui/ui-kit/05.surfaces",[1041,1045,1049,1053],{"title":1042,"path":1043,"stem":1044},"Alert Dialog","/laioutr-ui/ui-kit/surfaces/alertdialog","3.laioutr-ui/ui-kit/05.surfaces/AlertDialog",{"title":1046,"path":1047,"stem":1048},"Sheet","/laioutr-ui/ui-kit/surfaces/sheet","3.laioutr-ui/ui-kit/05.surfaces/Sheet",{"title":1050,"path":1051,"stem":1052},"Toast","/laioutr-ui/ui-kit/surfaces/toast","3.laioutr-ui/ui-kit/05.surfaces/Toast",{"title":1054,"path":1055,"stem":1056},"Toaster","/laioutr-ui/ui-kit/surfaces/toaster","3.laioutr-ui/ui-kit/05.surfaces/Toaster",{"title":1058,"path":1059,"stem":1060,"children":1061,"page":55},"Form","/laioutr-ui/ui-kit/form","3.laioutr-ui/ui-kit/06.form",[1062,1066,1070,1074,1078,1082,1086,1090,1094,1098,1102,1106,1110,1114,1118],{"title":1063,"path":1064,"stem":1065},"Button","/laioutr-ui/ui-kit/form/button","3.laioutr-ui/ui-kit/06.form/Button",{"title":1067,"path":1068,"stem":1069},"Checkbox","/laioutr-ui/ui-kit/form/checkbox","3.laioutr-ui/ui-kit/06.form/Checkbox",{"title":1071,"path":1072,"stem":1073},"Field","/laioutr-ui/ui-kit/form/field","3.laioutr-ui/ui-kit/06.form/Field",{"title":1075,"path":1076,"stem":1077},"Input","/laioutr-ui/ui-kit/form/input","3.laioutr-ui/ui-kit/06.form/Input",{"title":1079,"path":1080,"stem":1081},"Input Checkbox","/laioutr-ui/ui-kit/form/inputcheckbox","3.laioutr-ui/ui-kit/06.form/InputCheckbox",{"title":1083,"path":1084,"stem":1085},"Password Input","/laioutr-ui/ui-kit/form/inputpassword","3.laioutr-ui/ui-kit/06.form/InputPassword",{"title":1087,"path":1088,"stem":1089},"Search Input","/laioutr-ui/ui-kit/form/inputsearch","3.laioutr-ui/ui-kit/06.form/InputSearch",{"title":1091,"path":1092,"stem":1093},"Label","/laioutr-ui/ui-kit/form/label","3.laioutr-ui/ui-kit/06.form/Label",{"title":1095,"path":1096,"stem":1097},"Load More","/laioutr-ui/ui-kit/form/loadmore","3.laioutr-ui/ui-kit/06.form/LoadMore",{"title":1099,"path":1100,"stem":1101},"Pagination","/laioutr-ui/ui-kit/form/pagination","3.laioutr-ui/ui-kit/06.form/Pagination",{"title":1103,"path":1104,"stem":1105},"Quantity Picker","/laioutr-ui/ui-kit/form/quantitypicker","3.laioutr-ui/ui-kit/06.form/QuantityPicker",{"title":1107,"path":1108,"stem":1109},"Radio Group","/laioutr-ui/ui-kit/form/radioselect","3.laioutr-ui/ui-kit/06.form/RadioSelect",{"title":1111,"path":1112,"stem":1113},"Select","/laioutr-ui/ui-kit/form/select","3.laioutr-ui/ui-kit/06.form/Select",{"title":1115,"path":1116,"stem":1117},"Switch","/laioutr-ui/ui-kit/form/switch","3.laioutr-ui/ui-kit/06.form/Switch",{"title":1119,"path":1120,"stem":1121},"Variant Select Button","/laioutr-ui/ui-kit/form/variantselectbutton","3.laioutr-ui/ui-kit/06.form/VariantSelectButton",{"title":1123,"path":1124,"stem":1125,"children":1126,"page":55},"Indicators","/laioutr-ui/ui-kit/indicators","3.laioutr-ui/ui-kit/07.indicators",[1127,1131,1135,1139,1143,1147,1151,1155],{"title":1128,"path":1129,"stem":1130},"Badge","/laioutr-ui/ui-kit/indicators/badge","3.laioutr-ui/ui-kit/07.indicators/Badge",{"title":1132,"path":1133,"stem":1134},"Caption Flag","/laioutr-ui/ui-kit/indicators/captionflag","3.laioutr-ui/ui-kit/07.indicators/CaptionFlag",{"title":1136,"path":1137,"stem":1138},"Category Node Flag","/laioutr-ui/ui-kit/indicators/categorynodeflag","3.laioutr-ui/ui-kit/07.indicators/CategoryNodeFlag",{"title":1140,"path":1141,"stem":1142},"Product Tile Flag","/laioutr-ui/ui-kit/indicators/producttileflag","3.laioutr-ui/ui-kit/07.indicators/ProductTileFlag",{"title":1144,"path":1145,"stem":1146},"Rating Summary","/laioutr-ui/ui-kit/indicators/ratingsummary","3.laioutr-ui/ui-kit/07.indicators/RatingSummary",{"title":1148,"path":1149,"stem":1150},"Rating Summary Small","/laioutr-ui/ui-kit/indicators/ratingsummarysmall","3.laioutr-ui/ui-kit/07.indicators/RatingSummarySmall",{"title":1152,"path":1153,"stem":1154},"Savings Badge","/laioutr-ui/ui-kit/indicators/savingsbadge","3.laioutr-ui/ui-kit/07.indicators/SavingsBadge",{"title":1156,"path":1157,"stem":1158},"Stars Rating","/laioutr-ui/ui-kit/indicators/starsrating","3.laioutr-ui/ui-kit/07.indicators/StarsRating",{"title":1160,"path":1161,"stem":1162,"children":1163},"Hosting","/hosting","4.hosting/0.index",[1164,1165,1171,1201],{"title":1160,"path":1161,"stem":1162},{"title":1166,"path":1167,"stem":1168,"children":1169},"Laioutr Cloud","/hosting/laioutr-cloud","4.hosting/0.laioutr-cloud/0.index",[1170],{"title":1166,"path":1167,"stem":1168},{"title":1172,"path":1173,"stem":1174,"children":1175},"Hosting Adapter","/hosting/hosting-adapter","4.hosting/1.hosting-adapter/0.index",[1176,1177,1181,1185,1189,1193,1197],{"title":1172,"path":1173,"stem":1174},{"title":1178,"path":1179,"stem":1180},"AWS Adapter","/hosting/hosting-adapter/aws-adapter","4.hosting/1.hosting-adapter/aws-adapter",{"title":1182,"path":1183,"stem":1184},"Azure Adapter","/hosting/hosting-adapter/azure-adapter","4.hosting/1.hosting-adapter/azure-adapter",{"title":1186,"path":1187,"stem":1188},"Google Adapter","/hosting/hosting-adapter/google-adapter","4.hosting/1.hosting-adapter/google-adapter",{"title":1190,"path":1191,"stem":1192},"Netlify Adapter","/hosting/hosting-adapter/netlify-adapter","4.hosting/1.hosting-adapter/netlify-adapter",{"title":1194,"path":1195,"stem":1196},"Scale Commerce Adapter","/hosting/hosting-adapter/scale-commerce-adapter","4.hosting/1.hosting-adapter/scale-commerce-adapter",{"title":1198,"path":1199,"stem":1200},"Vercel Adapter","/hosting/hosting-adapter/vercel-adapter","4.hosting/1.hosting-adapter/vercel-adapter",{"title":1202,"path":1203,"stem":1204,"children":1205},"Bring Your Own Server (BYOS)","/hosting/bring-your-own-server-byos","4.hosting/2.bring-your-own-server-byos/0.index",[1206,1207,1211,1215,1219,1223,1227],{"title":1202,"path":1203,"stem":1204},{"title":1208,"path":1209,"stem":1210},"BYOS Agent","/hosting/bring-your-own-server-byos/byos-agent","4.hosting/2.bring-your-own-server-byos/byos-agent",{"title":1212,"path":1213,"stem":1214},"Changelog","/hosting/bring-your-own-server-byos/changelog","4.hosting/2.bring-your-own-server-byos/changelog",{"title":1216,"path":1217,"stem":1218},"DevOps Components","/hosting/bring-your-own-server-byos/devops","4.hosting/2.bring-your-own-server-byos/devops",{"title":1220,"path":1221,"stem":1222},"Infrastructure Requirements","/hosting/bring-your-own-server-byos/infrastructure","4.hosting/2.bring-your-own-server-byos/infrastructure",{"title":1224,"path":1225,"stem":1226},"Software Requirements","/hosting/bring-your-own-server-byos/software","4.hosting/2.bring-your-own-server-byos/software",{"title":1228,"path":1229,"stem":1230},"Webhook Configuration","/hosting/bring-your-own-server-byos/webhook-config","4.hosting/2.bring-your-own-server-byos/webhook-config",{"title":1232,"path":1233,"stem":1234,"children":1235},"Checkout","/checkout","5.Checkout/0.index",[1236],{"title":1232,"path":1233,"stem":1234},{"title":1238,"path":1239,"stem":1240,"children":1241},"Larry AI","/larry-ai","6.Larry-AI/0.index",[1242],{"title":1238,"path":1239,"stem":1240},{"title":611,"path":1244,"stem":1245,"children":1246},"/figma-kit","7.Figma Kit/0.index",[1247,1248,1264],{"title":611,"path":1244,"stem":1245},{"title":121,"path":1249,"stem":1250,"children":1251,"page":55},"/figma-kit/introduction","7.Figma Kit/1.Introduction",[1252,1256,1260],{"title":1253,"path":1254,"stem":1255},"How to Start","/figma-kit/introduction/howtostart","7.Figma Kit/1.Introduction/0.howtostart",{"title":1257,"path":1258,"stem":1259},"Figma Variables","/figma-kit/introduction/figma-variables","7.Figma Kit/1.Introduction/figma-variables",{"title":1261,"path":1262,"stem":1263},"Library Connections","/figma-kit/introduction/library-connections","7.Figma Kit/1.Introduction/library-connections",{"title":1265,"path":1266,"stem":1267,"children":1268,"page":55},"Kits","/figma-kit/kits","7.Figma Kit/Kits",[1269,1272,1275,1278,1282,1285,1289,1293,1296,1299],{"title":622,"path":1270,"stem":1271},"/figma-kit/kits/b2b","7.Figma Kit/Kits/b2b",{"title":628,"path":1273,"stem":1274},"/figma-kit/kits/booking","7.Figma Kit/Kits/booking",{"title":634,"path":1276,"stem":1277},"/figma-kit/kits/cms","7.Figma Kit/Kits/cms",{"title":1279,"path":1280,"stem":1281},"Inpage Navigation","/figma-kit/kits/inpage-navigation","7.Figma Kit/Kits/inpage-navigation",{"title":740,"path":1283,"stem":1284},"/figma-kit/kits/marketplace","7.Figma Kit/Kits/marketplace",{"title":1286,"path":1287,"stem":1288},"Retail & Multichannel","/figma-kit/kits/multichannel","7.Figma Kit/Kits/multichannel",{"title":1290,"path":1291,"stem":1292},"Navigation","/figma-kit/kits/navigation","7.Figma Kit/Kits/navigation",{"title":806,"path":1294,"stem":1295},"/figma-kit/kits/saas","7.Figma Kit/Kits/saas",{"title":828,"path":1297,"stem":1298},"/figma-kit/kits/shop","7.Figma Kit/Kits/shop",{"title":881,"path":1300,"stem":1301},"/figma-kit/kits/ui-kit","7.Figma Kit/Kits/ui-kit",{"title":1303,"path":1304,"stem":1305,"children":1306},"Cockpit","/cockpit","8.Cockpit/0.index",[1307,1308,1338,1355,1372],{"title":1303,"path":1304,"stem":1305},{"title":150,"path":1309,"stem":1310,"children":1311,"page":55},"/cockpit/features","8.Cockpit/1.Features",[1312,1315,1319,1323,1327,1330,1334],{"title":443,"path":1313,"stem":1314},"/cockpit/features/apps","8.Cockpit/1.Features/apps",{"title":1316,"path":1317,"stem":1318},"Content (Collections)","/cockpit/features/content-collections","8.Cockpit/1.Features/content-collections",{"title":1320,"path":1321,"stem":1322},"Deployments","/cockpit/features/deployments","8.Cockpit/1.Features/deployments",{"title":1324,"path":1325,"stem":1326},"Markets","/cockpit/features/markets","8.Cockpit/1.Features/markets",{"title":192,"path":1328,"stem":1329},"/cockpit/features/redirects","8.Cockpit/1.Features/redirects",{"title":1331,"path":1332,"stem":1333},"Studio","/cockpit/features/studio","8.Cockpit/1.Features/studio",{"title":1335,"path":1336,"stem":1337},"Translations","/cockpit/features/translations","8.Cockpit/1.Features/translations",{"title":1339,"path":1340,"stem":1341,"children":1342,"page":55},"Project Settings","/cockpit/project-settings","8.Cockpit/2.Project-Settings",[1343,1347,1351],{"title":1344,"path":1345,"stem":1346},"Delete a project","/cockpit/project-settings/delete-project","8.Cockpit/2.Project-Settings/delete-project",{"title":1348,"path":1349,"stem":1350},"NPM","/cockpit/project-settings/npm","8.Cockpit/2.Project-Settings/npm",{"title":1352,"path":1353,"stem":1354},"Project secret key","/cockpit/project-settings/project-secret-key","8.Cockpit/2.Project-Settings/project-secret-key",{"title":1356,"path":1357,"stem":1358,"children":1359,"page":55},"Account Settings","/cockpit/account-settings","8.Cockpit/3.Account-Settings",[1360,1364,1368],{"title":1361,"path":1362,"stem":1363},"Notifications","/cockpit/account-settings/notifications","8.Cockpit/3.Account-Settings/notifications",{"title":1365,"path":1366,"stem":1367},"Preferences","/cockpit/account-settings/preferences","8.Cockpit/3.Account-Settings/preferences",{"title":1369,"path":1370,"stem":1371},"Security","/cockpit/account-settings/security","8.Cockpit/3.Account-Settings/security",{"title":1373,"path":1374,"stem":1375,"children":1376,"page":55},"Organisation Settings","/cockpit/organisation-settings","8.Cockpit/4.Organisation-Settings",[1377,1381,1385,1389,1393,1397],{"title":1378,"path":1379,"stem":1380},"API keys","/cockpit/organisation-settings/api-keys","8.Cockpit/4.Organisation-Settings/api-keys",{"title":1382,"path":1383,"stem":1384},"Billing","/cockpit/organisation-settings/billing","8.Cockpit/4.Organisation-Settings/billing",{"title":1386,"path":1387,"stem":1388},"General settings","/cockpit/organisation-settings/general-settings","8.Cockpit/4.Organisation-Settings/general-settings",{"title":1390,"path":1391,"stem":1392},"Members","/cockpit/organisation-settings/members","8.Cockpit/4.Organisation-Settings/members",{"title":1394,"path":1395,"stem":1396},"Projects","/cockpit/organisation-settings/projects","8.Cockpit/4.Organisation-Settings/projects",{"title":1398,"path":1399,"stem":1400},"Roles","/cockpit/organisation-settings/roles","8.Cockpit/4.Organisation-Settings/roles",{"title":1402,"path":1403,"stem":1404,"children":1405},"Offering","/offering","9.Offering/0.index",[1406,1407,1439,1452,1465],{"title":1402,"path":1403,"stem":1404},{"title":1408,"path":1409,"stem":1410,"children":1411},"Products","/offering/products","9.Offering/1.Products/0.index",[1412,1413,1418,1423,1428,1434],{"title":1408,"path":1409,"stem":1410},{"title":133,"path":1414,"stem":1415,"children":1416},"/offering/products/frontend","9.Offering/1.Products/1.Frontend/0.index",[1417],{"title":133,"path":1414,"stem":1415},{"title":1303,"path":1419,"stem":1420,"children":1421},"/offering/products/cockpit","9.Offering/1.Products/2.Cockpit/0.index",[1422],{"title":1303,"path":1419,"stem":1420},{"title":1232,"path":1424,"stem":1425,"children":1426},"/offering/products/checkout","9.Offering/1.Products/3.Checkout/0.index",[1427],{"title":1232,"path":1424,"stem":1425},{"title":1429,"path":1430,"stem":1431,"children":1432},"Cloud","/offering/products/cloud","9.Offering/1.Products/4.cloud/0.index",[1433],{"title":1429,"path":1430,"stem":1431},{"title":1238,"path":1435,"stem":1436,"children":1437},"/offering/products/larry-ai","9.Offering/1.Products/5.larry-ai/0.index",[1438],{"title":1238,"path":1435,"stem":1436},{"title":1440,"path":1441,"stem":1442,"children":1443,"page":55},"Service Level Agreement","/offering/service-level-agreement","9.Offering/2.service-level-agreement",[1444,1448],{"title":1445,"path":1446,"stem":1447},"Standard Service Level Agreement Composable Frontend","/offering/service-level-agreement/standard-service-level-agreement","9.Offering/2.service-level-agreement/1.standard-service-level-agreement",{"title":1449,"path":1450,"stem":1451},"Backups","/offering/service-level-agreement/backups","9.Offering/2.service-level-agreement/backups",{"title":1453,"path":1454,"stem":1455,"children":1456,"page":55},"Customer Support","/offering/customer-support","9.Offering/3.customer-support",[1457,1461],{"title":1458,"path":1459,"stem":1460},"Standard Customer Support","/offering/customer-support/standard-customer-support","9.Offering/3.customer-support/1.standard-customer-support",{"title":1462,"path":1463,"stem":1464},"Customer Support Severity Levels of Laioutr products","/offering/customer-support/maximum-serverity-levels","9.Offering/3.customer-support/maximum-serverity-levels",{"title":1466,"path":1467,"stem":1468,"children":1469,"page":55},"Compliance","/offering/compliance","9.Offering/4.Compliance",[1470],{"title":1471,"path":1472,"stem":1473},"Fair usage policy","/offering/compliance/fair-usage-policy","9.Offering/4.Compliance/fair-usage-policy",{"id":1475,"title":262,"body":1476,"description":3986,"extension":3987,"meta":3988,"navigation":1744,"path":263,"seo":3989,"sitemap":3991,"stem":264,"__hash__":3995},"docs/1.Frontend/4.Orchestr/99.recipes/translating-vendor-errors.md",{"type":1477,"value":1478,"toc":3976},"minimark",[1479,1496,1503,1592,1597,1628,1632,1638,1676,1689,1693,1707,1986,1989,1993,2002,2603,2606,2632,2651,2655,2658,2960,2970,2974,2977,2985,2992,3199,3213,3258,3262,3290,3293,3431,3450,3944,3947,3951,3972],[1480,1481,1482,1483,1487,1488,1491,1492,1495],"p",{},"A customer adds a discontinued variant to their cart. Shopify returns ",[1484,1485,1486],"code",{},"200 OK"," with a ",[1484,1489,1490],{},"userErrors: [{ code: 'INVALID_MERCHANDISE_ID' }]"," payload. Your action handler ignores it and returns the (empty) cart, so the customer sees their click do nothing. Throwing alone is not enough either: ",[1484,1493,1494],{},"throw new Error('Invalid merchandise')"," arrives on the client as a generic 500 toast that says \"Something went wrong\", and pattern-matching on Shopify's error vocabulary in the storefront would couple the UI to one connector.",[1480,1497,1498,1499,1502],{},"The standard pattern is to translate vendor errors into canonical Laioutr errors before throwing. Every storefront template Laioutr ships handles those canonical errors out of the box, so the same ",[1484,1500,1501],{},"add-to-cart"," UI works against Shopify, Shopware, or any custom connector with no changes.",[1504,1505,1510],"pre",{"className":1506,"code":1507,"language":1508,"meta":1509,"style":1509},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// One assertion + one catch + one warnings call after every mutation.\nassertShopifyResponseHasData(response);              // transport errors\ncatchUserErrors(response, 'cartLinesAdd');           // payload errors → canonical\ncatchWarnings(response, 'cartLinesAdd');             // payload warnings → canonical\n","ts","",[1484,1511,1512,1521,1539,1569],{"__ignoreMap":1509},[1513,1514,1517],"span",{"class":1515,"line":1516},"line",1,[1513,1518,1520],{"class":1519},"sHwdD","// One assertion + one catch + one warnings call after every mutation.\n",[1513,1522,1524,1528,1532,1536],{"class":1515,"line":1523},2,[1513,1525,1527],{"class":1526},"s2Zo4","assertShopifyResponseHasData",[1513,1529,1531],{"class":1530},"sTEyZ","(response)",[1513,1533,1535],{"class":1534},"sMK4o",";",[1513,1537,1538],{"class":1519},"              // transport errors\n",[1513,1540,1542,1545,1548,1551,1554,1558,1561,1564,1566],{"class":1515,"line":1541},3,[1513,1543,1544],{"class":1526},"catchUserErrors",[1513,1546,1547],{"class":1530},"(response",[1513,1549,1550],{"class":1534},",",[1513,1552,1553],{"class":1534}," '",[1513,1555,1557],{"class":1556},"sfazB","cartLinesAdd",[1513,1559,1560],{"class":1534},"'",[1513,1562,1563],{"class":1530},")",[1513,1565,1535],{"class":1534},[1513,1567,1568],{"class":1519},"           // payload errors → canonical\n",[1513,1570,1572,1575,1577,1579,1581,1583,1585,1587,1589],{"class":1515,"line":1571},4,[1513,1573,1574],{"class":1526},"catchWarnings",[1513,1576,1547],{"class":1530},[1513,1578,1550],{"class":1534},[1513,1580,1553],{"class":1534},[1513,1582,1557],{"class":1556},[1513,1584,1560],{"class":1534},[1513,1586,1563],{"class":1530},[1513,1588,1535],{"class":1534},[1513,1590,1591],{"class":1519},"             // payload warnings → canonical\n",[1593,1594,1596],"h2",{"id":1595},"why-translation-matters","Why translation matters",[1480,1598,1599,1600,1603,1604,1607,1608,1611,1612,1615,1616,1619,1620,1623,1624,1627],{},"Orchestr serializes thrown errors with ",[1484,1601,1602],{},"errorFromUnknown"," and ships them to the client as ",[1484,1605,1606],{},"{ name, message, data, cause, errors }",". The frontend cannot import a connector's error classes, so the only stable handle it has is ",[1484,1609,1610],{},"error.name",". A throw from a connector that uses canonical error classes (",[1484,1613,1614],{},"ProductNotFoundError",", ",[1484,1617,1618],{},"DiscountCodeNotRedeemableError",", etc. from ",[1484,1621,1622],{},"@laioutr-core/canonical-types/ecommerce",") arrives with a recognizable ",[1484,1625,1626],{},"name",", and the storefront branches on it.",[1593,1629,1631],{"id":1630},"step-1-pick-a-canonical-error","Step 1: pick a canonical error",[1480,1633,1634,1635,1637],{},"Browse ",[1484,1636,1622],{}," for an error class that matches your case. Common ones:",[1639,1640,1641,1647,1653,1659,1667],"ul",{},[1642,1643,1644,1646],"li",{},[1484,1645,1614],{},": the variant or product no longer exists.",[1642,1648,1649,1652],{},[1484,1650,1651],{},"ProductStockError",": out of stock or not enough stock.",[1642,1654,1655,1658],{},[1484,1656,1657],{},"ProductQuantityError",": minimum or maximum quantity violated.",[1642,1660,1661,1615,1664,1666],{},[1484,1662,1663],{},"DiscountCodeNotFoundError",[1484,1665,1618],{},": discount issues.",[1642,1668,1669,1615,1672,1675],{},[1484,1670,1671],{},"AddressNotFoundError",[1484,1673,1674],{},"InvalidFieldError",": address or form-field validation.",[1480,1677,1678,1679,1684,1685,1688],{},"If nothing fits, define a custom class (see ",[1680,1681,1683],"a",{"href":1682},"#custom-errors-when-no-canonical-class-fits","Custom errors"," below) instead of throwing a plain ",[1484,1686,1687],{},"Error",".",[1593,1690,1692],{"id":1691},"step-2-assertion-helpers-for-transport-errors","Step 2: assertion helpers for transport errors",[1480,1694,1695,1696,1699,1700,1703,1704,1706],{},"Co-locate one helpers file per backend client (e.g. ",[1484,1697,1698],{},"server/shopify-helper/errors.ts","). Transport-level errors (network, GraphQL syntax, malformed responses) should not be translated to canonical errors; throw an ",[1484,1701,1702],{},"AggregateError"," so Orchestr's ",[1484,1705,1602],{}," can recursively serialize the cause for dev logs:",[1504,1708,1710],{"className":1506,"code":1709,"filename":1698,"language":1508,"meta":1509,"style":1509},"import { ClientResponse } from '@shopify/storefront-api-client';\n\nexport function assertShopifyResponseHasData\u003CT>(\n  response: ClientResponse\u003CT>,\n): asserts response is ClientResponse\u003CT> & { data: T } {\n  if (response.errors) {\n    throw new AggregateError(\n      response.errors.graphQLErrors ?? [],\n      response.errors.message ?? 'Shopify request failed',\n    );\n  }\n  if (!response.data) {\n    throw new Error('No data returned from Shopify');\n  }\n}\n",[1484,1711,1712,1740,1746,1768,1786,1829,1852,1867,1891,1916,1924,1930,1951,1975,1980],{"__ignoreMap":1509},[1513,1713,1714,1718,1721,1724,1727,1730,1732,1735,1737],{"class":1515,"line":1516},[1513,1715,1717],{"class":1716},"s7zQu","import",[1513,1719,1720],{"class":1534}," {",[1513,1722,1723],{"class":1530}," ClientResponse",[1513,1725,1726],{"class":1534}," }",[1513,1728,1729],{"class":1716}," from",[1513,1731,1553],{"class":1534},[1513,1733,1734],{"class":1556},"@shopify/storefront-api-client",[1513,1736,1560],{"class":1534},[1513,1738,1739],{"class":1534},";\n",[1513,1741,1742],{"class":1515,"line":1523},[1513,1743,1745],{"emptyLinePlaceholder":1744},true,"\n",[1513,1747,1748,1751,1755,1758,1761,1765],{"class":1515,"line":1541},[1513,1749,1750],{"class":1716},"export",[1513,1752,1754],{"class":1753},"spNyl"," function",[1513,1756,1757],{"class":1526}," assertShopifyResponseHasData",[1513,1759,1760],{"class":1534},"\u003C",[1513,1762,1764],{"class":1763},"sBMFI","T",[1513,1766,1767],{"class":1534},">(\n",[1513,1769,1770,1774,1777,1779,1781,1783],{"class":1515,"line":1571},[1513,1771,1773],{"class":1772},"sHdIc","  response",[1513,1775,1776],{"class":1534},":",[1513,1778,1723],{"class":1763},[1513,1780,1760],{"class":1534},[1513,1782,1764],{"class":1763},[1513,1784,1785],{"class":1534},">,\n",[1513,1787,1789,1792,1795,1798,1801,1803,1805,1807,1810,1813,1815,1819,1821,1824,1826],{"class":1515,"line":1788},5,[1513,1790,1791],{"class":1534},"):",[1513,1793,1794],{"class":1534}," asserts",[1513,1796,1797],{"class":1772}," response",[1513,1799,1800],{"class":1534}," is",[1513,1802,1723],{"class":1763},[1513,1804,1760],{"class":1534},[1513,1806,1764],{"class":1763},[1513,1808,1809],{"class":1534},">",[1513,1811,1812],{"class":1534}," &",[1513,1814,1720],{"class":1534},[1513,1816,1818],{"class":1817},"swJcz"," data",[1513,1820,1776],{"class":1534},[1513,1822,1823],{"class":1763}," T",[1513,1825,1726],{"class":1534},[1513,1827,1828],{"class":1534}," {\n",[1513,1830,1832,1835,1838,1841,1843,1846,1849],{"class":1515,"line":1831},6,[1513,1833,1834],{"class":1716},"  if",[1513,1836,1837],{"class":1817}," (",[1513,1839,1840],{"class":1530},"response",[1513,1842,1688],{"class":1534},[1513,1844,1845],{"class":1530},"errors",[1513,1847,1848],{"class":1817},") ",[1513,1850,1851],{"class":1534},"{\n",[1513,1853,1855,1858,1861,1864],{"class":1515,"line":1854},7,[1513,1856,1857],{"class":1716},"    throw",[1513,1859,1860],{"class":1534}," new",[1513,1862,1863],{"class":1526}," AggregateError",[1513,1865,1866],{"class":1817},"(\n",[1513,1868,1870,1873,1875,1877,1879,1882,1885,1888],{"class":1515,"line":1869},8,[1513,1871,1872],{"class":1530},"      response",[1513,1874,1688],{"class":1534},[1513,1876,1845],{"class":1530},[1513,1878,1688],{"class":1534},[1513,1880,1881],{"class":1530},"graphQLErrors",[1513,1883,1884],{"class":1534}," ??",[1513,1886,1887],{"class":1817}," []",[1513,1889,1890],{"class":1534},",\n",[1513,1892,1894,1896,1898,1900,1902,1905,1907,1909,1912,1914],{"class":1515,"line":1893},9,[1513,1895,1872],{"class":1530},[1513,1897,1688],{"class":1534},[1513,1899,1845],{"class":1530},[1513,1901,1688],{"class":1534},[1513,1903,1904],{"class":1530},"message",[1513,1906,1884],{"class":1534},[1513,1908,1553],{"class":1534},[1513,1910,1911],{"class":1556},"Shopify request failed",[1513,1913,1560],{"class":1534},[1513,1915,1890],{"class":1534},[1513,1917,1919,1922],{"class":1515,"line":1918},10,[1513,1920,1921],{"class":1817},"    )",[1513,1923,1739],{"class":1534},[1513,1925,1927],{"class":1515,"line":1926},11,[1513,1928,1929],{"class":1534},"  }\n",[1513,1931,1933,1935,1937,1940,1942,1944,1947,1949],{"class":1515,"line":1932},12,[1513,1934,1834],{"class":1716},[1513,1936,1837],{"class":1817},[1513,1938,1939],{"class":1534},"!",[1513,1941,1840],{"class":1530},[1513,1943,1688],{"class":1534},[1513,1945,1946],{"class":1530},"data",[1513,1948,1848],{"class":1817},[1513,1950,1851],{"class":1534},[1513,1952,1954,1956,1958,1961,1964,1966,1969,1971,1973],{"class":1515,"line":1953},13,[1513,1955,1857],{"class":1716},[1513,1957,1860],{"class":1534},[1513,1959,1960],{"class":1526}," Error",[1513,1962,1963],{"class":1817},"(",[1513,1965,1560],{"class":1534},[1513,1967,1968],{"class":1556},"No data returned from Shopify",[1513,1970,1560],{"class":1534},[1513,1972,1563],{"class":1817},[1513,1974,1739],{"class":1534},[1513,1976,1978],{"class":1515,"line":1977},14,[1513,1979,1929],{"class":1534},[1513,1981,1983],{"class":1515,"line":1982},15,[1513,1984,1985],{"class":1534},"}\n",[1480,1987,1988],{},"A transport failure is not a \"product not found\"; it is a 500. Keeping that boundary clean stops connector bugs from masquerading as user-facing errors.",[1593,1990,1992],{"id":1991},"step-3-catch-helpers-for-response-payload-errors","Step 3: catch helpers for response-payload errors",[1480,1994,1995,1996,1998,1999,2001],{},"Many vendors return ",[1484,1997,1486],{}," with an errors array inside the payload. Walk the array and translate each known code to a canonical class. Throw a plain ",[1484,2000,1687],{}," for anything unknown so it surfaces as a 500 with a clear message instead of being silently swallowed:",[1504,2003,2005],{"className":1506,"code":2004,"filename":1698,"language":1508,"meta":1509,"style":1509},"import {\n  ProductNotFoundError,\n  ProductQuantityError,\n} from '@laioutr-core/canonical-types/ecommerce';\n\nexport function catchUserErrors\u003CT extends Record\u003Cstring, any>>(\n  response: ClientResponse\u003CT>,\n  field: keyof T,\n): void {\n  const fieldData = response.data?.[field] as any;\n  const errors = fieldData?.customerUserErrors ?? fieldData?.userErrors ?? [];\n\n  for (const error of errors) {\n    const variantId = extractVariantId(error.message);\n\n    if (error.field?.includes('merchandiseId')) {\n      if (error.code === 'INVALID_MERCHANDISE_ID' || error.code === 'INVALID') {\n        throw new ProductNotFoundError(variantId);\n      }\n    }\n    if (error.field?.includes('quantity')) {\n      if (error.code === 'INVALID_INCREMENT') throw new ProductQuantityError('INVALID_INCREMENT', variantId);\n      if (error.code === 'MINIMUM_NOT_MET') throw new ProductQuantityError('MINIMUM_NOT_MET', variantId);\n      if (error.code === 'MAXIMUM_EXCEEDED') throw new ProductQuantityError('MAXIMUM_EXCEEDED', variantId);\n    }\n\n    throw new Error(`Unhandled Shopify userError: ${error.code} (field: ${error.field?.join(',')})`);\n  }\n}\n",[1484,2006,2007,2013,2020,2027,2042,2046,2078,2092,2106,2115,2151,2182,2186,2208,2234,2238,2271,2317,2337,2343,2349,2379,2427,2473,2519,2524,2529,2593,2598],{"__ignoreMap":1509},[1513,2008,2009,2011],{"class":1515,"line":1516},[1513,2010,1717],{"class":1716},[1513,2012,1828],{"class":1534},[1513,2014,2015,2018],{"class":1515,"line":1523},[1513,2016,2017],{"class":1530},"  ProductNotFoundError",[1513,2019,1890],{"class":1534},[1513,2021,2022,2025],{"class":1515,"line":1541},[1513,2023,2024],{"class":1530},"  ProductQuantityError",[1513,2026,1890],{"class":1534},[1513,2028,2029,2032,2034,2036,2038,2040],{"class":1515,"line":1571},[1513,2030,2031],{"class":1534},"}",[1513,2033,1729],{"class":1716},[1513,2035,1553],{"class":1534},[1513,2037,1622],{"class":1556},[1513,2039,1560],{"class":1534},[1513,2041,1739],{"class":1534},[1513,2043,2044],{"class":1515,"line":1788},[1513,2045,1745],{"emptyLinePlaceholder":1744},[1513,2047,2048,2050,2052,2055,2057,2059,2062,2065,2067,2070,2072,2075],{"class":1515,"line":1831},[1513,2049,1750],{"class":1716},[1513,2051,1754],{"class":1753},[1513,2053,2054],{"class":1526}," catchUserErrors",[1513,2056,1760],{"class":1534},[1513,2058,1764],{"class":1763},[1513,2060,2061],{"class":1753}," extends",[1513,2063,2064],{"class":1763}," Record",[1513,2066,1760],{"class":1534},[1513,2068,2069],{"class":1763},"string",[1513,2071,1550],{"class":1534},[1513,2073,2074],{"class":1763}," any",[1513,2076,2077],{"class":1534},">>(\n",[1513,2079,2080,2082,2084,2086,2088,2090],{"class":1515,"line":1854},[1513,2081,1773],{"class":1772},[1513,2083,1776],{"class":1534},[1513,2085,1723],{"class":1763},[1513,2087,1760],{"class":1534},[1513,2089,1764],{"class":1763},[1513,2091,1785],{"class":1534},[1513,2093,2094,2097,2099,2102,2104],{"class":1515,"line":1869},[1513,2095,2096],{"class":1772},"  field",[1513,2098,1776],{"class":1534},[1513,2100,2101],{"class":1534}," keyof",[1513,2103,1823],{"class":1763},[1513,2105,1890],{"class":1534},[1513,2107,2108,2110,2113],{"class":1515,"line":1893},[1513,2109,1791],{"class":1534},[1513,2111,2112],{"class":1763}," void",[1513,2114,1828],{"class":1534},[1513,2116,2117,2120,2123,2126,2128,2130,2132,2135,2138,2141,2144,2147,2149],{"class":1515,"line":1918},[1513,2118,2119],{"class":1753},"  const",[1513,2121,2122],{"class":1530}," fieldData",[1513,2124,2125],{"class":1534}," =",[1513,2127,1797],{"class":1530},[1513,2129,1688],{"class":1534},[1513,2131,1946],{"class":1530},[1513,2133,2134],{"class":1534},"?.",[1513,2136,2137],{"class":1817},"[",[1513,2139,2140],{"class":1530},"field",[1513,2142,2143],{"class":1817},"] ",[1513,2145,2146],{"class":1716},"as",[1513,2148,2074],{"class":1763},[1513,2150,1739],{"class":1534},[1513,2152,2153,2155,2158,2160,2162,2164,2167,2169,2171,2173,2176,2178,2180],{"class":1515,"line":1926},[1513,2154,2119],{"class":1753},[1513,2156,2157],{"class":1530}," errors",[1513,2159,2125],{"class":1534},[1513,2161,2122],{"class":1530},[1513,2163,2134],{"class":1534},[1513,2165,2166],{"class":1530},"customerUserErrors",[1513,2168,1884],{"class":1534},[1513,2170,2122],{"class":1530},[1513,2172,2134],{"class":1534},[1513,2174,2175],{"class":1530},"userErrors",[1513,2177,1884],{"class":1534},[1513,2179,1887],{"class":1817},[1513,2181,1739],{"class":1534},[1513,2183,2184],{"class":1515,"line":1932},[1513,2185,1745],{"emptyLinePlaceholder":1744},[1513,2187,2188,2191,2193,2196,2199,2202,2204,2206],{"class":1515,"line":1953},[1513,2189,2190],{"class":1716},"  for",[1513,2192,1837],{"class":1817},[1513,2194,2195],{"class":1753},"const",[1513,2197,2198],{"class":1530}," error",[1513,2200,2201],{"class":1534}," of",[1513,2203,2157],{"class":1530},[1513,2205,1848],{"class":1817},[1513,2207,1851],{"class":1534},[1513,2209,2210,2213,2216,2218,2221,2223,2226,2228,2230,2232],{"class":1515,"line":1977},[1513,2211,2212],{"class":1753},"    const",[1513,2214,2215],{"class":1530}," variantId",[1513,2217,2125],{"class":1534},[1513,2219,2220],{"class":1526}," extractVariantId",[1513,2222,1963],{"class":1817},[1513,2224,2225],{"class":1530},"error",[1513,2227,1688],{"class":1534},[1513,2229,1904],{"class":1530},[1513,2231,1563],{"class":1817},[1513,2233,1739],{"class":1534},[1513,2235,2236],{"class":1515,"line":1982},[1513,2237,1745],{"emptyLinePlaceholder":1744},[1513,2239,2241,2244,2246,2248,2250,2252,2254,2257,2259,2261,2264,2266,2269],{"class":1515,"line":2240},16,[1513,2242,2243],{"class":1716},"    if",[1513,2245,1837],{"class":1817},[1513,2247,2225],{"class":1530},[1513,2249,1688],{"class":1534},[1513,2251,2140],{"class":1530},[1513,2253,2134],{"class":1534},[1513,2255,2256],{"class":1526},"includes",[1513,2258,1963],{"class":1817},[1513,2260,1560],{"class":1534},[1513,2262,2263],{"class":1556},"merchandiseId",[1513,2265,1560],{"class":1534},[1513,2267,2268],{"class":1817},")) ",[1513,2270,1851],{"class":1534},[1513,2272,2274,2277,2279,2281,2283,2285,2288,2290,2293,2295,2298,2300,2302,2304,2306,2308,2311,2313,2315],{"class":1515,"line":2273},17,[1513,2275,2276],{"class":1716},"      if",[1513,2278,1837],{"class":1817},[1513,2280,2225],{"class":1530},[1513,2282,1688],{"class":1534},[1513,2284,1484],{"class":1530},[1513,2286,2287],{"class":1534}," ===",[1513,2289,1553],{"class":1534},[1513,2291,2292],{"class":1556},"INVALID_MERCHANDISE_ID",[1513,2294,1560],{"class":1534},[1513,2296,2297],{"class":1534}," ||",[1513,2299,2198],{"class":1530},[1513,2301,1688],{"class":1534},[1513,2303,1484],{"class":1530},[1513,2305,2287],{"class":1534},[1513,2307,1553],{"class":1534},[1513,2309,2310],{"class":1556},"INVALID",[1513,2312,1560],{"class":1534},[1513,2314,1848],{"class":1817},[1513,2316,1851],{"class":1534},[1513,2318,2320,2323,2325,2328,2330,2333,2335],{"class":1515,"line":2319},18,[1513,2321,2322],{"class":1716},"        throw",[1513,2324,1860],{"class":1534},[1513,2326,2327],{"class":1526}," ProductNotFoundError",[1513,2329,1963],{"class":1817},[1513,2331,2332],{"class":1530},"variantId",[1513,2334,1563],{"class":1817},[1513,2336,1739],{"class":1534},[1513,2338,2340],{"class":1515,"line":2339},19,[1513,2341,2342],{"class":1534},"      }\n",[1513,2344,2346],{"class":1515,"line":2345},20,[1513,2347,2348],{"class":1534},"    }\n",[1513,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2373,2375,2377],{"class":1515,"line":2351},21,[1513,2353,2243],{"class":1716},[1513,2355,1837],{"class":1817},[1513,2357,2225],{"class":1530},[1513,2359,1688],{"class":1534},[1513,2361,2140],{"class":1530},[1513,2363,2134],{"class":1534},[1513,2365,2256],{"class":1526},[1513,2367,1963],{"class":1817},[1513,2369,1560],{"class":1534},[1513,2371,2372],{"class":1556},"quantity",[1513,2374,1560],{"class":1534},[1513,2376,2268],{"class":1817},[1513,2378,1851],{"class":1534},[1513,2380,2382,2384,2386,2388,2390,2392,2394,2396,2399,2401,2403,2406,2408,2411,2413,2415,2417,2419,2421,2423,2425],{"class":1515,"line":2381},22,[1513,2383,2276],{"class":1716},[1513,2385,1837],{"class":1817},[1513,2387,2225],{"class":1530},[1513,2389,1688],{"class":1534},[1513,2391,1484],{"class":1530},[1513,2393,2287],{"class":1534},[1513,2395,1553],{"class":1534},[1513,2397,2398],{"class":1556},"INVALID_INCREMENT",[1513,2400,1560],{"class":1534},[1513,2402,1848],{"class":1817},[1513,2404,2405],{"class":1716},"throw",[1513,2407,1860],{"class":1534},[1513,2409,2410],{"class":1526}," ProductQuantityError",[1513,2412,1963],{"class":1817},[1513,2414,1560],{"class":1534},[1513,2416,2398],{"class":1556},[1513,2418,1560],{"class":1534},[1513,2420,1550],{"class":1534},[1513,2422,2215],{"class":1530},[1513,2424,1563],{"class":1817},[1513,2426,1739],{"class":1534},[1513,2428,2430,2432,2434,2436,2438,2440,2442,2444,2447,2449,2451,2453,2455,2457,2459,2461,2463,2465,2467,2469,2471],{"class":1515,"line":2429},23,[1513,2431,2276],{"class":1716},[1513,2433,1837],{"class":1817},[1513,2435,2225],{"class":1530},[1513,2437,1688],{"class":1534},[1513,2439,1484],{"class":1530},[1513,2441,2287],{"class":1534},[1513,2443,1553],{"class":1534},[1513,2445,2446],{"class":1556},"MINIMUM_NOT_MET",[1513,2448,1560],{"class":1534},[1513,2450,1848],{"class":1817},[1513,2452,2405],{"class":1716},[1513,2454,1860],{"class":1534},[1513,2456,2410],{"class":1526},[1513,2458,1963],{"class":1817},[1513,2460,1560],{"class":1534},[1513,2462,2446],{"class":1556},[1513,2464,1560],{"class":1534},[1513,2466,1550],{"class":1534},[1513,2468,2215],{"class":1530},[1513,2470,1563],{"class":1817},[1513,2472,1739],{"class":1534},[1513,2474,2476,2478,2480,2482,2484,2486,2488,2490,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517],{"class":1515,"line":2475},24,[1513,2477,2276],{"class":1716},[1513,2479,1837],{"class":1817},[1513,2481,2225],{"class":1530},[1513,2483,1688],{"class":1534},[1513,2485,1484],{"class":1530},[1513,2487,2287],{"class":1534},[1513,2489,1553],{"class":1534},[1513,2491,2492],{"class":1556},"MAXIMUM_EXCEEDED",[1513,2494,1560],{"class":1534},[1513,2496,1848],{"class":1817},[1513,2498,2405],{"class":1716},[1513,2500,1860],{"class":1534},[1513,2502,2410],{"class":1526},[1513,2504,1963],{"class":1817},[1513,2506,1560],{"class":1534},[1513,2508,2492],{"class":1556},[1513,2510,1560],{"class":1534},[1513,2512,1550],{"class":1534},[1513,2514,2215],{"class":1530},[1513,2516,1563],{"class":1817},[1513,2518,1739],{"class":1534},[1513,2520,2522],{"class":1515,"line":2521},25,[1513,2523,2348],{"class":1534},[1513,2525,2527],{"class":1515,"line":2526},26,[1513,2528,1745],{"emptyLinePlaceholder":1744},[1513,2530,2532,2534,2536,2538,2540,2543,2546,2549,2551,2553,2555,2557,2560,2562,2564,2566,2568,2570,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591],{"class":1515,"line":2531},27,[1513,2533,1857],{"class":1716},[1513,2535,1860],{"class":1534},[1513,2537,1960],{"class":1526},[1513,2539,1963],{"class":1817},[1513,2541,2542],{"class":1534},"`",[1513,2544,2545],{"class":1556},"Unhandled Shopify userError: ",[1513,2547,2548],{"class":1534},"${",[1513,2550,2225],{"class":1530},[1513,2552,1688],{"class":1534},[1513,2554,1484],{"class":1530},[1513,2556,2031],{"class":1534},[1513,2558,2559],{"class":1556}," (field: ",[1513,2561,2548],{"class":1534},[1513,2563,2225],{"class":1530},[1513,2565,1688],{"class":1534},[1513,2567,2140],{"class":1530},[1513,2569,2134],{"class":1534},[1513,2571,2572],{"class":1526},"join",[1513,2574,1963],{"class":1530},[1513,2576,1560],{"class":1534},[1513,2578,1550],{"class":1556},[1513,2580,1560],{"class":1534},[1513,2582,1563],{"class":1530},[1513,2584,2031],{"class":1534},[1513,2586,1563],{"class":1556},[1513,2588,2542],{"class":1534},[1513,2590,1563],{"class":1817},[1513,2592,1739],{"class":1534},[1513,2594,2596],{"class":1515,"line":2595},28,[1513,2597,1929],{"class":1534},[1513,2599,2601],{"class":1515,"line":2600},29,[1513,2602,1985],{"class":1534},[1480,2604,2605],{},"Two design choices that pay off when you scale this across actions:",[2607,2608,2609,2629],"ol",{},[1642,2610,2611,2612,1615,2614,2617,2618,2621,2622,2625,2626,2628],{},"One helper per error surface, not per error. Shopify's ",[1484,2613,1557],{},[1484,2615,2616],{},"cartLinesUpdate",", and ",[1484,2619,2620],{},"cartCreate"," all return errors under the same shape, so one ",[1484,2623,2624],{},"catchUserErrors(response, fieldName)"," covers them all. The ",[1484,2627,2140],{}," argument is the GraphQL mutation name.",[1642,2630,2631],{},"Throw on unknown codes. A silent unknown-error is worse than a loud 500: the storefront UI shows a working result while the customer's intent dropped on the floor.",[1480,2633,2634,2635,2638,2639,2641,2642,2644,2645,2648,2649,1688],{},"Some backends also surface non-fatal warnings (Shopify ships these as ",[1484,2636,2637],{},"warnings"," next to ",[1484,2640,2175],{},"). Treat them with a separate ",[1484,2643,1574],{}," helper that follows the same translation pattern but maps codes like ",[1484,2646,2647],{},"MERCHANDISE_OUT_OF_STOCK"," to ",[1484,2650,1651],{},[1593,2652,2654],{"id":2653},"step-4-call-the-helpers-from-every-action","Step 4: call the helpers from every action",[1480,2656,2657],{},"Each mutation gets the assertion-then-catch sequence:",[1504,2659,2662],{"className":1506,"code":2660,"filename":2661,"language":1508,"meta":1509,"style":1509},"import { CartAddItemsAction } from '@laioutr-core/canonical-types/ecommerce';\nimport { defineShopifyAction } from '../../middleware/defineShopify';\nimport {\n  assertShopifyResponseHasData,\n  catchUserErrors,\n  catchWarnings,\n} from '../../shopify-helper/errors';\n\nexport default defineShopifyAction(CartAddItemsAction, async ({ input, context, event }) => {\n  const response = await context.shopifyClient.request(cartLinesAddMutation, {\n    variables: { cartId: getCartId(event), lines: mapLines(input) },\n  });\n\n  assertShopifyResponseHasData(response);\n  catchUserErrors(response, 'cartLinesAdd');\n  catchWarnings(response, 'cartLinesAdd');\n\n  return { /* ... */ };\n});\n","server/orchestr/cart/add-items.action.ts",[1484,2663,2664,2685,2707,2713,2720,2727,2734,2749,2753,2794,2826,2870,2879,2883,2895,2915,2935,2939,2952],{"__ignoreMap":1509},[1513,2665,2666,2668,2670,2673,2675,2677,2679,2681,2683],{"class":1515,"line":1516},[1513,2667,1717],{"class":1716},[1513,2669,1720],{"class":1534},[1513,2671,2672],{"class":1530}," CartAddItemsAction",[1513,2674,1726],{"class":1534},[1513,2676,1729],{"class":1716},[1513,2678,1553],{"class":1534},[1513,2680,1622],{"class":1556},[1513,2682,1560],{"class":1534},[1513,2684,1739],{"class":1534},[1513,2686,2687,2689,2691,2694,2696,2698,2700,2703,2705],{"class":1515,"line":1523},[1513,2688,1717],{"class":1716},[1513,2690,1720],{"class":1534},[1513,2692,2693],{"class":1530}," defineShopifyAction",[1513,2695,1726],{"class":1534},[1513,2697,1729],{"class":1716},[1513,2699,1553],{"class":1534},[1513,2701,2702],{"class":1556},"../../middleware/defineShopify",[1513,2704,1560],{"class":1534},[1513,2706,1739],{"class":1534},[1513,2708,2709,2711],{"class":1515,"line":1541},[1513,2710,1717],{"class":1716},[1513,2712,1828],{"class":1534},[1513,2714,2715,2718],{"class":1515,"line":1571},[1513,2716,2717],{"class":1530},"  assertShopifyResponseHasData",[1513,2719,1890],{"class":1534},[1513,2721,2722,2725],{"class":1515,"line":1788},[1513,2723,2724],{"class":1530},"  catchUserErrors",[1513,2726,1890],{"class":1534},[1513,2728,2729,2732],{"class":1515,"line":1831},[1513,2730,2731],{"class":1530},"  catchWarnings",[1513,2733,1890],{"class":1534},[1513,2735,2736,2738,2740,2742,2745,2747],{"class":1515,"line":1854},[1513,2737,2031],{"class":1534},[1513,2739,1729],{"class":1716},[1513,2741,1553],{"class":1534},[1513,2743,2744],{"class":1556},"../../shopify-helper/errors",[1513,2746,1560],{"class":1534},[1513,2748,1739],{"class":1534},[1513,2750,2751],{"class":1515,"line":1869},[1513,2752,1745],{"emptyLinePlaceholder":1744},[1513,2754,2755,2757,2760,2762,2765,2767,2770,2773,2776,2778,2781,2783,2786,2789,2792],{"class":1515,"line":1893},[1513,2756,1750],{"class":1716},[1513,2758,2759],{"class":1716}," default",[1513,2761,2693],{"class":1526},[1513,2763,2764],{"class":1530},"(CartAddItemsAction",[1513,2766,1550],{"class":1534},[1513,2768,2769],{"class":1753}," async",[1513,2771,2772],{"class":1534}," ({",[1513,2774,2775],{"class":1772}," input",[1513,2777,1550],{"class":1534},[1513,2779,2780],{"class":1772}," context",[1513,2782,1550],{"class":1534},[1513,2784,2785],{"class":1772}," event",[1513,2787,2788],{"class":1534}," })",[1513,2790,2791],{"class":1753}," =>",[1513,2793,1828],{"class":1534},[1513,2795,2796,2798,2800,2802,2805,2807,2809,2812,2814,2817,2819,2822,2824],{"class":1515,"line":1918},[1513,2797,2119],{"class":1753},[1513,2799,1797],{"class":1530},[1513,2801,2125],{"class":1534},[1513,2803,2804],{"class":1716}," await",[1513,2806,2780],{"class":1530},[1513,2808,1688],{"class":1534},[1513,2810,2811],{"class":1530},"shopifyClient",[1513,2813,1688],{"class":1534},[1513,2815,2816],{"class":1526},"request",[1513,2818,1963],{"class":1817},[1513,2820,2821],{"class":1530},"cartLinesAddMutation",[1513,2823,1550],{"class":1534},[1513,2825,1828],{"class":1534},[1513,2827,2828,2831,2833,2835,2838,2840,2843,2845,2848,2850,2852,2855,2857,2860,2862,2865,2867],{"class":1515,"line":1926},[1513,2829,2830],{"class":1817},"    variables",[1513,2832,1776],{"class":1534},[1513,2834,1720],{"class":1534},[1513,2836,2837],{"class":1817}," cartId",[1513,2839,1776],{"class":1534},[1513,2841,2842],{"class":1526}," getCartId",[1513,2844,1963],{"class":1817},[1513,2846,2847],{"class":1530},"event",[1513,2849,1563],{"class":1817},[1513,2851,1550],{"class":1534},[1513,2853,2854],{"class":1817}," lines",[1513,2856,1776],{"class":1534},[1513,2858,2859],{"class":1526}," mapLines",[1513,2861,1963],{"class":1817},[1513,2863,2864],{"class":1530},"input",[1513,2866,1848],{"class":1817},[1513,2868,2869],{"class":1534},"},\n",[1513,2871,2872,2875,2877],{"class":1515,"line":1932},[1513,2873,2874],{"class":1534},"  }",[1513,2876,1563],{"class":1817},[1513,2878,1739],{"class":1534},[1513,2880,2881],{"class":1515,"line":1953},[1513,2882,1745],{"emptyLinePlaceholder":1744},[1513,2884,2885,2887,2889,2891,2893],{"class":1515,"line":1977},[1513,2886,2717],{"class":1526},[1513,2888,1963],{"class":1817},[1513,2890,1840],{"class":1530},[1513,2892,1563],{"class":1817},[1513,2894,1739],{"class":1534},[1513,2896,2897,2899,2901,2903,2905,2907,2909,2911,2913],{"class":1515,"line":1982},[1513,2898,2724],{"class":1526},[1513,2900,1963],{"class":1817},[1513,2902,1840],{"class":1530},[1513,2904,1550],{"class":1534},[1513,2906,1553],{"class":1534},[1513,2908,1557],{"class":1556},[1513,2910,1560],{"class":1534},[1513,2912,1563],{"class":1817},[1513,2914,1739],{"class":1534},[1513,2916,2917,2919,2921,2923,2925,2927,2929,2931,2933],{"class":1515,"line":2240},[1513,2918,2731],{"class":1526},[1513,2920,1963],{"class":1817},[1513,2922,1840],{"class":1530},[1513,2924,1550],{"class":1534},[1513,2926,1553],{"class":1534},[1513,2928,1557],{"class":1556},[1513,2930,1560],{"class":1534},[1513,2932,1563],{"class":1817},[1513,2934,1739],{"class":1534},[1513,2936,2937],{"class":1515,"line":2273},[1513,2938,1745],{"emptyLinePlaceholder":1744},[1513,2940,2941,2944,2946,2949],{"class":1515,"line":2319},[1513,2942,2943],{"class":1716},"  return",[1513,2945,1720],{"class":1534},[1513,2947,2948],{"class":1519}," /* ... */",[1513,2950,2951],{"class":1534}," };\n",[1513,2953,2954,2956,2958],{"class":1515,"line":2339},[1513,2955,2031],{"class":1534},[1513,2957,1563],{"class":1530},[1513,2959,1739],{"class":1534},[1480,2961,2962,2963,2966,2967,2969],{},"The order matters. The assertion runs first because the catch helpers reach into ",[1484,2964,2965],{},"response.data","; without the assertion, an undefined ",[1484,2968,1946],{}," would surface as a confusing TypeError instead of the actual transport failure.",[1593,2971,2973],{"id":2972},"custom-errors-when-no-canonical-class-fits","Custom errors when no canonical class fits",[1480,2975,2976],{},"If your connector exposes domain-specific failures the canonical types do not cover (e.g. a B2B-only \"buyer not approved\"), define your own class and co-locate it with the entity it relates to:",[1504,2978,2983],{"className":2979,"code":2981,"language":2982,"meta":1509},[2980],"language-text","src/runtime/server/orchestr/product/\n├── byId.query.ts\n└── errors/\n    └── product-not-found.error.ts\n","text",[1484,2984,2981],{"__ignoreMap":1509},[1480,2986,2987,2988,2991],{},"Use ",[1484,2989,2990],{},"@ebec/http"," for the base class so the error carries an HTTP status code:",[1504,2993,2996],{"className":1506,"code":2994,"filename":2995,"language":1508,"meta":1509,"style":1509},"import { NotFoundError } from '@ebec/http';\n\n/** Thrown when a product that should be added to the cart is not found. */\nexport class ProductNotFoundError extends NotFoundError {\n  declare data: { [key: string]: string };\n  static readonly code = 'PRODUCT_NOT_FOUND';\n\n  constructor(key: string) {\n    super({\n      message: `Product with id ${key} not found`,\n      code: ProductNotFoundError.code,\n      data: { key },\n    });\n  }\n}\n","server/orchestr/product/errors/product-not-found.error.ts",[1484,2997,2998,3019,3023,3028,3043,3074,3096,3100,3117,3126,3152,3167,3182,3191,3195],{"__ignoreMap":1509},[1513,2999,3000,3002,3004,3007,3009,3011,3013,3015,3017],{"class":1515,"line":1516},[1513,3001,1717],{"class":1716},[1513,3003,1720],{"class":1534},[1513,3005,3006],{"class":1530}," NotFoundError",[1513,3008,1726],{"class":1534},[1513,3010,1729],{"class":1716},[1513,3012,1553],{"class":1534},[1513,3014,2990],{"class":1556},[1513,3016,1560],{"class":1534},[1513,3018,1739],{"class":1534},[1513,3020,3021],{"class":1515,"line":1523},[1513,3022,1745],{"emptyLinePlaceholder":1744},[1513,3024,3025],{"class":1515,"line":1541},[1513,3026,3027],{"class":1519},"/** Thrown when a product that should be added to the cart is not found. */\n",[1513,3029,3030,3032,3035,3037,3039,3041],{"class":1515,"line":1571},[1513,3031,1750],{"class":1716},[1513,3033,3034],{"class":1753}," class",[1513,3036,2327],{"class":1763},[1513,3038,2061],{"class":1753},[1513,3040,3006],{"class":1763},[1513,3042,1828],{"class":1534},[1513,3044,3045,3048,3050,3052,3054,3057,3060,3062,3065,3068,3070,3072],{"class":1515,"line":1788},[1513,3046,3047],{"class":1753},"  declare",[1513,3049,1818],{"class":1817},[1513,3051,1776],{"class":1534},[1513,3053,1720],{"class":1534},[1513,3055,3056],{"class":1530}," [",[1513,3058,3059],{"class":1772},"key",[1513,3061,1776],{"class":1534},[1513,3063,3064],{"class":1763}," string",[1513,3066,3067],{"class":1530},"]",[1513,3069,1776],{"class":1534},[1513,3071,3064],{"class":1763},[1513,3073,2951],{"class":1534},[1513,3075,3076,3079,3082,3085,3087,3089,3092,3094],{"class":1515,"line":1831},[1513,3077,3078],{"class":1753},"  static",[1513,3080,3081],{"class":1753}," readonly",[1513,3083,3084],{"class":1817}," code",[1513,3086,2125],{"class":1534},[1513,3088,1553],{"class":1534},[1513,3090,3091],{"class":1556},"PRODUCT_NOT_FOUND",[1513,3093,1560],{"class":1534},[1513,3095,1739],{"class":1534},[1513,3097,3098],{"class":1515,"line":1854},[1513,3099,1745],{"emptyLinePlaceholder":1744},[1513,3101,3102,3105,3107,3109,3111,3113,3115],{"class":1515,"line":1869},[1513,3103,3104],{"class":1753},"  constructor",[1513,3106,1963],{"class":1534},[1513,3108,3059],{"class":1772},[1513,3110,1776],{"class":1534},[1513,3112,3064],{"class":1763},[1513,3114,1563],{"class":1534},[1513,3116,1828],{"class":1534},[1513,3118,3119,3122,3124],{"class":1515,"line":1893},[1513,3120,3121],{"class":1530},"    super",[1513,3123,1963],{"class":1817},[1513,3125,1851],{"class":1534},[1513,3127,3128,3131,3133,3136,3139,3141,3143,3145,3148,3150],{"class":1515,"line":1918},[1513,3129,3130],{"class":1817},"      message",[1513,3132,1776],{"class":1534},[1513,3134,3135],{"class":1534}," `",[1513,3137,3138],{"class":1556},"Product with id ",[1513,3140,2548],{"class":1534},[1513,3142,3059],{"class":1530},[1513,3144,2031],{"class":1534},[1513,3146,3147],{"class":1556}," not found",[1513,3149,2542],{"class":1534},[1513,3151,1890],{"class":1534},[1513,3153,3154,3157,3159,3161,3163,3165],{"class":1515,"line":1926},[1513,3155,3156],{"class":1817},"      code",[1513,3158,1776],{"class":1534},[1513,3160,2327],{"class":1530},[1513,3162,1688],{"class":1534},[1513,3164,1484],{"class":1530},[1513,3166,1890],{"class":1534},[1513,3168,3169,3172,3174,3176,3179],{"class":1515,"line":1932},[1513,3170,3171],{"class":1817},"      data",[1513,3173,1776],{"class":1534},[1513,3175,1720],{"class":1534},[1513,3177,3178],{"class":1530}," key",[1513,3180,3181],{"class":1534}," },\n",[1513,3183,3184,3187,3189],{"class":1515,"line":1953},[1513,3185,3186],{"class":1534},"    }",[1513,3188,1563],{"class":1817},[1513,3190,1739],{"class":1534},[1513,3192,3193],{"class":1515,"line":1977},[1513,3194,1929],{"class":1534},[1513,3196,3197],{"class":1515,"line":1982},[1513,3198,1985],{"class":1534},[1480,3200,3201,3202,3205,3206,3209,3210,3212],{},"The class name is what the frontend matches on (it survives serialization), so pick a name that describes the failure semantically rather than the vendor: ",[1484,3203,3204],{},"BuyerNotApprovedError",", not ",[1484,3207,3208],{},"ShopifyB2BError",". Whatever you put in ",[1484,3211,1946],{}," arrives intact on the client; use it for IDs, error codes, anything the UI needs to render a useful message.",[1480,3214,3215,3216,3218,3219,3222,3223,3226,3227,3230,3231,3234,3235,3238,3239,3242,3243,3246,3247,3249,3250,3254,3255,3257],{},"Each ",[1484,3217,2990],{}," subclass sets a ",[1484,3220,3221],{},"statusCode"," property (",[1484,3224,3225],{},"NotFoundError"," → 404, ",[1484,3228,3229],{},"BadRequestError"," → 400, ",[1484,3232,3233],{},"PreconditionFailedError"," → 412) that the Orchestr action endpoint reads with ",[1484,3236,3237],{},"error.statusCode ?? 500"," when re-throwing. A plain ",[1484,3240,3241],{},"BaseError"," from ",[1484,3244,3245],{},"ebec"," (or any error without a ",[1484,3248,3221],{},") ends up as a 500. This only matters for ",[3251,3252,3253],"strong",{},"action"," throws; errors from query handlers, link handlers, and component resolvers travel inside a 200 OK turbo-stream as per-result error chunks, so their ",[1484,3256,3221],{}," is not used as an HTTP status.",[1593,3259,3261],{"id":3260},"frontend-usage","Frontend usage",[1480,3263,3264,3265,3268,3269,3271,3272,3275,3276,1615,3278,2617,3280,3282,3283,3285,3286,3289],{},"The serialized canonical error arrives on the client wrapped: ",[1484,3266,3267],{},"fetchTurboStream"," parses the server's response body and re-throws a generic ",[1484,3270,1687],{}," whose ",[1484,3273,3274],{},"cause"," carries the original error's ",[1484,3277,1626],{},[1484,3279,1904],{},[1484,3281,1946],{},". The ",[1484,3284,1626],{}," is prefixed with ",[1484,3287,3288],{},"[SERVER] "," so it's obvious in stack traces where the throw originated.",[1480,3291,3292],{},"A small helper keeps pattern-matching readable:",[1504,3294,3297],{"className":1506,"code":3295,"filename":3296,"language":1508,"meta":1509,"style":1509},"export const isCanonicalError = (error: unknown, ErrorClass: { name: string }): boolean => {\n  const cause = (error as Error | undefined)?.cause as { name?: string } | undefined;\n  return cause?.name === `[SERVER] ${ErrorClass.name}`;\n};\n","app/utils/canonical-error.ts",[1484,3298,3299,3347,3396,3426],{"__ignoreMap":1509},[1513,3300,3301,3303,3306,3309,3312,3314,3316,3318,3321,3323,3326,3328,3330,3333,3335,3337,3340,3343,3345],{"class":1515,"line":1516},[1513,3302,1750],{"class":1716},[1513,3304,3305],{"class":1753}," const",[1513,3307,3308],{"class":1530}," isCanonicalError ",[1513,3310,3311],{"class":1534},"=",[1513,3313,1837],{"class":1534},[1513,3315,2225],{"class":1772},[1513,3317,1776],{"class":1534},[1513,3319,3320],{"class":1763}," unknown",[1513,3322,1550],{"class":1534},[1513,3324,3325],{"class":1772}," ErrorClass",[1513,3327,1776],{"class":1534},[1513,3329,1720],{"class":1534},[1513,3331,3332],{"class":1817}," name",[1513,3334,1776],{"class":1534},[1513,3336,3064],{"class":1763},[1513,3338,3339],{"class":1534}," }):",[1513,3341,3342],{"class":1763}," boolean",[1513,3344,2791],{"class":1753},[1513,3346,1828],{"class":1534},[1513,3348,3349,3351,3354,3356,3358,3360,3363,3365,3368,3371,3373,3375,3377,3379,3381,3383,3386,3388,3390,3392,3394],{"class":1515,"line":1523},[1513,3350,2119],{"class":1753},[1513,3352,3353],{"class":1530}," cause",[1513,3355,2125],{"class":1534},[1513,3357,1837],{"class":1817},[1513,3359,2225],{"class":1530},[1513,3361,3362],{"class":1716}," as",[1513,3364,1960],{"class":1763},[1513,3366,3367],{"class":1534}," |",[1513,3369,3370],{"class":1763}," undefined",[1513,3372,1563],{"class":1817},[1513,3374,2134],{"class":1534},[1513,3376,3274],{"class":1530},[1513,3378,3362],{"class":1716},[1513,3380,1720],{"class":1534},[1513,3382,3332],{"class":1817},[1513,3384,3385],{"class":1534},"?:",[1513,3387,3064],{"class":1763},[1513,3389,1726],{"class":1534},[1513,3391,3367],{"class":1534},[1513,3393,3370],{"class":1763},[1513,3395,1739],{"class":1534},[1513,3397,3398,3400,3402,3404,3406,3408,3410,3412,3414,3417,3419,3421,3424],{"class":1515,"line":1541},[1513,3399,2943],{"class":1716},[1513,3401,3353],{"class":1530},[1513,3403,2134],{"class":1534},[1513,3405,1626],{"class":1530},[1513,3407,2287],{"class":1534},[1513,3409,3135],{"class":1534},[1513,3411,3288],{"class":1556},[1513,3413,2548],{"class":1534},[1513,3415,3416],{"class":1530},"ErrorClass",[1513,3418,1688],{"class":1534},[1513,3420,1626],{"class":1530},[1513,3422,3423],{"class":1534},"}`",[1513,3425,1739],{"class":1534},[1513,3427,3428],{"class":1515,"line":1571},[1513,3429,3430],{"class":1534},"};\n",[1480,3432,3433,3434,3437,3438,3441,3442,3445,3446,3449],{},"A connected component then uses ",[1484,3435,3436],{},"try","/",[1484,3439,3440],{},"catch"," around ",[1484,3443,3444],{},"mutateAsync"," (the idiom shipping connected components in this repo follow, though most catch blocks today still surface the raw ",[1484,3447,3448],{},"error.cause.message"," instead of branching on canonical errors):",[1504,3451,3456],{"className":3452,"code":3453,"filename":3454,"language":3455,"meta":1509,"style":1509},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { useMutationAction, useToasterStore } from '#imports';\nimport { CartAddItemsAction, ProductNotFoundError } from '@laioutr-core/canonical-types/ecommerce';\nimport { isCanonicalError } from '~/utils/canonical-error';\n\nconst addToCartMutation = useMutationAction(CartAddItemsAction);\nconst toaster = useToasterStore();\n\nconst addToCart = async (variantId: string) => {\n  try {\n    await addToCartMutation.mutateAsync([{ type: 'product', variantId, quantity: 1 }]);\n    toaster.addToast({ title: 'Added to cart', variant: 'success' });\n  } catch (error) {\n    if (isCanonicalError(error, ProductNotFoundError)) {\n      toaster.addToast({ title: 'That product is no longer available.', variant: 'error' });\n      return;\n    }\n    const causeMessage = ((error as Error | undefined)?.cause as { message?: string } | undefined)?.message;\n    toaster.addToast({ title: 'Failed to add to cart', subline: causeMessage ?? 'Something went wrong', variant: 'error' });\n  }\n};\n\u003C/script>\n","components/ConnectedProductTileBasic.vue","vue",[1484,3457,3458,3483,3510,3534,3556,3560,3576,3592,3596,3621,3628,3680,3726,3741,3762,3804,3811,3815,3868,3927,3931,3935],{"__ignoreMap":1509},[1513,3459,3460,3462,3465,3468,3471,3473,3476,3478,3480],{"class":1515,"line":1516},[1513,3461,1760],{"class":1534},[1513,3463,3464],{"class":1817},"script",[1513,3466,3467],{"class":1753}," setup",[1513,3469,3470],{"class":1753}," lang",[1513,3472,3311],{"class":1534},[1513,3474,3475],{"class":1534},"\"",[1513,3477,1508],{"class":1556},[1513,3479,3475],{"class":1534},[1513,3481,3482],{"class":1534},">\n",[1513,3484,3485,3487,3489,3492,3494,3497,3499,3501,3503,3506,3508],{"class":1515,"line":1523},[1513,3486,1717],{"class":1716},[1513,3488,1720],{"class":1534},[1513,3490,3491],{"class":1530}," useMutationAction",[1513,3493,1550],{"class":1534},[1513,3495,3496],{"class":1530}," useToasterStore",[1513,3498,1726],{"class":1534},[1513,3500,1729],{"class":1716},[1513,3502,1553],{"class":1534},[1513,3504,3505],{"class":1556},"#imports",[1513,3507,1560],{"class":1534},[1513,3509,1739],{"class":1534},[1513,3511,3512,3514,3516,3518,3520,3522,3524,3526,3528,3530,3532],{"class":1515,"line":1541},[1513,3513,1717],{"class":1716},[1513,3515,1720],{"class":1534},[1513,3517,2672],{"class":1530},[1513,3519,1550],{"class":1534},[1513,3521,2327],{"class":1530},[1513,3523,1726],{"class":1534},[1513,3525,1729],{"class":1716},[1513,3527,1553],{"class":1534},[1513,3529,1622],{"class":1556},[1513,3531,1560],{"class":1534},[1513,3533,1739],{"class":1534},[1513,3535,3536,3538,3540,3543,3545,3547,3549,3552,3554],{"class":1515,"line":1571},[1513,3537,1717],{"class":1716},[1513,3539,1720],{"class":1534},[1513,3541,3542],{"class":1530}," isCanonicalError",[1513,3544,1726],{"class":1534},[1513,3546,1729],{"class":1716},[1513,3548,1553],{"class":1534},[1513,3550,3551],{"class":1556},"~/utils/canonical-error",[1513,3553,1560],{"class":1534},[1513,3555,1739],{"class":1534},[1513,3557,3558],{"class":1515,"line":1788},[1513,3559,1745],{"emptyLinePlaceholder":1744},[1513,3561,3562,3564,3567,3569,3571,3574],{"class":1515,"line":1831},[1513,3563,2195],{"class":1753},[1513,3565,3566],{"class":1530}," addToCartMutation ",[1513,3568,3311],{"class":1534},[1513,3570,3491],{"class":1526},[1513,3572,3573],{"class":1530},"(CartAddItemsAction)",[1513,3575,1739],{"class":1534},[1513,3577,3578,3580,3583,3585,3587,3590],{"class":1515,"line":1854},[1513,3579,2195],{"class":1753},[1513,3581,3582],{"class":1530}," toaster ",[1513,3584,3311],{"class":1534},[1513,3586,3496],{"class":1526},[1513,3588,3589],{"class":1530},"()",[1513,3591,1739],{"class":1534},[1513,3593,3594],{"class":1515,"line":1869},[1513,3595,1745],{"emptyLinePlaceholder":1744},[1513,3597,3598,3600,3603,3605,3607,3609,3611,3613,3615,3617,3619],{"class":1515,"line":1893},[1513,3599,2195],{"class":1753},[1513,3601,3602],{"class":1530}," addToCart ",[1513,3604,3311],{"class":1534},[1513,3606,2769],{"class":1753},[1513,3608,1837],{"class":1534},[1513,3610,2332],{"class":1772},[1513,3612,1776],{"class":1534},[1513,3614,3064],{"class":1763},[1513,3616,1563],{"class":1534},[1513,3618,2791],{"class":1753},[1513,3620,1828],{"class":1534},[1513,3622,3623,3626],{"class":1515,"line":1918},[1513,3624,3625],{"class":1716},"  try",[1513,3627,1828],{"class":1534},[1513,3629,3630,3633,3636,3638,3640,3643,3646,3649,3651,3653,3656,3658,3660,3662,3664,3667,3669,3673,3675,3678],{"class":1515,"line":1926},[1513,3631,3632],{"class":1716},"    await",[1513,3634,3635],{"class":1530}," addToCartMutation",[1513,3637,1688],{"class":1534},[1513,3639,3444],{"class":1526},[1513,3641,3642],{"class":1817},"([",[1513,3644,3645],{"class":1534},"{",[1513,3647,3648],{"class":1817}," type",[1513,3650,1776],{"class":1534},[1513,3652,1553],{"class":1534},[1513,3654,3655],{"class":1556},"product",[1513,3657,1560],{"class":1534},[1513,3659,1550],{"class":1534},[1513,3661,2215],{"class":1530},[1513,3663,1550],{"class":1534},[1513,3665,3666],{"class":1817}," quantity",[1513,3668,1776],{"class":1534},[1513,3670,3672],{"class":3671},"sbssI"," 1",[1513,3674,1726],{"class":1534},[1513,3676,3677],{"class":1817},"])",[1513,3679,1739],{"class":1534},[1513,3681,3682,3685,3687,3690,3692,3694,3697,3699,3701,3704,3706,3708,3711,3713,3715,3718,3720,3722,3724],{"class":1515,"line":1932},[1513,3683,3684],{"class":1530},"    toaster",[1513,3686,1688],{"class":1534},[1513,3688,3689],{"class":1526},"addToast",[1513,3691,1963],{"class":1817},[1513,3693,3645],{"class":1534},[1513,3695,3696],{"class":1817}," title",[1513,3698,1776],{"class":1534},[1513,3700,1553],{"class":1534},[1513,3702,3703],{"class":1556},"Added to cart",[1513,3705,1560],{"class":1534},[1513,3707,1550],{"class":1534},[1513,3709,3710],{"class":1817}," variant",[1513,3712,1776],{"class":1534},[1513,3714,1553],{"class":1534},[1513,3716,3717],{"class":1556},"success",[1513,3719,1560],{"class":1534},[1513,3721,1726],{"class":1534},[1513,3723,1563],{"class":1817},[1513,3725,1739],{"class":1534},[1513,3727,3728,3730,3733,3735,3737,3739],{"class":1515,"line":1953},[1513,3729,2874],{"class":1534},[1513,3731,3732],{"class":1716}," catch",[1513,3734,1837],{"class":1817},[1513,3736,2225],{"class":1530},[1513,3738,1848],{"class":1817},[1513,3740,1851],{"class":1534},[1513,3742,3743,3745,3747,3750,3752,3754,3756,3758,3760],{"class":1515,"line":1977},[1513,3744,2243],{"class":1716},[1513,3746,1837],{"class":1817},[1513,3748,3749],{"class":1526},"isCanonicalError",[1513,3751,1963],{"class":1817},[1513,3753,2225],{"class":1530},[1513,3755,1550],{"class":1534},[1513,3757,2327],{"class":1530},[1513,3759,2268],{"class":1817},[1513,3761,1851],{"class":1534},[1513,3763,3764,3767,3769,3771,3773,3775,3777,3779,3781,3784,3786,3788,3790,3792,3794,3796,3798,3800,3802],{"class":1515,"line":1982},[1513,3765,3766],{"class":1530},"      toaster",[1513,3768,1688],{"class":1534},[1513,3770,3689],{"class":1526},[1513,3772,1963],{"class":1817},[1513,3774,3645],{"class":1534},[1513,3776,3696],{"class":1817},[1513,3778,1776],{"class":1534},[1513,3780,1553],{"class":1534},[1513,3782,3783],{"class":1556},"That product is no longer available.",[1513,3785,1560],{"class":1534},[1513,3787,1550],{"class":1534},[1513,3789,3710],{"class":1817},[1513,3791,1776],{"class":1534},[1513,3793,1553],{"class":1534},[1513,3795,2225],{"class":1556},[1513,3797,1560],{"class":1534},[1513,3799,1726],{"class":1534},[1513,3801,1563],{"class":1817},[1513,3803,1739],{"class":1534},[1513,3805,3806,3809],{"class":1515,"line":2240},[1513,3807,3808],{"class":1716},"      return",[1513,3810,1739],{"class":1534},[1513,3812,3813],{"class":1515,"line":2273},[1513,3814,2348],{"class":1534},[1513,3816,3817,3819,3822,3824,3827,3829,3831,3833,3835,3837,3839,3841,3843,3845,3847,3850,3852,3854,3856,3858,3860,3862,3864,3866],{"class":1515,"line":2319},[1513,3818,2212],{"class":1753},[1513,3820,3821],{"class":1530}," causeMessage",[1513,3823,2125],{"class":1534},[1513,3825,3826],{"class":1817}," ((",[1513,3828,2225],{"class":1530},[1513,3830,3362],{"class":1716},[1513,3832,1960],{"class":1763},[1513,3834,3367],{"class":1534},[1513,3836,3370],{"class":1763},[1513,3838,1563],{"class":1817},[1513,3840,2134],{"class":1534},[1513,3842,3274],{"class":1530},[1513,3844,3362],{"class":1716},[1513,3846,1720],{"class":1534},[1513,3848,3849],{"class":1817}," message",[1513,3851,3385],{"class":1534},[1513,3853,3064],{"class":1763},[1513,3855,1726],{"class":1534},[1513,3857,3367],{"class":1534},[1513,3859,3370],{"class":1763},[1513,3861,1563],{"class":1817},[1513,3863,2134],{"class":1534},[1513,3865,1904],{"class":1530},[1513,3867,1739],{"class":1534},[1513,3869,3870,3872,3874,3876,3878,3880,3882,3884,3886,3889,3891,3893,3896,3898,3900,3902,3904,3907,3909,3911,3913,3915,3917,3919,3921,3923,3925],{"class":1515,"line":2339},[1513,3871,3684],{"class":1530},[1513,3873,1688],{"class":1534},[1513,3875,3689],{"class":1526},[1513,3877,1963],{"class":1817},[1513,3879,3645],{"class":1534},[1513,3881,3696],{"class":1817},[1513,3883,1776],{"class":1534},[1513,3885,1553],{"class":1534},[1513,3887,3888],{"class":1556},"Failed to add to cart",[1513,3890,1560],{"class":1534},[1513,3892,1550],{"class":1534},[1513,3894,3895],{"class":1817}," subline",[1513,3897,1776],{"class":1534},[1513,3899,3821],{"class":1530},[1513,3901,1884],{"class":1534},[1513,3903,1553],{"class":1534},[1513,3905,3906],{"class":1556},"Something went wrong",[1513,3908,1560],{"class":1534},[1513,3910,1550],{"class":1534},[1513,3912,3710],{"class":1817},[1513,3914,1776],{"class":1534},[1513,3916,1553],{"class":1534},[1513,3918,2225],{"class":1556},[1513,3920,1560],{"class":1534},[1513,3922,1726],{"class":1534},[1513,3924,1563],{"class":1817},[1513,3926,1739],{"class":1534},[1513,3928,3929],{"class":1515,"line":2345},[1513,3930,1929],{"class":1534},[1513,3932,3933],{"class":1515,"line":2351},[1513,3934,3430],{"class":1534},[1513,3936,3937,3940,3942],{"class":1515,"line":2381},[1513,3938,3939],{"class":1534},"\u003C/",[1513,3941,3464],{"class":1817},[1513,3943,3482],{"class":1534},[1480,3945,3946],{},"The storefront templates that ship with Laioutr already branch on every canonical error class, so most translations land working with no frontend changes. Custom error classes you define need their own UI handler.",[1593,3948,3950],{"id":3949},"related","Related",[1639,3952,3953,3966],{},[1642,3954,3955,3959,3960,3962,3963,3965],{},[1680,3956,3958],{"href":3957},"/frontend/orchestr/actions#error-handling","Actions: Error Handling",": base concepts and the ",[1484,3961,3245],{}," / ",[1484,3964,2990],{}," packages.",[1642,3967,3968,3971],{},[1680,3969,3970],{"href":299},"Wire format",": what survives the round-trip to the client.",[3973,3974,3975],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":1509,"searchDepth":1523,"depth":1523,"links":3977},[3978,3979,3980,3981,3982,3983,3984,3985],{"id":1595,"depth":1523,"text":1596},{"id":1630,"depth":1523,"text":1631},{"id":1691,"depth":1523,"text":1692},{"id":1991,"depth":1523,"text":1992},{"id":2653,"depth":1523,"text":2654},{"id":2972,"depth":1523,"text":2973},{"id":3260,"depth":1523,"text":3261},{"id":3949,"depth":1523,"text":3950},"Map raw backend errors into canonical Laioutr errors so the storefront UI can render them with no connector-specific code.","md",{},{"title":3990,"description":3986},"Translating vendor errors | Laioutr",{"loc":263,"lastmod":3992,"changefreq":3993,"priority":3994},"2026-05-05","monthly",0.9,"uXy2cMrPH1933Cmu-VvQaLwogYV82lXGLASh2MXjBy4",[3997,3999],{"title":258,"path":259,"stem":260,"description":3998,"children":-1},"When your backend needs internal IDs for currency, locale, or sales channel that aren't part of clientEnv, fetch and cache the metadata once, then resolve it on each request.",{"title":266,"path":267,"stem":268,"description":4000,"children":-1},"Pre-warm caches without blocking responses, and isolate cache entries across tenants and locales using cache key composition. Two patterns the built-in connectors hit constantly.",1778245943792]