diff --git a/next.config.ts b/next.config.ts index e9ffa30..6c19289 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,20 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "meshkee-templates.sas.amin.parminstorage.ir", + pathname: "/**", + }, + { + protocol: "https", + hostname: "www.meshkee.com", + pathname: "/**", + }, + ], + }, }; export default nextConfig; diff --git a/package.json b/package.json index 44ad535..9ad2872 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "meshkee-tmp", + "name": "meshkee", "version": "0.1.0", "private": true, "scripts": { diff --git a/public/images/blog/ab.jpg b/public/images/blog/ab.jpg new file mode 100644 index 0000000..9e3aca0 Binary files /dev/null and b/public/images/blog/ab.jpg differ diff --git a/public/images/blog/crawl.jpg b/public/images/blog/crawl.jpg new file mode 100644 index 0000000..930ba9b Binary files /dev/null and b/public/images/blog/crawl.jpg differ diff --git a/public/images/blog/cta.jpg b/public/images/blog/cta.jpg new file mode 100644 index 0000000..f750424 Binary files /dev/null and b/public/images/blog/cta.jpg differ diff --git a/public/images/blog/funnel.jpg b/public/images/blog/funnel.jpg new file mode 100644 index 0000000..e65fb2c Binary files /dev/null and b/public/images/blog/funnel.jpg differ diff --git a/public/images/blog/prototype.jpg b/public/images/blog/prototype.jpg new file mode 100644 index 0000000..d7db828 Binary files /dev/null and b/public/images/blog/prototype.jpg differ diff --git a/public/images/blog/saas.jpg b/public/images/blog/saas.jpg new file mode 100644 index 0000000..d99f79b Binary files /dev/null and b/public/images/blog/saas.jpg differ diff --git a/public/images/brand/logo-black.png b/public/images/brand/logo-black.png new file mode 100755 index 0000000..83f8536 Binary files /dev/null and b/public/images/brand/logo-black.png differ diff --git a/public/images/brand/logo-white.png b/public/images/brand/logo-white.png new file mode 100755 index 0000000..4246ac7 Binary files /dev/null and b/public/images/brand/logo-white.png differ diff --git a/public/images/brand/mark-black.png b/public/images/brand/mark-black.png new file mode 100755 index 0000000..ee9f056 Binary files /dev/null and b/public/images/brand/mark-black.png differ diff --git a/public/images/brand/mark-white.png b/public/images/brand/mark-white.png new file mode 100755 index 0000000..8fd5f62 Binary files /dev/null and b/public/images/brand/mark-white.png differ diff --git a/public/images/brand/mark.svg b/public/images/brand/mark.svg new file mode 100644 index 0000000..b046db7 --- /dev/null +++ b/public/images/brand/mark.svg @@ -0,0 +1,3 @@ + diff --git a/public/images/hero/app.webp b/public/images/hero/app.webp new file mode 100644 index 0000000..2b19735 Binary files /dev/null and b/public/images/hero/app.webp differ diff --git a/public/images/hero/cms.webp b/public/images/hero/cms.webp new file mode 100644 index 0000000..b79ec80 Binary files /dev/null and b/public/images/hero/cms.webp differ diff --git a/public/images/hero/hero.webp b/public/images/hero/hero.webp new file mode 100644 index 0000000..d87372a Binary files /dev/null and b/public/images/hero/hero.webp differ diff --git a/public/images/hero/main.webp b/public/images/hero/main.webp new file mode 100644 index 0000000..d87372a Binary files /dev/null and b/public/images/hero/main.webp differ diff --git a/public/images/media/1.jpg b/public/images/media/1.jpg new file mode 100644 index 0000000..5a81360 Binary files /dev/null and b/public/images/media/1.jpg differ diff --git a/public/images/media/2.jpg b/public/images/media/2.jpg new file mode 100644 index 0000000..fd61765 Binary files /dev/null and b/public/images/media/2.jpg differ diff --git a/public/images/media/3.jpg b/public/images/media/3.jpg new file mode 100644 index 0000000..c347503 Binary files /dev/null and b/public/images/media/3.jpg differ diff --git a/public/images/media/4.webp b/public/images/media/4.webp new file mode 100644 index 0000000..d52803a Binary files /dev/null and b/public/images/media/4.webp differ diff --git a/public/images/media/5.jpg b/public/images/media/5.jpg new file mode 100644 index 0000000..ccb1c2a Binary files /dev/null and b/public/images/media/5.jpg differ diff --git a/public/images/media/6.jpg b/public/images/media/6.jpg new file mode 100644 index 0000000..3b5a256 Binary files /dev/null and b/public/images/media/6.jpg differ diff --git a/public/images/media/7.jpg b/public/images/media/7.jpg new file mode 100644 index 0000000..7f6f976 Binary files /dev/null and b/public/images/media/7.jpg differ diff --git a/public/images/media/8.jpg b/public/images/media/8.jpg new file mode 100644 index 0000000..93e01b8 Binary files /dev/null and b/public/images/media/8.jpg differ diff --git a/public/images/media/9.jpg b/public/images/media/9.jpg new file mode 100644 index 0000000..4773850 Binary files /dev/null and b/public/images/media/9.jpg differ diff --git a/public/images/portfolio/alma.webp b/public/images/portfolio/alma.webp new file mode 100644 index 0000000..4f02146 Binary files /dev/null and b/public/images/portfolio/alma.webp differ diff --git a/public/images/portfolio/bakery.webp b/public/images/portfolio/bakery.webp new file mode 100644 index 0000000..b39b78b Binary files /dev/null and b/public/images/portfolio/bakery.webp differ diff --git a/public/images/portfolio/beauty.jpg b/public/images/portfolio/beauty.jpg new file mode 100644 index 0000000..4526a3e Binary files /dev/null and b/public/images/portfolio/beauty.jpg differ diff --git a/public/images/portfolio/building.webp b/public/images/portfolio/building.webp new file mode 100644 index 0000000..646d240 Binary files /dev/null and b/public/images/portfolio/building.webp differ diff --git a/public/images/portfolio/mirror.webp b/public/images/portfolio/mirror.webp new file mode 100644 index 0000000..4990461 Binary files /dev/null and b/public/images/portfolio/mirror.webp differ diff --git a/public/images/portfolio/watch.webp b/public/images/portfolio/watch.webp new file mode 100644 index 0000000..a1b070d Binary files /dev/null and b/public/images/portfolio/watch.webp differ diff --git a/public/images/services/app.png b/public/images/services/app.png new file mode 100644 index 0000000..71d255c Binary files /dev/null and b/public/images/services/app.png differ diff --git a/public/images/services/cms.png b/public/images/services/cms.png new file mode 100644 index 0000000..57e4232 Binary files /dev/null and b/public/images/services/cms.png differ diff --git a/public/images/services/graphic.png b/public/images/services/graphic.png new file mode 100644 index 0000000..8a71b8f Binary files /dev/null and b/public/images/services/graphic.png differ diff --git a/public/images/services/seo.png b/public/images/services/seo.png new file mode 100644 index 0000000..186fa26 Binary files /dev/null and b/public/images/services/seo.png differ diff --git a/public/images/services/web.png b/public/images/services/web.png new file mode 100644 index 0000000..293465b Binary files /dev/null and b/public/images/services/web.png differ diff --git a/src/app/apple-icon.png b/src/app/apple-icon.png new file mode 100755 index 0000000..ee9f056 Binary files /dev/null and b/src/app/apple-icon.png differ diff --git a/src/app/dedicated-application/page.tsx b/src/app/dedicated-application/page.tsx new file mode 100644 index 0000000..522371d --- /dev/null +++ b/src/app/dedicated-application/page.tsx @@ -0,0 +1,98 @@ +import type { Metadata } from "next"; +import { ServicePageLayout } from "@/components/ServicePageLayout"; +import { WebsiteCountries, applicationCountries } from "@/components/WebsiteCountries"; +import { + ProjectsShowcase, + applicationProjects, +} from "@/components/WebsiteProjects"; +import { images } from "@/data/assets"; + +const CDN = + "https://meshkee-templates.sas.amin.parminstorage.ir/sites/user_themes/meshkee_SEEpb1zypk/assets/files"; + +export const metadata: Metadata = { + title: "طراحی اختصاصی اپلیکیشن | مشکی", + description: "طراحی و توسعه اپلیکیشن موبایل iOS و Android توسط تیم اختصاصی مشکی.", +}; + +export default function DedicatedApplicationPage() { + return ( + + } + > + + + ); +} diff --git a/src/app/globals.css b/src/app/globals.css index a2dc41e..336fcc5 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,26 +1,258 @@ @import "tailwindcss"; :root { - --background: #ffffff; - --foreground: #171717; + --ink: #0e1116; + --ink-soft: #2a313c; + --muted: #5c6672; + --line: #d5dbe3; + --paper: #eef1f4; + --paper-deep: #e2e7ee; + --surface: #fafafa; + --accent-from: #ff5a7a; + --accent-to: #9c4dff; + --accent: #c44db8; + --accent-deep: #8b3adb; + --glow: rgba(196, 77, 184, 0.16); + --brand-gradient: linear-gradient(135deg, var(--accent-from), var(--accent-to)); + --background: var(--paper); + --foreground: var(--ink); } @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); + --color-ink: var(--ink); + --color-ink-soft: var(--ink-soft); + --color-muted: var(--muted); + --color-line: var(--line); + --color-paper: var(--paper); + --color-paper-deep: var(--paper-deep); + --color-surface: var(--surface); + --color-accent: var(--accent); + --color-accent-deep: var(--accent-deep); + --color-accent-from: var(--accent-from); + --color-accent-to: var(--accent-to); + --font-sans: var(--font-vazirmatn); + --font-display: var(--font-montserrat); } -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +/* Rule: all interactive elements animate smoothly on hover */ +button, +a { + transition: + background 0.25s ease, + background-color 0.25s ease, + color 0.25s ease, + border-color 0.25s ease, + box-shadow 0.25s ease, + transform 0.2s ease, + opacity 0.2s ease; +} + +/* Headings: consistent weight matching hero h1 — titles stay on one row */ +h1, +h2 { + font-weight: 400; + white-space: nowrap; +} + +h3, +h4 { + font-weight: 400; +} + +::selection { + background: color-mix(in srgb, var(--accent) 28%, white); + color: var(--ink); +} + +.latin { + font-family: var(--font-montserrat), var(--font-vazirmatn), sans-serif; + letter-spacing: 0.04em; +} + +.text-body { + text-align: justify; + text-justify: inter-word; +} + +/* Gradient hover utilities */ +.btn-primary { + background: var(--ink); + color: var(--surface); + transition: + background 0.25s ease, + color 0.25s ease, + box-shadow 0.25s ease; +} + +.btn-primary:hover { + background: var(--brand-gradient); + color: #fff; +} + +.link-hover { + transition: color 0.25s ease; +} + +.link-hover:hover { + color: var(--accent); + background: var(--brand-gradient); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.border-hover { + transition: + border-color 0.25s ease, + box-shadow 0.25s ease; +} + +.border-hover:hover, +.group:hover .border-hover { + border-color: transparent; + background: + linear-gradient(#fff, #fff) padding-box, + var(--brand-gradient) border-box; + box-shadow: 0 0 0 1px transparent; +} + +.group-border-hover { + transition: + border-color 0.25s ease, + box-shadow 0.25s ease; +} + +.group-border-hover:hover, +.group:hover.group-border-hover, +.group:hover .group-border-hover, +a.group-border-hover:hover { + border-color: color-mix(in srgb, var(--accent) 55%, white); +} + +.group-text-hover { + transition: color 0.25s ease; +} + +.group:hover .group-text-hover { + color: var(--accent); +} + +.carousel-mask { + -ms-overflow-style: none; + scrollbar-width: none; +} + +.carousel-mask::-webkit-scrollbar { + display: none; +} + +.carousel-track { + animation: carousel-scroll 48s linear infinite; + will-change: transform; +} + +.carousel-track:hover { + animation-play-state: paused; +} + +@keyframes carousel-scroll { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-50%); } } -body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; +.mesh-grid { + background-image: + linear-gradient(rgba(14, 17, 22, 0.035) 1px, transparent 1px), + linear-gradient(90deg, rgba(14, 17, 22, 0.035) 1px, transparent 1px); + background-size: 48px 48px; + mask-image: radial-gradient(ellipse 70% 60% at 50% 30%, black 20%, transparent 75%); +} + +.mesh-glow { + background: + radial-gradient(ellipse 55% 45% at 78% 35%, var(--glow), transparent 70%), + radial-gradient(ellipse 40% 35% at 12% 70%, rgba(42, 49, 60, 0.08), transparent 65%), + linear-gradient(165deg, #f5f7fa 0%, #e8edf3 48%, #eef2f6 100%); +} + +@keyframes float-y { + 0%, + 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-12px); + } +} + +@keyframes rise-in { + from { + opacity: 0; + transform: translateY(28px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.animate-float { + animation: float-y 7s ease-in-out infinite; +} + +.reveal { + opacity: 0; + transform: translateY(28px); + transition: + opacity 0.8s cubic-bezier(0.22, 1, 0.36, 1), + transform 0.8s cubic-bezier(0.22, 1, 0.36, 1); +} + +.reveal.is-visible { + opacity: 1; + transform: translateY(0); +} + +.reveal-delay-1 { + transition-delay: 0.12s; +} +.reveal-delay-2 { + transition-delay: 0.24s; +} +.reveal-delay-3 { + transition-delay: 0.36s; +} + +@media (prefers-reduced-motion: reduce) { + .animate-float, + .reveal, + .carousel-track { + animation: none !important; + transition: none !important; + opacity: 1 !important; + transform: none !important; + } } diff --git a/src/app/graphic-designer/page.tsx b/src/app/graphic-designer/page.tsx new file mode 100644 index 0000000..5a25ec2 --- /dev/null +++ b/src/app/graphic-designer/page.tsx @@ -0,0 +1,146 @@ +import type { Metadata } from "next"; +import { ServicePageLayout } from "@/components/ServicePageLayout"; +import { GraphicBrands } from "@/components/GraphicBrands"; +import { + ProjectsShowcase, + graphicCatalogProjects, + graphicIdentityProjects, + graphicLogoProjects, +} from "@/components/WebsiteProjects"; +import { images } from "@/data/assets"; + +const CDN = + "https://meshkee-templates.sas.amin.parminstorage.ir/sites/user_themes/meshkee_SEEpb1zypk/assets/files"; +const ASSETS = + "https://meshkee-templates.sas.amin.parminstorage.ir/sites/user_themes/meshkee_SEEpb1zypk/assets"; + +export const metadata: Metadata = { + title: "طراحی گرافیک و هویت بصری | مشکی", + description: "طراحی لوگو، هویت بصری، کاتالوگ، بروشور و گرافیک شبکه‌های اجتماعی توسط تیم مشکی.", +}; + +export default function GraphicDesignerPage() { + return ( + + ), + }, + { + after: 2, + node: ( + <> + + + + ), + }, + { + after: 3, + node: ( + + ), + }, + ]} + /> + ); +} diff --git a/src/app/icon.png b/src/app/icon.png new file mode 100755 index 0000000..ee9f056 Binary files /dev/null and b/src/app/icon.png differ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 976eb90..de76373 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,20 +1,27 @@ import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; +import { Montserrat, Vazirmatn } from "next/font/google"; import "./globals.css"; -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], +const vazirmatn = Vazirmatn({ + variable: "--font-vazirmatn", + subsets: ["arabic", "latin"], + display: "swap", }); -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", +const montserrat = Montserrat({ + variable: "--font-montserrat", subsets: ["latin"], + display: "swap", }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "تیم برنامه‌نویسی و تجارت الکترونیک مشکی | Meshkee", + description: + "راهکارهای مدرن برای تجارت شما — طراحی وبسایت، اپلیکیشن، سیستم‌های مدیریتی، سئو و گرافیک توسط تیم مشکی.", + icons: { + icon: "/images/brand/mark-black.png", + apple: "/images/brand/mark-black.png", + }, }; export default function RootLayout({ @@ -24,10 +31,11 @@ export default function RootLayout({ }>) { return ( - {children} + {children} ); } diff --git a/src/app/meshkee-cms/page.tsx b/src/app/meshkee-cms/page.tsx new file mode 100644 index 0000000..d57f209 --- /dev/null +++ b/src/app/meshkee-cms/page.tsx @@ -0,0 +1,328 @@ +import type { Metadata } from "next"; +import { ServicePageLayout } from "@/components/ServicePageLayout"; +import { GraphicBrands, cmsBrands } from "@/components/GraphicBrands"; +import { images } from "@/data/assets"; + +const CDN = + "https://meshkee-templates.sas.amin.parminstorage.ir/sites/user_themes/meshkee_SEEpb1zypk/assets/files"; +const ASSETS = + "https://meshkee-templates.sas.amin.parminstorage.ir/sites/user_themes/meshkee_SEEpb1zypk/assets"; + +export const metadata: Metadata = { + title: "سیستم مدیریت یکپارچه مشکی | Meshkee CMS", + description: + "سیستم مدیریت یکپارچه مشکی شامل فروشگاه، مالی، انبار، باشگاه مشتریان و محتوا.", +}; + +export default function MeshkeeCmsPage() { + return ( + , + }, + ]} + /> + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 3f36f7c..8333cff 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,65 +1,31 @@ -import Image from "next/image"; +import { AppSection } from "@/components/AppSection"; +import { BlogSection } from "@/components/BlogSection"; +import { CmsSection } from "@/components/CmsSection"; +import { ContactSection } from "@/components/ContactSection"; +import { Footer } from "@/components/Footer"; +import { Header } from "@/components/Header"; +import { Hero } from "@/components/Hero"; +import { MediaSection } from "@/components/MediaSection"; +import { Portfolio } from "@/components/Portfolio"; +import { RevealObserver } from "@/components/RevealObserver"; +import { Services } from "@/components/Services"; -export default function Home() { +export default function HomePage() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
- + <> + +
+
+ + + + + + + +
-
+