chore: upload public images to Cloudinary and update dictionaries
@@ -1,6 +1,6 @@
|
|||||||
# Moy Group
|
# Moy Group
|
||||||
|
|
||||||
Modern, şık ve çift dilli (TR/EN) kurumsal web sitesi projesi. Moy Group çatısı altında yer alan Moy Beach, Kite Beach Hotel ve Volkswagen Kite (Surfing) mekanlarının tanıtımı, hizmet detayları, galeri ve iletişim/rezervasyon bilgilerini içerir.
|
Modern, şık ve çift dilli (TR/EN) kurumsal web sitesi projesi. Moy Group çatısı altında yer alan Moy Beach, Kite Beach Hotel ve Kite Beach (Surfing) mekanlarının tanıtımı, hizmet detayları, galeri ve iletişim/rezervasyon bilgilerini içerir.
|
||||||
|
|
||||||
## Teknolojiler
|
## Teknolojiler
|
||||||
|
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ const fadeUp: Variants = {
|
|||||||
export default function HomeClient({ lang, dict }: { lang: string; dict: any }) {
|
export default function HomeClient({ lang, dict }: { lang: string; dict: any }) {
|
||||||
const [activeMap, setActiveMap] = useState(0);
|
const [activeMap, setActiveMap] = useState(0);
|
||||||
|
|
||||||
const VENUES: { id: string; title: string; tag: string; desc: string; img: string; color: string }[] = dict.venuesList;
|
const VENUES: { id: string; title: string; tag: string; desc: string; img: string; color: string; link: string }[] = dict.venuesList;
|
||||||
const LOCATIONS_MAP: { place: string; addr: string; embed: string }[] = dict.locationsMap;
|
const LOCATIONS_MAP: { place: string; addr: string; embed: string }[] = dict.locationsMap;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -321,7 +321,7 @@ export default function HomeClient({ lang, dict }: { lang: string; dict: any })
|
|||||||
<span className="moy-gold-line mb-6 block" />
|
<span className="moy-gold-line mb-6 block" />
|
||||||
<p className="text-gray-500 mb-8 text-base leading-relaxed">{venue.desc}</p>
|
<p className="text-gray-500 mb-8 text-base leading-relaxed">{venue.desc}</p>
|
||||||
<Link
|
<Link
|
||||||
href={`/${lang}/mekanlar/${venue.id}`}
|
href={`${venue.link}`}
|
||||||
className="inline-flex items-center gap-2 text-[11px] uppercase tracking-[0.18em] font-semibold text-[var(--color-moy-dark)] border-b border-[var(--color-moy-gold)] pb-1 hover:text-[var(--color-moy-gold-dark)] transition-colors group"
|
className="inline-flex items-center gap-2 text-[11px] uppercase tracking-[0.18em] font-semibold text-[var(--color-moy-dark)] border-b border-[var(--color-moy-gold)] pb-1 hover:text-[var(--color-moy-gold-dark)] transition-colors group"
|
||||||
>
|
>
|
||||||
{dict.cta.exploreBtn}
|
{dict.cta.exploreBtn}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const LOCATIONS = [
|
|||||||
variant: "blue" as const,
|
variant: "blue" as const,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Volkswagen Kite (Surfing)",
|
name: "Kite Beach (Surfing)",
|
||||||
tag: "Kite Surf",
|
tag: "Kite Surf",
|
||||||
address: "Akçapınar kite sahili, Ula, Turkey 48640",
|
address: "Akçapınar kite sahili, Ula, Turkey 48640",
|
||||||
phones: ["+90 537 882 31 37", "+90 505 204 98 56"],
|
phones: ["+90 537 882 31 37", "+90 505 204 98 56"],
|
||||||
@@ -183,10 +183,10 @@ export default async function IletisimPage({
|
|||||||
<h3 className="font-serif text-xl text-[var(--color-moy-dark)] mb-4">{t.social}</h3>
|
<h3 className="font-serif text-xl text-[var(--color-moy-dark)] mb-4">{t.social}</h3>
|
||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
<a href="#" aria-label="Instagram" className="w-10 h-10 border border-gray-200 flex items-center justify-center hover:border-[var(--color-moy-gold)] hover:text-[var(--color-moy-gold)] text-gray-400 transition-all duration-200">
|
<a href="#" aria-label="Instagram" className="w-10 h-10 border border-gray-200 flex items-center justify-center hover:border-[var(--color-moy-gold)] hover:text-[var(--color-moy-gold)] text-gray-400 transition-all duration-200">
|
||||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><rect width="20" height="20" x="2" y="2" rx="5" ry="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" x2="17.51" y1="6.5" y2="6.5"/></svg>
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><rect width="20" height="20" x="2" y="2" rx="5" ry="5" /><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" /><line x1="17.5" x2="17.51" y1="6.5" y2="6.5" /></svg>
|
||||||
</a>
|
</a>
|
||||||
<a href="#" aria-label="Facebook" className="w-10 h-10 border border-gray-200 flex items-center justify-center hover:border-[var(--color-moy-gold)] hover:text-[var(--color-moy-gold)] text-gray-400 transition-all duration-200">
|
<a href="#" aria-label="Facebook" className="w-10 h-10 border border-gray-200 flex items-center justify-center hover:border-[var(--color-moy-gold)] hover:text-[var(--color-moy-gold)] text-gray-400 transition-all duration-200">
|
||||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg>
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z" /></svg>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -42,24 +42,27 @@
|
|||||||
"title": "Moy Beach",
|
"title": "Moy Beach",
|
||||||
"tag": "Beach & Bar",
|
"tag": "Beach & Bar",
|
||||||
"desc": "An exclusive beach and gastronomy experience amidst the unique nature and azure waters of Akyaka. The point where local aromas meet international flavors.",
|
"desc": "An exclusive beach and gastronomy experience amidst the unique nature and azure waters of Akyaka. The point where local aromas meet international flavors.",
|
||||||
"img": "/moy-beach.jpg",
|
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592404/moygrup/moy-beach.jpg",
|
||||||
"color": "from-amber-900/60"
|
"color": "from-amber-900/60",
|
||||||
|
"link": "http://moybeachakyaka.com"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "kite-beach-hotel",
|
"id": "kite-beach-hotel",
|
||||||
"title": "Kite Beach Hotel",
|
"title": "Kite Beach Hotel",
|
||||||
"tag": "Hotel",
|
"tag": "Hotel",
|
||||||
"desc": "A boutique hotel right on the clear waters of Akyaka, offering the perfect balance of both sports and relaxation. Swim in the sea in the mornings, enjoy the restaurant in the evenings.",
|
"desc": "A boutique hotel right on the clear waters of Akyaka, offering the perfect balance of both sports and relaxation. Swim in the sea in the mornings, enjoy the restaurant in the evenings.",
|
||||||
"img": "/kite-beach-hotel.jpg",
|
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592402/moygrup/kite-beach-hotel.jpg",
|
||||||
"color": "from-blue-900/60"
|
"color": "from-blue-900/60",
|
||||||
|
"link": "http://moybeachakyaka.com"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "volkswagen-kite",
|
"id": "volkswagen-kite",
|
||||||
"title": "Volkswagen Kite (Surfing)",
|
"title": "Kite Beach (Surfing)",
|
||||||
"tag": "Kite & Surf",
|
"tag": "Kite & Surf",
|
||||||
"desc": "Professional training and equipment rental at Akçapınar Kite Beach, Turkey's best kitesurf spot. Discover freedom in the diamond waters of the Gulf of Gökova.",
|
"desc": "Professional training and equipment rental at Akçapınar Kite Beach, Turkey's best kitesurf spot. Discover freedom in the diamond waters of the Gulf of Gökova.",
|
||||||
"img": "/volkswagen-kite.png",
|
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592405/moygrup/volkswagen-kite.png",
|
||||||
"color": "from-green-900/60"
|
"color": "from-green-900/60",
|
||||||
|
"link": "/"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"locationsMap": [
|
"locationsMap": [
|
||||||
@@ -74,7 +77,7 @@
|
|||||||
"embed": "https://maps.google.com/maps?q=Kite+Beach+Hotel+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
|
"embed": "https://maps.google.com/maps?q=Kite+Beach+Hotel+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"place": "Volkswagen Kite (Surfing)",
|
"place": "Kite Beach (Surfing)",
|
||||||
"addr": "Akçapınar Kite Sahili, Ula/Muğla",
|
"addr": "Akçapınar Kite Sahili, Ula/Muğla",
|
||||||
"embed": "https://maps.google.com/maps?q=Volkswagen+Kite+Surfing+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
|
"embed": "https://maps.google.com/maps?q=Volkswagen+Kite+Surfing+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,24 +42,27 @@
|
|||||||
"title": "Moy Beach",
|
"title": "Moy Beach",
|
||||||
"tag": "Beach & Bar",
|
"tag": "Beach & Bar",
|
||||||
"desc": "Akyaka'nın eşsiz doğası ve masmavi suları arasında, seçkin bir plaj ve gastronomi deneyimi. Yerel aromalar ile uluslararası lezzetlerin buluştuğu nokta.",
|
"desc": "Akyaka'nın eşsiz doğası ve masmavi suları arasında, seçkin bir plaj ve gastronomi deneyimi. Yerel aromalar ile uluslararası lezzetlerin buluştuğu nokta.",
|
||||||
"img": "/moy-beach.jpg",
|
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592404/moygrup/moy-beach.jpg",
|
||||||
"color": "from-amber-900/60"
|
"color": "from-amber-900/60",
|
||||||
|
"link": "http://moybeachakyaka.com"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "kite-beach-hotel",
|
"id": "kite-beach-hotel",
|
||||||
"title": "Kite Beach Hotel",
|
"title": "Kite Beach Hotel",
|
||||||
"tag": "Hotel",
|
"tag": "Hotel",
|
||||||
"desc": "Akyaka'nın berrak sularına sıfır, hem sporun hem de dinlenmenin mükemmel dengesini sunan butik otel. Sabahları denizde yüzün, akşamları restoranda keyif yapın.",
|
"desc": "Akyaka'nın berrak sularına sıfır, hem sporun hem de dinlenmenin mükemmel dengesini sunan butik otel. Sabahları denizde yüzün, akşamları restoranda keyif yapın.",
|
||||||
"img": "/kite-beach-hotel.jpg",
|
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592402/moygrup/kite-beach-hotel.jpg",
|
||||||
"color": "from-blue-900/60"
|
"color": "from-blue-900/60",
|
||||||
|
"link": "http://moybeachakyaka.com"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "volkswagen-kite",
|
"id": "volkswagen-kite",
|
||||||
"title": "Volkswagen Kite (Surfing)",
|
"title": "Kite Beach (Surfing)",
|
||||||
"tag": "Kite & Surf",
|
"tag": "Kite & Surf",
|
||||||
"desc": "Akçapınar Kite Sahili'nde, Türkiye'nin en iyi kitesurf noktasında profesyonel eğitim ve ekipman kiralama. Gökova Körfezi'nin pırlanta sularında özgürlüğü keşfedin.",
|
"desc": "Akçapınar Kite Sahili'nde, Türkiye'nin en iyi kitesurf noktasında profesyonel eğitim ve ekipman kiralama. Gökova Körfezi'nin pırlanta sularında özgürlüğü keşfedin.",
|
||||||
"img": "/volkswagen-kite.png",
|
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592405/moygrup/volkswagen-kite.png",
|
||||||
"color": "from-green-900/60"
|
"color": "from-green-900/60",
|
||||||
|
"link": "/"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"locationsMap": [
|
"locationsMap": [
|
||||||
@@ -74,7 +77,7 @@
|
|||||||
"embed": "https://maps.google.com/maps?q=Kite+Beach+Hotel+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
|
"embed": "https://maps.google.com/maps?q=Kite+Beach+Hotel+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"place": "Volkswagen Kite (Surfing)",
|
"place": "Kite Beach (Surfing)",
|
||||||
"addr": "Akçapınar Kite Sahili, Ula/Muğla",
|
"addr": "Akçapınar Kite Sahili, Ula/Muğla",
|
||||||
"embed": "https://maps.google.com/maps?q=Volkswagen+Kite+Surfing+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
|
"embed": "https://maps.google.com/maps?q=Volkswagen+Kite+Surfing+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ const nextConfig: NextConfig = {
|
|||||||
output: "standalone",
|
output: "standalone",
|
||||||
images: {
|
images: {
|
||||||
remotePatterns: [
|
remotePatterns: [
|
||||||
|
{
|
||||||
|
protocol: "https",
|
||||||
|
hostname: "res.cloudinary.com",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
protocol: "https",
|
protocol: "https",
|
||||||
hostname: "images.unsplash.com",
|
hostname: "images.unsplash.com",
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
"@types/node": "^20",
|
"@types/node": "^20",
|
||||||
"@types/react": "^19",
|
"@types/react": "^19",
|
||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
|
"cloudinary": "^2.10.0",
|
||||||
"eslint": "^9",
|
"eslint": "^9",
|
||||||
"eslint-config-next": "16.2.7",
|
"eslint-config-next": "16.2.7",
|
||||||
"tailwindcss": "^4",
|
"tailwindcss": "^4",
|
||||||
@@ -2773,6 +2774,19 @@
|
|||||||
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
|
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/cloudinary": {
|
||||||
|
"version": "2.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.10.0.tgz",
|
||||||
|
"integrity": "sha512-sY09kYg7wprkndAOjZBAYqFZqwL+SxnEGcAvksOvFA+5upnFn949UjkEkHKNSwkBtW/xRDd0p6NgbSXZcxkI3w==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"lodash": "^4.17.23"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=9"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/color-convert": {
|
"node_modules/color-convert": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
@@ -5031,6 +5045,13 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/lodash": {
|
||||||
|
"version": "4.18.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
|
||||||
|
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/lodash.merge": {
|
"node_modules/lodash.merge": {
|
||||||
"version": "4.6.2",
|
"version": "4.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
"@types/node": "^20",
|
"@types/node": "^20",
|
||||||
"@types/react": "^19",
|
"@types/react": "^19",
|
||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
|
"cloudinary": "^2.10.0",
|
||||||
"eslint": "^9",
|
"eslint": "^9",
|
||||||
"eslint-config-next": "16.2.7",
|
"eslint-config-next": "16.2.7",
|
||||||
"tailwindcss": "^4",
|
"tailwindcss": "^4",
|
||||||
|
|||||||
|
After Width: | Height: | Size: 715 KiB |
|
After Width: | Height: | Size: 940 KiB |
|
After Width: | Height: | Size: 919 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 837 KiB |
@@ -0,0 +1,39 @@
|
|||||||
|
const cloudinary = require('cloudinary').v2;
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
cloudinary.config({
|
||||||
|
cloud_name: 'du7xohbct',
|
||||||
|
api_key: '525922573613433',
|
||||||
|
api_secret: 'cJ0NDcaoQhSTAxBMv6jNMFupt3k'
|
||||||
|
});
|
||||||
|
|
||||||
|
const uploadImages = async () => {
|
||||||
|
const publicDir = path.join(__dirname, '..', 'public');
|
||||||
|
const files = fs.readdirSync(publicDir);
|
||||||
|
|
||||||
|
const images = files.filter(file => file.endsWith('.jpg') || file.endsWith('.png'));
|
||||||
|
|
||||||
|
const results = {};
|
||||||
|
|
||||||
|
for (const file of images) {
|
||||||
|
console.log(`Uploading ${file}...`);
|
||||||
|
try {
|
||||||
|
const filePath = path.join(publicDir, file);
|
||||||
|
const result = await cloudinary.uploader.upload(filePath, {
|
||||||
|
folder: 'moygrup',
|
||||||
|
use_filename: true,
|
||||||
|
unique_filename: false
|
||||||
|
});
|
||||||
|
console.log(`Uploaded ${file} -> ${result.secure_url}`);
|
||||||
|
results[file] = result.secure_url;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error uploading ${file}:`, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('\n--- Upload Results ---');
|
||||||
|
console.log(JSON.stringify(results, null, 2));
|
||||||
|
};
|
||||||
|
|
||||||
|
uploadImages();
|
||||||