@salla.sa/twilight-components 2.14.10 → 2.14.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/{app-globals-29d166ce.js → app-globals-5486958c.js} +2 -2
- package/dist/cjs/app-globals-5486958c.js.map +1 -0
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/salla-add-product-button_48.cjs.entry.js +16 -9
- package/dist/cjs/salla-add-product-button_48.cjs.entry.js.map +1 -1
- package/dist/cjs/twilight.cjs.js +1 -1
- package/dist/collection/components/salla-breadcrumb/salla-breadcrumb.js +16 -9
- package/dist/collection/components/salla-breadcrumb/salla-breadcrumb.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/salla-breadcrumb.js +16 -9
- package/dist/components/salla-breadcrumb.js.map +1 -1
- package/dist/components/salla-quick-buy2.js.map +1 -1
- package/dist/esm/{app-globals-f51db284.js → app-globals-81d17271.js} +2 -2
- package/dist/esm/app-globals-81d17271.js.map +1 -0
- package/dist/esm/loader.js +1 -1
- package/dist/esm/salla-add-product-button_48.entry.js +16 -9
- package/dist/esm/salla-add-product-button_48.entry.js.map +1 -1
- package/dist/esm/twilight.js +1 -1
- package/dist/esm-es5/{app-globals-f51db284.js → app-globals-81d17271.js} +2 -2
- package/dist/esm-es5/app-globals-81d17271.js.map +1 -0
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/salla-add-product-button_48.entry.js +1 -1
- package/dist/esm-es5/salla-add-product-button_48.entry.js.map +1 -1
- package/dist/esm-es5/twilight.js +1 -1
- package/dist/twilight/{p-85437cd8.system.js → p-2cb89724.system.js} +2 -2
- package/dist/twilight/p-2cb89724.system.js.map +1 -0
- package/dist/twilight/{p-b3326820.system.entry.js → p-8fc87184.system.entry.js} +2 -2
- package/dist/twilight/p-8fc87184.system.entry.js.map +1 -0
- package/dist/twilight/{p-1d0fd8b5.js → p-aabec29e.js} +2 -2
- package/dist/twilight/p-aabec29e.js.map +1 -0
- package/dist/twilight/{p-d60b7588.entry.js → p-b135f146.entry.js} +2 -2
- package/dist/twilight/p-b135f146.entry.js.map +1 -0
- package/dist/twilight/{p-3d786e9f.system.js → p-e9f87bbd.system.js} +2 -2
- package/dist/twilight/twilight.esm.js +1 -1
- package/dist/twilight/twilight.js +1 -1
- package/package.json +5 -5
- package/dist/cjs/app-globals-29d166ce.js.map +0 -1
- package/dist/esm/app-globals-f51db284.js.map +0 -1
- package/dist/esm-es5/app-globals-f51db284.js.map +0 -1
- package/dist/twilight/p-1d0fd8b5.js.map +0 -1
- package/dist/twilight/p-85437cd8.system.js.map +0 -1
- package/dist/twilight/p-b3326820.system.entry.js.map +0 -1
- package/dist/twilight/p-d60b7588.entry.js.map +0 -1
- package/dist/types/global.d.ts +0 -20
- /package/dist/twilight/{p-3d786e9f.system.js.map → p-e9f87bbd.system.js.map} +0 -0
|
@@ -94,10 +94,11 @@ const SallaBreadcrumb$1 = /*@__PURE__*/ proxyCustomElement(class SallaBreadcrumb
|
|
|
94
94
|
return title.split('|').map(part => part.trim())[preferedIndex];
|
|
95
95
|
}
|
|
96
96
|
generateBreadcrumbs(page) {
|
|
97
|
+
var _a, _b;
|
|
97
98
|
let breadcrumbs = [];
|
|
98
99
|
if (page.slug === 'product.single') {
|
|
99
100
|
const previousPage = JSON.parse(sessionStorage.getItem(this.sessionStorageKey) || '[]');
|
|
100
|
-
if (previousPage
|
|
101
|
+
if (previousPage.length > 0 && ((_a = previousPage[1]) === null || _a === void 0 ? void 0 : _a.url) === ((_b = page.parent) === null || _b === void 0 ? void 0 : _b.url)) {
|
|
101
102
|
return this.setBreadcrumbsFromArray([...previousPage, page]);
|
|
102
103
|
}
|
|
103
104
|
}
|
|
@@ -105,24 +106,25 @@ const SallaBreadcrumb$1 = /*@__PURE__*/ proxyCustomElement(class SallaBreadcrumb
|
|
|
105
106
|
let currentPage = page;
|
|
106
107
|
// Traverse up to the parent pages
|
|
107
108
|
while (currentPage) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
109
|
+
if (currentPage.title) {
|
|
110
|
+
breadcrumbs.unshift({
|
|
111
|
+
title: currentPage.title,
|
|
112
|
+
url: currentPage.url,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
113
115
|
currentPage = currentPage.parent;
|
|
114
116
|
}
|
|
115
117
|
// Additional logic based on page slug or title
|
|
116
118
|
if (page.slug.includes("customer") && page.slug !== 'customer.profile') {
|
|
117
119
|
breadcrumbs.unshift({ title: salla.lang.get('common.titles.profile'), url: salla.url.get('profile') });
|
|
118
120
|
}
|
|
119
|
-
if (page.slug.includes(
|
|
121
|
+
if (page.slug.includes('blog')) {
|
|
120
122
|
breadcrumbs.unshift({ title: salla.lang.get('blocks.footer.blog'), url: salla.url.get('blog') });
|
|
121
123
|
}
|
|
122
|
-
if (page.slug
|
|
124
|
+
if (page.slug === 'brands.single') {
|
|
123
125
|
breadcrumbs.unshift({ title: salla.lang.get('common.titles.brands'), url: salla.url.get('brands') });
|
|
124
126
|
}
|
|
125
|
-
if (!page.title && page.slug
|
|
127
|
+
if (!page.title && page.slug === 'loyalty') {
|
|
126
128
|
breadcrumbs.unshift({ title: salla.lang.get('common.titles.loyalty_program'), url: salla.url.get('loyalty') });
|
|
127
129
|
}
|
|
128
130
|
// Add home breadcrumb
|
|
@@ -131,6 +133,11 @@ const SallaBreadcrumb$1 = /*@__PURE__*/ proxyCustomElement(class SallaBreadcrumb
|
|
|
131
133
|
}
|
|
132
134
|
storeBreadcrumbSnapshot() {
|
|
133
135
|
try {
|
|
136
|
+
const page = salla.config.get("page");
|
|
137
|
+
// Skip storing breadcrumbs for product.single page
|
|
138
|
+
if ((page === null || page === void 0 ? void 0 : page.slug) === 'product.single') {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
134
141
|
const items = [...this.breadcrumbs];
|
|
135
142
|
// Find the last item and update its URL
|
|
136
143
|
const lastItemIndex = items.length - 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"salla-breadcrumb.js","mappings":"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","names":["SallaBreadcrumb"],"sources":["src/components/salla-breadcrumb/salla-breadcrumb.scss?tag=salla-breadcrumb","src/components/salla-breadcrumb/salla-breadcrumb.tsx"],"sourcesContent":[":host {\n display: block;\n}\n","import { Component, State, h, Element } from '@stencil/core';\nimport { BreadcrumbItem } from './interfaces';\nimport KeyBoardArrowLeftIcon from \"../../assets/svg/keyboard_arrow_left.svg\"\nimport KeyBoardArrowRightIcon from \"../../assets/svg/keyboard_arrow_right.svg\"\n\n/**\n * @name SallaBreadcrumb\n * @description A StencilJS component for rendering breadcrumb navigation.\n * @tag salla-breadcrumb\n *\n * @slot item - Replaces breadcrumb item, has replaceable props `{url}`, `{title}`.\n * @slot icon - Replaces breadcrumb arrow icon.\n */\n@Component({\n tag: 'salla-breadcrumb',\n styleUrl: 'salla-breadcrumb.scss',\n})\nexport class SallaBreadcrumb {\n @Element() host: HTMLElement;\n\n private readonly itemSlot: string;\n private readonly iconSlot: string;\n private sessionStorageKey: string = \"breadcrumb_snapshot\"\n\n @State() breadcrumbs: BreadcrumbItem[];\n\n constructor() {\n this.itemSlot = this.host.querySelector('[slot=\"item\"]')?.outerHTML || `<li class=\"s-breadcrumb-item\"><a href={url}>{title}</a></li>`;\n this.iconSlot = this.host.querySelector('[slot=\"icon\"]')?.outerHTML;\n }\n\n componentWillLoad() {\n return (new Promise(resolve => salla.onReady(() => salla.lang.onLoaded(resolve))))\n .then(() => {\n if (salla.url.is_page('index')) {\n throw new Error('salla-breadcrumb:: breadcrumb not supported on home page');\n }\n })\n .then(() => {\n if (!salla.config.get('theme.settings.is_breadcrumbs_enabled', true)) {\n throw new Error('salla-breadcrumb:: merchant disabled the feature');\n }\n })\n .then(() => {\n const page = salla.config.get(\"page\");\n if (!page || !page.slug) {\n salla.logger.error('salla-breadcrumbs:: page object not existed on salla.config.get(\"page\")!');\n this.breadcrumbs = [];\n return;\n }\n\n let sessionBreadcrumbs = JSON.parse(sessionStorage.getItem(this.sessionStorageKey) || '[]');\n\n if (page.slug === \"product.single\" && sessionBreadcrumbs && sessionBreadcrumbs.length > 0) {\n sessionBreadcrumbs.push({\n title: page.title,\n url: page.url\n });\n this.breadcrumbs = this.setBreadcrumbsFromArray(sessionBreadcrumbs);\n this.storeBreadcrumbSnapshot();\n } else if (sessionBreadcrumbs && sessionBreadcrumbs.length > 0) {\n if (this.isNewPage(page, sessionBreadcrumbs)) {\n this.breadcrumbs = this.generateBreadcrumbs(page);\n this.storeBreadcrumbSnapshot();\n } else {\n this.breadcrumbs = this.setBreadcrumbsFromArray(sessionBreadcrumbs);\n }\n } else {\n this.breadcrumbs = this.generateBreadcrumbs(page);\n this.storeBreadcrumbSnapshot();\n }\n\n if (this.breadcrumbs?.length) {\n this.breadcrumbs[this.breadcrumbs.length - 1].is_last = true;\n }\n\n return this.breadcrumbs;\n })\n .catch((error) => {\n salla.logger.error('salla-breadcrumb:: unexpected error!', error);\n this.breadcrumbs = [];\n });\n }\n\n /**\n * Helper function to determine if we're navigating to a new page that requires updating the session storage.\n */\n private isNewPage(page: any, sessionBreadcrumbs: BreadcrumbItem[]): boolean {\n // Check if the last breadcrumb in sessionStorage matches the current page's URL.\n const lastBreadcrumb = sessionBreadcrumbs[sessionBreadcrumbs.length - 1];\n return lastBreadcrumb?.url !== page.url; // If the URLs don't match, it's a new page.\n }\n\n private setBreadcrumbsFromArray(breadcrumbArray: BreadcrumbItem[]) {\n return breadcrumbArray.map((item, index) => ({\n ...item,\n is_last: index === breadcrumbArray.length - 1,\n }));\n }\n\n /**\n * Sanitizes the breadcrumb title by splitting it on the `|` character and returning \n * the part based on `preferedIndex`. If no separator is found, returns the trimmed title.\n *\n * @param {string} title - The title to sanitize.\n * @param {number} [preferedIndex=1] - Index of the part to return (0 for first, 1 for second).\n * @returns {string} - The sanitized title.\n */\n private sanitizeBreadcrumbTitle(title: string, preferedIndex: number = 1): string {\n if (!title.includes('|')) {\n return title.trim();\n }\n return title.split('|').map(part => part.trim())[preferedIndex];\n }\n\n private generateBreadcrumbs(page: any): BreadcrumbItem[] {\n let breadcrumbs: BreadcrumbItem[] = [];\n\n if (page.slug === 'product.single') {\n const previousPage = JSON.parse(sessionStorage.getItem(this.sessionStorageKey) || '[]');\n if (previousPage && previousPage.length > 0 && previousPage[1].url == page.parent.url) {\n return this.setBreadcrumbsFromArray([...previousPage, page]);\n }\n }\n\n // Start with the current page\n let currentPage = page;\n\n // Traverse up to the parent pages\n while (currentPage) {\n !!currentPage.title && breadcrumbs.unshift({\n title: currentPage.title,\n url: currentPage.url,\n });\n\n // Move to the parent page, if exists\n currentPage = currentPage.parent;\n }\n\n\n // Additional logic based on page slug or title\n if (page.slug.includes(\"customer\") && page.slug !== 'customer.profile') {\n breadcrumbs.unshift({ title: salla.lang.get('common.titles.profile'), url: salla.url.get('profile') });\n }\n\n if (page.slug.includes(\"blog\")) {\n breadcrumbs.unshift({ title: salla.lang.get('blocks.footer.blog'), url: salla.url.get('blog') });\n }\n\n if (page.slug == 'brands.single') {\n breadcrumbs.unshift({ title: salla.lang.get('common.titles.brands'), url: salla.url.get('brands') });\n }\n\n if (!page.title && page.slug == \"loyalty\") {\n breadcrumbs.unshift({ title: salla.lang.get('common.titles.loyalty_program'), url: salla.url.get('loyalty') });\n }\n // Add home breadcrumb\n breadcrumbs.unshift({ title: salla.lang.get('common.titles.home'), url: salla.url.get('') });\n\n return breadcrumbs;\n }\n\n private storeBreadcrumbSnapshot() {\n try {\n const items = [...this.breadcrumbs];\n\n // Find the last item and update its URL\n const lastItemIndex = items.length - 1;\n if (lastItemIndex >= 0) {\n items[lastItemIndex].url = window.location.href;\n }\n\n const breadcrumbSnapshot = JSON.stringify(items);\n sessionStorage.setItem(this.sessionStorageKey, breadcrumbSnapshot);\n } catch (error) {\n salla.logger.error('salla-breadcrumb:: Failed to store breadcrumb snapshot in sessionStorage.', error);\n }\n }\n\n render() {\n if (this.breadcrumbs.length <= 1) {\n salla.log('salla-breadcrumb:: There is no breadcrumbs!');\n return null;\n }\n return (\n <ol class={{\n \"s-breadcrumb-wrapper\": true,\n \"s-breadcrumb-dark\": salla.url.is_page('loyalty'),\n \"s-breadcrumb-primary-reverse\": salla.config.get('page.slug').includes('customer')\n }}>\n {this.breadcrumbs.map(item => {\n const isProductSingle = salla.config.get('page.slug') === \"product.single\";\n const title = (isProductSingle && item.is_last) ? item.title : this.sanitizeBreadcrumbTitle(item.title);\n const itemHTML = this.itemSlot.replace(/\\{url\\}/g, item.url).replace(/\\{title\\}/g, title);\n return [\n <div class=\"s-breadcrumb-slot\" innerHTML={itemHTML}></div>,\n this.getArrowDomForItem(item)\n ];\n })}\n </ol>\n );\n }\n\n private getArrowDomForItem(item: BreadcrumbItem) {\n if (item.is_last) {\n return '';\n }\n let iconDom = this.iconSlot || (salla.config.get('theme.is_rtl', true) ? KeyBoardArrowLeftIcon : KeyBoardArrowRightIcon);\n\n return <li class=\"s-breadcrumb-arrow\">\n <div class={{ \"s-breadcrumb-icon-slot\": true, \"s-breadcrumb-default-icon\": !this.iconSlot }} innerHTML={iconDom}></div>\n </li>;\n }\n\n /**\n * Lifecycle method called after the component is rendered.\n * - Reduces the number of elements in the DOM.\n * - Removes unnecessary slots parent elements.\n * - Replaces the last anchor tag in the breadcrumb with its content.\n */\n componentDidRender() {\n // Reduces the number of elements in the DOM\n this.host.querySelectorAll('.s-breadcrumb-slot').forEach(el => el.replaceWith(el.firstChild));\n this.host.querySelectorAll('.s-breadcrumb-icon-slot.s-breadcrumb-default-icon').forEach(el => el.replaceWith(el.querySelector('svg')));\n\n // Removes the slots parent elements if exists\n this.host.querySelector('[slot=\"item\"]')?.remove();\n this.host.querySelector('[slot=\"icon\"]')?.remove();\n\n let lastEl = this.host.querySelectorAll('.s-breadcrumb-item')[this.breadcrumbs.length - 1]?.querySelector('a');\n lastEl && lastEl.replaceWith(lastEl.firstChild);\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"salla-breadcrumb.js","mappings":"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","names":["SallaBreadcrumb"],"sources":["src/components/salla-breadcrumb/salla-breadcrumb.scss?tag=salla-breadcrumb","src/components/salla-breadcrumb/salla-breadcrumb.tsx"],"sourcesContent":[":host {\n display: block;\n}\n","import { Component, State, h, Element } from '@stencil/core';\nimport { BreadcrumbItem } from './interfaces';\nimport KeyBoardArrowLeftIcon from \"../../assets/svg/keyboard_arrow_left.svg\"\nimport KeyBoardArrowRightIcon from \"../../assets/svg/keyboard_arrow_right.svg\"\n\n/**\n * @name SallaBreadcrumb\n * @description A StencilJS component for rendering breadcrumb navigation.\n * @tag salla-breadcrumb\n *\n * @slot item - Replaces breadcrumb item, has replaceable props `{url}`, `{title}`.\n * @slot icon - Replaces breadcrumb arrow icon.\n */\n@Component({\n tag: 'salla-breadcrumb',\n styleUrl: 'salla-breadcrumb.scss',\n})\nexport class SallaBreadcrumb {\n @Element() host: HTMLElement;\n\n private readonly itemSlot: string;\n private readonly iconSlot: string;\n private sessionStorageKey: string = \"breadcrumb_snapshot\"\n\n @State() breadcrumbs: BreadcrumbItem[];\n\n constructor() {\n this.itemSlot = this.host.querySelector('[slot=\"item\"]')?.outerHTML || `<li class=\"s-breadcrumb-item\"><a href={url}>{title}</a></li>`;\n this.iconSlot = this.host.querySelector('[slot=\"icon\"]')?.outerHTML;\n }\n\n componentWillLoad() {\n return (new Promise(resolve => salla.onReady(() => salla.lang.onLoaded(resolve))))\n .then(() => {\n if (salla.url.is_page('index')) {\n throw new Error('salla-breadcrumb:: breadcrumb not supported on home page');\n }\n })\n .then(() => {\n if (!salla.config.get('theme.settings.is_breadcrumbs_enabled', true)) {\n throw new Error('salla-breadcrumb:: merchant disabled the feature');\n }\n })\n .then(() => {\n const page = salla.config.get(\"page\");\n if (!page || !page.slug) {\n salla.logger.error('salla-breadcrumbs:: page object not existed on salla.config.get(\"page\")!');\n this.breadcrumbs = [];\n return;\n }\n\n let sessionBreadcrumbs = JSON.parse(sessionStorage.getItem(this.sessionStorageKey) || '[]');\n\n if (page.slug === \"product.single\" && sessionBreadcrumbs && sessionBreadcrumbs.length > 0) {\n sessionBreadcrumbs.push({\n title: page.title,\n url: page.url\n });\n \n this.breadcrumbs = this.setBreadcrumbsFromArray(sessionBreadcrumbs);\n this.storeBreadcrumbSnapshot();\n } else if (sessionBreadcrumbs && sessionBreadcrumbs.length > 0) {\n if (this.isNewPage(page, sessionBreadcrumbs)) {\n this.breadcrumbs = this.generateBreadcrumbs(page);\n this.storeBreadcrumbSnapshot();\n } else {\n this.breadcrumbs = this.setBreadcrumbsFromArray(sessionBreadcrumbs);\n }\n } else {\n this.breadcrumbs = this.generateBreadcrumbs(page);\n this.storeBreadcrumbSnapshot();\n }\n\n if (this.breadcrumbs?.length) {\n this.breadcrumbs[this.breadcrumbs.length - 1].is_last = true;\n }\n\n return this.breadcrumbs;\n })\n .catch((error) => {\n salla.logger.error('salla-breadcrumb:: unexpected error!', error);\n this.breadcrumbs = [];\n });\n }\n\n /**\n * Helper function to determine if we're navigating to a new page that requires updating the session storage.\n */\n private isNewPage(page: any, sessionBreadcrumbs: BreadcrumbItem[]): boolean {\n // Check if the last breadcrumb in sessionStorage matches the current page's URL.\n const lastBreadcrumb = sessionBreadcrumbs[sessionBreadcrumbs.length - 1];\n return lastBreadcrumb?.url !== page.url; // If the URLs don't match, it's a new page.\n }\n\n private setBreadcrumbsFromArray(breadcrumbArray: BreadcrumbItem[]) {\n return breadcrumbArray.map((item, index) => ({\n ...item,\n is_last: index === breadcrumbArray.length - 1,\n }));\n }\n\n /**\n * Sanitizes the breadcrumb title by splitting it on the `|` character and returning \n * the part based on `preferedIndex`. If no separator is found, returns the trimmed title.\n *\n * @param {string} title - The title to sanitize.\n * @param {number} [preferedIndex=1] - Index of the part to return (0 for first, 1 for second).\n * @returns {string} - The sanitized title.\n */\n private sanitizeBreadcrumbTitle(title: string, preferedIndex: number = 1): string {\n if (!title.includes('|')) {\n return title.trim();\n }\n return title.split('|').map(part => part.trim())[preferedIndex];\n }\n\n private generateBreadcrumbs(page: any): BreadcrumbItem[] {\n let breadcrumbs: BreadcrumbItem[] = [];\n \n if (page.slug === 'product.single') {\n const previousPage = JSON.parse(sessionStorage.getItem(this.sessionStorageKey) || '[]');\n \n if (previousPage.length > 0 && previousPage[1]?.url === page.parent?.url) {\n return this.setBreadcrumbsFromArray([...previousPage, page]);\n }\n }\n\n // Start with the current page\n let currentPage = page;\n\n // Traverse up to the parent pages\n while (currentPage) {\n if (currentPage.title) {\n breadcrumbs.unshift({\n title: currentPage.title,\n url: currentPage.url,\n });\n }\n \n currentPage = currentPage.parent;\n }\n\n\n // Additional logic based on page slug or title\n if (page.slug.includes(\"customer\") && page.slug !== 'customer.profile') {\n breadcrumbs.unshift({ title: salla.lang.get('common.titles.profile'), url: salla.url.get('profile') });\n }\n \n if (page.slug.includes('blog')) {\n breadcrumbs.unshift({ title: salla.lang.get('blocks.footer.blog'), url: salla.url.get('blog') });\n }\n \n if (page.slug === 'brands.single') {\n breadcrumbs.unshift({ title: salla.lang.get('common.titles.brands'), url: salla.url.get('brands') });\n }\n \n if (!page.title && page.slug === 'loyalty') {\n breadcrumbs.unshift({ title: salla.lang.get('common.titles.loyalty_program'), url: salla.url.get('loyalty') });\n }\n // Add home breadcrumb\n breadcrumbs.unshift({ title: salla.lang.get('common.titles.home'), url: salla.url.get('') });\n \n return breadcrumbs;\n }\n\n private storeBreadcrumbSnapshot() {\n try {\n const page = salla.config.get(\"page\");\n\n // Skip storing breadcrumbs for product.single page\n if (page?.slug === 'product.single') {\n return;\n }\n const items = [...this.breadcrumbs];\n\n // Find the last item and update its URL\n const lastItemIndex = items.length - 1;\n if (lastItemIndex >= 0) {\n items[lastItemIndex].url = window.location.href;\n }\n\n const breadcrumbSnapshot = JSON.stringify(items);\n sessionStorage.setItem(this.sessionStorageKey, breadcrumbSnapshot);\n } catch (error) {\n salla.logger.error('salla-breadcrumb:: Failed to store breadcrumb snapshot in sessionStorage.', error);\n }\n }\n\n render() {\n if (this.breadcrumbs.length <= 1) {\n salla.log('salla-breadcrumb:: There is no breadcrumbs!');\n return null;\n }\n return (\n <ol class={{\n \"s-breadcrumb-wrapper\": true,\n \"s-breadcrumb-dark\": salla.url.is_page('loyalty'),\n \"s-breadcrumb-primary-reverse\": salla.config.get('page.slug').includes('customer')\n }}>\n {this.breadcrumbs.map(item => {\n const isProductSingle = salla.config.get('page.slug') === \"product.single\";\n const title = (isProductSingle && item.is_last) ? item.title : this.sanitizeBreadcrumbTitle(item.title);\n const itemHTML = this.itemSlot.replace(/\\{url\\}/g, item.url).replace(/\\{title\\}/g, title);\n return [\n <div class=\"s-breadcrumb-slot\" innerHTML={itemHTML}></div>,\n this.getArrowDomForItem(item)\n ];\n })}\n </ol>\n );\n }\n\n private getArrowDomForItem(item: BreadcrumbItem) {\n if (item.is_last) {\n return '';\n }\n let iconDom = this.iconSlot || (salla.config.get('theme.is_rtl', true) ? KeyBoardArrowLeftIcon : KeyBoardArrowRightIcon);\n\n return <li class=\"s-breadcrumb-arrow\">\n <div class={{ \"s-breadcrumb-icon-slot\": true, \"s-breadcrumb-default-icon\": !this.iconSlot }} innerHTML={iconDom}></div>\n </li>;\n }\n\n /**\n * Lifecycle method called after the component is rendered.\n * - Reduces the number of elements in the DOM.\n * - Removes unnecessary slots parent elements.\n * - Replaces the last anchor tag in the breadcrumb with its content.\n */\n componentDidRender() {\n // Reduces the number of elements in the DOM\n this.host.querySelectorAll('.s-breadcrumb-slot').forEach(el => el.replaceWith(el.firstChild));\n this.host.querySelectorAll('.s-breadcrumb-icon-slot.s-breadcrumb-default-icon').forEach(el => el.replaceWith(el.querySelector('svg')));\n\n // Removes the slots parent elements if exists\n this.host.querySelector('[slot=\"item\"]')?.remove();\n this.host.querySelector('[slot=\"icon\"]')?.remove();\n\n let lastEl = this.host.querySelectorAll('.s-breadcrumb-item')[this.breadcrumbs.length - 1]?.querySelector('a');\n lastEl && lastEl.replaceWith(lastEl.firstChild);\n }\n}\n"],"version":3}
|