diff --git a/public/fonts/iran-yekan-bold.ttf b/public/fonts/iran-yekan-bold.ttf
new file mode 100644
index 0000000..6d98764
Binary files /dev/null and b/public/fonts/iran-yekan-bold.ttf differ
diff --git a/public/fonts/iran-yekan-extrabold.ttf b/public/fonts/iran-yekan-extrabold.ttf
new file mode 100644
index 0000000..a2810c5
Binary files /dev/null and b/public/fonts/iran-yekan-extrabold.ttf differ
diff --git a/public/fonts/iran-yekan-medium.ttf b/public/fonts/iran-yekan-medium.ttf
new file mode 100644
index 0000000..cc9d9b4
Binary files /dev/null and b/public/fonts/iran-yekan-medium.ttf differ
diff --git a/public/fonts/iran-yekan-regular.ttf b/public/fonts/iran-yekan-regular.ttf
new file mode 100644
index 0000000..c662408
Binary files /dev/null and b/public/fonts/iran-yekan-regular.ttf differ
diff --git a/public/fonts/oswald-400.ttf b/public/fonts/oswald-400.ttf
new file mode 100644
index 0000000..1b5cb18
Binary files /dev/null and b/public/fonts/oswald-400.ttf differ
diff --git a/public/fonts/oswald-500.ttf b/public/fonts/oswald-500.ttf
new file mode 100644
index 0000000..73d8ee0
Binary files /dev/null and b/public/fonts/oswald-500.ttf differ
diff --git a/public/fonts/oswald-600.ttf b/public/fonts/oswald-600.ttf
new file mode 100644
index 0000000..314768a
Binary files /dev/null and b/public/fonts/oswald-600.ttf differ
diff --git a/public/fonts/oswald-700.ttf b/public/fonts/oswald-700.ttf
new file mode 100644
index 0000000..86812a0
Binary files /dev/null and b/public/fonts/oswald-700.ttf differ
diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx
index f14869b..f855538 100644
--- a/src/app/contact/page.tsx
+++ b/src/app/contact/page.tsx
@@ -1,7 +1,7 @@
import type { Metadata } from "next";
import { SiteShell } from "@/components/SiteShell";
import { ContactForm } from "@/components/ContactForm";
-import { getBusinessInfo } from "@/lib/api/business";
+import { getBusinessInfo, getPrimaryPhone, toPhoneText } from "@/lib/api/business";
import { site } from "@/data/home";
export const metadata: Metadata = {
@@ -11,10 +11,11 @@ export const metadata: Metadata = {
export default async function ContactPage() {
const info = await getBusinessInfo();
- const phones =
- info?.phoneNumbers?.filter(Boolean).length
- ? info.phoneNumbers
- : [site.phoneDisplay];
+ const phones = (info?.phoneNumbers ?? [])
+ .map(toPhoneText)
+ .filter(Boolean);
+ const displayPhones =
+ phones.length > 0 ? phones : [getPrimaryPhone(info)];
const emails = info?.emails?.filter(Boolean) ?? [];
const addresses =
info?.addresses?.length
@@ -56,19 +57,16 @@ export default async function ContactPage() {
تلفن
- {phones.map((phone) => {
- const phoneText = String(phone ?? "")
- return (
+ {displayPhones.map((phone) => (
- {phoneText}
+ {phone}
- )
- })}
+ ))}
diff --git a/src/app/globals.css b/src/app/globals.css
index 096f5e2..8807a59 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -2,7 +2,7 @@
@font-face {
font-family: "iran-yekan";
- src: url("https://cdn.meshkee.com/web-builder/fonts/iran-yekan/iran-yekan-regular.ttf");
+ src: url("/fonts/iran-yekan-regular.ttf") format("truetype");
font-weight: 400;
font-style: normal;
font-display: swap;
@@ -10,7 +10,7 @@
@font-face {
font-family: "iran-yekan";
- src: url("https://cdn.meshkee.com/web-builder/fonts/iran-yekan/iran-yekan-medium.ttf");
+ src: url("/fonts/iran-yekan-medium.ttf") format("truetype");
font-weight: 500;
font-style: normal;
font-display: swap;
@@ -18,7 +18,7 @@
@font-face {
font-family: "iran-yekan";
- src: url("https://cdn.meshkee.com/web-builder/fonts/iran-yekan/iran-yekan-bold.ttf");
+ src: url("/fonts/iran-yekan-bold.ttf") format("truetype");
font-weight: 700;
font-style: normal;
font-display: swap;
@@ -26,12 +26,44 @@
@font-face {
font-family: "iran-yekan";
- src: url("https://cdn.meshkee.com/web-builder/fonts/iran-yekan/iran-yekan-extrabold.ttf");
+ src: url("/fonts/iran-yekan-extrabold.ttf") format("truetype");
font-weight: 800;
font-style: normal;
font-display: swap;
}
+@font-face {
+ font-family: "Oswald";
+ src: url("/fonts/oswald-400.ttf") format("truetype");
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: "Oswald";
+ src: url("/fonts/oswald-500.ttf") format("truetype");
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: "Oswald";
+ src: url("/fonts/oswald-600.ttf") format("truetype");
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: "Oswald";
+ src: url("/fonts/oswald-700.ttf") format("truetype");
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
:root {
--background: #f2f5f8;
--foreground: #0f1720;
@@ -43,6 +75,7 @@
--brand-ink: #06233f;
--steel: #8fa3b8;
--container: 1180px;
+ --font-industrial: "Oswald", Impact, sans-serif;
}
@theme inline {
@@ -56,7 +89,8 @@
--color-brand-ink: var(--brand-ink);
--color-steel: var(--steel);
--font-sans: "iran-yekan", Tahoma, sans-serif;
- --font-display: var(--font-industrial), "Oswald", Impact, sans-serif;
+ --font-display: "Oswald", Impact, sans-serif;
+ --font-industrial: "Oswald", Impact, sans-serif;
}
* {
@@ -83,7 +117,7 @@ body {
}
.font-industrial {
- font-family: var(--font-industrial), "Oswald", Impact, sans-serif;
+ font-family: var(--font-industrial);
unicode-bidi: isolate;
}
@@ -111,7 +145,7 @@ img {
}
.section-kicker {
- font-family: var(--font-industrial), "Oswald", Impact, sans-serif;
+ font-family: var(--font-industrial);
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--brand);
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index ae4fa17..c988d30 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,13 +1,6 @@
import type { Metadata, Viewport } from "next";
-import { Oswald } from "next/font/google";
import "./globals.css";
-const oswald = Oswald({
- subsets: ["latin"],
- variable: "--font-industrial",
- weight: ["400", "500", "600", "700"],
-});
-
export const metadata: Metadata = {
metadataBase: new URL("https://www.mashinify.com"),
title: {
@@ -47,7 +40,7 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
+
{children}
);
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 2622492..f96c71b 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -6,13 +6,15 @@ import { HeaderContainer } from "@/components/HeaderContainer";
import { Hero } from "@/components/Hero";
import { Products } from "@/components/Products";
import { SellCta } from "@/components/SellCta";
+import { getPrimaryPhoneNumber } from "@/lib/api/business";
import { listBlogs } from "@/lib/api/blogs";
import { listUserProducts } from "@/lib/api/user-products";
export default async function Home() {
- const [userProducts, blogs] = await Promise.all([
+ const [userProducts, blogs, phone] = await Promise.all([
listUserProducts({ page: 1, pageSize: 8 }),
listBlogs({ page: 1, pageSize: 3 }),
+ getPrimaryPhoneNumber(),
]);
return (
@@ -26,7 +28,7 @@ export default async function Home() {
-
+
>
);
}
diff --git a/src/app/user-products/[slug]/page.tsx b/src/app/user-products/[slug]/page.tsx
index f3aa7e0..bc86a9c 100644
--- a/src/app/user-products/[slug]/page.tsx
+++ b/src/app/user-products/[slug]/page.tsx
@@ -6,7 +6,7 @@ import { ProductMarketplaceCtas } from "@/components/ProductMarketplaceCtas";
import { ProductTabs } from "@/components/ProductTabs";
import { Products } from "@/components/Products";
import { SiteShell } from "@/components/SiteShell";
-import { site } from "@/data/home";
+import { getPrimaryPhoneNumber } from "@/lib/api/business";
import {
formatCondition,
formatPrice,
@@ -58,7 +58,7 @@ export default async function UserProductDetailPage({ params }: PageProps) {
const description =
product.descriptionFa || product.description || product.descriptionEn;
const deliveryNotes = product.deliveryNotes ?? product.deliveryNote ?? null;
- const [technicalInfo, similarResult] = await Promise.all([
+ const [technicalInfo, similarResult, phone] = await Promise.all([
getUserProductTechnicalInfo(slug),
product.categoryId
? listUserProducts({
@@ -66,6 +66,7 @@ export default async function UserProductDetailPage({ params }: PageProps) {
pageSize: 5,
})
: Promise.resolve({ items: [], total: 0 }),
+ getPrimaryPhoneNumber(),
]);
const similarProducts = similarResult.items
@@ -144,7 +145,7 @@ export default async function UserProductDetailPage({ params }: PageProps) {
)}
@@ -177,7 +178,7 @@ export default async function UserProductDetailPage({ params }: PageProps) {
/>
) : null}
-
+
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx
index c2093fe..e42deb7 100644
--- a/src/components/Footer.tsx
+++ b/src/components/Footer.tsx
@@ -1,6 +1,10 @@
import { footerLinks, site } from "@/data/home";
-export function Footer() {
+type FooterProps = {
+ phone?: string;
+};
+
+export function Footer({ phone = site.phone }: FooterProps) {
return (