Add Saleh Kargar factory website with FA/AR i18n.
Clone of salehkargar.ir as a Next.js site with localized pages, SEO, and product gallery. Co-authored-by: Cursor <cursoragent@cursor.com>
@@ -0,0 +1,241 @@
|
||||
{
|
||||
"Meta": {
|
||||
"homeTitle": "الرئيسية",
|
||||
"homeDescription": "مجمّع مصانع صالح كاركر وأبنائه لسحق الأحجار وإنتاج الجير — إنتاج مسحوق الحجر والجير وجص سوبر صالح ومواد معدنية بجودة عالية وتحميل سريع ورضا العملاء",
|
||||
"siteName": "مصنع صالح كاركر وأبنائه",
|
||||
"productsTitle": "المنتجات",
|
||||
"productsDescription": "اطّلع على منتجات مصنع صالح كاركر وأبنائه بما في ذلك جص سوبر صالح ومسحوق الحجر المعدني والجير الإنشائي والصناعي وغيرها من المواد المعدنية.",
|
||||
"productDetails": "تفاصيل المنتج",
|
||||
"aboutChalkTitle": "حول جص سوبر صالح",
|
||||
"aboutChalkDescription": "تعرّف على تاريخ إنتاج الجص وطريقة تصنيعه ومزاياه وخصائص جص سوبر صالح؛ جص ميكروني قابل للغسل بصلابة تفوق الجص العادي بثلاثة أضعاف.",
|
||||
"aboutLimeTitle": "حول الجير",
|
||||
"aboutLimeDescription": "تعرّف على تاريخ إنتاج الجير والطرق التقليدية والصناعية في مجمّع صالح كاركر وأبنائه واستخدامات الجير الإنشائي والصناعي.",
|
||||
"galleryTitle": "معرض الصور",
|
||||
"galleryDescription": "معرض صور مصنع ومنجم صالح كاركر وأبنائه؛ مشاهدة بيئة الإنتاج والمنتجات وأنشطة المجمع.",
|
||||
"aboutUsTitle": "من نحن",
|
||||
"aboutUsDescription": "حول مجمّع إنتاج صالح كاركر وأبنائه؛ منتج الأحجار المعدنية ومسحوق الجير وجص سوبر صالح بشعار الجودة الأعلى والتحميل السريع."
|
||||
},
|
||||
"Nav": {
|
||||
"home": "الصفحة الرئيسية",
|
||||
"products": "المنتجات",
|
||||
"aboutChalk": "حول جص سوبر صالح",
|
||||
"aboutLime": "حول الجير",
|
||||
"gallery": "المعرض",
|
||||
"aboutUs": "من نحن",
|
||||
"mainMenu": "القائمة الرئيسية",
|
||||
"openMenu": "فتح القائمة",
|
||||
"closeMenu": "إغلاق القائمة",
|
||||
"login": "تسجيل الدخول",
|
||||
"logoAlt": "صالح كاركر وأبنائه"
|
||||
},
|
||||
"Language": {
|
||||
"label": "اللغة",
|
||||
"fa": "فارسی",
|
||||
"ar": "العربية"
|
||||
},
|
||||
"Hero": {
|
||||
"title": "مصنع صالح كاركر وأبنائه",
|
||||
"subtitleEn": "Saleh Kargar Factory",
|
||||
"imageAlt": "مصنع صالح كاركر",
|
||||
"transport": "النقل",
|
||||
"demolition": "الهدم",
|
||||
"limeProduction": "إنتاج الجير"
|
||||
},
|
||||
"Productions": {
|
||||
"title": "إنتــاجــات المــصــنــع",
|
||||
"imageAlt": "منتجات المصنع",
|
||||
"items": {
|
||||
"clay": {
|
||||
"title": "طين مطحون (طين البلاط)",
|
||||
"description": "يُستخدم هذا الطين عادة في الجص والطين، وطين صناعة البلاط وأعمال التبليط."
|
||||
},
|
||||
"mineralPowder": {
|
||||
"title": "مسحوق الحجر المعدني",
|
||||
"description": "يُحضَّر هذا المسحوق من أفضل أنواع حجر كربونات الكالسيوم بنقاء عالٍ جدًا وبياض ونعومة تقلل استهلاك الإسمنت، وهو ما يلاحظه مستخدمو هذا النوع من المسحوق."
|
||||
},
|
||||
"joshaghan": {
|
||||
"title": "مسحوق حجر جوشقان",
|
||||
"description": "يُستخدم هذا المسحوق في الأغراض الصناعية والتبييض والإنشاء وأعمال الكنتيكس ومصانع اللواصق وغيرها."
|
||||
},
|
||||
"superChalk": {
|
||||
"title": "جص سوبر صالح",
|
||||
"description": "جص سوبر كاركر أقوى بثلاثة أضعاف من أنواع الجص الأخرى، ويمنح الواجهة الداخلية للمبنى بياضًا ولمعانًا وبريقًا استثنائيًا. ومن حيث البياض يمكن أن يحل محل الدهان، فيقلل التكلفة ويزيد سرعة وسهولة التنفيذ."
|
||||
},
|
||||
"buildingLime": {
|
||||
"title": "جير إنشائي وصناعي",
|
||||
"description": "يُقدَّم هذا الجير بنوعين سائب ومعبّأ؛ فالمعبّأ (جير مطفأ) في عبوات، والسائب للاستخدامات الإنشائية. أما النوع الصناعي فبنقاء عالٍ جدًا لمصانع الجلود والخرسانة الخفيفة والهيدرات وغيرها."
|
||||
},
|
||||
"limestone": {
|
||||
"title": "حجر جيري بكربونات البوتاسيوم",
|
||||
"description": "يُستخدم الحجر الجيري في الأغراض الإنشائية مثل شيّ الجير الصناعي والتقليدي والجير ومسحوق الحجر وحجر الواجهة، وبسبب وفرة كربونات الكالسيوم فيه يُستخدم أيضًا في علف الدواجن. يُستخرج من المنجم على شكل كتل أو بالتفجير من الجبل."
|
||||
},
|
||||
"superPowder": {
|
||||
"title": "سوبر مسحوق معدني",
|
||||
"description": "بفضل بياضه العالي وعدم الحاجة إلى الغربلة وقابليته الممتازة للتشطيب وسهولة العمل وعدم التشقق في الواجهات الداخلية والخارجية وفي لحام البلاط، يمكن أن يكون بديلًا عن مسحوق جوشقان."
|
||||
},
|
||||
"sand": {
|
||||
"title": "رمل ناعم",
|
||||
"description": "يُستخدم هذا الرمل الناعم في أعمال البستنة والحدائق."
|
||||
}
|
||||
}
|
||||
},
|
||||
"Powder": {
|
||||
"title": "خصائص مسحوق الحجر المعدني",
|
||||
"benefitsTitle": "مزايا العمل بمسحوق الحجر المعدني:",
|
||||
"usesTitle": "مجالات استخدام مسحوق الحجر المعدني",
|
||||
"benefitsImageAlt": "مزايا مسحوق الحجر المعدني",
|
||||
"usesImageAlt": "مجالات استخدام مسحوق الحجر المعدني",
|
||||
"benefits": {
|
||||
"quality": "جودة ممتازة",
|
||||
"lessCement": "تقليل استهلاك الإسمنت",
|
||||
"whiteness": "البياض",
|
||||
"easyWork": "سهولة العمل على يد الحرفي",
|
||||
"finish": "قابلية تشطيب ممتازة وقابل للغسل"
|
||||
},
|
||||
"uses": {
|
||||
"whitework": "1- التبييض بالإسمنت",
|
||||
"grout": "2- لحام البلاط والسيراميك والموزاييك",
|
||||
"mosaic": "3- صناعة الموزاييك",
|
||||
"slurry": "4- عمل الملاط خلف أحجار الصين والرخام"
|
||||
}
|
||||
},
|
||||
"AboutTabs": {
|
||||
"sampleWork": "نموذج عمل",
|
||||
"factoryView": "منظر المصنع",
|
||||
"tabs": {
|
||||
"work": {
|
||||
"label": "عملنا",
|
||||
"title": "نتائج تحليل عينات الأحجار",
|
||||
"subtitle": "شعارنا :\nجودة أعلى - تحميل سريع - رضا العملاء",
|
||||
"body": "يمتلك هذا المجمع وكالات لعدة أنواع من جص سمنان وقم وأنواع جص سوبر قم.",
|
||||
"cta": "اعرف المزيد عنا ..."
|
||||
},
|
||||
"goal": {
|
||||
"label": "هدفنا",
|
||||
"title": "اطلب منا أفضل جودة للجير...",
|
||||
"subtitle": "يفتخر هذا المجمع الإنتاجي بتقديم جميع منتجاته معبّأة وسائبة بجودة عالية مباشرة لعملائه الكرام، ويمتلك وكالات لعدة أنواع من جص سمنان وقم وأنواع جص سوبر قم.",
|
||||
"body": "هدفنا رضا العميل وإنتاج سلعة عالية الجودة",
|
||||
"cta": "حول الجير ..."
|
||||
},
|
||||
"services": {
|
||||
"label": "خدماتنا",
|
||||
"title": "منتجات ممتازة وعالية الجودة ...",
|
||||
"subtitle": "يفتخر إنتاج صالح كاركر وأبنائه بتقديم جميع منتجاته من أفضل الأحجار المعدنية المتوفرة في البلاد وبجودة عالية لعملائه الكرام.",
|
||||
"body": "شعارنا:\nجودة أعلى\nتحميل سريع\nرضا العملاء",
|
||||
"cta": "اعرف المزيد ..."
|
||||
}
|
||||
}
|
||||
},
|
||||
"Carousel": {
|
||||
"title": "منتجات المصنع",
|
||||
"prev": "السابق",
|
||||
"next": "التالي",
|
||||
"items": {
|
||||
"aryanClay": "طين آريائي",
|
||||
"ore": "حجر المنجم",
|
||||
"superPowder": "سوبر مسحوق معدني",
|
||||
"mineralPowder": "مسحوق الحجر المعدني",
|
||||
"joshaghan": "مسحوق حجر جوشقان",
|
||||
"superChalk": "جص سوبر صالح"
|
||||
}
|
||||
},
|
||||
"Location": {
|
||||
"title": "مــوقــعــنــا",
|
||||
"heading": "مجمّع مصانع سحق الأحجار وإنتاج الجير صالح",
|
||||
"subtitle": "( صالح كاركر وأبنائه )",
|
||||
"coverage": "التوزيع في جميع أنحاء إيران",
|
||||
"mapAlt": "موقع المجمع"
|
||||
},
|
||||
"Footer": {
|
||||
"brand": "مـــوقـــع الـــمـــعـــدن",
|
||||
"aboutTitle": "من نحن",
|
||||
"aboutText": "إنتاج أنواع الأحجار المعدنية ومسحوق الجير",
|
||||
"addressTitle": "عنواننا",
|
||||
"address": "قم - طريق أراك - الكيلومتر 8 - دوران مارال - بعد مستشفى الإمام رضا - الزقاق الثاني - داخل الزقاق (المسابك)",
|
||||
"noteFactory": "مجمّع مصانع سحق الأحجار وإنتاج الجير صالح",
|
||||
"noteSlogan": "شعارنا: جودة أعلى - تحميل سريع - رضا العملاء",
|
||||
"contactTitle": "اتصل بنا",
|
||||
"accounting": "المحاسبة",
|
||||
"sales": "المبيعات",
|
||||
"loading": "التحميل",
|
||||
"copyright": "مصنع صالح كاركر وأبنائه"
|
||||
},
|
||||
"Products": {
|
||||
"pageTitle": "المنتجات",
|
||||
"detailsTitle": "تفاصيل المنتج",
|
||||
"backToProducts": "العودة إلى المنتجات",
|
||||
"currency": "تومان",
|
||||
"notFound": "المنتج غير موجود",
|
||||
"items": {
|
||||
"super-chalk": {
|
||||
"title": "جص سوبر صالح",
|
||||
"description": "هذا الجص أقوى بثلاثة أضعاف من أنواع الجص الأخرى. يُنفَّذ جص سوبر صالح كطبقة رقيقة بسمك 3-4 مم على طبقة الجص السفلية (جص التبييض والإنشاء)، فيمنح الواجهة الداخلية للمبنى بياضًا ولمعانًا وبريقًا استثنائيًا. ومن حيث البياض يمكن أن يحل محل الدهان، فيقلل التكلفة ويزيد سرعة وسهولة التنفيذ."
|
||||
}
|
||||
}
|
||||
},
|
||||
"AboutChalkPage": {
|
||||
"title": "حول جص سوبر صالح",
|
||||
"sections": {
|
||||
"history": {
|
||||
"title": "تاريــخ إنتــاج الجــص",
|
||||
"body": "الجص هو كبريتات الكالسيوم المائية الطبيعية ويوجد بأشكال بلورية متعددة ضمن قشور سميكة نسبيًا في القشرة الصلبة للأرض، حيث يُستخرج ويُستخدم. ويُعد الجص من أقدم مواد البناء المستخدمة في العالم، وقد أُنتج واستُخدم بطرق مختلفة عبر القرون. بعد استخراجه من المنجم يُنقل إلى الفرن مثل الجير ويُسخَّن إلى نحو 180 درجة مئوية حتى يفقد جزءًا من جزيئات ماء التبلور ويصبح صالحًا كمواد بناء وللقوالب. عادةً ما يُطحن الجص بمطاحن خاصة ويُباع في أكياس أو سائبًا. ويجب أن تكون مساحيق الجص الجيدة أصغر من 0.15 مم."
|
||||
},
|
||||
"method": {
|
||||
"title": "طريقة إنتــاج الجــص",
|
||||
"body": "تُعرَّف نقاوة حجر الجص بنسبة معدن الجبس فيه. ووفق جمعية معايير المواد الأمريكية (ASTM) فإن الحد الأدنى المطلوب لنقاوة حجر الجص في المواد الصناعية هو 70٪ جبس، بينما تتراوح نقاوة معظم أحجار الجص التجارية بين 75 و90٪. وتشمل الشوائب عادةً الطفل والطين وكربونات الكالسيوم، وقد تظهر بقايا أنشطة حيوية.\n\nلون الجص طبيعيًا أبيض، وقد يظهر رماديًا أو رماديًا مائلًا إلى الأزرق أو ورديًا أو أصفر بسبب شوائب عضوية أو طين أو أكسيد الحديد. ونظام تبلور حجر الجص أحادي الميل، وكثافته النوعية 2.2 وصلابته 2. والجبس المستخدم يكون على شكل كتلة بلورية ناعمة أو خشنة، ويذوب في حمض الهيدروكلوريك والماء الساخن. ويتكون حجر الجص النقي من نحو 20.9٪ ماء مركب و64.6٪ SO3 و32.5٪ CaO.\n\nمعادلة تحضير الجص: 2CaSO4.4H2O → 2CaSO4 + H2O 3H2O (يتبخر بالحرارة)"
|
||||
},
|
||||
"strength": {
|
||||
"title": "مقاومة الجص",
|
||||
"body": "يتمتع الجص بمقاومة جيدة نسبيًا، ويتحمل ضغطًا أقصاه نحو 30 كغ/سم²، أما في الشد فمقاومته أضعف وتصل إلى نحو 5 كغ/سم²؛ وهذه القيم للجص النقي، وإذا استُخدم مخلوطًا (جص وطين) تنخفض المقاومة بشكل ملحوظ. ونسبة الماء المستخدمة تؤثر بقوة على المقاومة. مقاومة الجص للحريق: يقاوم الجص الحرائق ويمكن أن يعمل كطبقة عازلة للفولاذ، لأن بنيته الكيميائية تحتوي جزيئي ماء ينفصلان عند الحريق ويكوّنان طبقة رقيقة واقية."
|
||||
},
|
||||
"pros": {
|
||||
"title": "مــزايا الجــص",
|
||||
"body": "رخص الجص: لرخصه ووفوره يعمل به الجميع حتى غير المختصين لإصلاحات بسيطة. قابلية التشكيل: للجص قابلية تشكيل عالية تُستخدم في صناعات مثل الخزف كقوالب، ولذلك يلعب النحت الجصي دورًا مهمًا في تجميل الداخل. الامتصاص الصوتي: يمتص الجص نحو 70٪ من الموجات الصوتية تقريبًا. البياض: يمنح اللون الأبيض جمالية مميزة للفضاء الداخلي. التمدد الحجمي: يزداد حجمه عند التصلب فيملأ المسام ويصبح سطحًا متجانسًا صحيًا."
|
||||
},
|
||||
"cons": {
|
||||
"title": "عيــوب الجــص",
|
||||
"body": "يمتص الجص الأوساخ بسرعة، وأداؤه ضعيف جدًا أمام الرطوبة؛ فإذا تعرض للماء باستمرار تظهر ظاهرة الانتفاخ. لذلك يقل استخدامه في المناطق الرطبة مثل شمال إيران، ويُستبدل بالجير والإسمنت الأبيض في التبييض. كما قد تتشقق الطبقات الجصية قرب أنابيب التدفئة بسبب التمدد والانكماش المتكرر وفقدان الماء."
|
||||
},
|
||||
"super": {
|
||||
"title": "جــص ســوبر كــاركر",
|
||||
"body": "جص سوبر كاركر أقوى بثلاثة أضعاف من أنواع الجص الأخرى. يُنفَّذ كطبقة رقيقة بسمك 3-4 مم على طبقة الجص السفلية (جص التبييض والإنشاء) فيمنح الواجهة الداخلية بياضًا ولمعانًا وبريقًا استثنائيًا، ويمكن أن يحل محل الدهان فيقلل التكلفة ويزيد سرعة وسهولة التنفيذ. قابل للغسل: جص سوبر كاركر ميكروني وقابل للغسل فيدوم أكثر. قابلية تشطيب ممتازة تمنح سطحًا أملسًا خاليًا من التعرجات، إضافة إلى صلابة أعلى بثلاثة أضعاف من الجص العادي."
|
||||
}
|
||||
}
|
||||
},
|
||||
"AboutLimePage": {
|
||||
"title": "حول الجير",
|
||||
"sections": {
|
||||
"history": {
|
||||
"title": "تاريــخ إنتــاج الجيــر",
|
||||
"body": "لا يعرف عامة الناس كثيرًا عن الجير وأنواعه وطرق إنتاجه. يُنتج الجير بطريقتين تقليدية وصناعية. والطريقة التقليدية موجودة منذ آلاف السنين، وما زالت مستخدمة رغم الطرق الصناعية لأنها ذات جودة مناسبة وملائمة للورش الصغيرة. وترافق معالجة الجير دائمًا عملية الشيّ، ولذلك يلزم فرن لشيّ الجير."
|
||||
},
|
||||
"traditional": {
|
||||
"title": "طريقة الإنتــاج التقليــدي للجير",
|
||||
"body": "في الطريقة التقليدية يُختار موقع الورشة عادة عند منجم الجير، فيُحفر تجويف في الأرض وتُرصّ فيه أحجار الجير طبقات. وهكذا تؤدي الأرض دور الفرن، وتُعرف هذه الأفران بأفران الجير البئرية أو التنورية. ثم تُشعل من الأسفل وتُغلق بطبقة من طين الجير. هذه طريقة إنتاج الجير الحي (المشوّي) التقليدي. وإذا أُريد جير مطفأ يُرطَّب أثناء الشيّ لتكوين جير مهدرج. وتصل نقاوة الجير في هذا النوع من الشيّ إلى أكثر من 94٪."
|
||||
},
|
||||
"difference": {
|
||||
"title": "الفرق بين الجير التقليــدي والصناعــي",
|
||||
"body": "يستغرق شيّ الجير التقليدي وقتًا أطول وحرارة أقل من الصناعي. ولا يمكن القول إن أحدهما أفضل مطلقًا لأن لكل منهما استخداماته، وتفضّل كل صناعة أحدهما. والفرق الأساسي في نوع الفرن: التقليدي داخل الأرض بشكل تنور، والصناعي دوار (روتاري) من سبيكة خاصة."
|
||||
},
|
||||
"uses": {
|
||||
"title": "استخدامــات الجير التقليــدي",
|
||||
"body": "الجير التقليدي بطيء التفاعل ونقاوته أعلى من الصناعي، لذلك يُستخدم في البناء والتعقيم في تربية المواشي والدواجن ودفن النفايات وإنتاج الجير المهدرج وإنتاج طوب الأوتوكلاف الذي يساهم في تخفيف وزن المباني."
|
||||
}
|
||||
}
|
||||
},
|
||||
"AboutUsPage": {
|
||||
"title": "من نحن",
|
||||
"imageAlt": "مجمّع إنتاج صالح كاركر وأبنائه",
|
||||
"p1": "يفتخر مجمّع إنتاج صالح كاركر وأبنائه بتقديم جميع منتجاته من أفضل الأحجار المعدنية المتوفرة في البلاد وبجودة عالية لعملائه الكرام.",
|
||||
"p2": "ويفتخر هذا المجمع بتقديم جميع منتجاته معبّأة وسائبة بجودة عالية مباشرة لعملائه، ويمتلك وكالات لعدة أنواع من جص سمنان وهو منتج جص سوبر صالح في قم.",
|
||||
"p3": "شعارنا: جودة أعلى - تحميل سريع - رضا العملاء"
|
||||
},
|
||||
"GalleryPage": {
|
||||
"title": "معرض الصور",
|
||||
"itemAlt": "معرض الصور {n}"
|
||||
},
|
||||
"Common": {
|
||||
"home": "الرئيسية",
|
||||
"products": "المنتجات"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,241 @@
|
||||
{
|
||||
"Meta": {
|
||||
"homeTitle": "خانه",
|
||||
"homeDescription": "مجتمع تولیدی کارخانجات سنگکوبی و آهکپزی صالح کارگر و پسران — تولید پودر سنگ، آهک، گچ سوپر صالح و مصالح معدنی با کیفیت برتر، بارگیری سریع و جلب رضایت مشتری",
|
||||
"siteName": "کارخانه صالح کارگر و پسران",
|
||||
"productsTitle": "محصولات",
|
||||
"productsDescription": "مشاهده محصولات کارخانه صالح کارگر و پسران شامل سوپر گچ صالح، پودر سنگ معدنی، آهک ساختمانی و صنعتی و سایر مصالح معدنی.",
|
||||
"productDetails": "جزئیات محصول",
|
||||
"aboutChalkTitle": "درباره سوپر گچ صالح",
|
||||
"aboutChalkDescription": "آشنایی با تاریخچه، روش تولید، مزایا و ویژگیهای سوپر گچ صالح؛ گچ میکرونیزه قابل شستشو با استحکام سه برابر گچ معمولی.",
|
||||
"aboutLimeTitle": "درباره آهک",
|
||||
"aboutLimeDescription": "آشنایی با تاریخچه و روش تولید سنتی و صنعتی آهک در مجتمع صالح کارگر و پسران و کاربردهای آهک ساختمانی و صنعتی.",
|
||||
"galleryTitle": "گالری تصاویر",
|
||||
"galleryDescription": "گالری تصاویر کارخانه و معدن صالح کارگر و پسران؛ مشاهده فضای تولید، محصولات و فعالیتهای مجموعه.",
|
||||
"aboutUsTitle": "درباره ما",
|
||||
"aboutUsDescription": "درباره مجتمع تولیدی صالح کارگر و پسران؛ تولیدکننده سنگهای معدنی، پودر آهک و گچ سوپر صالح با شعار کیفیت برتر و بارگیری سریع."
|
||||
},
|
||||
"Nav": {
|
||||
"home": "صفحه اصلی",
|
||||
"products": "محصولات",
|
||||
"aboutChalk": "درباره گچ سوپر صالح",
|
||||
"aboutLime": "درباره آهک",
|
||||
"gallery": "گالری",
|
||||
"aboutUs": "درباره ما",
|
||||
"mainMenu": "منوی اصلی",
|
||||
"openMenu": "باز کردن منو",
|
||||
"closeMenu": "بستن منو",
|
||||
"login": "ورود",
|
||||
"logoAlt": "صالح کارگر و پسران"
|
||||
},
|
||||
"Language": {
|
||||
"label": "زبان",
|
||||
"fa": "فارسی",
|
||||
"ar": "العربية"
|
||||
},
|
||||
"Hero": {
|
||||
"title": "کارخانه صالح کارگر و پسران",
|
||||
"subtitleEn": "Saleh Kargar Factory",
|
||||
"imageAlt": "کارخانه صالح کارگر",
|
||||
"transport": "حمل و نقل",
|
||||
"demolition": "تخریب",
|
||||
"limeProduction": "تولید آهک"
|
||||
},
|
||||
"Productions": {
|
||||
"title": "تولیــدات کارخــانه",
|
||||
"imageAlt": "تولیدات کارخانه",
|
||||
"items": {
|
||||
"clay": {
|
||||
"title": "خاک رس آسیابی (گل کاشی)",
|
||||
"description": "موارد مصرف این خاک معمولا گچ و خاک، گل مخصوص کاشی سازی و کاشی کاری مورد استفاده می باشد."
|
||||
},
|
||||
"mineralPowder": {
|
||||
"title": "پودر سنگ معدنی",
|
||||
"description": "این پودر تهیه شده از بهترین نوع سنگ کربنات کلسیم با خلوس بسیار بالا با سفیدی و نرمی مصرف حداقلی سیمان در این مورد توجه مصرف کنندگان این نوع پودر می باشد."
|
||||
},
|
||||
"joshaghan": {
|
||||
"title": "پودر سنگ جوشقان",
|
||||
"description": "این نوع پودر جهت مصارف صنعتی و سفید کاری و ساختمانی و کنیتکس کاری و کارخانجات چسب سازی و ... مورد استفاده می باشد."
|
||||
},
|
||||
"superChalk": {
|
||||
"title": "سوپر گچ صالح",
|
||||
"description": "گچ سوپر کارگر سه برابر مستحکم تر از سایر گچ هاست، که سفیدی و درخشندگی و براقیت فوق العاده ای را به نمای داخلی ساختمان می بخشد. این گچ از نظر سفیدی جایگزین رنگ می شود که به طبع آن هزینه را کاهش و سرعت و سهولت اجرا را افزایش می دهد."
|
||||
},
|
||||
"buildingLime": {
|
||||
"title": "آهک ساختمانی و صنعتی",
|
||||
"description": "این آهک در دو نوع فله و پاکتی ارائه می شود که پاکتی آن( آهک آب زده) در بسته بندی و فله آن جهت امور ساختمانی مورد مصرف می باشد. نوع صنعتی آن با خلوص بسیار بالا جهت کارخانجات چرم سازی و بتون سبک ، هیدراته و ... مورد مصرف قرار میگیرد."
|
||||
},
|
||||
"limestone": {
|
||||
"title": "سنگ آهکی کربنات پتاسیم",
|
||||
"description": "سنگ آهکی در مصارف ساختمانی از جمله پختن آهک صنعتی و سنتی - آهک - پودر سنگ و سنگ نما استفاده می شود و به دلیل کربنات کلسیم فراوان در این سنگ جهت خوراک طیور نیز استفاده می شود. این سنگ را از معدن به طور کوپ و یا انفجار از کوه استخراج می کنند."
|
||||
},
|
||||
"superPowder": {
|
||||
"title": "سوپر پودر معدنی",
|
||||
"description": "این پودر با سفیدی زیاد و عدم نیاز به الک و پرداخت پذیری عالی و سهولت کار و ترک نخوردن در نمای داخل و خارج ساختمان و بند کشی کاشی، می تواند جایگزینی برای پودر جوشقان مورد مصرف قرار گیرد."
|
||||
},
|
||||
"sand": {
|
||||
"title": "ماسه بادی",
|
||||
"description": "این نوع ماسه بادی جهت مصارف باغ داری و باغچه استفاده می گردد."
|
||||
}
|
||||
}
|
||||
},
|
||||
"Powder": {
|
||||
"title": "ویژگی پودر سنگ معدنی",
|
||||
"benefitsTitle": "مزایای کار با پودر سنگ معدنی:",
|
||||
"usesTitle": "موارد مصرف پودر سنگ معدنی",
|
||||
"benefitsImageAlt": "مزایای پودر سنگ معدنی",
|
||||
"usesImageAlt": "موارد مصرف پودر سنگ معدنی",
|
||||
"benefits": {
|
||||
"quality": "کیفیت عالی",
|
||||
"lessCement": "کاهش مصرف سیمان",
|
||||
"whiteness": "سفیدی",
|
||||
"easyWork": "سهولت کار توسط استاد کار",
|
||||
"finish": "پرداخت پذیری عالی و با قابلیت شستشو"
|
||||
},
|
||||
"uses": {
|
||||
"whitework": "1- سفید کاری با سیمان",
|
||||
"grout": "2- بندکشی کاشی، سرامیک و موزائیک",
|
||||
"mosaic": "3- موائیک سازی",
|
||||
"slurry": "4- دوغ آب کاری پشت سنگ های چینی و مرمر"
|
||||
}
|
||||
},
|
||||
"AboutTabs": {
|
||||
"sampleWork": "نمونه کار",
|
||||
"factoryView": "نمای کارخانه",
|
||||
"tabs": {
|
||||
"work": {
|
||||
"label": "کار ما",
|
||||
"title": "نتایج آنالیز نمونه سنگ ها",
|
||||
"subtitle": "شعار ما :\nکیفیت برتر- بارگیری سریع- جلب رضایت مشتری",
|
||||
"body": "این مجتمع دارای نمایندگی چندین نوع گچ سمنان و قم و انواع گچ سوپر قم می باشد.",
|
||||
"cta": "درباره ما بیشتر بدانید ..."
|
||||
},
|
||||
"goal": {
|
||||
"label": "هدف ما",
|
||||
"title": "بهترین کیفیت آهک را از ما بخواهید...",
|
||||
"subtitle": "این مجتمع تولید مفتخر است که تمامی مصولات خود را به صورت بسته بندی و فله با کیفیت عالی به طور مستقیم در دسترس مشتریان عزیز خود قرار داده ودارای نمایندگی چندین نوع گچ سمنان و قم و انواع گچ سوپر قم می باشد.",
|
||||
"body": "هدف ما رضایت مشتری است و تولید کالایی با کیفیت",
|
||||
"cta": "درباره آهک ..."
|
||||
},
|
||||
"services": {
|
||||
"label": "خدمات ما",
|
||||
"title": "تولیداتی مرغوب و با کیفیت ...",
|
||||
"subtitle": "تولیدی صالح کارگر و پسران مفتخر است که تمامی محصولات خود را از بهترین نوع سنگهای معدنی موجود در کشور و با کیفیت عالی د ردسترس مشتریان محترم خود قرار می دهد.",
|
||||
"body": "شعار ما:\nکیفیت برتر\nبارگیری سریع\nجلب رضایت مشتری",
|
||||
"cta": "بیشتر بدانید ..."
|
||||
}
|
||||
}
|
||||
},
|
||||
"Carousel": {
|
||||
"title": "محصولات کارخانه",
|
||||
"prev": "قبلی",
|
||||
"next": "بعدی",
|
||||
"items": {
|
||||
"aryanClay": "خاک رس آریایی",
|
||||
"ore": "سنگ معدن",
|
||||
"superPowder": "سوپر پودر معدنی",
|
||||
"mineralPowder": "پودر سنگ معدنی",
|
||||
"joshaghan": "پودر سنگ جوشقان",
|
||||
"superChalk": "سوپر گچ صالح"
|
||||
}
|
||||
},
|
||||
"Location": {
|
||||
"title": "مــوقــعــیــت مـــــا",
|
||||
"heading": "مجتمع تولیدی کارخانجات سنک کوبی و آهک پزی صالح",
|
||||
"subtitle": "( صالح کارگر و پسران)",
|
||||
"coverage": "پخش در سرتاسر ایران",
|
||||
"mapAlt": "موقعیت مجتمع"
|
||||
},
|
||||
"Footer": {
|
||||
"brand": "سایــــت معــــــدن",
|
||||
"aboutTitle": "درباره ما",
|
||||
"aboutText": "تولید انواع سنگ معدنی و پودر آهک",
|
||||
"addressTitle": "آدرس ما",
|
||||
"address": "قم - جاده اراک - کیلومتر 8 - دوربرگردان مارال - بعد از بیمارستان امام رضا- کوچه دوم - داخل کوچه ( ریخته گری ها)",
|
||||
"noteFactory": "مجتمع تولید کارخانجات سنگ کوبی و آهک پزی صالح",
|
||||
"noteSlogan": "شعارما: کیفیت برتر- بارگیری سریع- جلب رضایت مشتری است",
|
||||
"contactTitle": "تماس با ما",
|
||||
"accounting": "حسابداری",
|
||||
"sales": "فروش",
|
||||
"loading": "بارگیری",
|
||||
"copyright": "کارخانه صالح کارگر و پسران"
|
||||
},
|
||||
"Products": {
|
||||
"pageTitle": "محصولات",
|
||||
"detailsTitle": "جزئیات محصول",
|
||||
"backToProducts": "بازگشت به محصولات",
|
||||
"currency": "تومان",
|
||||
"notFound": "محصول یافت نشد",
|
||||
"items": {
|
||||
"super-chalk": {
|
||||
"title": "سوپر گچ صالح",
|
||||
"description": "این گچ سه برابر مستحکم تر از سایر گچ هاست. سوپر گچ صالح به عنوان یک لایه نازک به ضخامت 4-3 میلی متر روی لایه زیرین گچ کاری (گچ سفید کاری و ساختمانی) اجرا می شود که سفیدی و درخشندگی و براقیت فوق العاده ای را به نمای داخلی ساختمان می بخشد این گچ از نظر سفیدی جایگزین رنگ می شود که به طبع، هزینه را کاهش و سرعت و سهولت اجرا را افزایش می دهد."
|
||||
}
|
||||
}
|
||||
},
|
||||
"AboutChalkPage": {
|
||||
"title": "درباره سوپر گچ صالح",
|
||||
"sections": {
|
||||
"history": {
|
||||
"title": "تاریخچـه تولیـد گــچ",
|
||||
"body": "گَچ کلسیم سولفات آبدار طبیعی است و در چندین فرم بلوری یافت میشود که در ذخایر پوسته جامد کره زمین به فرم قشرهای نسبتاً ضخیم و کلفت یافت میشود که آن را از دل زمین استخراج میکنند و مورد بهکارگیری قرار میدهند. گچ یکی از قدیمیترین مصالح ساختمانی مورد استفاده در دنیا میباشد که در قرون گذشته با روشهای متفاوتی تولید و استفاده میشده است. گچ را پس از استخراج از معدن مانند آهک به کوره میبرند و تا دمای نزدیک به ۱۸۰ درجه سانتیگراد گرما میدهند تا شماری از مولکولهای آب تبلورش را از دست بدهند و به فرم گچ قابل بکارگیری به عنوان مصالح ساختمانی و قالب گیری درآید. معمولاً گچ را با آسیاب های مخصوص به صورت پودر درمیآورند و در کیسههای گچ یا به صورت فله به فروش میرسد. پودرهای گچ مرغوب باید کوچکتر از ۰٫۱۵ میلیمترباشد."
|
||||
},
|
||||
"method": {
|
||||
"title": "روش تولیـد گــچ",
|
||||
"body": "خلوص سنگ گچ بر پایه درصد کانی ژیپس در آن تعریف میشود. بر پایه انجمن استاندارد مصالح آمریکا (ASTM) دست کم خلوص مورد نیاز برای سنگ گچ در مواد صنعتی ۷۰ درصد ژیپس است در صورتی که بیشتر سنگ گچهای تجارتی و بازرگانی دارای ۷۵ تا ۹۰ درصدخلوص میباشند. نا خالصیهای موجود درسنگ گچ بیشتر شیل، رسها و کربنات کلسیم است و گاهی بازمانده کنشها و فعالیتهای حیاتی نیز در آن دیده میشود.\n\nرنگ گچ به فرم طبیعی سفید بوده و ممکن است به دلیل ناخالصیهای مواد آلی رس و اکسید آهن به رنگهای خاکستری، خاکستری مایل به آبی، صورتی یا زرد دیده شود. سنگ گچ دارای سیستم تبلور منوکلینیک، وزن مخصوص ۲/۲ و سختی ۲ میباشد. ژیپس مورد بکارگیری با سنگ گچ به فرم تودهای بلوری شده که به فرم دانههای ریز و درشت است؛ که در اسید کلریدریک و آب گرم به فرم محلول در میآید. سنگ گچ خالص دارای ۹/۲۰ درصد آب ترکیبی و ۶/۶۴ درصد SO3 و ۵/۳۲ درصد CaO است.\n\nفرمول تهیه گچ : 2CaSO4.4H2O → 2CaSO4 + H2O 3H2O (در اثر حرارت تبخیر میشود)"
|
||||
},
|
||||
"strength": {
|
||||
"title": "مقاومت گچ",
|
||||
"body": "گچ مقاومت نسبتا خوبی دارد و حداکثر تنش فشاری قابل تحمل آن حدود ۳۰ کیلوگرم بر سانتیمتر مربع است، در کشش البته گچ ضعیفتر عمل کرده و تنش کششی حداکثر ۵ کیلوگرم بر سانتیمتر مربع را تحمل مینماید؛ توجه داشته باشید که این مقاومت برای گچ خالص است و اگر گچ به صورت ناخالص (گچ و خاک) بکار رود، مقاومت کاهش چشم گیری می یابد. میزان آب مصرفی به شدت در مقاومت گچ موثر است. مقاومت گچ در برابر آتش سوزی: گچ در مقابل سوانح آتش سوزی مقاومت کرده و می تواند به عنوان یک لایه عایق در برابر فولاد عمل نماید."
|
||||
},
|
||||
"pros": {
|
||||
"title": "مــزایـای گـــچ",
|
||||
"body": "ارزانی گچ: گچ به دلیل ارزانی و در دسترس بودن، از جمله مصالحی است که همگان با آن کار می کنند. شکل پذیری: گچ شکل پذیری فوق العاده ای دارد و این خاصیت باعث می شود که در بسیاری از صنعت ها مانند چینی سازی، به عنوان قالب مورد استفاده قرار گیرد. اکوستیک بودن یا خاصیت جذب صدا در گچ: گچ می تواند حدود تقریبا ۷۰ درصد امواج صوتی را جذب نماید. سفید بودن: رنگ سفید گچ باعث می شود که در فضای داخلی ساختمان جلوه فوق العاده ای به فضا ببخشد. قابلیت حجیم شدن: گچ در هنگام گیرش افزایش حجم پیدا می کند و منافذ را پر می کند."
|
||||
},
|
||||
"cons": {
|
||||
"title": "معـــــایب گـــچ",
|
||||
"body": "گچ کثیفی ها را زود به خود می گیرد. مشکل دیگر گچ این است که در مقابل رطوبت عملکردی بسیار ضعیف از خود نشان می دهد و اگر آب روی آن بریزد و رطوبت ادامه یابد، ضایعه طبله در گچ بروز می کند. این مشکل باعث شده است استفاده از گچ در مناطقی که از لحاظ رطوبتی غنی می باشند، مانند شمال ایران به مراتب کاهش یافته و از مصالح جایگزین آهک و سیمان سفید، برای سفیدکاری استفاده شود."
|
||||
},
|
||||
"super": {
|
||||
"title": "گــــچ سوپــــر کارگـــــر",
|
||||
"body": "گچ سوپر کارگر سه برابر مستحکم تر از سایر گچ هاست. سوپر گچ کارگر به عنوان یک لایه نازک به ضخامت ۳-۴ میلیمتر روی لایه زیرین گچ کاری (گچ سفید کاری و ساختمانی) اجرا می شود که سفیدی و درخشندگی و براقیت فوق العاده ای را به نمای داخلی ساختمان می بخشد این گچ از نظر سفیدی جایگزین رنگ می شود که به طبع آن هزینه را کاهش و سرعت و سهولت اجرا را افزایش می دهد. قابل شستشو: گچ سوپر کارگر میکرونیزه و قابل شستشو می باشد. پرداخت پذیری عالی: این گچ با پرداخت پذیری عالی که دارد باعث می شود سطحی بسیار سیقلی و عاری از هر گونه پستی و بلندی ایجاد شود."
|
||||
}
|
||||
}
|
||||
},
|
||||
"AboutLimePage": {
|
||||
"title": "درباره آهک",
|
||||
"sections": {
|
||||
"history": {
|
||||
"title": "تاریخچـــه تولیـــد آهــــک",
|
||||
"body": "عموما مردم از آهک و نوع و شیوه تولید آن چیزی نمی دانند. تولید آهک به دو روش سنتی و صنعتی تولید می گردد. روش سنتی تولید آهک هزاران سال است که توسط بشر انجام می شود. امروزه نیز با وجود ابداع روش های صنعتی همچنان از روش های سنتی گذشتگان برای تولید آهک استفاده می گردد، زیرا هم کیفیت مناسبی دارد و هم برای کارگاه های کوچک تولید آهک روش خوبی محسوب می شود. فرآوری آهک همیشه با پخت آن همراه است و برای این منظور نیاز به کوره آهک پزی است."
|
||||
},
|
||||
"traditional": {
|
||||
"title": "روش تولیـد سنتـی آهـک",
|
||||
"body": "در روش سنتی معمولا محل کارگاه در محل معدن آهک انتخاب می شود برای این منظور یک حفره در زمین ایجاد کرده و درون آن به صورت لایه ای سنگ آهک می چینند. بدین ترتیب زمین نقش کوره در روش سنتی تولید آهک ایفا می کند. این کوره های آهک پزی به کوره آهک چاهی یا تنوری شهرت دارند. در ادامه کوره را از پایین روشن کرده و روی آن را با گل آهک مهر می کنند. این روش تولید آهک زنده (پخته) سنتی است. همچنین در صورتی که هدف تولید آهک شکفته باشد در حین پخت روی آهک را مرطوب می کنند تا آهک هیدراته شود. در این نوع پخت خلوص آهک به درصدی بالای ۹۴٪ می رسد."
|
||||
},
|
||||
"difference": {
|
||||
"title": "تفاوت آهـک سنتـی و صنعتـی",
|
||||
"body": "البته پخت آهک در روش سنتی زمان بیشتر و حرارت کمتری نسبت به حالت صنعتی دارد. نمی توان گفت که آهک سنتی از نظر کیفیت بهتر است یا آهک صنعتی زیرا هریک دارای کاربردهای مخصوص به خود بوده و هر صنعتی ترجیح می دهد از یکی از این دو نوع محصول استفاده نماید. تفاوت اصلی در تولید سنتی و صنعتی آهک در کوره های آن می باشد. کوره سنتی در داخل زمین به صورت تنور بوده و کوره آهک صنعتی به شکل دوار یا روتاری و از جنس آلیاژ خاصی می باشد."
|
||||
},
|
||||
"uses": {
|
||||
"title": "کاربردهـای آهـک سنتــی",
|
||||
"body": "آهک سنتی دیر واکنش است و درصد خلوص بالاتری نسبت به صنعتی دارد به همین دلیل در بخش ساختمان، ضدعفونی در پرورش دام و طیور، دفن زباله، تولید آهک هیدراته و تولید آجرهای اتو کلاو شده که از نظر سبک سازی ساختمان بسیار موثر است مورد استفاده قرار می گیرد."
|
||||
}
|
||||
}
|
||||
},
|
||||
"AboutUsPage": {
|
||||
"title": "درباره ما",
|
||||
"imageAlt": "مجتمع تولیدی صالح کارگر و پسران",
|
||||
"p1": "مجتمع تولیدی صالح کارگر و پسران مفتخر است که تمامی محصولات خود را از بهترین نوع سنگهای معدنی موجود در کشور و با کیفیت عالی د ردسترس مشتریان محترم خود قرار می دهد.",
|
||||
"p2": "این مجتمع تولید مفتخر است که تمامی مصولات خود را به صورت بسته بندی و فله با کیفیت عالی به طور مستقیم در دسترس مشتریان عزیز خود قرار داده ودارای نمایندگی چندین نوع گچ سمنان و تولید کننده گچ سوپر صالح قم می باشد.",
|
||||
"p3": "شعار ما: کیفیت برتر بارگیری سریع جلب رضایت مشتری"
|
||||
},
|
||||
"GalleryPage": {
|
||||
"title": "گالری تصاویر",
|
||||
"itemAlt": "گالری تصاویر {n}"
|
||||
},
|
||||
"Common": {
|
||||
"home": "خانه",
|
||||
"products": "محصولات"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,14 @@
|
||||
import type { NextConfig } from "next";
|
||||
import createNextIntlPlugin from "next-intl/plugin";
|
||||
|
||||
const withNextIntl = createNextIntlPlugin("./src/i18n/request.ts");
|
||||
|
||||
const nextConfig: NextConfig = {
|
||||
/* config options here */
|
||||
// Leaner production runtime: deploy uses .next/standalone and drops node_modules.
|
||||
output: "standalone",
|
||||
images: {
|
||||
unoptimized: false,
|
||||
},
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
export default withNextIntl(nextConfig);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"next": "16.3.0",
|
||||
"next-intl": "^4.13.6",
|
||||
"react": "19.2.8",
|
||||
"react-dom": "19.2.8"
|
||||
},
|
||||
@@ -453,6 +454,36 @@
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@formatjs/fast-memoize": {
|
||||
"version": "3.1.7",
|
||||
"resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.7.tgz",
|
||||
"integrity": "sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@formatjs/icu-messageformat-parser": {
|
||||
"version": "3.5.16",
|
||||
"resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.16.tgz",
|
||||
"integrity": "sha512-kl6b/4D56gjGZi4ZewSmvXbalHwjOUI5ogEHPZqw42goeXTTrL7/yuPzvdrvr0QigDtvaOeb+UeMf62jks43Yg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@formatjs/icu-skeleton-parser": "2.1.11"
|
||||
}
|
||||
},
|
||||
"node_modules/@formatjs/icu-skeleton-parser": {
|
||||
"version": "2.1.11",
|
||||
"resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.11.tgz",
|
||||
"integrity": "sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@formatjs/intl-localematcher": {
|
||||
"version": "0.8.13",
|
||||
"resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.8.13.tgz",
|
||||
"integrity": "sha512-kHEAFOkeJSPNi7c5PaKaRjxcBrJwzzt81ifUu+8uve1EDW/VJl83KsxmqgqNZLzcFEhSliZGvx3+pk/RH0IOmg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@formatjs/fast-memoize": "3.1.7"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanfs/core": {
|
||||
"version": "0.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
|
||||
@@ -1317,6 +1348,292 @@
|
||||
"node": ">=12.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz",
|
||||
"integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"detect-libc": "^2.0.3",
|
||||
"is-glob": "^4.0.3",
|
||||
"node-addon-api": "^7.0.0",
|
||||
"picomatch": "^4.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@parcel/watcher-android-arm64": "2.6.0",
|
||||
"@parcel/watcher-darwin-arm64": "2.6.0",
|
||||
"@parcel/watcher-darwin-x64": "2.6.0",
|
||||
"@parcel/watcher-freebsd-x64": "2.6.0",
|
||||
"@parcel/watcher-linux-arm-glibc": "2.6.0",
|
||||
"@parcel/watcher-linux-arm-musl": "2.6.0",
|
||||
"@parcel/watcher-linux-arm64-glibc": "2.6.0",
|
||||
"@parcel/watcher-linux-arm64-musl": "2.6.0",
|
||||
"@parcel/watcher-linux-x64-glibc": "2.6.0",
|
||||
"@parcel/watcher-linux-x64-musl": "2.6.0",
|
||||
"@parcel/watcher-win32-arm64": "2.6.0",
|
||||
"@parcel/watcher-win32-x64": "2.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-android-arm64": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz",
|
||||
"integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-darwin-arm64": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz",
|
||||
"integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-darwin-x64": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz",
|
||||
"integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-freebsd-x64": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz",
|
||||
"integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm-glibc": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz",
|
||||
"integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm-musl": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz",
|
||||
"integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm64-glibc": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz",
|
||||
"integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-arm64-musl": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz",
|
||||
"integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-x64-glibc": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz",
|
||||
"integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-linux-x64-musl": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz",
|
||||
"integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-arm64": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz",
|
||||
"integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher-win32-x64": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz",
|
||||
"integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher/node_modules/picomatch": {
|
||||
"version": "4.0.5",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
|
||||
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/@rtsao/scc": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
|
||||
@@ -1324,6 +1641,210 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@schummar/icu-type-parser": {
|
||||
"version": "1.21.5",
|
||||
"resolved": "https://registry.npmjs.org/@schummar/icu-type-parser/-/icu-type-parser-1.21.5.tgz",
|
||||
"integrity": "sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@swc/core-darwin-arm64": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.47.tgz",
|
||||
"integrity": "sha512-GsoMtan3ojGGMGFbl31mmRu5ctZ56re8grGE8mO/OHJ8O+JRkzod02fe7X6ZQ8JvamA3imkEkx/h3u+vsOgPgA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-darwin-x64": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.47.tgz",
|
||||
"integrity": "sha512-leTi7Rx3KF4zcC637iqWgk9SoV8VXAD8ppQYXsep63px5A/UftOcxLN1pmr8Z1si/YvX90ompP/rHgpYkgwXWg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-linux-arm-gnueabihf": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.47.tgz",
|
||||
"integrity": "sha512-hBqHuoWKKIsKmDBn9qVeWqj5GWZhtlcczVaqQmNRXsDfq+voR5CxKRfamA367QjJXtceYuliLFfEL8QsskRM2g==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-linux-arm64-gnu": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.47.tgz",
|
||||
"integrity": "sha512-TBxvRz+B4K205TWHHZxWVxkC2RFNP/Mz3PNcECBos5PsKwxjg3QSJzdoebr0VCf0Bfh8HOPldKxAP/8XkFe9gA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-linux-arm64-musl": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.47.tgz",
|
||||
"integrity": "sha512-3Yu3Uq/VgytqsPjTMbkPU1ExADytbdWbruJYhA584E9jrpE2Ki+R6VVPoZCeAVk1Cb7QxcRTgblw6bSa6a/R+w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-linux-ppc64-gnu": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.47.tgz",
|
||||
"integrity": "sha512-wfdMi5IaOaNtmh2/6geRoxIdNfqylUZFdtzTKS655y1axWfIWyx7As74vv0wVdjeCIZ3WmCI9odDd4rUttXOSQ==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-linux-s390x-gnu": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.47.tgz",
|
||||
"integrity": "sha512-3hHYBY0yx8Ez7GMRrkhXHQzMdR5IZA6Wq5Ee4svlgwvSECLpnAJ9+0AimEGUFDvuLwE7nV/2+PYe8+Nm4rvNcQ==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-linux-x64-gnu": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.47.tgz",
|
||||
"integrity": "sha512-TjfhjgP/jGCfFHYC3JQPhJA1HwErbIJ9JfREDc1KNkvY6P0LodCgKVIlQ5deeTbkG7ih3bF5PHJLuLpaZjdRyQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-linux-x64-musl": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.47.tgz",
|
||||
"integrity": "sha512-CQpS8Ge/avfjZd0UEwG/sds83Uu32deQXcV1Jo3jD0mmvQQqtYAjpsDZXugmheeAwmt+YIuoVtVHro8LMYHqsQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-win32-arm64-msvc": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.47.tgz",
|
||||
"integrity": "sha512-0W8IKHsUTYiT7G2RqtOoVWk+89yzZikIiDUb/sCK6BmQDBhN91hQSfyUtW12jhEWLzYgcfmisfsZrmZE+84U1A==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-win32-ia32-msvc": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.47.tgz",
|
||||
"integrity": "sha512-ZIp49d2Z4/ka2jO9otOg4hDvTdPmp86kVOgS2M5FCPI7eKKZ1W0boxWn+8XeZrfERtFGW0AlMRm4JhlJa7l3NA==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/core-win32-x64-msvc": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.47.tgz",
|
||||
"integrity": "sha512-2h8Iek95vnixkBRCo+H8p09+Q5ll2NgSMFrWTy0iKt7+/t+8/T5mBpiT6c0ZxSS7wcWjwZ9sGZkK70tTSYHdDw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"license": "Apache-2.0 AND MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/counter": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
|
||||
"integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/@swc/helpers": {
|
||||
"version": "0.5.15",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
|
||||
@@ -1333,6 +1854,15 @@
|
||||
"tslib": "^2.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/types": {
|
||||
"version": "0.1.28",
|
||||
"resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.28.tgz",
|
||||
"integrity": "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@swc/counter": "^0.1.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/node": {
|
||||
"version": "4.3.3",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz",
|
||||
@@ -2933,7 +3463,6 @@
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
|
||||
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -4072,6 +4601,21 @@
|
||||
"hermes-estree": "0.25.1"
|
||||
}
|
||||
},
|
||||
"node_modules/icu-minify": {
|
||||
"version": "4.13.6",
|
||||
"resolved": "https://registry.npmjs.org/icu-minify/-/icu-minify-4.13.6.tgz",
|
||||
"integrity": "sha512-iYZGCJZ+kX6o7GrxpVe2sOSdW86AvEqh8RQBvWeBd9jqmuABsMc2B6xongACfItLOogyIWH6GuBslNHr79OU8Q==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/amannn"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@formatjs/icu-messageformat-parser": "^3.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ignore": {
|
||||
"version": "5.3.2",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
|
||||
@@ -4124,6 +4668,16 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/intl-messageformat": {
|
||||
"version": "11.2.13",
|
||||
"resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-11.2.13.tgz",
|
||||
"integrity": "sha512-JaPaE6TIX+TAS5XLhDUh41geLw4QfBHX4s5pW8Km+L9fVC8HzB9yOuhbh4EMR/F1+8C6b9qk4763Cv+LdOG1kg==",
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"@formatjs/fast-memoize": "3.1.7",
|
||||
"@formatjs/icu-messageformat-parser": "3.5.16"
|
||||
}
|
||||
},
|
||||
"node_modules/is-array-buffer": {
|
||||
"version": "3.0.5",
|
||||
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
|
||||
@@ -4302,7 +4856,6 @@
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
@@ -4348,7 +4901,6 @@
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
||||
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-extglob": "^2.1.1"
|
||||
@@ -5156,6 +5708,15 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/negotiator": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
|
||||
"integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/next": {
|
||||
"version": "16.3.0",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-16.3.0.tgz",
|
||||
@@ -5209,6 +5770,83 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/next-intl": {
|
||||
"version": "4.13.6",
|
||||
"resolved": "https://registry.npmjs.org/next-intl/-/next-intl-4.13.6.tgz",
|
||||
"integrity": "sha512-loS6tjWWkr/IP+EV1yXUm9URB54QmZOp4+ZsMZNmeYxY8IZxLvO2esUegnXIDxj5DpK/4BsxwDGfGhlqodpkCQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/amannn"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@formatjs/intl-localematcher": "^0.8.1",
|
||||
"@parcel/watcher": "^2.4.1",
|
||||
"@swc/core": "^1.15.2",
|
||||
"icu-minify": "^4.13.6",
|
||||
"negotiator": "^1.0.0",
|
||||
"next-intl-swc-plugin-extractor": "^4.13.6",
|
||||
"po-parser": "^2.1.1",
|
||||
"use-intl": "^4.13.6"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0",
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/next-intl-swc-plugin-extractor": {
|
||||
"version": "4.13.6",
|
||||
"resolved": "https://registry.npmjs.org/next-intl-swc-plugin-extractor/-/next-intl-swc-plugin-extractor-4.13.6.tgz",
|
||||
"integrity": "sha512-M2L8jtPEAXj0CPmXbiW66THdr3OnDqA9IsU1hqv3CdxtVow3Bl9eXPdT9Opeji7L4AFrUZ016dJOs+CoTw66OA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/next-intl/node_modules/@swc/core": {
|
||||
"version": "1.15.47",
|
||||
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.47.tgz",
|
||||
"integrity": "sha512-FbsO5JcfOjfH38W/rohBRBweJeERsAuIP4f377lmkmxTcq9exjtx4SkRuZY5CdfhR2CBVwDIJegBpJDffwNsOg==",
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@swc/counter": "^0.1.3",
|
||||
"@swc/types": "^0.1.27"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/swc"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@swc/core-darwin-arm64": "1.15.47",
|
||||
"@swc/core-darwin-x64": "1.15.47",
|
||||
"@swc/core-linux-arm-gnueabihf": "1.15.47",
|
||||
"@swc/core-linux-arm64-gnu": "1.15.47",
|
||||
"@swc/core-linux-arm64-musl": "1.15.47",
|
||||
"@swc/core-linux-ppc64-gnu": "1.15.47",
|
||||
"@swc/core-linux-s390x-gnu": "1.15.47",
|
||||
"@swc/core-linux-x64-gnu": "1.15.47",
|
||||
"@swc/core-linux-x64-musl": "1.15.47",
|
||||
"@swc/core-win32-arm64-msvc": "1.15.47",
|
||||
"@swc/core-win32-ia32-msvc": "1.15.47",
|
||||
"@swc/core-win32-x64-msvc": "1.15.47"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@swc/helpers": ">=0.5.17"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@swc/helpers": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/next/node_modules/postcss": {
|
||||
"version": "8.5.23",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz",
|
||||
@@ -5237,6 +5875,12 @@
|
||||
"node": "^10 || ^12 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/node-addon-api": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
|
||||
"integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/node-exports-info": {
|
||||
"version": "1.6.2",
|
||||
"resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz",
|
||||
@@ -5517,6 +6161,12 @@
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/po-parser": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/po-parser/-/po-parser-2.1.1.tgz",
|
||||
"integrity": "sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/possible-typed-array-names": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
|
||||
@@ -6619,6 +7269,27 @@
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/use-intl": {
|
||||
"version": "4.13.6",
|
||||
"resolved": "https://registry.npmjs.org/use-intl/-/use-intl-4.13.6.tgz",
|
||||
"integrity": "sha512-RLej84qL6PGTDp/PSG3tqRpwr7IvJfOu4Qfv/uyy8CrnYn1oEOQb6osNJb++jZ7FQxqN3aQ5BI7wTIerUgrgMA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/amannn"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@formatjs/fast-memoize": "^3.1.0",
|
||||
"@schummar/icu-type-parser": "1.21.5",
|
||||
"icu-minify": "^4.13.6",
|
||||
"intl-messageformat": "^11.1.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/which": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "16.3.0",
|
||||
"next-intl": "^4.13.6",
|
||||
"react": "19.2.8",
|
||||
"react-dom": "19.2.8"
|
||||
},
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
Please make a clone of this website
|
||||
https://www.salehkargar.ir/
|
||||
|
||||
You can make it better anywhere you want - but use exact design
|
||||
Color palette: like the original website
|
||||
Lang: fa
|
||||
Dir: rtl
|
||||
Use next js
|
||||
Download image from main website without any change and put in src/images with proper foldering
|
||||
Build only home page for now
|
||||
Use the data from main website
|
||||
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1 @@
|
||||
../src/images
|
||||
@@ -0,0 +1,72 @@
|
||||
import type { Metadata } from "next";
|
||||
import Image from "next/image";
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server";
|
||||
import PageShell from "@/components/PageShell";
|
||||
import { buildMetadata } from "@/lib/seo";
|
||||
|
||||
const sectionMeta = [
|
||||
{ key: "history", image: "/images/about-lime/1.jpg" },
|
||||
{ key: "traditional", image: "/images/about-lime/2.jpg" },
|
||||
{ key: "difference", image: "/images/about-lime/3.jpg" },
|
||||
{ key: "uses", image: "/images/products/building-lime.jpg" },
|
||||
] as const;
|
||||
|
||||
type Props = {
|
||||
params: Promise<{ locale: string }>;
|
||||
};
|
||||
|
||||
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||
const { locale } = await params;
|
||||
const t = await getTranslations({ locale, namespace: "Meta" });
|
||||
return buildMetadata({
|
||||
title: t("aboutLimeTitle"),
|
||||
description: t("aboutLimeDescription"),
|
||||
path: `/${locale}/aboutlime`,
|
||||
locale,
|
||||
});
|
||||
}
|
||||
|
||||
export default async function AboutLimePage({ params }: Props) {
|
||||
const { locale } = await params;
|
||||
setRequestLocale(locale);
|
||||
const t = await getTranslations("AboutLimePage");
|
||||
|
||||
return (
|
||||
<PageShell title={t("title")}>
|
||||
<section className="section content-page">
|
||||
<div className="container">
|
||||
{sectionMeta.map((section, index) => (
|
||||
<article
|
||||
key={section.key}
|
||||
className={`content-block${index % 2 === 1 ? " is-reverse" : ""}`}
|
||||
>
|
||||
<div className="content-block-media shadow-box">
|
||||
<Image
|
||||
src={section.image}
|
||||
alt={t(`sections.${section.key}.title`)}
|
||||
width={700}
|
||||
height={520}
|
||||
/>
|
||||
</div>
|
||||
<div className="content-block-text">
|
||||
<h2>{t(`sections.${section.key}.title`)}</h2>
|
||||
<Image
|
||||
src="/images/infoitems/line.png"
|
||||
alt=""
|
||||
width={151}
|
||||
height={5}
|
||||
className="section-line"
|
||||
/>
|
||||
{t(`sections.${section.key}.body`)
|
||||
.split("\n")
|
||||
.map((para) =>
|
||||
para.trim() ? <p key={para.slice(0, 24)}>{para}</p> : null,
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</PageShell>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
import type { Metadata } from "next";
|
||||
import Image from "next/image";
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server";
|
||||
import PageShell from "@/components/PageShell";
|
||||
import { buildMetadata } from "@/lib/seo";
|
||||
|
||||
const sectionMeta = [
|
||||
{ key: "history", image: "/images/about-chalk/1.jpg" },
|
||||
{ key: "method", image: "/images/about-chalk/2.jpg" },
|
||||
{ key: "strength", image: "/images/about-chalk/3.jpg" },
|
||||
{ key: "pros", image: "/images/about-chalk/4.jpg" },
|
||||
{ key: "cons", image: "/images/about-chalk/1.jpg" },
|
||||
{ key: "super", image: "/images/products/super-chalk.jpg" },
|
||||
] as const;
|
||||
|
||||
type Props = {
|
||||
params: Promise<{ locale: string }>;
|
||||
};
|
||||
|
||||
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||
const { locale } = await params;
|
||||
const t = await getTranslations({ locale, namespace: "Meta" });
|
||||
return buildMetadata({
|
||||
title: t("aboutChalkTitle"),
|
||||
description: t("aboutChalkDescription"),
|
||||
path: `/${locale}/aboutsuperchalk`,
|
||||
locale,
|
||||
});
|
||||
}
|
||||
|
||||
export default async function AboutChalkPage({ params }: Props) {
|
||||
const { locale } = await params;
|
||||
setRequestLocale(locale);
|
||||
const t = await getTranslations("AboutChalkPage");
|
||||
|
||||
return (
|
||||
<PageShell title={t("title")}>
|
||||
<section className="section content-page">
|
||||
<div className="container">
|
||||
{sectionMeta.map((section, index) => (
|
||||
<article
|
||||
key={section.key}
|
||||
className={`content-block${index % 2 === 1 ? " is-reverse" : ""}`}
|
||||
>
|
||||
<div className="content-block-media shadow-box">
|
||||
<Image
|
||||
src={section.image}
|
||||
alt={t(`sections.${section.key}.title`)}
|
||||
width={700}
|
||||
height={520}
|
||||
/>
|
||||
</div>
|
||||
<div className="content-block-text">
|
||||
<h2>{t(`sections.${section.key}.title`)}</h2>
|
||||
<Image
|
||||
src="/images/infoitems/line.png"
|
||||
alt=""
|
||||
width={151}
|
||||
height={5}
|
||||
className="section-line"
|
||||
/>
|
||||
{t(`sections.${section.key}.body`)
|
||||
.split("\n")
|
||||
.map((para) =>
|
||||
para.trim() ? <p key={para.slice(0, 24)}>{para}</p> : null,
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</PageShell>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
import type { Metadata } from "next";
|
||||
import Image from "next/image";
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server";
|
||||
import PageShell from "@/components/PageShell";
|
||||
import { buildMetadata } from "@/lib/seo";
|
||||
|
||||
type Props = {
|
||||
params: Promise<{ locale: string }>;
|
||||
};
|
||||
|
||||
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||
const { locale } = await params;
|
||||
const t = await getTranslations({ locale, namespace: "Meta" });
|
||||
return buildMetadata({
|
||||
title: t("aboutUsTitle"),
|
||||
description: t("aboutUsDescription"),
|
||||
path: `/${locale}/aboutus`,
|
||||
locale,
|
||||
});
|
||||
}
|
||||
|
||||
export default async function AboutUsPage({ params }: Props) {
|
||||
const { locale } = await params;
|
||||
setRequestLocale(locale);
|
||||
const t = await getTranslations("AboutUsPage");
|
||||
|
||||
return (
|
||||
<PageShell title={t("title")}>
|
||||
<section className="section about-us-page">
|
||||
<div className="container about-us-grid">
|
||||
<div className="about-us-media shadow-box">
|
||||
<Image
|
||||
src="/images/about-us/1.jpg"
|
||||
alt={t("imageAlt")}
|
||||
width={900}
|
||||
height={600}
|
||||
priority
|
||||
sizes="(max-width: 1024px) 100vw, 55vw"
|
||||
/>
|
||||
</div>
|
||||
<div className="about-us-copy">
|
||||
<Image
|
||||
src="/images/about-us/2.png"
|
||||
alt=""
|
||||
width={90}
|
||||
height={90}
|
||||
className="about-us-icon"
|
||||
/>
|
||||
<h2>{t("title")}</h2>
|
||||
<Image
|
||||
src="/images/infoitems/line.png"
|
||||
alt=""
|
||||
width={151}
|
||||
height={5}
|
||||
className="section-line"
|
||||
/>
|
||||
<p>{t("p1")}</p>
|
||||
<p>{t("p2")}</p>
|
||||
<p>{t("p3")}</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</PageShell>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
import type { Metadata } from "next";
|
||||
import Image from "next/image";
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server";
|
||||
import PageShell from "@/components/PageShell";
|
||||
import { galleryImages } from "@/data/pages";
|
||||
import { buildMetadata } from "@/lib/seo";
|
||||
|
||||
type Props = {
|
||||
params: Promise<{ locale: string }>;
|
||||
};
|
||||
|
||||
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||
const { locale } = await params;
|
||||
const t = await getTranslations({ locale, namespace: "Meta" });
|
||||
return buildMetadata({
|
||||
title: t("galleryTitle"),
|
||||
description: t("galleryDescription"),
|
||||
path: `/${locale}/gallery`,
|
||||
locale,
|
||||
});
|
||||
}
|
||||
|
||||
export default async function GalleryPage({ params }: Props) {
|
||||
const { locale } = await params;
|
||||
setRequestLocale(locale);
|
||||
const t = await getTranslations("GalleryPage");
|
||||
|
||||
return (
|
||||
<PageShell title={t("title")}>
|
||||
<section className="section">
|
||||
<div className="container">
|
||||
<div className="gallery-grid">
|
||||
{galleryImages.map((item) => (
|
||||
<figure key={item.id} className="gallery-item">
|
||||
<Image
|
||||
src={item.src}
|
||||
alt={t("itemAlt", { n: item.id })}
|
||||
width={700}
|
||||
height={500}
|
||||
sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"
|
||||
/>
|
||||
</figure>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</PageShell>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
import type { Metadata, Viewport } from "next";
|
||||
import { hasLocale, NextIntlClientProvider } from "next-intl";
|
||||
import { getMessages, getTranslations, setRequestLocale } from "next-intl/server";
|
||||
import { Vazirmatn } from "next/font/google";
|
||||
import { notFound } from "next/navigation";
|
||||
import JsonLd, {
|
||||
localBusinessJsonLd,
|
||||
organizationJsonLd,
|
||||
} from "@/components/JsonLd";
|
||||
import { routing } from "@/i18n/routing";
|
||||
import { siteConfig } from "@/data/seo";
|
||||
import "../globals.css";
|
||||
|
||||
const vazirmatn = Vazirmatn({
|
||||
subsets: ["arabic"],
|
||||
weight: ["300", "400", "500", "700", "800"],
|
||||
variable: "--font-vazirmatn",
|
||||
display: "swap",
|
||||
});
|
||||
|
||||
export const viewport: Viewport = {
|
||||
width: "device-width",
|
||||
initialScale: 1,
|
||||
themeColor: "#000000",
|
||||
};
|
||||
|
||||
type Props = {
|
||||
children: React.ReactNode;
|
||||
params: Promise<{ locale: string }>;
|
||||
};
|
||||
|
||||
export function generateStaticParams() {
|
||||
return routing.locales.map((locale) => ({ locale }));
|
||||
}
|
||||
|
||||
export async function generateMetadata({
|
||||
params,
|
||||
}: {
|
||||
params: Promise<{ locale: string }>;
|
||||
}): Promise<Metadata> {
|
||||
const { locale } = await params;
|
||||
const t = await getTranslations({ locale, namespace: "Meta" });
|
||||
|
||||
return {
|
||||
metadataBase: new URL(siteConfig.url),
|
||||
title: {
|
||||
default: t("siteName"),
|
||||
template: `%s | ${t("siteName")}`,
|
||||
},
|
||||
description: t("homeDescription"),
|
||||
applicationName: siteConfig.shortName,
|
||||
icons: {
|
||||
icon: "/favicon.png",
|
||||
apple: "/favicon.png",
|
||||
},
|
||||
openGraph: {
|
||||
type: "website",
|
||||
locale: locale === "ar" ? "ar_SA" : "fa_IR",
|
||||
url: `${siteConfig.url}/${locale}`,
|
||||
siteName: t("siteName"),
|
||||
title: t("siteName"),
|
||||
description: t("homeDescription"),
|
||||
images: [
|
||||
{
|
||||
url: siteConfig.ogImage,
|
||||
width: 1920,
|
||||
height: 680,
|
||||
alt: t("siteName"),
|
||||
},
|
||||
],
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: t("siteName"),
|
||||
description: t("homeDescription"),
|
||||
images: [siteConfig.ogImage],
|
||||
},
|
||||
alternates: {
|
||||
canonical: `/${locale}`,
|
||||
languages: {
|
||||
"fa-IR": "/fa",
|
||||
"ar": "/ar",
|
||||
"x-default": "/fa",
|
||||
},
|
||||
},
|
||||
robots: {
|
||||
index: true,
|
||||
follow: true,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default async function LocaleLayout({ children, params }: Props) {
|
||||
const { locale } = await params;
|
||||
if (!hasLocale(routing.locales, locale)) {
|
||||
notFound();
|
||||
}
|
||||
|
||||
setRequestLocale(locale);
|
||||
const messages = await getMessages();
|
||||
|
||||
return (
|
||||
<html lang={locale} dir="rtl" className={`${vazirmatn.variable} h-full`}>
|
||||
<body className={`${vazirmatn.className} min-h-full antialiased`}>
|
||||
<NextIntlClientProvider messages={messages}>
|
||||
<JsonLd data={[organizationJsonLd(), localBusinessJsonLd()]} />
|
||||
{children}
|
||||
</NextIntlClientProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
import type { Metadata } from "next";
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server";
|
||||
import AboutTabs from "@/components/AboutTabs";
|
||||
import Footer from "@/components/Footer";
|
||||
import Header from "@/components/Header";
|
||||
import Hero from "@/components/Hero";
|
||||
import Location from "@/components/Location";
|
||||
import PowderFeatures from "@/components/PowderFeatures";
|
||||
import Productions from "@/components/Productions";
|
||||
import ProductsCarousel from "@/components/ProductsCarousel";
|
||||
import { buildMetadata } from "@/lib/seo";
|
||||
|
||||
type Props = {
|
||||
params: Promise<{ locale: string }>;
|
||||
};
|
||||
|
||||
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||
const { locale } = await params;
|
||||
const t = await getTranslations({ locale, namespace: "Meta" });
|
||||
|
||||
return buildMetadata({
|
||||
title: t("homeTitle"),
|
||||
description: t("homeDescription"),
|
||||
path: `/${locale}`,
|
||||
locale,
|
||||
});
|
||||
}
|
||||
|
||||
export default async function HomePage({ params }: Props) {
|
||||
const { locale } = await params;
|
||||
setRequestLocale(locale);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Header />
|
||||
<main>
|
||||
<Hero />
|
||||
<Productions />
|
||||
<PowderFeatures />
|
||||
<AboutTabs />
|
||||
<ProductsCarousel />
|
||||
<Location />
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
import type { Metadata } from "next";
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server";
|
||||
import { notFound } from "next/navigation";
|
||||
import JsonLd, { breadcrumbJsonLd, productJsonLd } from "@/components/JsonLd";
|
||||
import PageShell from "@/components/PageShell";
|
||||
import ProductDetail from "@/components/ProductDetail";
|
||||
import { getProductBySlug, getProducts } from "@/data/products";
|
||||
import { buildMetadata } from "@/lib/seo";
|
||||
|
||||
type Props = {
|
||||
params: Promise<{ locale: string; slug: string }>;
|
||||
};
|
||||
|
||||
export async function generateStaticParams() {
|
||||
return getProducts().map((product) => ({ slug: product.slug }));
|
||||
}
|
||||
|
||||
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||
const { locale, slug } = await params;
|
||||
const product = getProductBySlug(slug);
|
||||
const t = await getTranslations({ locale, namespace: "Products" });
|
||||
if (!product) return { title: t("notFound") };
|
||||
|
||||
return buildMetadata({
|
||||
title: t(`items.${product.slug}.title`),
|
||||
description: t(`items.${product.slug}.description`),
|
||||
path: `/${locale}/products/${product.slug}`,
|
||||
image: product.image,
|
||||
locale,
|
||||
});
|
||||
}
|
||||
|
||||
export default async function ProductDetailPage({ params }: Props) {
|
||||
const { locale, slug } = await params;
|
||||
setRequestLocale(locale);
|
||||
const product = getProductBySlug(slug);
|
||||
const t = await getTranslations("Products");
|
||||
const tCommon = await getTranslations("Common");
|
||||
if (!product) notFound();
|
||||
|
||||
const title = t(`items.${product.slug}.title`);
|
||||
|
||||
return (
|
||||
<PageShell title={t("detailsTitle")}>
|
||||
<JsonLd
|
||||
data={[
|
||||
productJsonLd({
|
||||
...product,
|
||||
title,
|
||||
description: t(`items.${product.slug}.description`),
|
||||
}),
|
||||
breadcrumbJsonLd([
|
||||
{ name: tCommon("home"), path: `/${locale}` },
|
||||
{ name: tCommon("products"), path: `/${locale}/products` },
|
||||
{
|
||||
name: title,
|
||||
path: `/${locale}/products/${product.slug}`,
|
||||
},
|
||||
]),
|
||||
]}
|
||||
/>
|
||||
<ProductDetail product={product} />
|
||||
</PageShell>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
import type { Metadata } from "next";
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server";
|
||||
import PageShell from "@/components/PageShell";
|
||||
import ProductGrid from "@/components/ProductGrid";
|
||||
import { getProducts } from "@/data/products";
|
||||
import { buildMetadata } from "@/lib/seo";
|
||||
|
||||
type Props = {
|
||||
params: Promise<{ locale: string }>;
|
||||
};
|
||||
|
||||
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||
const { locale } = await params;
|
||||
const t = await getTranslations({ locale, namespace: "Meta" });
|
||||
return buildMetadata({
|
||||
title: t("productsTitle"),
|
||||
description: t("productsDescription"),
|
||||
path: `/${locale}/products`,
|
||||
locale,
|
||||
});
|
||||
}
|
||||
|
||||
export default async function ProductsPage({ params }: Props) {
|
||||
const { locale } = await params;
|
||||
setRequestLocale(locale);
|
||||
const t = await getTranslations("Products");
|
||||
const products = getProducts();
|
||||
|
||||
return (
|
||||
<PageShell title={t("pageTitle")}>
|
||||
<section className="section">
|
||||
<div className="container">
|
||||
<ProductGrid products={products} />
|
||||
</div>
|
||||
</section>
|
||||
</PageShell>
|
||||
);
|
||||
}
|
||||
@@ -1,29 +1,9 @@
|
||||
import type { Metadata } from "next";
|
||||
import { Geist, Geist_Mono } from "next/font/google";
|
||||
import "./globals.css";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
const geistSans = Geist({
|
||||
variable: "--font-geist-sans",
|
||||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
const geistMono = Geist_Mono({
|
||||
variable: "--font-geist-mono",
|
||||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Create Next App",
|
||||
description: "Generated by create next app",
|
||||
type Props = {
|
||||
children: ReactNode;
|
||||
};
|
||||
|
||||
export default function RootLayout({ children }: LayoutProps<"/">) {
|
||||
return (
|
||||
<html
|
||||
lang="en"
|
||||
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
|
||||
>
|
||||
<body className="min-h-full flex flex-col">{children}</body>
|
||||
</html>
|
||||
);
|
||||
export default function RootLayout({ children }: Props) {
|
||||
return children;
|
||||
}
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
import Image from "next/image";
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<div className="flex flex-col flex-1 items-center justify-center bg-zinc-50 font-sans dark:bg-black">
|
||||
<main className="flex flex-1 w-full max-w-3xl flex-col items-center justify-between py-32 px-16 bg-white dark:bg-black sm:items-start">
|
||||
<Image
|
||||
className="dark:invert h-5 w-[100px]"
|
||||
src="/next.svg"
|
||||
alt="Next.js logo"
|
||||
width={100}
|
||||
height={20}
|
||||
priority
|
||||
/>
|
||||
<div className="flex flex-col items-center gap-6 text-center sm:items-start sm:text-left">
|
||||
<h1 className="max-w-xs text-3xl font-semibold leading-10 tracking-tight text-black dark:text-zinc-50">
|
||||
To get started, edit the{" "}
|
||||
<code className="rounded bg-black/[.06] px-1.5 py-0.5 font-mono text-[0.9em] dark:bg-white/[.08]">
|
||||
page.tsx
|
||||
</code>{" "}
|
||||
file.
|
||||
</h1>
|
||||
<p className="max-w-md text-lg leading-8 text-zinc-600 dark:text-zinc-400">
|
||||
Looking for a starting point or more instructions? Head over to{" "}
|
||||
<a
|
||||
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
|
||||
className="font-medium text-zinc-950 dark:text-zinc-50"
|
||||
>
|
||||
Templates
|
||||
</a>{" "}
|
||||
or the{" "}
|
||||
<a
|
||||
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
|
||||
className="font-medium text-zinc-950 dark:text-zinc-50"
|
||||
>
|
||||
Learning
|
||||
</a>{" "}
|
||||
center.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-col gap-4 text-base font-medium sm:flex-row">
|
||||
<a
|
||||
className="flex h-12 w-full items-center justify-center gap-2 rounded-full bg-foreground px-5 text-background transition-colors hover:bg-[#383838] dark:hover:bg-[#ccc] md:w-[158px]"
|
||||
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<Image
|
||||
className="dark:invert h-[14px] w-4"
|
||||
src="/vercel.svg"
|
||||
alt="Vercel logomark"
|
||||
width={16}
|
||||
height={14}
|
||||
/>
|
||||
Deploy Now
|
||||
</a>
|
||||
<a
|
||||
className="flex h-12 w-full items-center justify-center rounded-full border border-solid border-black/[.08] px-5 transition-colors hover:border-transparent hover:bg-black/[.04] dark:border-white/[.145] dark:hover:bg-[#1a1a1a] md:w-[158px]"
|
||||
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Documentation
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import type { MetadataRoute } from "next";
|
||||
import { siteConfig } from "@/data/seo";
|
||||
|
||||
export default function robots(): MetadataRoute.Robots {
|
||||
return {
|
||||
rules: {
|
||||
userAgent: "*",
|
||||
allow: "/",
|
||||
},
|
||||
sitemap: `${siteConfig.url}/sitemap.xml`,
|
||||
host: siteConfig.url,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import type { MetadataRoute } from "next";
|
||||
import { siteConfig } from "@/data/seo";
|
||||
import { getProducts } from "@/data/products";
|
||||
import { routing } from "@/i18n/routing";
|
||||
|
||||
export default function sitemap(): MetadataRoute.Sitemap {
|
||||
const now = new Date();
|
||||
const staticPaths = [
|
||||
"",
|
||||
"/products",
|
||||
"/aboutsuperchalk",
|
||||
"/aboutlime",
|
||||
"/gallery",
|
||||
"/aboutus",
|
||||
];
|
||||
|
||||
const productPaths = getProducts().map(
|
||||
(product) => `/products/${product.slug}`,
|
||||
);
|
||||
|
||||
const entries: MetadataRoute.Sitemap = [];
|
||||
|
||||
for (const locale of routing.locales) {
|
||||
for (const path of [...staticPaths, ...productPaths]) {
|
||||
entries.push({
|
||||
url: `${siteConfig.url}/${locale}${path}`,
|
||||
lastModified: now,
|
||||
changeFrequency: path.startsWith("/products") ? "weekly" : "monthly",
|
||||
priority: path === "" ? 1 : path === "/products" ? 0.9 : 0.8,
|
||||
alternates: {
|
||||
languages: Object.fromEntries(
|
||||
routing.locales.map((item) => [
|
||||
item,
|
||||
`${siteConfig.url}/${item}${path}`,
|
||||
]),
|
||||
),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return entries;
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
"use client";
|
||||
|
||||
import Image from "next/image";
|
||||
import { useTranslations } from "next-intl";
|
||||
import { useState } from "react";
|
||||
import { Link } from "@/i18n/navigation";
|
||||
|
||||
const tabIds = ["work", "goal", "services"] as const;
|
||||
|
||||
export default function AboutTabs() {
|
||||
const t = useTranslations("AboutTabs");
|
||||
const [active, setActive] = useState(0);
|
||||
const activeId = tabIds[active];
|
||||
|
||||
return (
|
||||
<section className="section about-tabs">
|
||||
<div className="container">
|
||||
<div className="about-layout">
|
||||
<div className="about-media">
|
||||
<Link href="/" className="zoom-box">
|
||||
<Image
|
||||
src="/images/featurebox/2.jpg"
|
||||
alt={t("sampleWork")}
|
||||
width={400}
|
||||
height={500}
|
||||
/>
|
||||
<span className="zoom-label">{t("sampleWork")}</span>
|
||||
</Link>
|
||||
<div className="about-side-photo">
|
||||
<Image
|
||||
src="/images/featurebox/1.jpg"
|
||||
alt={t("factoryView")}
|
||||
width={400}
|
||||
height={500}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="about-panel">
|
||||
<div className="tabs-nav" role="tablist">
|
||||
{tabIds.map((id, index) => (
|
||||
<button
|
||||
key={id}
|
||||
type="button"
|
||||
role="tab"
|
||||
aria-selected={active === index}
|
||||
className={active === index ? "is-active" : ""}
|
||||
onClick={() => setActive(index)}
|
||||
>
|
||||
{t(`tabs.${id}.label`)}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="tabs-panel" role="tabpanel">
|
||||
<h2>{t(`tabs.${activeId}.title`)}</h2>
|
||||
<h3 className="tabs-subtitle">
|
||||
{t(`tabs.${activeId}.subtitle`)
|
||||
.split("\n")
|
||||
.map((line) => (
|
||||
<span key={line}>
|
||||
{line}
|
||||
<br />
|
||||
</span>
|
||||
))}
|
||||
</h3>
|
||||
<p className="tabs-body">
|
||||
{t(`tabs.${activeId}.body`)
|
||||
.split("\n")
|
||||
.map((line) => (
|
||||
<span key={line}>
|
||||
{line}
|
||||
<br />
|
||||
</span>
|
||||
))}
|
||||
</p>
|
||||
<Link
|
||||
href={activeId === "goal" ? "/aboutlime" : "/aboutus"}
|
||||
className="btn-theme"
|
||||
>
|
||||
{t(`tabs.${activeId}.cta`)}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
import { getTranslations } from "next-intl/server";
|
||||
|
||||
const phones = [
|
||||
{ key: "accounting", href: "tel:+982538700105", text: "8700105-0253" },
|
||||
{ key: "sales", href: "tel:+982538700061", text: "4-8700061-0253" },
|
||||
{ key: "loading", href: "tel:+982538700074", text: "8700074-8700683-0253" },
|
||||
] as const;
|
||||
|
||||
export default async function Footer() {
|
||||
const t = await getTranslations("Footer");
|
||||
|
||||
return (
|
||||
<footer className="site-footer">
|
||||
<div className="footer-action">
|
||||
<div className="container">
|
||||
<h3>{t("brand")}</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="footer-widgets">
|
||||
<div className="container footer-grid">
|
||||
<aside>
|
||||
<h4>{t("aboutTitle")}</h4>
|
||||
<p>{t("aboutText")}</p>
|
||||
</aside>
|
||||
|
||||
<aside>
|
||||
<h4>{t("addressTitle")}</h4>
|
||||
<address className="footer-address">{t("address")}</address>
|
||||
<ul>
|
||||
<li>
|
||||
<span className="bullet" aria-hidden />
|
||||
{t("noteFactory")}
|
||||
</li>
|
||||
<li>
|
||||
<span className="bullet" aria-hidden />
|
||||
{t("noteSlogan")}
|
||||
</li>
|
||||
</ul>
|
||||
</aside>
|
||||
|
||||
<aside>
|
||||
<h4>{t("contactTitle")}</h4>
|
||||
<ul>
|
||||
{phones.map((item) => (
|
||||
<li key={item.key}>
|
||||
<span className="bullet" aria-hidden />
|
||||
<span>
|
||||
{t(item.key)} :{" "}
|
||||
<a href={item.href} className="footer-phone">
|
||||
{item.text}
|
||||
</a>
|
||||
</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="footer-copy">
|
||||
<div className="container">
|
||||
<p>{t("copyright")}</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,216 @@
|
||||
"use client";
|
||||
|
||||
import Image from "next/image";
|
||||
import { useLocale, useTranslations } from "next-intl";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { Link, usePathname, useRouter } from "@/i18n/navigation";
|
||||
import { routing, type AppLocale } from "@/i18n/routing";
|
||||
|
||||
const navLinks = [
|
||||
{ key: "home", href: "/" },
|
||||
{ key: "products", href: "/products" },
|
||||
{ key: "aboutChalk", href: "/aboutsuperchalk" },
|
||||
{ key: "aboutLime", href: "/aboutlime" },
|
||||
{ key: "gallery", href: "/gallery" },
|
||||
{ key: "aboutUs", href: "/aboutus" },
|
||||
] as const;
|
||||
|
||||
export default function Header() {
|
||||
const t = useTranslations("Nav");
|
||||
const tLang = useTranslations("Language");
|
||||
const locale = useLocale();
|
||||
const pathname = usePathname();
|
||||
const router = useRouter();
|
||||
const langRef = useRef<HTMLLIElement>(null);
|
||||
|
||||
const [scrolled, setScrolled] = useState(false);
|
||||
const [open, setOpen] = useState(false);
|
||||
const [langOpen, setLangOpen] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const onScroll = () => setScrolled(window.scrollY > 10);
|
||||
onScroll();
|
||||
window.addEventListener("scroll", onScroll, { passive: true });
|
||||
return () => window.removeEventListener("scroll", onScroll);
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
setOpen(false);
|
||||
setLangOpen(false);
|
||||
}, [pathname, locale]);
|
||||
|
||||
useEffect(() => {
|
||||
document.body.classList.toggle("nav-open", open);
|
||||
return () => document.body.classList.remove("nav-open");
|
||||
}, [open]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!langOpen) return;
|
||||
|
||||
const onPointerDown = (event: MouseEvent) => {
|
||||
if (!langRef.current?.contains(event.target as Node)) {
|
||||
setLangOpen(false);
|
||||
}
|
||||
};
|
||||
|
||||
const onKeyDown = (event: KeyboardEvent) => {
|
||||
if (event.key === "Escape") setLangOpen(false);
|
||||
};
|
||||
|
||||
document.addEventListener("mousedown", onPointerDown);
|
||||
document.addEventListener("keydown", onKeyDown);
|
||||
return () => {
|
||||
document.removeEventListener("mousedown", onPointerDown);
|
||||
document.removeEventListener("keydown", onKeyDown);
|
||||
};
|
||||
}, [langOpen]);
|
||||
|
||||
const isActive = (href: string) => {
|
||||
if (href === "/") return pathname === "/";
|
||||
return pathname === href || pathname.startsWith(`${href}/`);
|
||||
};
|
||||
|
||||
const switchLocale = (nextLocale: AppLocale) => {
|
||||
router.replace(pathname, { locale: nextLocale });
|
||||
setLangOpen(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<header className={`site-header${scrolled ? " is-sticky" : ""}`}>
|
||||
<div className="header-bar">
|
||||
<div className="header-brand-row">
|
||||
<div className="header-main">
|
||||
<Link href="/" className="header-wordmark">
|
||||
<Image
|
||||
src="/images/header/logo.jpg"
|
||||
alt={t("logoAlt")}
|
||||
width={260}
|
||||
height={44}
|
||||
priority
|
||||
/>
|
||||
</Link>
|
||||
|
||||
<div className="header-divider" />
|
||||
|
||||
<div className="header-nav-row">
|
||||
<button
|
||||
type="button"
|
||||
className={`menu-toggle${open ? " is-open" : ""}`}
|
||||
aria-label={open ? t("closeMenu") : t("openMenu")}
|
||||
aria-expanded={open}
|
||||
aria-controls="main-navigation"
|
||||
onClick={() => setOpen((v) => !v)}
|
||||
>
|
||||
<span />
|
||||
<span />
|
||||
<span />
|
||||
</button>
|
||||
|
||||
<nav
|
||||
id="main-navigation"
|
||||
className={`main-nav${open ? " is-open" : ""}`}
|
||||
aria-label={t("mainMenu")}
|
||||
>
|
||||
<ul>
|
||||
<li className="nav-lang" ref={langRef}>
|
||||
<button
|
||||
type="button"
|
||||
className={`nav-icon-btn lang-trigger${langOpen ? " is-open" : ""}`}
|
||||
aria-label={tLang("label")}
|
||||
aria-expanded={langOpen}
|
||||
aria-haspopup="listbox"
|
||||
onClick={() => setLangOpen((v) => !v)}
|
||||
>
|
||||
<GlobeIcon />
|
||||
<span className="lang-current">
|
||||
{locale === "ar" ? "AR" : "FA"}
|
||||
</span>
|
||||
</button>
|
||||
|
||||
{langOpen && (
|
||||
<ul className="lang-menu" role="listbox" aria-label={tLang("label")}>
|
||||
{routing.locales.map((item) => (
|
||||
<li key={item} role="option" aria-selected={item === locale}>
|
||||
<button
|
||||
type="button"
|
||||
className={`lang-option${item === locale ? " is-active" : ""}`}
|
||||
onClick={() => switchLocale(item)}
|
||||
>
|
||||
<Image
|
||||
src={`/images/languages/${item}.png`}
|
||||
alt=""
|
||||
width={20}
|
||||
height={14}
|
||||
/>
|
||||
<span>{tLang(item)}</span>
|
||||
</button>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</li>
|
||||
|
||||
{navLinks.map((item) => (
|
||||
<li key={item.href}>
|
||||
<Link
|
||||
href={item.href}
|
||||
aria-current={isActive(item.href) ? "page" : undefined}
|
||||
className={isActive(item.href) ? "is-active" : undefined}
|
||||
onClick={() => setOpen(false)}
|
||||
>
|
||||
{t(item.key)}
|
||||
</Link>
|
||||
</li>
|
||||
))}
|
||||
|
||||
<li>
|
||||
<button type="button" className="nav-icon-btn" aria-label={t("login")}>
|
||||
<UserIcon />
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Link href="/" className="header-crest" aria-label={t("logoAlt")}>
|
||||
<Image
|
||||
src="/images/header/logo1.png"
|
||||
alt={t("logoAlt")}
|
||||
width={92}
|
||||
height={92}
|
||||
priority
|
||||
/>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
|
||||
function GlobeIcon() {
|
||||
return (
|
||||
<svg viewBox="0 0 24 24" width="18" height="18" fill="none" aria-hidden>
|
||||
<circle cx="12" cy="12" r="9" stroke="currentColor" strokeWidth="1.6" />
|
||||
<path
|
||||
d="M3 12h18M12 3c2.8 2.6 4.2 5.7 4.2 9s-1.4 6.4-4.2 9c-2.8-2.6-4.2-5.7-4.2-9S9.2 5.6 12 3z"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1.6"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
|
||||
function UserIcon() {
|
||||
return (
|
||||
<svg viewBox="0 0 24 24" width="18" height="18" fill="none" aria-hidden>
|
||||
<circle cx="12" cy="8" r="3.2" stroke="currentColor" strokeWidth="1.6" />
|
||||
<path
|
||||
d="M5 19.5c1.8-3.2 4-4.7 7-4.7s5.2 1.5 7 4.7"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1.6"
|
||||
strokeLinecap="round"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
import Image from "next/image";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
|
||||
export default async function Hero() {
|
||||
const t = await getTranslations("Hero");
|
||||
|
||||
const services = [
|
||||
{ title: t("transport"), image: "/images/slider/1.png" },
|
||||
{ title: t("demolition"), image: "/images/slider/2.png" },
|
||||
{ title: t("limeProduction"), image: "/images/slider/3.png" },
|
||||
];
|
||||
|
||||
return (
|
||||
<section className="hero">
|
||||
<div className="hero-bg">
|
||||
<Image
|
||||
src="/images/slider/slider.jpg"
|
||||
alt={t("imageAlt")}
|
||||
fill
|
||||
priority
|
||||
className="hero-bg-img"
|
||||
sizes="100vw"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="hero-overlay">
|
||||
<div className="hero-center animate-fade-up">
|
||||
<h1>{t("title")}</h1>
|
||||
<hr className="hero-hr" />
|
||||
<div className="hero-en">{t("subtitleEn")}</div>
|
||||
</div>
|
||||
|
||||
<ul className="hero-services">
|
||||
{services.map((item, i) => (
|
||||
<li
|
||||
key={item.title}
|
||||
className="animate-fade-up"
|
||||
style={{ animationDelay: `${0.2 + i * 0.12}s` }}
|
||||
>
|
||||
<Image src={item.image} alt={item.title} width={64} height={60} />
|
||||
<span>{item.title}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
import { siteConfig } from "@/data/seo";
|
||||
|
||||
type JsonLdProps = {
|
||||
data: Record<string, unknown> | Record<string, unknown>[];
|
||||
};
|
||||
|
||||
export default function JsonLd({ data }: JsonLdProps) {
|
||||
return (
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export function organizationJsonLd() {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
name: siteConfig.name,
|
||||
alternateName: siteConfig.nameEn,
|
||||
url: siteConfig.url,
|
||||
logo: `${siteConfig.url}/images/header/logo1.png`,
|
||||
image: `${siteConfig.url}${siteConfig.ogImage}`,
|
||||
description: siteConfig.description,
|
||||
slogan: siteConfig.slogan,
|
||||
telephone: siteConfig.phone,
|
||||
address: {
|
||||
"@type": "PostalAddress",
|
||||
addressLocality: siteConfig.address.locality,
|
||||
streetAddress: siteConfig.address.street,
|
||||
addressCountry: siteConfig.address.country,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function localBusinessJsonLd() {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "LocalBusiness",
|
||||
"@id": `${siteConfig.url}/#business`,
|
||||
name: siteConfig.name,
|
||||
alternateName: siteConfig.nameEn,
|
||||
url: siteConfig.url,
|
||||
image: `${siteConfig.url}${siteConfig.ogImage}`,
|
||||
description: siteConfig.description,
|
||||
telephone: siteConfig.phone[0],
|
||||
address: {
|
||||
"@type": "PostalAddress",
|
||||
addressLocality: siteConfig.address.locality,
|
||||
streetAddress: siteConfig.address.street,
|
||||
addressCountry: siteConfig.address.country,
|
||||
},
|
||||
areaServed: {
|
||||
"@type": "Country",
|
||||
name: "Iran",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function productJsonLd(product: {
|
||||
title: string;
|
||||
description: string;
|
||||
image: string;
|
||||
price: number;
|
||||
slug: string;
|
||||
}) {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Product",
|
||||
name: product.title,
|
||||
description: product.description,
|
||||
image: `${siteConfig.url}${product.image}`,
|
||||
brand: {
|
||||
"@type": "Brand",
|
||||
name: siteConfig.shortName,
|
||||
},
|
||||
offers: {
|
||||
"@type": "Offer",
|
||||
url: `${siteConfig.url}/products/${product.slug}`,
|
||||
priceCurrency: "IRR",
|
||||
price: product.price,
|
||||
availability: "https://schema.org/InStock",
|
||||
seller: {
|
||||
"@type": "Organization",
|
||||
name: siteConfig.name,
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function breadcrumbJsonLd(
|
||||
items: { name: string; path: string }[],
|
||||
) {
|
||||
return {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
itemListElement: items.map((item, index) => ({
|
||||
"@type": "ListItem",
|
||||
position: index + 1,
|
||||
name: item.name,
|
||||
item: `${siteConfig.url}${item.path}`,
|
||||
})),
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
import Image from "next/image";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
|
||||
export default async function Location() {
|
||||
const t = await getTranslations("Location");
|
||||
|
||||
return (
|
||||
<section className="section location">
|
||||
<div className="container">
|
||||
<div className="section-head section-head-center">
|
||||
<h2>{t("title")}</h2>
|
||||
<Image
|
||||
src="/images/infoitems/line.png"
|
||||
alt=""
|
||||
width={151}
|
||||
height={5}
|
||||
className="section-line"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="location-grid">
|
||||
<div className="location-copy">
|
||||
<Image
|
||||
src="/images/info1/2.png"
|
||||
alt=""
|
||||
width={80}
|
||||
height={80}
|
||||
className="location-icon"
|
||||
/>
|
||||
<h3>{t("heading")}</h3>
|
||||
<p>
|
||||
{t("subtitle")}
|
||||
<br />
|
||||
<br />
|
||||
{t("coverage")}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="location-map">
|
||||
<Image
|
||||
src="/images/info1/1.png"
|
||||
alt={t("mapAlt")}
|
||||
width={700}
|
||||
height={420}
|
||||
className="location-map-img"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
type Props = {
|
||||
title: string;
|
||||
};
|
||||
|
||||
export default function PageHero({ title }: Props) {
|
||||
return (
|
||||
<section className="page-hero">
|
||||
<div className="container">
|
||||
<h1>{title}</h1>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import Header from "@/components/Header";
|
||||
import Footer from "@/components/Footer";
|
||||
import PageHero from "@/components/PageHero";
|
||||
|
||||
type Props = {
|
||||
title: string;
|
||||
children: React.ReactNode;
|
||||
};
|
||||
|
||||
export default function PageShell({ title, children }: Props) {
|
||||
return (
|
||||
<>
|
||||
<Header />
|
||||
<main>
|
||||
<PageHero title={title} />
|
||||
{children}
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
import Image from "next/image";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
|
||||
const benefitKeys = [
|
||||
"quality",
|
||||
"lessCement",
|
||||
"whiteness",
|
||||
"easyWork",
|
||||
"finish",
|
||||
] as const;
|
||||
|
||||
const useKeys = ["whitework", "grout", "mosaic", "slurry"] as const;
|
||||
|
||||
export default async function PowderFeatures() {
|
||||
const t = await getTranslations("Powder");
|
||||
|
||||
return (
|
||||
<section className="section powder-features">
|
||||
<div className="container">
|
||||
<div className="section-head section-head-center">
|
||||
<h2>{t("title")}</h2>
|
||||
<Image
|
||||
src="/images/infoitems/line.png"
|
||||
alt=""
|
||||
width={151}
|
||||
height={5}
|
||||
className="section-line"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="powder-grid">
|
||||
<div className="powder-col">
|
||||
<div className="powder-photo shadow-box">
|
||||
<Image
|
||||
src="/images/info/1.jpg"
|
||||
alt={t("benefitsImageAlt")}
|
||||
width={700}
|
||||
height={480}
|
||||
/>
|
||||
</div>
|
||||
<div className="powder-text">
|
||||
<h3>{t("benefitsTitle")}</h3>
|
||||
<p className="dots">. . . . . . . . . . . . . . . . . . . . . . . .</p>
|
||||
<ul>
|
||||
{benefitKeys.map((key) => (
|
||||
<li key={key}>{t(`benefits.${key}`)}</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="powder-col powder-col-reverse">
|
||||
<div className="powder-text">
|
||||
<h3>{t("usesTitle")}</h3>
|
||||
<p className="dots">. . . . . . . . . . . . . . . . . . . . . . . . .</p>
|
||||
<ul>
|
||||
{useKeys.map((key) => (
|
||||
<li key={key}>{t(`uses.${key}`)}</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
<div className="powder-photo shadow-box">
|
||||
<Image
|
||||
src="/images/info/2.jpg"
|
||||
alt={t("usesImageAlt")}
|
||||
width={700}
|
||||
height={480}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
import Image from "next/image";
|
||||
import { getTranslations, getLocale } from "next-intl/server";
|
||||
import type { Product } from "@/data/products";
|
||||
import { formatPrice } from "@/data/products";
|
||||
import { Link } from "@/i18n/navigation";
|
||||
|
||||
type Props = {
|
||||
product: Product;
|
||||
};
|
||||
|
||||
export default async function ProductDetail({ product }: Props) {
|
||||
const t = await getTranslations("Products");
|
||||
const locale = await getLocale();
|
||||
const title = t(`items.${product.slug}.title`);
|
||||
const description = t(`items.${product.slug}.description`);
|
||||
|
||||
return (
|
||||
<section className="section product-detail">
|
||||
<div className="container product-detail-grid">
|
||||
<div className="product-detail-media shadow-box">
|
||||
<Image
|
||||
src={product.image}
|
||||
alt={title}
|
||||
width={800}
|
||||
height={800}
|
||||
priority
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="product-detail-info">
|
||||
<h2>{title}</h2>
|
||||
<hr />
|
||||
<p className="product-detail-desc">{description}</p>
|
||||
<p className="product-detail-price">
|
||||
{formatPrice(product.price, locale, t("currency"))}
|
||||
</p>
|
||||
<Link href="/products" className="btn-theme">
|
||||
{t("backToProducts")}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
import Image from "next/image";
|
||||
import { getTranslations, getLocale } from "next-intl/server";
|
||||
import type { Product } from "@/data/products";
|
||||
import { formatPrice } from "@/data/products";
|
||||
import { Link } from "@/i18n/navigation";
|
||||
|
||||
type Props = {
|
||||
products: Product[];
|
||||
};
|
||||
|
||||
export default async function ProductGrid({ products }: Props) {
|
||||
const t = await getTranslations("Products");
|
||||
const locale = await getLocale();
|
||||
|
||||
return (
|
||||
<div className="product-grid">
|
||||
{products.map((product) => {
|
||||
const title = t(`items.${product.slug}.title`);
|
||||
return (
|
||||
<article key={product.id} className="product-tile">
|
||||
<Link href={`/products/${product.slug}`} className="product-tile-link">
|
||||
<div className="product-tile-img">
|
||||
<Image
|
||||
src={product.image}
|
||||
alt={title}
|
||||
width={500}
|
||||
height={500}
|
||||
/>
|
||||
</div>
|
||||
<h2>{title}</h2>
|
||||
<p className="product-tile-price">
|
||||
{formatPrice(product.price, locale, t("currency"))}
|
||||
</p>
|
||||
</Link>
|
||||
</article>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
import Image from "next/image";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
|
||||
const productionKeys = [
|
||||
"clay",
|
||||
"mineralPowder",
|
||||
"joshaghan",
|
||||
"superChalk",
|
||||
"buildingLime",
|
||||
"limestone",
|
||||
"superPowder",
|
||||
"sand",
|
||||
] as const;
|
||||
|
||||
export default async function Productions() {
|
||||
const t = await getTranslations("Productions");
|
||||
|
||||
return (
|
||||
<section className="section productions">
|
||||
<div className="container">
|
||||
<div className="productions-grid">
|
||||
<div className="productions-list">
|
||||
<div className="section-head">
|
||||
<h2>{t("title")}</h2>
|
||||
<Image
|
||||
src="/images/infoitems/line.png"
|
||||
alt=""
|
||||
width={151}
|
||||
height={5}
|
||||
className="section-line"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="production-items">
|
||||
{productionKeys.map((key) => (
|
||||
<article key={key} className="production-item">
|
||||
<h3>{t(`items.${key}.title`)}</h3>
|
||||
<p>{t(`items.${key}.description`)}</p>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="productions-visual">
|
||||
<Image
|
||||
src="/images/infoitems/1.png"
|
||||
alt={t("imageAlt")}
|
||||
width={640}
|
||||
height={720}
|
||||
className="productions-img"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
"use client";
|
||||
|
||||
import Image from "next/image";
|
||||
import { useTranslations } from "next-intl";
|
||||
import { useRef } from "react";
|
||||
import { Link } from "@/i18n/navigation";
|
||||
|
||||
const carouselItems = [
|
||||
{ key: "aryanClay", image: "/images/infoitems1/1.jpg" },
|
||||
{ key: "ore", image: "/images/infoitems1/2.jpg" },
|
||||
{ key: "superPowder", image: "/images/files/Bd4HF0Mm3G.jpg" },
|
||||
{ key: "mineralPowder", image: "/images/infoitems1/4.jpg" },
|
||||
{ key: "ore", image: "/images/infoitems1/2.jpg", id: "ore-2" },
|
||||
{ key: "joshaghan", image: "/images/infoitems1/3.jpg" },
|
||||
{ key: "superChalk", image: "/images/files/eADGpxlT4k.jpg" },
|
||||
] as const;
|
||||
|
||||
export default function ProductsCarousel() {
|
||||
const t = useTranslations("Carousel");
|
||||
const trackRef = useRef<HTMLUListElement>(null);
|
||||
|
||||
const scrollBy = (dir: 1 | -1) => {
|
||||
const el = trackRef.current;
|
||||
if (!el) return;
|
||||
const amount = el.clientWidth * 0.7;
|
||||
el.scrollBy({ left: dir * -amount, behavior: "smooth" });
|
||||
};
|
||||
|
||||
return (
|
||||
<section className="section products-carousel">
|
||||
<div className="container">
|
||||
<div className="section-head section-head-center">
|
||||
<h2>{t("title")}</h2>
|
||||
<Image
|
||||
src="/images/infoitems/line.png"
|
||||
alt=""
|
||||
width={151}
|
||||
height={5}
|
||||
className="section-line"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="carousel-wrap">
|
||||
<button
|
||||
type="button"
|
||||
className="carousel-btn prev"
|
||||
aria-label={t("prev")}
|
||||
onClick={() => scrollBy(-1)}
|
||||
>
|
||||
‹
|
||||
</button>
|
||||
|
||||
<ul className="carousel-track" ref={trackRef}>
|
||||
{carouselItems.map((item, index) => {
|
||||
const title = t(`items.${item.key}`);
|
||||
return (
|
||||
<li key={`${"id" in item ? item.id : item.key}-${index}`}>
|
||||
<Link href="/products" className="product-card-link">
|
||||
<article className="product-card">
|
||||
<div className="product-card-img">
|
||||
<Image
|
||||
src={item.image}
|
||||
alt={title}
|
||||
width={700}
|
||||
height={400}
|
||||
/>
|
||||
</div>
|
||||
<p>{title}</p>
|
||||
</article>
|
||||
</Link>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
className="carousel-btn next"
|
||||
aria-label={t("next")}
|
||||
onClick={() => scrollBy(1)}
|
||||
>
|
||||
›
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
export const site = {
|
||||
name: "کارخانه صالح کارگر و پسران",
|
||||
nameEn: "Saleh Kargar Factory",
|
||||
tagline: "شعار ما : کیفیت برتر- بارگیری سریع- جلب رضایت مشتری",
|
||||
};
|
||||
|
||||
export const navItems = [
|
||||
{ label: "صفحه اصلی", href: "/" },
|
||||
{ label: "محصولات", href: "/products" },
|
||||
{ label: "درباره گچ سوپر صالح", href: "/aboutsuperchalk" },
|
||||
{ label: "درباره آهک", href: "/aboutlime" },
|
||||
{ label: "گالری", href: "/gallery" },
|
||||
{ label: "درباره ما", href: "/aboutus" },
|
||||
];
|
||||
|
||||
export const heroServices = [
|
||||
{ title: "حمل و نقل", image: "/images/slider/1.png" },
|
||||
{ title: "تخریب", image: "/images/slider/2.png" },
|
||||
{ title: "تولید آهک", image: "/images/slider/3.png" },
|
||||
];
|
||||
|
||||
export const productions = [
|
||||
{
|
||||
title: "خاک رس آسیابی (گل کاشی)",
|
||||
description:
|
||||
"موارد مصرف این خاک معمولا گچ و خاک، گل مخصوص کاشی سازی و کاشی کاری مورد استفاده می باشد.",
|
||||
},
|
||||
{
|
||||
title: "پودر سنگ معدنی",
|
||||
description:
|
||||
"این پودر تهیه شده از بهترین نوع سنگ کربنات کلسیم با خلوس بسیار بالا با سفیدی و نرمی مصرف حداقلی سیمان در این مورد توجه مصرف کنندگان این نوع پودر می باشد.",
|
||||
},
|
||||
{
|
||||
title: "پودر سنگ جوشقان",
|
||||
description:
|
||||
"این نوع پودر جهت مصارف صنعتی و سفید کاری و ساختمانی و کنیتکس کاری و کارخانجات چسب سازی و ... مورد استفاده می باشد.",
|
||||
},
|
||||
{
|
||||
title: "سوپر گچ صالح",
|
||||
description:
|
||||
"گچ سوپر کارگر سه برابر مستحکم تر از سایر گچ هاست، که سفیدی و درخشندگی و براقیت فوق العاده ای را به نمای داخلی ساختمان می بخشد. این گچ از نظر سفیدی جایگزین رنگ می شود که به طبع آن هزینه را کاهش و سرعت و سهولت اجرا را افزایش می دهد.",
|
||||
},
|
||||
{
|
||||
title: "آهک ساختمانی و صنعتی",
|
||||
description:
|
||||
"این آهک در دو نوع فله و پاکتی ارائه می شود که پاکتی آن( آهک آب زده) در بسته بندی و فله آن جهت امور ساختمانی مورد مصرف می باشد. نوع صنعتی آن با خلوص بسیار بالا جهت کارخانجات چرم سازی و بتون سبک ، هیدراته و ... مورد مصرف قرار میگیرد.",
|
||||
},
|
||||
{
|
||||
title: "سنگ آهکی کربنات پتاسیم",
|
||||
description:
|
||||
"سنگ آهکی در مصارف ساختمانی از جمله پختن آهک صنعتی و سنتی - آهک - پودر سنگ و سنگ نما استفاده می شود و به دلیل کربنات کلسیم فراوان در این سنگ جهت خوراک طیور نیز استفاده می شود. این سنگ را از معدن به طور کوپ و یا انفجار از کوه استخراج می کنند.",
|
||||
},
|
||||
{
|
||||
title: "سوپر پودر معدنی",
|
||||
description:
|
||||
"این پودر با سفیدی زیاد و عدم نیاز به الک و پرداخت پذیری عالی و سهولت کار و ترک نخوردن در نمای داخل و خارج ساختمان و بند کشی کاشی، می تواند جایگزینی برای پودر جوشقان مورد مصرف قرار گیرد.",
|
||||
},
|
||||
{
|
||||
title: "ماسه بادی",
|
||||
description:
|
||||
"این نوع ماسه بادی جهت مصارف باغ داری و باغچه استفاده می گردد.",
|
||||
},
|
||||
];
|
||||
|
||||
export const powderBenefits = [
|
||||
"کیفیت عالی",
|
||||
"کاهش مصرف سیمان",
|
||||
"سفیدی",
|
||||
"سهولت کار توسط استاد کار",
|
||||
"پرداخت پذیری عالی و با قابلیت شستشو",
|
||||
];
|
||||
|
||||
export const powderUses = [
|
||||
"1- سفید کاری با سیمان",
|
||||
"2- بندکشی کاشی، سرامیک و موزائیک",
|
||||
"3- موائیک سازی",
|
||||
"4- دوغ آب کاری پشت سنگ های چینی و مرمر",
|
||||
];
|
||||
|
||||
export const aboutTabs = [
|
||||
{
|
||||
id: "work",
|
||||
label: "کار ما",
|
||||
title: "نتایج آنالیز نمونه سنگ ها",
|
||||
subtitle: "شعار ما :\nکیفیت برتر- بارگیری سریع- جلب رضایت مشتری",
|
||||
body: "این مجتمع دارای نمایندگی چندین نوع گچ سمنان و قم و انواع گچ سوپر قم می باشد.",
|
||||
cta: "درباره ما بیشتر بدانید ...",
|
||||
},
|
||||
{
|
||||
id: "goal",
|
||||
label: "هدف ما",
|
||||
title: "بهترین کیفیت آهک را از ما بخواهید...",
|
||||
subtitle:
|
||||
"این مجتمع تولید مفتخر است که تمامی مصولات خود را به صورت بسته بندی و فله با کیفیت عالی به طور مستقیم در دسترس مشتریان عزیز خود قرار داده ودارای نمایندگی چندین نوع گچ سمنان و قم و انواع گچ سوپر قم می باشد.",
|
||||
body: "هدف ما رضایت مشتری است و تولید کالایی با کیفیت",
|
||||
cta: "درباره آهک ...",
|
||||
},
|
||||
{
|
||||
id: "services",
|
||||
label: "خدمات ما",
|
||||
title: "تولیداتی مرغوب و با کیفیت ...",
|
||||
subtitle:
|
||||
"تولیدی صالح کارگر و پسران مفتخر است که تمامی محصولات خود را از بهترین نوع سنگهای معدنی موجود در کشور و با کیفیت عالی د ردسترس مشتریان محترم خود قرار می دهد.",
|
||||
body: "شعار ما:\nکیفیت برتر\nبارگیری سریع\nجلب رضایت مشتری",
|
||||
cta: "بیشتر بدانید ...",
|
||||
},
|
||||
];
|
||||
|
||||
export const factoryProducts = [
|
||||
{ title: "خاک رس آریایی", image: "/images/infoitems1/1.jpg" },
|
||||
{ title: "سنگ معدن", image: "/images/infoitems1/2.jpg" },
|
||||
{ title: "سوپر پودر معدنی", image: "/images/files/Bd4HF0Mm3G.jpg" },
|
||||
{ title: "پودر سنگ معدنی", image: "/images/infoitems1/4.jpg" },
|
||||
{ title: "سنگ معدن", image: "/images/infoitems1/2.jpg" },
|
||||
{ title: "پودر سنگ جوشقان", image: "/images/infoitems1/3.jpg" },
|
||||
{ title: "سوپر گچ صالح", image: "/images/files/eADGpxlT4k.jpg" },
|
||||
];
|
||||
|
||||
export const location = {
|
||||
title: "مــوقــعــیــت مـــــا",
|
||||
heading: "مجتمع تولیدی کارخانجات سنک کوبی و آهک پزی صالح",
|
||||
subtitle: "( صالح کارگر و پسران)",
|
||||
coverage: "پخش در سرتاسر ایران",
|
||||
};
|
||||
|
||||
export const footer = {
|
||||
brand: "سایــــت معــــــدن",
|
||||
aboutTitle: "درباره ما",
|
||||
aboutText: "تولید انواع سنگ معدنی و پودر آهک",
|
||||
addressTitle: "آدرس ما",
|
||||
address:
|
||||
"قم - جاده اراک - کیلومتر 8 - دوربرگردان مارال - بعد از بیمارستان امام رضا- کوچه دوم - داخل کوچه ( ریخته گری ها)",
|
||||
addressNotes: [
|
||||
"مجتمع تولید کارخانجات سنگ کوبی و آهک پزی صالح",
|
||||
"شعارما: کیفیت برتر- بارگیری سریع- جلب رضایت مشتری است",
|
||||
],
|
||||
contactTitle: "تماس با ما",
|
||||
contacts: [
|
||||
"حسابداری : 8700105-0253",
|
||||
"فروش : 4-8700061-0253",
|
||||
"بارگیری: 8700074-8700683-0253",
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,82 @@
|
||||
export const aboutChalk = {
|
||||
title: "درباره سوپر گچ صالح",
|
||||
sections: [
|
||||
{
|
||||
title: "تاریخچـه تولیـد گــچ",
|
||||
image: "/images/about-chalk/1.jpg",
|
||||
body: `گَچ کلسیم سولفات آبدار طبیعی است و در چندین فرم بلوری یافت میشود که در ذخایر پوسته جامد کره زمین به فرم قشرهای نسبتاً ضخیم و کلفت یافت میشود که آن را از دل زمین استخراج میکنند و مورد بهکارگیری قرار میدهند. گچ یکی از قدیمیترین مصالح ساختمانی مورد استفاده در دنیا میباشد که در قرون گذشته با روشهای متفاوتی تولید و استفاده میشده است. گچ را پس از استخراج از معدن مانند آهک به کوره میبرند و تا دمای نزدیک به ۱۸۰ درجه سانتیگراد گرما میدهند تا شماری از مولکولهای آب تبلورش را از دست بدهند و به فرم گچ قابل بکارگیری به عنوان مصالح ساختمانی و قالب گیری درآید. معمولاً گچ را با آسیاب های مخصوص به صورت پودر درمیآورند و در کیسههای گچ یا به صورت فله به فروش میرسد. پودرهای گچ مرغوب باید کوچکتر از ۰٫۱۵ میلیمترباشد.`,
|
||||
},
|
||||
{
|
||||
title: "روش تولیـد گــچ",
|
||||
image: "/images/about-chalk/2.jpg",
|
||||
body: `خلوص سنگ گچ بر پایه درصد کانی ژیپس در آن تعریف میشود. بر پایه انجمن استاندارد مصالح آمریکا (ASTM) دست کم خلوص مورد نیاز برای سنگ گچ در مواد صنعتی ۷۰ درصد ژیپس است در صورتی که بیشتر سنگ گچهای تجارتی و بازرگانی دارای ۷۵ تا ۹۰ درصدخلوص میباشند. نا خالصیهای موجود درسنگ گچ بیشتر شیل، رسها و کربنات کلسیم است و گاهی بازمانده کنشها و فعالیتهای حیاتی نیز در آن دیده میشود.
|
||||
|
||||
رنگ گچ به فرم طبیعی سفید بوده و ممکن است به دلیل ناخالصیهای مواد آلی رس و اکسید آهن به رنگهای خاکستری، خاکستری مایل به آبی، صورتی یا زرد دیده شود. سنگ گچ دارای سیستم تبلور منوکلینیک، وزن مخصوص ۲/۲ و سختی ۲ میباشد. ژیپس مورد بکارگیری با سنگ گچ به فرم تودهای بلوری شده که به فرم دانههای ریز و درشت است؛ که در اسید کلریدریک و آب گرم به فرم محلول در میآید. سنگ گچ خالص دارای ۹/۲۰ درصد آب ترکیبی و ۶/۶۴ درصد SO3 و ۵/۳۲ درصد CaO است.
|
||||
|
||||
فرمول تهیه گچ : 2CaSO4.4H2O → 2CaSO4 + H2O 3H2O (در اثر حرارت تبخیر میشود)`,
|
||||
},
|
||||
{
|
||||
title: "مقاومت گچ",
|
||||
image: "/images/about-chalk/3.jpg",
|
||||
body: `گچ مقاومت نسبتا خوبی دارد و حداکثر تنش فشاری قابل تحمل آن حدود ۳۰ کیلوگرم بر سانتیمتر مربع است، در کشش البته گچ ضعیفتر عمل کرده و تنش کششی حداکثر ۵ کیلوگرم بر سانتیمتر مربع را تحمل مینماید؛ توجه داشته باشید که این مقاومت برای گچ خالص است و اگر گچ به صورت ناخالص (گچ و خاک) بکار رود، مقاومت کاهش چشم گیری می یابد. میزان آب مصرفی به شدت در مقاومت گچ موثر است. مقاومت گچ در برابر آتش سوزی: گچ در مقابل سوانح آتش سوزی مقاومت کرده و می تواند به عنوان یک لایه عایق در برابر فولاد عمل نماید.`,
|
||||
},
|
||||
{
|
||||
title: "مــزایـای گـــچ",
|
||||
image: "/images/about-chalk/4.jpg",
|
||||
body: `ارزانی گچ: گچ به دلیل ارزانی و در دسترس بودن، از جمله مصالحی است که همگان با آن کار می کنند. شکل پذیری: گچ شکل پذیری فوق العاده ای دارد و این خاصیت باعث می شود که در بسیاری از صنعت ها مانند چینی سازی، به عنوان قالب مورد استفاده قرار گیرد. اکوستیک بودن یا خاصیت جذب صدا در گچ: گچ می تواند حدود تقریبا ۷۰ درصد امواج صوتی را جذب نماید. سفید بودن: رنگ سفید گچ باعث می شود که در فضای داخلی ساختمان جلوه فوق العاده ای به فضا ببخشد. قابلیت حجیم شدن: گچ در هنگام گیرش افزایش حجم پیدا می کند و منافذ را پر می کند.`,
|
||||
},
|
||||
{
|
||||
title: "معـــــایب گـــچ",
|
||||
image: "/images/about-chalk/1.jpg",
|
||||
body: `گچ کثیفی ها را زود به خود می گیرد. مشکل دیگر گچ این است که در مقابل رطوبت عملکردی بسیار ضعیف از خود نشان می دهد و اگر آب روی آن بریزد و رطوبت ادامه یابد، ضایعه طبله در گچ بروز می کند. این مشکل باعث شده است استفاده از گچ در مناطقی که از لحاظ رطوبتی غنی می باشند، مانند شمال ایران به مراتب کاهش یافته و از مصالح جایگزین آهک و سیمان سفید، برای سفیدکاری استفاده شود.`,
|
||||
},
|
||||
{
|
||||
title: "گــــچ سوپــــر کارگـــــر",
|
||||
image: "/images/products/super-chalk.jpg",
|
||||
body: `گچ سوپر کارگر سه برابر مستحکم تر از سایر گچ هاست. سوپر گچ کارگر به عنوان یک لایه نازک به ضخامت ۳-۴ میلیمتر روی لایه زیرین گچ کاری (گچ سفید کاری و ساختمانی) اجرا می شود که سفیدی و درخشندگی و براقیت فوق العاده ای را به نمای داخلی ساختمان می بخشد این گچ از نظر سفیدی جایگزین رنگ می شود که به طبع آن هزینه را کاهش و سرعت و سهولت اجرا را افزایش می دهد. قابل شستشو: گچ سوپر کارگر میکرونیزه و قابل شستشو می باشد. پرداخت پذیری عالی: این گچ با پرداخت پذیری عالی که دارد باعث می شود سطحی بسیار سیقلی و عاری از هر گونه پستی و بلندی ایجاد شود.`,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export const aboutLime = {
|
||||
title: "درباره آهک",
|
||||
sections: [
|
||||
{
|
||||
title: "تاریخچـــه تولیـــد آهــــک",
|
||||
image: "/images/about-lime/1.jpg",
|
||||
body: `عموما مردم از آهک و نوع و شیوه تولید آن چیزی نمی دانند. تولید آهک به دو روش سنتی و صنعتی تولید می گردد. روش سنتی تولید آهک هزاران سال است که توسط بشر انجام می شود. امروزه نیز با وجود ابداع روش های صنعتی همچنان از روش های سنتی گذشتگان برای تولید آهک استفاده می گردد، زیرا هم کیفیت مناسبی دارد و هم برای کارگاه های کوچک تولید آهک روش خوبی محسوب می شود. فرآوری آهک همیشه با پخت آن همراه است و برای این منظور نیاز به کوره آهک پزی است.`,
|
||||
},
|
||||
{
|
||||
title: "روش تولیـد سنتـی آهـک",
|
||||
image: "/images/about-lime/2.jpg",
|
||||
body: `در روش سنتی معمولا محل کارگاه در محل معدن آهک انتخاب می شود برای این منظور یک حفره در زمین ایجاد کرده و درون آن به صورت لایه ای سنگ آهک می چینند. بدین ترتیب زمین نقش کوره در روش سنتی تولید آهک ایفا می کند. این کوره های آهک پزی به کوره آهک چاهی یا تنوری شهرت دارند. در ادامه کوره را از پایین روشن کرده و روی آن را با گل آهک مهر می کنند. این روش تولید آهک زنده (پخته) سنتی است. همچنین در صورتی که هدف تولید آهک شکفته باشد در حین پخت روی آهک را مرطوب می کنند تا آهک هیدراته شود. در این نوع پخت خلوص آهک به درصدی بالای ۹۴٪ می رسد.`,
|
||||
},
|
||||
{
|
||||
title: "تفاوت آهـک سنتـی و صنعتـی",
|
||||
image: "/images/about-lime/3.jpg",
|
||||
body: `البته پخت آهک در روش سنتی زمان بیشتر و حرارت کمتری نسبت به حالت صنعتی دارد. نمی توان گفت که آهک سنتی از نظر کیفیت بهتر است یا آهک صنعتی زیرا هریک دارای کاربردهای مخصوص به خود بوده و هر صنعتی ترجیح می دهد از یکی از این دو نوع محصول استفاده نماید. تفاوت اصلی در تولید سنتی و صنعتی آهک در کوره های آن می باشد. کوره سنتی در داخل زمین به صورت تنور بوده و کوره آهک صنعتی به شکل دوار یا روتاری و از جنس آلیاژ خاصی می باشد.`,
|
||||
},
|
||||
{
|
||||
title: "کاربردهـای آهـک سنتــی",
|
||||
image: "/images/products/building-lime.jpg",
|
||||
body: `آهک سنتی دیر واکنش است و درصد خلوص بالاتری نسبت به صنعتی دارد به همین دلیل در بخش ساختمان، ضدعفونی در پرورش دام و طیور، دفن زباله، تولید آهک هیدراته و تولید آجرهای اتو کلاو شده که از نظر سبک سازی ساختمان بسیار موثر است مورد استفاده قرار می گیرد.`,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export const aboutUs = {
|
||||
title: "درباره ما",
|
||||
image: "/images/about-us/1.jpg",
|
||||
icon: "/images/about-us/2.png",
|
||||
paragraphs: [
|
||||
"مجتمع تولیدی صالح کارگر و پسران مفتخر است که تمامی محصولات خود را از بهترین نوع سنگهای معدنی موجود در کشور و با کیفیت عالی د ردسترس مشتریان محترم خود قرار می دهد.",
|
||||
"این مجتمع تولید مفتخر است که تمامی مصولات خود را به صورت بسته بندی و فله با کیفیت عالی به طور مستقیم در دسترس مشتریان عزیز خود قرار داده ودارای نمایندگی چندین نوع گچ سمنان و تولید کننده گچ سوپر صالح قم می باشد.",
|
||||
"شعار ما: کیفیت برتر بارگیری سریع جلب رضایت مشتری",
|
||||
],
|
||||
};
|
||||
|
||||
export const galleryImages = Array.from({ length: 22 }, (_, i) => ({
|
||||
id: i + 1,
|
||||
src: `/images/gallery/${i + 1}.jpg`,
|
||||
alt: `گالری تصاویر ${i + 1}`,
|
||||
}));
|
||||
@@ -0,0 +1,42 @@
|
||||
export type Product = {
|
||||
id: string;
|
||||
slug: string;
|
||||
title: string;
|
||||
price: number;
|
||||
image: string;
|
||||
description: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* Sample product data for UI design.
|
||||
* Replace `getProducts` / `getProductBySlug` with backend API calls later.
|
||||
* Localized title/description live in messages/{locale}.json under Products.items.
|
||||
*/
|
||||
export const products: Product[] = [
|
||||
{
|
||||
id: "5853",
|
||||
slug: "super-chalk",
|
||||
title: "سوپر گچ صالح",
|
||||
price: 24000,
|
||||
image: "/images/products/super-chalk.jpg",
|
||||
description:
|
||||
"این گچ سه برابر مستحکم تر از سایر گچ هاست. سوپر گچ صالح به عنوان یک لایه نازک به ضخامت 4-3 میلی متر روی لایه زیرین گچ کاری (گچ سفید کاری و ساختمانی) اجرا می شود که سفیدی و درخشندگی و براقیت فوق العاده ای را به نمای داخلی ساختمان می بخشد این گچ از نظر سفیدی جایگزین رنگ می شود که به طبع، هزینه را کاهش و سرعت و سهولت اجرا را افزایش می دهد.",
|
||||
},
|
||||
];
|
||||
|
||||
export function getProducts(): Product[] {
|
||||
return products;
|
||||
}
|
||||
|
||||
export function getProductBySlug(slug: string): Product | undefined {
|
||||
return products.find((p) => p.slug === slug);
|
||||
}
|
||||
|
||||
export function formatPrice(
|
||||
price: number,
|
||||
locale = "fa",
|
||||
currencyLabel = "تومان",
|
||||
): string {
|
||||
const numberLocale = locale === "ar" ? "ar-EG" : "fa-IR";
|
||||
return `${price.toLocaleString(numberLocale)} ${currencyLabel}`;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
export const siteConfig = {
|
||||
name: "کارخانه صالح کارگر و پسران",
|
||||
nameEn: "Saleh Kargar Factory",
|
||||
shortName: "صالح کارگر",
|
||||
description:
|
||||
"مجتمع تولیدی کارخانجات سنگکوبی و آهکپزی صالح کارگر و پسران — تولید پودر سنگ، آهک، گچ سوپر صالح و مصالح معدنی با کیفیت برتر، بارگیری سریع و جلب رضایت مشتری",
|
||||
url: process.env.NEXT_PUBLIC_SITE_URL ?? "https://www.salehkargar.ir",
|
||||
locale: "fa_IR",
|
||||
phone: ["0253-8700105", "0253-8700061", "0253-8700074"],
|
||||
email: undefined as string | undefined,
|
||||
address: {
|
||||
locality: "قم",
|
||||
street:
|
||||
"جاده اراک - کیلومتر 8 - دوربرگردان مارال - بعد از بیمارستان امام رضا - کوچه دوم - داخل کوچه (ریختهگریها)",
|
||||
country: "IR",
|
||||
},
|
||||
slogan: "کیفیت برتر — بارگیری سریع — جلب رضایت مشتری",
|
||||
ogImage: "/images/slider/slider.jpg",
|
||||
};
|
||||
|
||||
export const seoPages = {
|
||||
home: {
|
||||
title: "خانه",
|
||||
description: siteConfig.description,
|
||||
path: "/",
|
||||
},
|
||||
products: {
|
||||
title: "محصولات",
|
||||
description:
|
||||
"مشاهده محصولات کارخانه صالح کارگر و پسران شامل سوپر گچ صالح، پودر سنگ معدنی، آهک ساختمانی و صنعتی و سایر مصالح معدنی.",
|
||||
path: "/products",
|
||||
},
|
||||
aboutChalk: {
|
||||
title: "درباره سوپر گچ صالح",
|
||||
description:
|
||||
"آشنایی با تاریخچه، روش تولید، مزایا و ویژگیهای سوپر گچ صالح؛ گچ میکرونیزه قابل شستشو با استحکام سه برابر گچ معمولی.",
|
||||
path: "/aboutsuperchalk",
|
||||
},
|
||||
aboutLime: {
|
||||
title: "درباره آهک",
|
||||
description:
|
||||
"آشنایی با تاریخچه و روش تولید سنتی و صنعتی آهک در مجتمع صالح کارگر و پسران و کاربردهای آهک ساختمانی و صنعتی.",
|
||||
path: "/aboutlime",
|
||||
},
|
||||
gallery: {
|
||||
title: "گالری تصاویر",
|
||||
description:
|
||||
"گالری تصاویر کارخانه و معدن صالح کارگر و پسران؛ مشاهده فضای تولید، محصولات و فعالیتهای مجموعه.",
|
||||
path: "/gallery",
|
||||
},
|
||||
aboutUs: {
|
||||
title: "درباره ما",
|
||||
description:
|
||||
"درباره مجتمع تولیدی صالح کارگر و پسران؛ تولیدکننده سنگهای معدنی، پودر آهک و گچ سوپر صالح با شعار کیفیت برتر و بارگیری سریع.",
|
||||
path: "/aboutus",
|
||||
},
|
||||
} as const;
|
||||
@@ -0,0 +1,5 @@
|
||||
import { createNavigation } from "next-intl/navigation";
|
||||
import { routing } from "./routing";
|
||||
|
||||
export const { Link, redirect, usePathname, useRouter, getPathname } =
|
||||
createNavigation(routing);
|
||||
@@ -0,0 +1,15 @@
|
||||
import { hasLocale } from "next-intl";
|
||||
import { getRequestConfig } from "next-intl/server";
|
||||
import { routing } from "./routing";
|
||||
|
||||
export default getRequestConfig(async ({ requestLocale }) => {
|
||||
const requested = await requestLocale;
|
||||
const locale = hasLocale(routing.locales, requested)
|
||||
? requested
|
||||
: routing.defaultLocale;
|
||||
|
||||
return {
|
||||
locale,
|
||||
messages: (await import(`../../messages/${locale}.json`)).default,
|
||||
};
|
||||
});
|
||||
@@ -0,0 +1,9 @@
|
||||
import { defineRouting } from "next-intl/routing";
|
||||
|
||||
export const routing = defineRouting({
|
||||
locales: ["fa", "ar"],
|
||||
defaultLocale: "fa",
|
||||
localePrefix: "always",
|
||||
});
|
||||
|
||||
export type AppLocale = (typeof routing.locales)[number];
|
||||
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 154 KiB |
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 596 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 237 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 407 KiB |
|
After Width: | Height: | Size: 405 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 596 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 158 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 327 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 407 KiB |
|
After Width: | Height: | Size: 405 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 289 KiB |
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Key>sites/user_themes/salehkargar_DsyYdptMYr/assets/img/infoItems/icon.png</Key><BucketName>meshkee-templates</BucketName><Resource>/sites/user_themes/salehkargar_DsyYdptMYr/assets/img/infoItems/icon.png</Resource><RequestId>18CB1AC108A191BC</RequestId><HostId>dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8</HostId></Error>
|
||||
|
After Width: | Height: | Size: 422 B |
|
After Width: | Height: | Size: 327 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 293 B |
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 244 KiB |