Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed8994aaca | ||
|
|
21302f59ec | ||
|
|
ee81da8f70 | ||
|
|
bf7706fb2d | ||
|
|
dae31e9e83 | ||
|
|
fc30597835 |
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Runs on `git push`. If a tag ref is among what's being pushed, build locally
|
||||||
|
# and deploy to the server. Normal branch pushes are untouched.
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
deploy=0
|
||||||
|
tag=""
|
||||||
|
while read -r local_ref _local_sha _remote_ref _remote_sha; do
|
||||||
|
case "$local_ref" in
|
||||||
|
refs/tags/*)
|
||||||
|
deploy=1
|
||||||
|
tag="${local_ref#refs/tags/}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$deploy" = "1" ]; then
|
||||||
|
echo "→ Tag '$tag' is being pushed — building locally and deploying to the server…"
|
||||||
|
exec "$(git rev-parse --show-toplevel)/scripts/deploy.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -16,9 +16,9 @@ function App() {
|
|||||||
<>
|
<>
|
||||||
|
|
||||||
<SEOHead
|
<SEOHead
|
||||||
title="آرام لند - تمرین تنفسی و مدیتیشن"
|
title="آرام جان - تمرین تنفسی و مدیتیشن"
|
||||||
description="اپلیکیشن آرام لند - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی، تمرینهای تنفسی و موسیقی آرامشبخش"
|
description="اپلیکیشن آرام جان - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی، تمرینهای تنفسی و موسیقی آرامشبخش"
|
||||||
canonical="/" ogImage="../app/og-image.png" />
|
canonical="/" />
|
||||||
|
|
||||||
<div className="min-h-screen bg-gradient-to-b from-blue-50 via-white to-green-50" dir="rtl">
|
<div className="min-h-screen bg-gradient-to-b from-blue-50 via-white to-green-50" dir="rtl">
|
||||||
<Header />
|
<Header />
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ function BlogSection() {
|
|||||||
{
|
{
|
||||||
title: "تمرین تنفسی برای کاهش استرس",
|
title: "تمرین تنفسی برای کاهش استرس",
|
||||||
subtitle: "تکنیکهای ساده تنفسی برای کاهش فوری استرس و اضطراب",
|
subtitle: "تکنیکهای ساده تنفسی برای کاهش فوری استرس و اضطراب",
|
||||||
link: "https://aaramland.ir/blog/tmryn-tnfsy-bry-khhsh-strs.html",
|
link: "https://aramejan.com/blog/tmryn-tnfsy-bry-khhsh-strs.html",
|
||||||
readTime: "۵ دقیقه",
|
readTime: "۵ دقیقه",
|
||||||
date: "۱۴۰۴/۱/۱۵",
|
date: "۱۴۰۴/۱/۱۵",
|
||||||
category: "سلامت روان",
|
category: "سلامت روان",
|
||||||
@@ -19,7 +19,7 @@ function BlogSection() {
|
|||||||
{
|
{
|
||||||
title: "مدیتیشن چیست و چگونه شروع کنیم؟",
|
title: "مدیتیشن چیست و چگونه شروع کنیم؟",
|
||||||
subtitle: "راهنمای کامل برای شناخت مدیتیشن و شروع این سفر زیبا",
|
subtitle: "راهنمای کامل برای شناخت مدیتیشن و شروع این سفر زیبا",
|
||||||
link: "https://aaramland.ir/blog/mdytyshn-chyh.html",
|
link: "https://aramejan.com/blog/mdytyshn-chyh.html",
|
||||||
readTime: "۷ دقیقه",
|
readTime: "۷ دقیقه",
|
||||||
date: "۱۴۰۴/۱۰/۱۰",
|
date: "۱۴۰۴/۱۰/۱۰",
|
||||||
category: "آموزش",
|
category: "آموزش",
|
||||||
@@ -29,7 +29,7 @@ function BlogSection() {
|
|||||||
{
|
{
|
||||||
title: "مدیتیشن چیست و چگونه زندگیات را متحول میکند؟",
|
title: "مدیتیشن چیست و چگونه زندگیات را متحول میکند؟",
|
||||||
subtitle: "راهنمای کامل برای شناخت انواع مدیتیشن",
|
subtitle: "راهنمای کامل برای شناخت انواع مدیتیشن",
|
||||||
link: "https://aaramland.ir/blog/khls-shdn-z-strs-b-arm-lnd.html",
|
link: "https://aramejan.com/blog/khls-shdn-z-strs-b-arm-lnd.html",
|
||||||
readTime: "۸ دقیقه",
|
readTime: "۸ دقیقه",
|
||||||
date: "۱۴۰۴/۱۰/۰۵",
|
date: "۱۴۰۴/۱۰/۰۵",
|
||||||
category: "تحول شخصی",
|
category: "تحول شخصی",
|
||||||
@@ -113,7 +113,7 @@ function BlogSection() {
|
|||||||
{/* View All Button */}
|
{/* View All Button */}
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<Link
|
<Link
|
||||||
href="https://aaramland.ir/blog/"
|
href="https://aramejan.com/blog/"
|
||||||
className="inline-flex items-center gap-2 bg-gradient-to-r from-primary-500 to-primary-600 text-white font-medium py-3 px-8 rounded-2xl hover:shadow-lg transition-all duration-300 transform hover:scale-105 group"
|
className="inline-flex items-center gap-2 bg-gradient-to-r from-primary-500 to-primary-600 text-white font-medium py-3 px-8 rounded-2xl hover:shadow-lg transition-all duration-300 transform hover:scale-105 group"
|
||||||
>
|
>
|
||||||
<span>مشاهده همه مقالات</span>
|
<span>مشاهده همه مقالات</span>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ function CallToAction() {
|
|||||||
آماده برای <span className="text-primary-500">تغییر</span> زندگی؟
|
آماده برای <span className="text-primary-500">تغییر</span> زندگی؟
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-xl text-gray-700 mb-8 max-w-2xl mx-auto leading-relaxed">
|
<p className="text-xl text-gray-700 mb-8 max-w-2xl mx-auto leading-relaxed">
|
||||||
امروز اولین قدم رو بردار و ببین چطور آرام لند میتونه کیفیت زندگیات رو متحول کنه
|
امروز اولین قدم رو بردار و ببین چطور آرام جان میتونه کیفیت زندگیات رو متحول کنه
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center">
|
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center">
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ function DownloadSection() {
|
|||||||
icon: './images/appstore.png',
|
icon: './images/appstore.png',
|
||||||
title: "وب سایت",
|
title: "وب سایت",
|
||||||
description: "نسخه وب برای تمام دستگاهها",
|
description: "نسخه وب برای تمام دستگاهها",
|
||||||
link: 'https://aaramland.ir/web/',
|
link: 'https://app.aramejan.com',
|
||||||
badge: "",
|
badge: "",
|
||||||
gradient: "from-primary-500/10 to-primary-600/10",
|
gradient: "from-primary-500/10 to-primary-600/10",
|
||||||
animation: "animate-slideInRight delay-300",
|
animation: "animate-slideInRight delay-300",
|
||||||
@@ -47,7 +47,7 @@ function DownloadSection() {
|
|||||||
همین حالا <span className="text-primary-500">شروع کنید</span>
|
همین حالا <span className="text-primary-500">شروع کنید</span>
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-xl text-gray-600 max-w-2xl mx-auto">
|
<p className="text-xl text-gray-600 max-w-2xl mx-auto">
|
||||||
آرام لند را روی دستگاه مورد علاقهتان نصب کنید
|
آرام جان را روی دستگاه مورد علاقهتان نصب کنید
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { useScroll } from '../hooks/useScroll';
|
import { useScroll } from '../hooks/useScroll';
|
||||||
|
import LotusLogo from './LotusLogo';
|
||||||
|
|
||||||
function Footer() {
|
function Footer() {
|
||||||
const { scrollToSectionWithHeader } = useScroll();
|
const { scrollToSectionWithHeader } = useScroll();
|
||||||
@@ -12,11 +13,9 @@ function Footer() {
|
|||||||
{/* Brand Column */}
|
{/* Brand Column */}
|
||||||
<div className="lg:col-span-2">
|
<div className="lg:col-span-2">
|
||||||
<div className="flex items-center gap-3 mb-6">
|
<div className="flex items-center gap-3 mb-6">
|
||||||
<div className="bg-gradient-to-r from-primary-500 to-primary-600 w-10 h-10 rounded-xl flex items-center justify-center">
|
<LotusLogo className="w-11 h-11 drop-shadow-sm" />
|
||||||
<span className="text-white font-bold text-lg">آ</span>
|
|
||||||
</div>
|
|
||||||
<div className="text-2xl font-bold bg-gradient-to-r from-primary-500 to-primary-600 bg-clip-text text-transparent">
|
<div className="text-2xl font-bold bg-gradient-to-r from-primary-500 to-primary-600 bg-clip-text text-transparent">
|
||||||
آرام لند
|
آرام جان
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-gray-600 leading-relaxed mb-6 max-w-md">
|
<p className="text-gray-600 leading-relaxed mb-6 max-w-md">
|
||||||
@@ -44,7 +43,7 @@ function Footer() {
|
|||||||
{[
|
{[
|
||||||
{ name: 'ویژگیها', section: 'features' },
|
{ name: 'ویژگیها', section: 'features' },
|
||||||
{ name: 'امکانات', section: 'what-you-can-do' },
|
{ name: 'امکانات', section: 'what-you-can-do' },
|
||||||
{ name: 'چرا آرام لند', section: 'why-aramland' },
|
{ name: 'چرا آرام جان', section: 'why-aramland' },
|
||||||
{ name: 'ارتباط با تیم', href: 'https://approagency.ir/' }
|
{ name: 'ارتباط با تیم', href: 'https://approagency.ir/' }
|
||||||
].map((link) => (
|
].map((link) => (
|
||||||
<li key={link.name}>
|
<li key={link.name}>
|
||||||
@@ -107,7 +106,7 @@ function Footer() {
|
|||||||
<div className="flex flex-col md:flex-row justify-between items-center gap-4">
|
<div className="flex flex-col md:flex-row justify-between items-center gap-4">
|
||||||
<div className="text-center md:text-right">
|
<div className="text-center md:text-right">
|
||||||
<p className="text-gray-600 mb-2">
|
<p className="text-gray-600 mb-2">
|
||||||
© 1404 آرام لند - همراه تو برای یک زندگی آرامتر
|
© 1404 آرام جان - همراه تو برای یک زندگی آرامتر
|
||||||
</p>
|
</p>
|
||||||
<p className="text-gray-500 text-sm">
|
<p className="text-gray-500 text-sm">
|
||||||
ساخته شده با عشق برای مردم ایران
|
ساخته شده با عشق برای مردم ایران
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import { useScroll } from '../hooks/useScroll';
|
import { useScroll } from '../hooks/useScroll';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { Menu, X } from 'lucide-react';
|
import { Menu, X } from 'lucide-react';
|
||||||
|
import LotusLogo from './LotusLogo';
|
||||||
|
|
||||||
function Header() {
|
function Header() {
|
||||||
const { scrollToSectionWithHeader } = useScroll();
|
const { scrollToSectionWithHeader } = useScroll();
|
||||||
@@ -26,11 +27,9 @@ function Header() {
|
|||||||
<div className="max-w-6xl mx-auto flex justify-between items-center">
|
<div className="max-w-6xl mx-auto flex justify-between items-center">
|
||||||
{/* Logo */}
|
{/* Logo */}
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<div className="bg-gradient-to-r from-primary-500 to-primary-600 w-8 h-8 rounded-xl flex items-center justify-center">
|
<LotusLogo className="w-9 h-9 drop-shadow-sm" />
|
||||||
<span className="text-white font-bold text-sm">آ</span>
|
|
||||||
</div>
|
|
||||||
<div className="text-xl sm:text-2xl font-bold bg-gradient-to-r from-primary-500 to-primary-600 bg-clip-text text-transparent">
|
<div className="text-xl sm:text-2xl font-bold bg-gradient-to-r from-primary-500 to-primary-600 bg-clip-text text-transparent">
|
||||||
آرام لند
|
آرام جان
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ function Header() {
|
|||||||
key={item.id}
|
key={item.id}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (item.id === 'blog') {
|
if (item.id === 'blog') {
|
||||||
window.open('https://aramland.approagency.ir/blog/', '_self');
|
window.open('https://aramejan.com/blog/', '_self');
|
||||||
} else {
|
} else {
|
||||||
handleNavClick(item.id);
|
handleNavClick(item.id);
|
||||||
}
|
}
|
||||||
@@ -86,7 +85,7 @@ function Header() {
|
|||||||
key={item.id}
|
key={item.id}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (item.id === 'blog') {
|
if (item.id === 'blog') {
|
||||||
window.open('https://aramland.approagency.ir/blog/', '_self');
|
window.open('https://aramejan.com/blog/', '_self');
|
||||||
} else {
|
} else {
|
||||||
handleNavClick(item.id);
|
handleNavClick(item.id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import DownloadSection from "./DownloadSection";
|
import DownloadSection from "./DownloadSection";
|
||||||
import { useScroll } from '../hooks/useScroll';
|
import { useScroll } from '../hooks/useScroll';
|
||||||
|
import LotusLogo from "./LotusLogo";
|
||||||
function Hero() {
|
function Hero() {
|
||||||
const { scrollToSectionWithHeader } = useScroll();
|
const { scrollToSectionWithHeader } = useScroll();
|
||||||
return (
|
return (
|
||||||
@@ -8,28 +9,37 @@ function Hero() {
|
|||||||
{/* Background decoration */}
|
{/* Background decoration */}
|
||||||
<div className="absolute inset-0 overflow-hidden pointer-events-none rounded-3xl">
|
<div className="absolute inset-0 overflow-hidden pointer-events-none rounded-3xl">
|
||||||
<div className="absolute -top-20 -right-20 w-72 h-72 bg-primary-500 opacity-10 rounded-full blur-3xl"></div>
|
<div className="absolute -top-20 -right-20 w-72 h-72 bg-primary-500 opacity-10 rounded-full blur-3xl"></div>
|
||||||
<div className="absolute -bottom-20 -left-20 w-72 h-72 bg-primary-500 opacity-10 rounded-full blur-3xl"></div>
|
<div className="absolute -bottom-20 -left-20 w-72 h-72 bg-primary-400 opacity-10 rounded-full blur-3xl"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<div className="mb-8 animate-float">
|
{/* App logo */}
|
||||||
<div className="relative inline-block">
|
<div className="mb-6 flex justify-center">
|
||||||
|
<div className="relative inline-block animate-float">
|
||||||
<div className="absolute inset-0 bg-gradient-to-r from-primary-500 to-primary-600 opacity-20 blur-xl rounded-full"></div>
|
<div className="absolute inset-0 bg-gradient-to-r from-primary-500 to-primary-600 blur-2xl rounded-full animate-pulseGlow"></div>
|
||||||
|
<div className="relative w-24 h-24 sm:w-28 sm:h-28 rounded-[26px] overflow-hidden shadow-2xl shadow-primary-500/40">
|
||||||
|
<LotusLogo className="w-full h-full" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h1 className="text-5xl md:text-7xl font-bold text-gray-900 mb-1 leading-tight animate-fadeInUp">
|
{/* Badge */}
|
||||||
آرامش را در
|
<div className="inline-flex items-center gap-2 bg-primary-500/10 text-primary-600 px-4 py-2 rounded-full text-sm font-medium mb-6 animate-fadeInUp">
|
||||||
|
<span>🌿</span>
|
||||||
|
مدیتیشن، تمرین تنفسی و آرامش فارسی
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1 className="text-5xl md:text-7xl font-bold text-gray-900 mb-4 leading-tight animate-fadeInUp">
|
||||||
|
آرامش را در
|
||||||
<span className="bg-gradient-to-r from-primary-500 to-primary-600 bg-clip-text text-transparent"> هر لحظه </span>
|
<span className="bg-gradient-to-r from-primary-500 to-primary-600 bg-clip-text text-transparent"> هر لحظه </span>
|
||||||
تجربه کنید
|
تجربه کنید
|
||||||
</h1>
|
</h1>
|
||||||
|
<p className="text-lg md:text-xl text-gray-600 max-w-2xl mx-auto animate-fadeInUp delay-100">
|
||||||
|
با آرام جان هر روز چند دقیقه برای خودت وقت بگذار؛ ذهنی آرامتر، خوابی عمیقتر و انرژیای تازه.
|
||||||
|
</p>
|
||||||
<DownloadSection />
|
<DownloadSection />
|
||||||
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center animate-fadeInUp delay-200">
|
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center animate-fadeInUp delay-200">
|
||||||
{/* <button className="bg-gradient-to-r from-primary-500 to-primary-600 text-white font-bold py-4 px-8 rounded-2xl hover:shadow-2xl transition-all duration-300 transform hover:scale-105 text-lg shadow-lg hover:shadow-primary-500/25">
|
<button onClick={() => scrollToSectionWithHeader('what-you-can-do')} className="bg-gradient-to-r from-primary-500 to-primary-600 border-2 border-transparent text-white font-bold py-4 px-8 rounded-2xl hover:shadow-2xl hover:shadow-primary-500/30 transition-all duration-300 transform hover:scale-105">
|
||||||
شروع کنید رایگان
|
|
||||||
</button> */}
|
|
||||||
<button onClick={() => scrollToSectionWithHeader('what-you-can-do')} className=" bg-gradient-to-r from-primary-500 to-primary-600 border-2 text-white font-bold py-4 px-8 rounded-2xl hover:border-primary-200 hover:text-primary-50 transition-all duration-300">
|
|
||||||
مشاهده ویژگیها
|
مشاهده ویژگیها
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -37,11 +47,11 @@ function Hero() {
|
|||||||
{/* Trust indicators */}
|
{/* Trust indicators */}
|
||||||
<div className="mt-12 animate-fadeInUp delay-300">
|
<div className="mt-12 animate-fadeInUp delay-300">
|
||||||
<p className="text-gray-500 text-sm mb-4">مورد اعتماد هزاران کاربر</p>
|
<p className="text-gray-500 text-sm mb-4">مورد اعتماد هزاران کاربر</p>
|
||||||
<div className="flex justify-center items-center gap-8 opacity-60">
|
<div className="flex justify-center items-center gap-8 opacity-80">
|
||||||
<div className="text-2xl font-bold text-primary-500">★ ۴.۹</div>
|
<div className="text-2xl font-bold text-primary-500">★ ۴.۹</div>
|
||||||
<div className="h-4 w-px bg-primary-500"></div>
|
<div className="h-4 w-px bg-primary-300"></div>
|
||||||
<div className="text-primary-500 font-bold">+۱۰۰۰ دانلود</div>
|
<div className="text-primary-500 font-bold">+۱۰۰۰ دانلود</div>
|
||||||
<div className="h-4 w-px bg-primary-500"></div>
|
<div className="h-4 w-px bg-primary-300"></div>
|
||||||
<div className="text-primary-500 font-bold ">۹۸٪ رضایت</div>
|
<div className="text-primary-500 font-bold ">۹۸٪ رضایت</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// Brand mark for آرام جان — the real app icon (blue→indigo lotus) served as a
|
||||||
|
// vector from /logo.svg, so it stays crisp at any size and matches the store
|
||||||
|
// icon exactly. Size it with `className` (e.g. "w-9 h-9"); corners are rounded
|
||||||
|
// like an app icon.
|
||||||
|
function LotusLogo({ className = "w-9 h-9", title = "آرام جان" }) {
|
||||||
|
return (
|
||||||
|
<span className={`inline-block overflow-hidden rounded-[22%] ${className}`}>
|
||||||
|
<img
|
||||||
|
src="/logo.svg"
|
||||||
|
alt={title}
|
||||||
|
className="w-full h-full object-cover"
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LotusLogo;
|
||||||
@@ -2,10 +2,10 @@
|
|||||||
export function SEOHead({
|
export function SEOHead({
|
||||||
title,
|
title,
|
||||||
description,
|
description,
|
||||||
canonical,
|
canonical,
|
||||||
ogImage
|
ogImage = ''
|
||||||
}) {
|
}) {
|
||||||
const siteUrl = 'https://aramland.approagency.ir/';
|
const siteUrl = 'https://aramejan.com';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -19,14 +19,14 @@ export function SEOHead({
|
|||||||
<meta property="og:title" content={title} />
|
<meta property="og:title" content={title} />
|
||||||
<meta property="og:description" content={description} />
|
<meta property="og:description" content={description} />
|
||||||
<meta property="og:url" content={`${siteUrl}${canonical}`} />
|
<meta property="og:url" content={`${siteUrl}${canonical}`} />
|
||||||
<meta property="og:image" content={ogImage || `${siteUrl}/og-image.png`} />
|
<meta property="og:image" content={ogImage || `${siteUrl}/og-image.jpg`} />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:locale" content="fa_IR" />
|
<meta property="og:locale" content="fa_IR" />
|
||||||
|
|
||||||
{/* Twitter */}
|
{/* Twitter */}
|
||||||
<meta name="twitter:title" content={title} />
|
<meta name="twitter:title" content={title} />
|
||||||
<meta name="twitter:description" content={description} />
|
<meta name="twitter:description" content={description} />
|
||||||
<meta name="twitter:image" content={ogImage || `${siteUrl}/og-image.png`} />
|
<meta name="twitter:image" content={ogImage || `${siteUrl}/og-image.jpg`} />
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -60,10 +60,10 @@ function WhyAramland() {
|
|||||||
<div className="text-center mb-16">
|
<div className="text-center mb-16">
|
||||||
<div className="inline-flex items-center gap-2 bg-primary-500/10 text-primary-500 px-4 py-2 rounded-full text-sm font-medium mb-4">
|
<div className="inline-flex items-center gap-2 bg-primary-500/10 text-primary-500 px-4 py-2 rounded-full text-sm font-medium mb-4">
|
||||||
<span className="text-lg">🚀</span>
|
<span className="text-lg">🚀</span>
|
||||||
برتری آرام لند
|
برتری آرام جان
|
||||||
</div>
|
</div>
|
||||||
<h2 className="text-4xl md:text-5xl font-bold text-gray-900 mb-4">
|
<h2 className="text-4xl md:text-5xl font-bold text-gray-900 mb-4">
|
||||||
چرا <span className="text-primary-500">هزاران نفر</span> آرام لند را انتخاب میکنند؟
|
چرا <span className="text-primary-500">هزاران نفر</span> آرام جان را انتخاب میکنند؟
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-xl text-gray-600 max-w-2xl mx-auto">
|
<p className="text-xl text-gray-600 max-w-2xl mx-auto">
|
||||||
تجربهای متفاوت از آرامش، طراحی شده مخصوص فارسیزبانان
|
تجربهای متفاوت از آرامش، طراحی شده مخصوص فارسیزبانان
|
||||||
@@ -129,7 +129,7 @@ function WhyAramland() {
|
|||||||
<div className="flex flex-col md:flex-row items-center justify-between gap-6">
|
<div className="flex flex-col md:flex-row items-center justify-between gap-6">
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<h4 className="text-2xl font-bold text-gray-900 mb-3">
|
<h4 className="text-2xl font-bold text-gray-900 mb-3">
|
||||||
👥 عضو جامعه هزاران نفری آرام لند شوید
|
👥 عضو جامعه هزاران نفری آرام جان شوید
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-gray-700 leading-relaxed">
|
<p className="text-gray-700 leading-relaxed">
|
||||||
به خانوادهای از کاربران خوشحال بپیوندید که هر روز قدمی به سمت آرامش برمیدارند
|
به خانوادهای از کاربران خوشحال بپیوندید که هر روز قدمی به سمت آرامش برمیدارند
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 676 KiB |
@@ -68,4 +68,50 @@ body {
|
|||||||
color: var(--foreground);
|
color: var(--foreground);
|
||||||
font-family: 'Dana', 'Inter', Arial, Helvetica, sans-serif;
|
font-family: 'Dana', 'Inter', Arial, Helvetica, sans-serif;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===== Brand motion =====
|
||||||
|
The markup already references these animation classes; define them here so
|
||||||
|
the landing page feels alive (entrance reveals, floating logo, soft glow). */
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from { opacity: 0; transform: translateY(30px); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
@keyframes slideInLeft {
|
||||||
|
from { opacity: 0; transform: translateX(-40px); }
|
||||||
|
to { opacity: 1; transform: translateX(0); }
|
||||||
|
}
|
||||||
|
@keyframes slideInRight {
|
||||||
|
from { opacity: 0; transform: translateX(40px); }
|
||||||
|
to { opacity: 1; transform: translateX(0); }
|
||||||
|
}
|
||||||
|
@keyframes floatY {
|
||||||
|
0%, 100% { transform: translateY(0); }
|
||||||
|
50% { transform: translateY(-14px); }
|
||||||
|
}
|
||||||
|
@keyframes pulseGlow {
|
||||||
|
0%, 100% { opacity: .3; transform: scale(1); }
|
||||||
|
50% { opacity: .6; transform: scale(1.08); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-fadeInUp { animation: fadeInUp 0.7s ease-out both; }
|
||||||
|
.animate-slideInLeft { animation: slideInLeft 0.7s ease-out both; }
|
||||||
|
.animate-slideInRight { animation: slideInRight 0.7s ease-out both; }
|
||||||
|
.animate-float { animation: floatY 5s ease-in-out infinite; }
|
||||||
|
.animate-pulseGlow { animation: pulseGlow 4s ease-in-out infinite; }
|
||||||
|
|
||||||
|
/* Stagger helpers — apply animation-delay on top of the entrance animations */
|
||||||
|
.delay-100 { animation-delay: .1s; }
|
||||||
|
.delay-200 { animation-delay: .2s; }
|
||||||
|
.delay-300 { animation-delay: .3s; }
|
||||||
|
.delay-400 { animation-delay: .4s; }
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.animate-fadeInUp,
|
||||||
|
.animate-slideInLeft,
|
||||||
|
.animate-slideInRight,
|
||||||
|
.animate-float,
|
||||||
|
.animate-pulseGlow {
|
||||||
|
animation: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
<svg width="600" height="600" viewBox="0 0 600 600" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_2449_11924)">
|
||||||
|
<rect width="600" height="600" fill="white"/>
|
||||||
|
<rect width="600" height="600" fill="url(#paint0_linear_2449_11924)"/>
|
||||||
|
<mask id="mask0_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="67" y="127" width="307" height="307">
|
||||||
|
<circle cx="220.588" cy="280.488" r="152.894" fill="url(#paint1_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask0_2449_11924)">
|
||||||
|
<circle cx="379.598" cy="280.488" r="152.894" fill="url(#paint2_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask1_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="9" y="185" width="307" height="306">
|
||||||
|
<circle cx="162.544" cy="337.995" r="152.894" transform="rotate(-30 162.544 337.995)" fill="url(#paint3_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask1_2449_11924)">
|
||||||
|
<circle cx="300.25" cy="258.49" r="152.894" transform="rotate(-30 300.25 258.49)" fill="url(#paint4_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask2_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="145" y="105" width="307" height="307">
|
||||||
|
<circle cx="298.619" cy="258.491" r="152.894" transform="rotate(30 298.619 258.491)" fill="url(#paint5_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask2_2449_11924)">
|
||||||
|
<circle cx="436.325" cy="337.996" r="152.894" transform="rotate(30 436.325 337.996)" fill="url(#paint6_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask3_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="226" y="124" width="306" height="307">
|
||||||
|
<circle cx="379.004" cy="277.486" r="152.894" transform="rotate(60 379.004 277.486)" fill="url(#paint7_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask3_2449_11924)">
|
||||||
|
<circle cx="458.509" cy="415.192" r="152.894" transform="rotate(60 458.509 415.192)" fill="url(#paint8_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask4_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="-13" y="262" width="307" height="307">
|
||||||
|
<circle cx="140.491" cy="415.192" r="152.894" transform="rotate(-60 140.491 415.192)" fill="url(#paint9_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask4_2449_11924)">
|
||||||
|
<circle cx="219.996" cy="277.486" r="152.894" transform="rotate(-60 219.996 277.486)" fill="url(#paint10_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<ellipse cx="300.093" cy="434.911" rx="29.0498" ry="33.6366" fill="url(#paint11_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_2449_11924" x1="300" y1="0" x2="300" y2="600" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#3ABDEB"/>
|
||||||
|
<stop offset="1" stop-color="#553AEB"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_2449_11924" x1="220.588" y1="127.595" x2="220.588" y2="433.382" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_2449_11924" x1="379.598" y1="127.595" x2="379.598" y2="433.382" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint3_linear_2449_11924" x1="162.544" y1="185.102" x2="162.544" y2="490.889" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint4_linear_2449_11924" x1="300.25" y1="105.597" x2="300.25" y2="411.384" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint5_linear_2449_11924" x1="298.619" y1="105.597" x2="298.619" y2="411.384" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint6_linear_2449_11924" x1="436.325" y1="185.102" x2="436.325" y2="490.889" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint7_linear_2449_11924" x1="379.004" y1="124.592" x2="379.004" y2="430.38" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint8_linear_2449_11924" x1="458.509" y1="262.298" x2="458.509" y2="568.086" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint9_linear_2449_11924" x1="140.491" y1="262.298" x2="140.491" y2="568.085" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint10_linear_2449_11924" x1="219.996" y1="124.593" x2="219.996" y2="430.38" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint11_linear_2449_11924" x1="300.093" y1="401.274" x2="300.093" y2="420.805" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white" stop-opacity="0.4"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_2449_11924">
|
||||||
|
<rect width="600" height="600" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.1 KiB |
@@ -2,20 +2,20 @@ import type { Metadata } from 'next';
|
|||||||
import './globals.css';
|
import './globals.css';
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: 'آرام لند | تمرین تنفسی و مدیتیشن',
|
title: 'آرام جان | تمرین تنفسی و مدیتیشن',
|
||||||
description: 'لحظهای آرام بگیر، زندگی را حس کن',
|
description: 'لحظهای آرام بگیر، زندگی را حس کن',
|
||||||
keywords: ['مدیتیشن فارسی', 'آرامش', 'تمرین تنفسی', 'کاهش استرس', 'ذهنآگاهی', 'مدیتیشن هدایت شده', 'سلامت روان', 'آرام لند'],
|
keywords: ['مدیتیشن فارسی', 'آرامش', 'تمرین تنفسی', 'کاهش استرس', 'ذهنآگاهی', 'مدیتیشن هدایت شده', 'سلامت روان', 'آرام جان'],
|
||||||
authors: [{ name: 'آرام لند' }],
|
authors: [{ name: 'آرام جان' }],
|
||||||
creator: 'آرام لند',
|
creator: 'آرام جان',
|
||||||
publisher: 'آرام لند',
|
publisher: 'آرام جان',
|
||||||
metadataBase: new URL('https://aramland.approagency.ir/'),
|
metadataBase: new URL('https://aramejan.com'),
|
||||||
formatDetection: {
|
formatDetection: {
|
||||||
email: false,
|
email: false,
|
||||||
address: false,
|
address: false,
|
||||||
telephone: false,
|
telephone: false,
|
||||||
},
|
},
|
||||||
icons: {
|
icons: {
|
||||||
icon: '/favicon.png',
|
icon: '/icon.svg',
|
||||||
},
|
},
|
||||||
alternates: {
|
alternates: {
|
||||||
canonical: '/',
|
canonical: '/',
|
||||||
@@ -24,16 +24,16 @@ export const metadata: Metadata = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
openGraph: {
|
openGraph: {
|
||||||
title: 'آرام لند - دستیار آرامش و مدیتیشن فارسی',
|
title: 'آرام جان - دستیار آرامش و مدیتیشن فارسی',
|
||||||
description: 'اپلیکیشن آرام لند - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی و تمرینهای تنفسی',
|
description: 'اپلیکیشن آرام جان - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی و تمرینهای تنفسی',
|
||||||
url: 'https://aramland.approagency.ir/',
|
url: '/',
|
||||||
siteName: 'آرام لند',
|
siteName: 'آرام جان',
|
||||||
images: [
|
images: [
|
||||||
{
|
{
|
||||||
url: '/og-image.png', // Create this image (1200x630px)
|
url: '/og-image.jpg',
|
||||||
width: 1200,
|
width: 1067,
|
||||||
height: 630,
|
height: 600,
|
||||||
alt: ' آرام لند - اپلیکیشن مدیتیشن و آرامش - تمرین تنفسی',
|
alt: ' آرام جان - اپلیکیشن مدیتیشن و آرامش - تمرین تنفسی',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
@@ -43,9 +43,9 @@ export const metadata: Metadata = {
|
|||||||
|
|
||||||
twitter: {
|
twitter: {
|
||||||
card: 'summary_large_image',
|
card: 'summary_large_image',
|
||||||
title: 'آرام لند - تمرین تنفسی و مدیتیشن',
|
title: 'آرام جان - تمرین تنفسی و مدیتیشن',
|
||||||
description: 'اپلیکیشن آرام لند - همراه شما برای رسیدن به آرامش درونی',
|
description: 'اپلیکیشن آرام جان - همراه شما برای رسیدن به آرامش درونی',
|
||||||
images: ['/og-image.png'],
|
images: ['/og-image.jpg'],
|
||||||
creator: '@aramland', // Replace with your Twitter handle
|
creator: '@aramland', // Replace with your Twitter handle
|
||||||
},
|
},
|
||||||
robots: {
|
robots: {
|
||||||
@@ -78,10 +78,9 @@ export default function RootLayout({
|
|||||||
name="google-site-verification"
|
name="google-site-verification"
|
||||||
content="HIKgdf_siYdPxbJ2P1792opMprpxci_QjE-quk9kyi8"
|
content="HIKgdf_siYdPxbJ2P1792opMprpxci_QjE-quk9kyi8"
|
||||||
/>
|
/>
|
||||||
{/* Favicon */}
|
{/* Favicon — lotus mark (آرام جان) */}
|
||||||
<link rel="icon" href="/favicon.ico" sizes="any" />
|
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
|
||||||
<link rel="icon" href="/icon?<generated>" type="image/<generated>" sizes="<generated>" />
|
<link rel="apple-touch-icon" href="/logo-aram.png" />
|
||||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
||||||
|
|
||||||
{/* Preload critical resources */}
|
{/* Preload critical resources */}
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
@@ -99,9 +98,9 @@ export default function RootLayout({
|
|||||||
"ratingValue": "4.5",
|
"ratingValue": "4.5",
|
||||||
"ratingCount": "1000"
|
"ratingCount": "1000"
|
||||||
},
|
},
|
||||||
"name": "آرام لند",
|
"name": "آرام جان",
|
||||||
"description": "اپلیکیشن آرام لند - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی و تمرینهای تنفسی",
|
"description": "اپلیکیشن آرام جان - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی و تمرینهای تنفسی",
|
||||||
"url": "https://aramland.approagency.ir/",
|
"url": "https://aramejan.com/",
|
||||||
"applicationCategory": "HealthApplication",
|
"applicationCategory": "HealthApplication",
|
||||||
"operatingSystem": "Android, iOS, Web",
|
"operatingSystem": "Android, iOS, Web",
|
||||||
"offers": {
|
"offers": {
|
||||||
@@ -111,7 +110,7 @@ export default function RootLayout({
|
|||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
"@type": "Organization",
|
"@type": "Organization",
|
||||||
"name": "آرام لند"
|
"name": "آرام جان"
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}}
|
}}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.4 MiB |
@@ -5,7 +5,8 @@ Disallow: /api/
|
|||||||
Disallow: /_next/
|
Disallow: /_next/
|
||||||
Disallow: /private/
|
Disallow: /private/
|
||||||
|
|
||||||
Sitemap: https://aramland.approagency.ir/sitemap.xml
|
Sitemap: https://aramejan.com/sitemap.xml
|
||||||
|
Sitemap: https://aramejan.com/blog/sitemap.xml
|
||||||
|
|
||||||
# Iranian search engines
|
# Iranian search engines
|
||||||
User-agent: YoozBot
|
User-agent: YoozBot
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
// app/sitemap.js
|
// app/sitemap.js
|
||||||
|
// Required for `output: 'export'` so Next emits a static /sitemap.xml.
|
||||||
|
export const dynamic = 'force-static';
|
||||||
|
|
||||||
export default function sitemap() {
|
export default function sitemap() {
|
||||||
const baseUrl = 'https://aaramland.ir/';
|
const baseUrl = 'https://aramejan.com/';
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
@@ -9,34 +12,33 @@ export default function sitemap() {
|
|||||||
changeFrequency: 'weekly',
|
changeFrequency: 'weekly',
|
||||||
priority: 1,
|
priority: 1,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
url: `${baseUrl}blog/`,
|
// ⬇️ مقالات بلاگ — بعد از اینکه بلاگ روی aramejan.com/blog/ منتشر شد،
|
||||||
lastModified: new Date(),
|
// اینها را از کامنت خارج کن. تا وقتی بلاگ بالا نیامده، در سایتمپ نباشند
|
||||||
changeFrequency: 'weekly',
|
// تا در سرچ کنسول خطای «صفحه یافت نشد / 404» نگیری.
|
||||||
priority: 0.9,
|
// {
|
||||||
},
|
// url: `${baseUrl}blog/`,
|
||||||
{
|
// lastModified: new Date(),
|
||||||
url: `${baseUrl}blog/tmryn-tnfsy-bry-khhsh-strs.html`,
|
// changeFrequency: 'weekly',
|
||||||
lastModified: new Date(),
|
// priority: 0.9,
|
||||||
changeFrequency: 'weekly',
|
// },
|
||||||
priority: 0.8,
|
// {
|
||||||
},
|
// url: `${baseUrl}blog/tmryn-tnfsy-bry-khhsh-strs.html`,
|
||||||
{
|
// lastModified: new Date(),
|
||||||
url: `${baseUrl}blog/mdytyshn-chyh.html`,
|
// changeFrequency: 'monthly',
|
||||||
lastModified: new Date(),
|
// priority: 0.8,
|
||||||
changeFrequency: 'weekly',
|
// },
|
||||||
priority: 0.7,
|
// {
|
||||||
},
|
// url: `${baseUrl}blog/mdytyshn-chyh.html`,
|
||||||
{
|
// lastModified: new Date(),
|
||||||
url: `${baseUrl}blog/khls-shdn-z-strs-b-arm-lnd.html`,
|
// changeFrequency: 'monthly',
|
||||||
lastModified: new Date(),
|
// priority: 0.7,
|
||||||
changeFrequency: 'weekly',
|
// },
|
||||||
priority: 0.6,
|
// {
|
||||||
},
|
// url: `${baseUrl}blog/khls-shdn-z-strs-b-arm-lnd.html`,
|
||||||
|
// lastModified: new Date(),
|
||||||
|
// changeFrequency: 'monthly',
|
||||||
|
// priority: 0.6,
|
||||||
|
// },
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add this export for static generation
|
|
||||||
export async function generateSitemaps() {
|
|
||||||
return [{ id: '0' }];
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,8 @@
|
|||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "eslint"
|
"lint": "eslint",
|
||||||
|
"deploy": "bash scripts/deploy.sh"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"framer-motion": "^12.23.24",
|
"framer-motion": "^12.23.24",
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"relation": ["delegate_permission/common.handle_all_urls"],
|
||||||
|
"target": {
|
||||||
|
"namespace": "android_app",
|
||||||
|
"package_name": "com.approagency.meditation",
|
||||||
|
"sha256_cert_fingerprints": [
|
||||||
|
"7B:43:79:DE:71:EB:86:4B:60:FF:8D:CC:49:7C:D3:F7:91:7B:86:EB:30:B7:2C:1A:CD:98:44:AC:34:9E:E4:DA"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 677 KiB |
|
After Width: | Height: | Size: 396 KiB |
@@ -0,0 +1,90 @@
|
|||||||
|
<svg width="600" height="600" viewBox="0 0 600 600" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_2449_11924)">
|
||||||
|
<rect width="600" height="600" fill="white"/>
|
||||||
|
<rect width="600" height="600" fill="url(#paint0_linear_2449_11924)"/>
|
||||||
|
<mask id="mask0_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="67" y="127" width="307" height="307">
|
||||||
|
<circle cx="220.588" cy="280.488" r="152.894" fill="url(#paint1_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask0_2449_11924)">
|
||||||
|
<circle cx="379.598" cy="280.488" r="152.894" fill="url(#paint2_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask1_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="9" y="185" width="307" height="306">
|
||||||
|
<circle cx="162.544" cy="337.995" r="152.894" transform="rotate(-30 162.544 337.995)" fill="url(#paint3_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask1_2449_11924)">
|
||||||
|
<circle cx="300.25" cy="258.49" r="152.894" transform="rotate(-30 300.25 258.49)" fill="url(#paint4_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask2_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="145" y="105" width="307" height="307">
|
||||||
|
<circle cx="298.619" cy="258.491" r="152.894" transform="rotate(30 298.619 258.491)" fill="url(#paint5_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask2_2449_11924)">
|
||||||
|
<circle cx="436.325" cy="337.996" r="152.894" transform="rotate(30 436.325 337.996)" fill="url(#paint6_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask3_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="226" y="124" width="306" height="307">
|
||||||
|
<circle cx="379.004" cy="277.486" r="152.894" transform="rotate(60 379.004 277.486)" fill="url(#paint7_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask3_2449_11924)">
|
||||||
|
<circle cx="458.509" cy="415.192" r="152.894" transform="rotate(60 458.509 415.192)" fill="url(#paint8_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask4_2449_11924" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="-13" y="262" width="307" height="307">
|
||||||
|
<circle cx="140.491" cy="415.192" r="152.894" transform="rotate(-60 140.491 415.192)" fill="url(#paint9_linear_2449_11924)"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask4_2449_11924)">
|
||||||
|
<circle cx="219.996" cy="277.486" r="152.894" transform="rotate(-60 219.996 277.486)" fill="url(#paint10_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<ellipse cx="300.093" cy="434.911" rx="29.0498" ry="33.6366" fill="url(#paint11_linear_2449_11924)"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_2449_11924" x1="300" y1="0" x2="300" y2="600" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#3ABDEB"/>
|
||||||
|
<stop offset="1" stop-color="#553AEB"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_2449_11924" x1="220.588" y1="127.595" x2="220.588" y2="433.382" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_2449_11924" x1="379.598" y1="127.595" x2="379.598" y2="433.382" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint3_linear_2449_11924" x1="162.544" y1="185.102" x2="162.544" y2="490.889" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint4_linear_2449_11924" x1="300.25" y1="105.597" x2="300.25" y2="411.384" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint5_linear_2449_11924" x1="298.619" y1="105.597" x2="298.619" y2="411.384" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint6_linear_2449_11924" x1="436.325" y1="185.102" x2="436.325" y2="490.889" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint7_linear_2449_11924" x1="379.004" y1="124.592" x2="379.004" y2="430.38" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint8_linear_2449_11924" x1="458.509" y1="262.298" x2="458.509" y2="568.086" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint9_linear_2449_11924" x1="140.491" y1="262.298" x2="140.491" y2="568.085" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint10_linear_2449_11924" x1="219.996" y1="124.593" x2="219.996" y2="430.38" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint11_linear_2449_11924" x1="300.093" y1="401.274" x2="300.093" y2="420.805" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white" stop-opacity="0.4"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_2449_11924">
|
||||||
|
<rect width="600" height="600" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
@@ -0,0 +1,49 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build the static site locally, then replace the server directory with it.
|
||||||
|
#
|
||||||
|
# - Builds on THIS machine (npm run build -> ./out).
|
||||||
|
# - Streams out/ over a single SSH connection (tar pipe) and swaps the
|
||||||
|
# contents of the target dir on the server. No rsync/sshpass required.
|
||||||
|
#
|
||||||
|
# Password handling:
|
||||||
|
# - If `sshpass` is installed AND DEPLOY_PASSWORD is set (env or .env.deploy),
|
||||||
|
# the deploy is fully unattended.
|
||||||
|
# - Otherwise SSH prompts for the password once (interactive).
|
||||||
|
#
|
||||||
|
# Config (override via env or .env.deploy):
|
||||||
|
set -euo pipefail
|
||||||
|
cd "$(git rev-parse --show-toplevel 2>/dev/null || dirname "$(dirname "$0")")"
|
||||||
|
|
||||||
|
# Optional local secrets file (gitignored).
|
||||||
|
[ -f .env.deploy ] && . ./.env.deploy
|
||||||
|
|
||||||
|
DEPLOY_HOST="${DEPLOY_HOST:-185.226.116.88}"
|
||||||
|
DEPLOY_USER="${DEPLOY_USER:-ubuntu}"
|
||||||
|
DEPLOY_PATH="${DEPLOY_PATH:-/var/www/aramland-front}"
|
||||||
|
DEPLOY_PASSWORD="${DEPLOY_PASSWORD:-}"
|
||||||
|
|
||||||
|
echo "▸ Building locally (clean)…"
|
||||||
|
# Remove caches so the production build never type-checks a stale `.next/dev`
|
||||||
|
# validator (tsconfig includes .next/dev/types) and never ships stale out/ files.
|
||||||
|
rm -rf .next out
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
if [ ! -d out ]; then
|
||||||
|
echo "✗ Build did not produce ./out" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Pick the SSH command: unattended with sshpass, else interactive prompt.
|
||||||
|
ssh_cmd=(ssh -o StrictHostKeyChecking=no "$DEPLOY_USER@$DEPLOY_HOST")
|
||||||
|
if command -v sshpass >/dev/null 2>&1 && [ -n "$DEPLOY_PASSWORD" ]; then
|
||||||
|
ssh_cmd=(sshpass -p "$DEPLOY_PASSWORD" "${ssh_cmd[@]}")
|
||||||
|
else
|
||||||
|
echo "ℹ sshpass/password not available — SSH will prompt for the password."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "▸ Uploading to $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH …"
|
||||||
|
# Replace the directory contents (incl. dotfiles) then extract the new build.
|
||||||
|
tar -C out -czf - . | "${ssh_cmd[@]}" \
|
||||||
|
"set -e; mkdir -p '$DEPLOY_PATH'; find '$DEPLOY_PATH' -mindepth 1 -delete; tar -C '$DEPLOY_PATH' -xzf -"
|
||||||
|
|
||||||
|
echo "✓ Deployed to $DEPLOY_HOST:$DEPLOY_PATH"
|
||||||