@salla.sa/twilight-theme-engine 1.0.87 → 1.0.89
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/{AddToCartForm-P644O2QL.js → AddToCartForm-DQO6VT4B.js} +3 -3
- package/dist/{AddToCartForm-P644O2QL.js.map → AddToCartForm-DQO6VT4B.js.map} +1 -1
- package/dist/{BlogAuthorPage-VWSO6MPY.js → BlogAuthorPage-V37VUW6D.js} +9 -9
- package/dist/{BlogAuthorPage-VWSO6MPY.js.map → BlogAuthorPage-V37VUW6D.js.map} +1 -1
- package/dist/{BlogCategoryPage-K2KSQ6T6.js → BlogCategoryPage-JNUNJSJZ.js} +9 -9
- package/dist/{BlogCategoryPage-K2KSQ6T6.js.map → BlogCategoryPage-JNUNJSJZ.js.map} +1 -1
- package/dist/{BlogPage-XRM7VWOZ.js → BlogPage-ZUQJEI4Y.js} +8 -8
- package/dist/{BlogPage-XRM7VWOZ.js.map → BlogPage-ZUQJEI4Y.js.map} +1 -1
- package/dist/{BlogSinglePage-XIAXT54H.js → BlogSinglePage-C4DZ77ZZ.js} +8 -8
- package/dist/{BlogSinglePage-XIAXT54H.js.map → BlogSinglePage-C4DZ77ZZ.js.map} +1 -1
- package/dist/{BlogTagPage-IHOA267V.js → BlogTagPage-IOC5THS6.js} +9 -9
- package/dist/{BlogTagPage-IHOA267V.js.map → BlogTagPage-IOC5THS6.js.map} +1 -1
- package/dist/{BrandsPage-ZFEILRT3.js → BrandsPage-FYSSGMW7.js} +8 -8
- package/dist/{BrandsPage-ZFEILRT3.js.map → BrandsPage-FYSSGMW7.js.map} +1 -1
- package/dist/{Breadcrumb-CVSISL2K.js → Breadcrumb-UZKM6E5D.js} +8 -8
- package/dist/{Breadcrumb-CVSISL2K.js.map → Breadcrumb-UZKM6E5D.js.map} +1 -1
- package/dist/{CartItem-EOI7P3JA.js → CartItem-RZHFJNYP.js} +8 -8
- package/dist/{CartItem-EOI7P3JA.js.map → CartItem-RZHFJNYP.js.map} +1 -1
- package/dist/{CartSummary-RZGUBDKJ.js → CartSummary-BTIONT3W.js} +8 -8
- package/dist/{CartSummary-RZGUBDKJ.js.map → CartSummary-BTIONT3W.js.map} +1 -1
- package/dist/{Copyright-5BLYSP24.js → Copyright-ABMWKKLY.js} +3 -3
- package/dist/{Copyright-5BLYSP24.js.map → Copyright-ABMWKKLY.js.map} +1 -1
- package/dist/{CustomerLayout-6F4BJAMU.js → CustomerLayout-SR7WXPZC.js} +8 -8
- package/dist/{CustomerLayout-6F4BJAMU.js.map → CustomerLayout-SR7WXPZC.js.map} +1 -1
- package/dist/{Footer-NF2NLDLR.js → Footer-Y56SQHHG.js} +4 -4
- package/dist/{Footer-NF2NLDLR.js.map → Footer-Y56SQHHG.js.map} +1 -1
- package/dist/{Header-6DQJ5X7J.js → Header-S36FMWQ5.js} +4 -4
- package/dist/{Header-6DQJ5X7J.js.map → Header-S36FMWQ5.js.map} +1 -1
- package/dist/{LoyaltyPage-YHWHIWCS.js → LoyaltyPage-IWCKSJTJ.js} +8 -8
- package/dist/{LoyaltyPage-YHWHIWCS.js.map → LoyaltyPage-IWCKSJTJ.js.map} +1 -1
- package/dist/{LoyaltyPointsPage-T6K3H5A5.js → LoyaltyPointsPage-7DWWY4LM.js} +3 -3
- package/dist/{LoyaltyPointsPage-T6K3H5A5.js.map → LoyaltyPointsPage-7DWWY4LM.js.map} +1 -1
- package/dist/{MainMenu-Y2TAM7DK.js → MainMenu-DBTYYNNI.js} +3 -3
- package/dist/{MainMenu-Y2TAM7DK.js.map → MainMenu-DBTYYNNI.js.map} +1 -1
- package/dist/{MasterLayout-GBEEFFPG.js → MasterLayout-ZXZMATPB.js} +8 -8
- package/dist/{MasterLayout-GBEEFFPG.js.map → MasterLayout-ZXZMATPB.js.map} +1 -1
- package/dist/{MobileMenu-RE5XVGZL.js → MobileMenu-HDGZFWZR.js} +8 -8
- package/dist/{MobileMenu-RE5XVGZL.js.map → MobileMenu-HDGZFWZR.js.map} +1 -1
- package/dist/{NotificationsPage-QAFWZAS3.js → NotificationsPage-7DF3AJLC.js} +8 -8
- package/dist/{NotificationsPage-QAFWZAS3.js.map → NotificationsPage-7DF3AJLC.js.map} +1 -1
- package/dist/{OrderSinglePage-T4PRXTKG.js → OrderSinglePage-FLHEF4AK.js} +8 -8
- package/dist/{OrderSinglePage-T4PRXTKG.js.map → OrderSinglePage-FLHEF4AK.js.map} +1 -1
- package/dist/{OrdersPage-3S6ZS56E.js → OrdersPage-6BVIHODF.js} +8 -8
- package/dist/{OrdersPage-3S6ZS56E.js.map → OrdersPage-6BVIHODF.js.map} +1 -1
- package/dist/{PageSingle-W3UTXDOW.js → PageSingle-DJNL362R.js} +3 -3
- package/dist/{PageSingle-W3UTXDOW.js.map → PageSingle-DJNL362R.js.map} +1 -1
- package/dist/{ProductDetails-X5A7TG3F.js → ProductDetails-PYPZUTCN.js} +3 -3
- package/dist/{ProductDetails-X5A7TG3F.js.map → ProductDetails-PYPZUTCN.js.map} +1 -1
- package/dist/{ProfilePage-DUH3AILJ.js → ProfilePage-6W7C7FXQ.js} +8 -8
- package/dist/{ProfilePage-DUH3AILJ.js.map → ProfilePage-6W7C7FXQ.js.map} +1 -1
- package/dist/{ReviewsPage-2C2P7VS3.js → ReviewsPage-HGXGW7WU.js} +3 -3
- package/dist/{ReviewsPage-2C2P7VS3.js.map → ReviewsPage-HGXGW7WU.js.map} +1 -1
- package/dist/{SeoCartWidget-VYLGEW2I.js → SeoCartWidget-ZB6GY65W.js} +8 -8
- package/dist/{SeoCartWidget-VYLGEW2I.js.map → SeoCartWidget-ZB6GY65W.js.map} +1 -1
- package/dist/{SettingsPage-OZJEW6CW.js → SettingsPage-ZSTD6TOR.js} +8 -8
- package/dist/{SettingsPage-OZJEW6CW.js.map → SettingsPage-ZSTD6TOR.js.map} +1 -1
- package/dist/{StoreClosedNotification-QHIZBNXO.js → StoreClosedNotification-NNCBUMMX.js} +9 -9
- package/dist/{StoreClosedNotification-QHIZBNXO.js.map → StoreClosedNotification-NNCBUMMX.js.map} +1 -1
- package/dist/{TestimonialsPage-K6WJKKME.js → TestimonialsPage-36QYN7RD.js} +3 -3
- package/dist/{TestimonialsPage-K6WJKKME.js.map → TestimonialsPage-36QYN7RD.js.map} +1 -1
- package/dist/{ThankYouPage-H6QQEI5R.js → ThankYouPage-BD42QNKE.js} +8 -8
- package/dist/{ThankYouPage-H6QQEI5R.js.map → ThankYouPage-BD42QNKE.js.map} +1 -1
- package/dist/{WalletPage-G5IBGN6B.js → WalletPage-5LHVR2EA.js} +8 -8
- package/dist/{WalletPage-G5IBGN6B.js.map → WalletPage-5LHVR2EA.js.map} +1 -1
- package/dist/{WishlistPage-AIOTAB6L.js → WishlistPage-2NYODMHF.js} +8 -8
- package/dist/{WishlistPage-AIOTAB6L.js.map → WishlistPage-2NYODMHF.js.map} +1 -1
- package/dist/{chunk-GJ5IMPNY.js → chunk-2NBURJFN.js} +7 -7
- package/dist/{chunk-GJ5IMPNY.js.map → chunk-2NBURJFN.js.map} +1 -1
- package/dist/{chunk-E7WWO3V3.js → chunk-4446UB3M.js} +3 -3
- package/dist/{chunk-E7WWO3V3.js.map → chunk-4446UB3M.js.map} +1 -1
- package/dist/{chunk-N3BCZIGS.js → chunk-4UMNQ4EQ.js} +4 -4
- package/dist/{chunk-N3BCZIGS.js.map → chunk-4UMNQ4EQ.js.map} +1 -1
- package/dist/{chunk-TZ3E5BN4.js → chunk-65KBXGDT.js} +24 -10
- package/dist/chunk-65KBXGDT.js.map +1 -0
- package/dist/{chunk-FYHF62KI.js → chunk-7U5HUPY3.js} +5 -5
- package/dist/{chunk-FYHF62KI.js.map → chunk-7U5HUPY3.js.map} +1 -1
- package/dist/{chunk-NXQZ4RLM.js → chunk-7XM2TC27.js} +5 -5
- package/dist/{chunk-NXQZ4RLM.js.map → chunk-7XM2TC27.js.map} +1 -1
- package/dist/{chunk-3LXB4VFK.js → chunk-DXBYD75N.js} +15 -3
- package/dist/chunk-DXBYD75N.js.map +1 -0
- package/dist/{chunk-UQIVX4YA.js → chunk-JRFGBIX2.js} +3 -3
- package/dist/{chunk-UQIVX4YA.js.map → chunk-JRFGBIX2.js.map} +1 -1
- package/dist/{chunk-EZHXVHXY.js → chunk-JVHC4U2E.js} +4 -4
- package/dist/{chunk-EZHXVHXY.js.map → chunk-JVHC4U2E.js.map} +1 -1
- package/dist/{chunk-XKNXYQ2K.js → chunk-L3U7C2DP.js} +6 -6
- package/dist/{chunk-XKNXYQ2K.js.map → chunk-L3U7C2DP.js.map} +1 -1
- package/dist/{chunk-BCJTF3V7.js → chunk-PNNBK26L.js} +5 -5
- package/dist/{chunk-BCJTF3V7.js.map → chunk-PNNBK26L.js.map} +1 -1
- package/dist/{chunk-PU2LHFDQ.js → chunk-TJGHOSES.js} +16 -14
- package/dist/chunk-TJGHOSES.js.map +1 -0
- package/dist/{chunk-FWYKOQV5.js → chunk-VQNLXDPQ.js} +17 -20
- package/dist/chunk-VQNLXDPQ.js.map +1 -0
- package/dist/chunk-WKSTFIQX.js +14 -0
- package/dist/{chunk-LWPKBVIE.js.map → chunk-WKSTFIQX.js.map} +1 -1
- package/dist/{chunk-PCURRKIH.js → chunk-XKIVS72A.js} +7 -6
- package/dist/chunk-XKIVS72A.js.map +1 -0
- package/dist/{chunk-XO7B3VWS.js → chunk-Z3SSHDVW.js} +3 -3
- package/dist/{chunk-XO7B3VWS.js.map → chunk-Z3SSHDVW.js.map} +1 -1
- package/dist/components/cart/index.js +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/components/drawer/index.js +6 -6
- package/dist/components/home/index.js +8 -8
- package/dist/components/layout/Footer.d.ts.map +1 -1
- package/dist/components/layout/index.js +1 -1
- package/dist/components/product/index.js +7 -7
- package/dist/components/store/index.js +8 -8
- package/dist/{document-class-FRL7JHWD.js → document-class-T4LRZRRH.js} +6 -6
- package/dist/{document-class-FRL7JHWD.js.map → document-class-T4LRZRRH.js.map} +1 -1
- package/dist/hooks/index.js +6 -6
- package/dist/hooks/useGtm.js +6 -6
- package/dist/hooks/useMoney.js +6 -6
- package/dist/hooks/useStore.js +6 -6
- package/dist/index.js +6 -6
- package/dist/{not-found-E6AR4CZ4.js → not-found-3QOH2I4S.js} +8 -8
- package/dist/{not-found-E6AR4CZ4.js.map → not-found-3QOH2I4S.js.map} +1 -1
- package/dist/providers/index.js +6 -6
- package/dist/routes/account/orders.js +2 -2
- package/dist/routes/account.js +7 -7
- package/dist/routes/blog.js +6 -6
- package/dist/routes/brands.js +2 -2
- package/dist/routes/cart.js +10 -10
- package/dist/routes/home/index.d.ts.map +1 -1
- package/dist/routes/home.js +9 -9
- package/dist/routes/loyalty.js +3 -3
- package/dist/routes/page.js +2 -2
- package/dist/routes/product-listing/index.d.ts.map +1 -1
- package/dist/routes/product-listing.js +9 -9
- package/dist/routes/product-listing.js.map +1 -1
- package/dist/routes/product.js +8 -8
- package/dist/routes/testimonials.js +3 -3
- package/dist/routes/thank-you.js +2 -2
- package/dist/skeleton.js +9 -9
- package/dist/tanstack/head.d.ts.map +1 -1
- package/dist/tanstack.js +4 -4
- package/dist/utils/apply-theme.d.ts.map +1 -1
- package/dist/utils/baseHead.d.ts +4 -2
- package/dist/utils/baseHead.d.ts.map +1 -1
- package/dist/utils/baseHead.js +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/vite/index.js +2 -1
- package/dist/vite/index.js.map +1 -1
- package/package.json +1 -1
- package/tailwind/components/layout/Footer.tsx.txt +19 -16
- package/tailwind/routes/home/index.tsx.txt +5 -3
- package/tailwind/routes/product-listing/index.tsx.txt +8 -2
- package/dist/chunk-3LXB4VFK.js.map +0 -1
- package/dist/chunk-FWYKOQV5.js.map +0 -1
- package/dist/chunk-LWPKBVIE.js +0 -14
- package/dist/chunk-PCURRKIH.js.map +0 -1
- package/dist/chunk-PU2LHFDQ.js.map +0 -1
- package/dist/chunk-TZ3E5BN4.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/baseHead.ts"],"names":[],"mappings":"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","file":"chunk-TZ3E5BN4.js","sourcesContent":["import type { HeadDescriptor } from './head';\nimport type { StoreContext } from '../api/store';\nimport { FALLBACK_LOCALE } from '../providers/locale-constants';\n\n// ============================================================================\n// Locale helpers\n// ============================================================================\n\n/** Maps ISO-639-1 locale codes to the og:locale format (language_TERRITORY). */\nconst LOCALE_OG_MAP: Record<string, string> = {\n ar: 'ar_AR',\n en: 'en_US',\n};\n\n/**\n * Converts an ISO-639-1 locale string to the og:locale format (e.g. `ar` → `ar_AR`).\n */\nexport function localeToOgLocale(locale: string): string {\n if (!locale) return LOCALE_OG_MAP[FALLBACK_LOCALE] ?? 'ar_AR';\n const base = locale.split(/[-_]/)[0].toLowerCase();\n return LOCALE_OG_MAP[base] ?? `${base}_${base.toUpperCase()}`;\n}\n\n/**\n * Extracts the path portion from a URL or path string, removing any locale prefix.\n */\nfunction extractPath(urlOrPath: string | undefined): string {\n if (!urlOrPath) return '/';\n\n try {\n const parsed = new URL(urlOrPath);\n const pathParts = parsed.pathname.split('/').filter(Boolean);\n if (pathParts.length > 0 && pathParts[0].length === 2) {\n pathParts.shift();\n }\n return '/' + pathParts.join('/');\n } catch {\n const pathParts = urlOrPath.split('/').filter(Boolean);\n if (pathParts.length > 0 && pathParts[0].length === 2) {\n pathParts.shift();\n }\n return '/' + pathParts.join('/');\n }\n}\n\n/**\n * Extracts the base domain from a store URL, removing any locale path.\n * \"https://saudiseamless.com/ar/\" → \"https://saudiseamless.com\"\n */\nfunction extractBaseUrl(storeUrl: string): string {\n try {\n const parsed = new URL(storeUrl);\n return parsed.origin;\n } catch {\n return storeUrl.replace(/\\/[a-z]{2}\\/?$/i, '').replace(/\\/$/, '');\n }\n}\n\n// ============================================================================\n// Hreflang alternates builder\n// ============================================================================\n\n/**\n * Builds hreflang alternate links for multilingual SEO.\n *\n * @param settings - StoreContext containing store and languages\n * @param path - Current route path from router (e.g., '/ar/products/123')\n */\nexport function buildHreflangAlternates(\n settings: StoreContext | null | undefined,\n path?: string\n): HeadDescriptor['alternateLanguages'] {\n const languages = settings?.languages;\n if (!languages?.length) {\n return undefined;\n }\n\n const baseUrl = settings?.store?.url ? extractBaseUrl(settings.store.url) : '';\n const extractedPath = extractPath(path);\n const defaultLang = languages.find((l) => l.code === FALLBACK_LOCALE) ?? languages[0];\n\n const buildUrl = (langCode: string) => {\n return `${baseUrl}/${langCode}${extractedPath === '/' ? '' : extractedPath}`;\n };\n\n return [\n { hreflang: 'x-default', href: buildUrl(defaultLang.code) },\n ...languages.map((lang) => ({ hreflang: lang.code, href: buildUrl(lang.code) })),\n ];\n}\n\n// ============================================================================\n// Base head builder (for __root.tsx)\n// ============================================================================\n\n/**\n * Builds a base {@link HeadDescriptor} with store-wide OG and Twitter defaults.\n * Used in __root.tsx to set base metadata that can be overridden by child routes.\n *\n * Note: hreflang alternates are only generated when path is provided,\n * since we need the current route path. Child routes call\n * buildHreflangAlternates directly with ctx.path.\n */\nexport function buildBaseHead(\n settings: StoreContext | null | undefined,\n locale: string = FALLBACK_LOCALE,\n path?: string\n): HeadDescriptor {\n const store = settings?.store;\n if (!store) return {};\n\n const title = store.meta?.title || store.name;\n const description = store.meta?.description || store.description || undefined;\n const keywords = store.meta?.keywords || undefined;\n const baseUrl = store.url ? extractBaseUrl(store.url) : undefined;\n const canonicalUrl = path && baseUrl ? `${baseUrl}${path}` : baseUrl;\n const ogUrl = path && baseUrl ? `${baseUrl}/${locale}${path === '/' ? '' : path}` : baseUrl;\n\n const twitterSite = store.social?.twitter\n ? store.social.twitter.startsWith('@')\n ? store.social.twitter\n : `@${store.social.twitter}`\n : undefined;\n\n return {\n title,\n ...(description ? { description } : {}),\n ...(keywords ? { keywords } : {}),\n ...(canonicalUrl ? { canonical: canonicalUrl } : {}),\n openGraph: {\n type: 'website',\n siteName: store.name,\n title,\n ...(description ? { description } : {}),\n ...(ogUrl ? { url: ogUrl } : {}),\n locale: localeToOgLocale(locale),\n ...(store.logo ? { images: store.logo } : {}),\n },\n twitter: {\n card: 'summary_large_image',\n title,\n ...(description ? { description } : {}),\n ...(twitterSite ? { site: twitterSite } : {}),\n ...(store.logo ? { images: store.logo } : {}),\n },\n ...(path ? { alternateLanguages: buildHreflangAlternates(settings, path) } : {}),\n };\n}\n"]}
|