const el = React.createElement;
function svg(children, vb){ return el('svg',{width:20,height:20,viewBox:vb||'0 0 24 24',fill:'none',stroke:'currentColor','strokeWidth':1.8,'strokeLinecap':'round','strokeLinejoin':'round'}, children); }
function P(d){ return el('path',{d:d,key:d}); }
const ICON = {
  menu: ()=>svg([P('M3 6h18'),P('M3 12h18'),P('M3 18h18')]),
  search: ()=>svg([el('circle',{cx:11,cy:11,r:7,key:'c'}),P('M21 21l-4.3-4.3')]),
  x: ()=>svg([P('M18 6 6 18'),P('M6 6l12 12')]),
  check: ()=>svg([P('M20 6 9 17l-5-5')]),
  arrow: ()=>svg([P('M5 12h14'),P('M13 6l6 6-6 6')]),
  clock: ()=>svg([el('circle',{cx:12,cy:12,r:9,key:'c'}),P('M12 7v5l3 2')]),
  star: ()=>el('svg',{width:15,height:15,viewBox:'0 0 24 24',fill:'currentColor',stroke:'none'},[P('M12 2l2.9 6.3 6.9.7-5.1 4.6 1.4 6.8L12 17.8 5 20.4l1.4-6.8L1.3 9l6.9-.7z')]),
  home: ()=>svg([P('M3 11l9-7 9 7'),P('M5 10v10h14V10')]),
  panel: ()=>svg([el('rect',{x:3,y:3,width:18,height:18,rx:2,key:'r'}),P('M3 9h18'),P('M9 21V9')]),
  anchor: ()=>svg([el('circle',{cx:12,cy:5,r:2.4,key:'c'}),P('M12 8v13'),P('M5 12a7 7 0 0 0 14 0'),P('M3 12h3'),P('M18 12h3')]),
  fish: ()=>svg([P('M16 12c-2.5 4-7 5-12 4 1-2 1-6 0-8 5-1 9.5 0 12 4z'),P('M16 12l5-3v6z'),el('circle',{cx:7,cy:11,r:.6,fill:'currentColor',key:'e'})]),
  hook: ()=>svg([P('M12 3v9a4 4 0 1 1-4-4'),el('circle',{cx:12,cy:3,r:1,key:'c'})]),
  yacht: ()=>svg([P('M3 17h18l-2 4H5z'),P('M5 17V8l8-4v13'),P('M13 8l5 3v6')]),
  doc: ()=>svg([P('M7 3h7l4 4v14H7z'),P('M14 3v4h4'),P('M10 13h6'),P('M10 17h6')]),
  flag: ()=>svg([P('M5 21V4'),P('M5 4h13l-2 4 2 4H5')]),
  wrench: ()=>svg([P('M14.5 6a3.5 3.5 0 0 0-4.8 4.3l-6 6 2 2 6-6A3.5 3.5 0 0 0 18 7.5L15.5 10 14 8.5 16.5 6z')]),
  route: ()=>svg([el('circle',{cx:6,cy:18,r:2.4,key:'a'}),el('circle',{cx:18,cy:6,r:2.4,key:'b'}),P('M8 18h6a3 3 0 0 0 0-6H10a3 3 0 0 1 0-6h4')]),
  handshake: ()=>svg([P('M11 17l2 2 4-4 3 1V8l-4-3-3 2H9L6 5 3 8v8l3-1 3 3z'),P('M9 12l2-2')]),
  shield: ()=>svg([P('M12 3l8 3v6c0 5-3.5 7.5-8 9-4.5-1.5-8-4-8-9V6z'),P('M9 12l2 2 4-4')]),
  fuel: ()=>svg([P('M5 21V5a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v16'),P('M3 21h14'),P('M15 9h2a2 2 0 0 1 2 2v5a2 2 0 0 0 2-2V8l-3-3'),P('M7 8h6')]),
  cap: ()=>svg([P('M4 9a8 8 0 0 1 16 0'),P('M3 9h18v2a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3z'),P('M12 3v6')]),
  lift: ()=>svg([P('M3 4h18'),P('M6 4v9'),P('M18 4v9'),P('M6 13h12'),P('M9 13l-1 7'),P('M15 13l1 7')]),
  diver: ()=>svg([el('circle',{cx:9,cy:7,r:3,key:'c'}),P('M3 7h3'),P('M9 10v5l4 3 5-9')]),
  grad: ()=>svg([P('M12 4 2 9l10 5 10-5z'),P('M6 11v5c0 1.5 3 3 6 3s6-1.5 6-3v-5')]),
  big: ()=>el('svg',{width:34,height:34,viewBox:'0 0 24 24',fill:'none',stroke:'currentColor','strokeWidth':2,'strokeLinecap':'round','strokeLinejoin':'round'},[P('M20 6 9 17l-5-5')]),
  vip: ()=>svg([el('circle',{cx:12,cy:9,r:5,key:'c'}),P('M8 13l-1 8 5-3 5 3-1-8')]),
  hotel: ()=>svg([P('M3 18v-6h18v6'),P('M3 12V7h9v5'),P('M3 20v-2'),P('M21 20v-2'),P('M7 12v-1')]),
  power: ()=>svg([el('rect',{x:3,y:8,width:14,height:9,rx:1.5,key:'r'}),P('M17 11h3v3h-3'),P('M9 9l-2 4h3l-2 4')]),
  auction: ()=>svg([P('M13 4l5 5'),P('M15.5 6.5l-8 8'),P('M5 12l5 5'),P('M7.5 14.5l-4.5 4.5 2 2 4.5-4.5'),P('M13 20h8')]),
  club: ()=>svg([P('M8 4h8v3a4 4 0 0 1-8 0z'),P('M8 5H5a3 3 0 0 0 3 3'),P('M16 5h3a3 3 0 0 1-3 3'),P('M12 11v4'),P('M9 20h6'),P('M10 15h4v5h-4z')]),
  trip: ()=>svg([el('circle',{cx:12,cy:12,r:9,key:'c'}),P('M15.5 8.5l-2.5 6-5 2 2.5-6z')]),
  hardhat: ()=>svg([P('M4 15a8 8 0 0 1 16 0'),P('M2 15h20v2H2z'),P('M10 7h4v2'),P('M12 7V5')]),
  photo: ()=>svg([el('rect',{x:3,y:7,width:18,height:13,rx:2,key:'r'}),el('circle',{cx:12,cy:13.5,r:3.5,key:'c'}),P('M8 7l1.5-3h5L16 7')]),
  ticket: ()=>svg([P('M4 8a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2 2 2 0 0 0 0 4 2 2 0 0 1-2 2H6a2 2 0 0 1-2-2 2 2 0 0 0 0-4z'),P('M14 6v12')]),
  masaj: ()=>svg([P('M12 21c-5 0-9-3-9-7 3 0 6 1 9 4 3-3 6-4 9-4 0 4-4 7-9 7z'),P('M12 21c-2-3-2-7 0-10 2 3 2 7 0 10z')]),
  ai: ()=>svg([P('M12 3l1.7 4.6L18 9l-4.3 1.4L12 15l-1.7-4.6L6 9l4.3-1.4z'),P('M18 14l.9 2.3L21 17l-2.1.7L18 20l-.9-2.3L15 17l2.1-.7z')]),
  user: ()=>svg([el('circle',{cx:12,cy:8,r:3.4,key:'c'}),P('M5 20a7 7 0 0 1 14 0')]),
  speaker: ()=>svg([P('M4 9v6h4l5 4V5L8 9z'),P('M16 8.5a4 4 0 0 1 0 7'),P('M18.5 6a7 7 0 0 1 0 12')]),
  race: ()=>svg([P('M5 21V4'),P('M5 4h14l-3 4 3 4H5'),P('M5 8h7'),P('M12 4v8')]),
  exper: ()=>svg([el('circle',{cx:11,cy:11,r:6,key:'c'}),P('M20 20l-3.6-3.6'),P('M8.5 11l1.8 1.8L14 9')]),
  filter: ()=>svg([P('M3 5h18'),P('M6 12h12'),P('M10 19h4')]),
  camera: ()=>svg([P('M4 8h3l1.5-2h7L17 8h3a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1z'),el('circle',{cx:12,cy:13,r:3.2,key:'c'})]),
  pin: ()=>svg([P('M12 21s-6-5.2-6-10a6 6 0 0 1 12 0c0 4.8-6 10-6 10z'),el('circle',{cx:12,cy:11,r:2.2,key:'c'})]),
  radio: ()=>svg([el('circle',{cx:12,cy:13,r:3.2,key:'c'}),P('M16.5 6.5L7 10'),el('rect',{x:3,y:10,width:18,height:10,rx:2,key:'r'}),P('M7 15h.01')]),
  star2: ()=>svg([el('circle',{cx:12,cy:8,r:3.6,key:'c'}),P('M5.5 20a6.5 6.5 0 0 1 13 0'),P('M18 3l.7 1.8L20.5 5.5l-1.8.7L18 8l-.7-1.8L15.5 5.5l1.8-.7z')]),
  instagram: ()=>svg([el('rect',{x:3,y:3,width:18,height:18,rx:5,key:'r'}),el('circle',{cx:12,cy:12,r:4,key:'c'}),el('circle',{cx:17.5,cy:6.5,r:.9,fill:'currentColor',key:'d'})]),
  youtube: ()=>svg([el('rect',{x:2,y:5,width:20,height:14,rx:4,key:'r'}),el('path',{d:'M10 9l5 3-5 3z',fill:'currentColor',stroke:'none',key:'p'})]),
  linkedin: ()=>svg([el('rect',{x:3,y:3,width:18,height:18,rx:3,key:'r'}),P('M7 10v7'),el('circle',{cx:7,cy:7,r:.9,fill:'currentColor',key:'d'}),P('M11 17v-4a2 2 0 0 1 4 0v4'),P('M11 10v7')]),
  globe: ()=>svg([el('circle',{cx:12,cy:12,r:9,key:'c'}),P('M3 12h18'),P('M12 3a15 15 0 0 1 0 18a15 15 0 0 1 0-18')]),
  store: ()=>svg([P('M4 9l1-4h14l1 4'),P('M4 9a2.5 2.5 0 0 0 5 0 2.5 2.5 0 0 0 6 0 2.5 2.5 0 0 0 5 0'),P('M5 11v8h14v-8'),P('M9 19v-5h6v5')]),
};

const fmtTRY = (n)=> new Intl.NumberFormat('tr-TR',{style:'currency',currency:'TRY',maximumFractionDigits:0}).format(n);
const fmtTRY2 = (n)=> new Intl.NumberFormat('tr-TR',{style:'currency',currency:'TRY',minimumFractionDigits:2}).format(n);
function coverSVG(a){
  const svg = "<svg xmlns='http://www.w3.org/2000/svg' width='400' height='220' viewBox='0 0 400 220'>"
    + "<defs><linearGradient id='g' x1='0' y1='0' x2='0.4' y2='1'><stop offset='0' stop-color='"+a+"' stop-opacity='0.95'/><stop offset='1' stop-color='"+a+"' stop-opacity='0.5'/></linearGradient></defs>"
    + "<rect width='400' height='220' fill='url(#g)'/>"
    + "<circle cx='328' cy='52' r='42' fill='#fff' fill-opacity='0.13'/>"
    + "<path d='M0 150 Q100 118 200 150 T400 150 V220 H0 Z' fill='#fff' fill-opacity='0.10'/>"
    + "<path d='M0 172 Q100 143 200 172 T400 172 V220 H0 Z' fill='#fff' fill-opacity='0.15'/>"
    + "<path d='M0 194 Q100 168 200 194 T400 194 V220 H0 Z' fill='#fff' fill-opacity='0.22'/>"
    + "</svg>";
  return 'data:image/svg+xml,'+encodeURIComponent(svg);
}

const MODULES = [
  {key:'marin',name:'KolayYedekParçam',short:'Denizcilik yedek parça arama + fiyat karşılaştırma',accent:'#F2A310',cat:'Ürün & Fiyat',icon:'wrench',live:true,ph:'Parça, marka veya OEM no ara…'},
  {key:'mazot',name:'KolayMazot',short:'Marine mazot/yakıt fiyatları + ikmal noktaları',accent:'#4B5563',cat:'Ürün & Fiyat',ph:'Bölge veya istasyon ara…'},
  {key:'insurance',name:'KolaySigorta',short:'Tekne/yat sigortası teklif karşılaştırma',accent:'#3D4EA8',cat:'Ürün & Fiyat',ph:'Tekne tipi veya sigorta türü ara…'},
  {key:'yacht',name:'KolayYacht',short:'Yat satın alma + kiralama + karşılaştırma',accent:'#16324F',cat:'Tekne & Yat',ph:'Marka, model veya uzunluk ara…'},
  {key:'broker',name:'KolayBroker',short:'Yat brokerliği + portföy + alıcı talebi',accent:'#A6792E',cat:'Tekne & Yat',ph:'Broker, bölge veya uzmanlık ara…'},
  {key:'bayrak',name:'KolayBayrak',short:'Yat tescil / bayrak kaydı + belge hizmetleri',accent:'#C8102E',cat:'Tekne & Yat',ph:'Hizmet veya belge ara…'},
  {key:'kislama',name:'KolayKışlama',short:'Tersane / çekek yeri + travel-lift rezervasyon',accent:'#37718E',cat:'Tekne & Yat',ph:'Bölge veya tersane ara…'},
  {key:'charter',name:'KolayCharter',short:'Charter hatları: rota / sefer + kabin kiralama',accent:'#E2683C',cat:'Charter & Aktivite',ph:'Bölge, rota veya tarih ara…'},
  {key:'fishing',name:'KolayFishing',short:'Balıkçılık ekipmanı + balık avı turları',accent:'#1E8E5C',cat:'Charter & Aktivite',ph:'Ekipman veya tur ara…'},
  {key:'susporu',name:'KolaySuSporu',short:'Su sporları & dalış + ekipman kiralama',accent:'#00A3C4',cat:'Charter & Aktivite',ph:'Aktivite veya bölge ara…'},
  {key:'marina',name:'Kolaymarina',short:'Marina rehberi: bağlama yeri, doluluk, fiyat',accent:'#2E86AB',cat:'Yer & Hizmet',ph:'Marina veya şehir ara… örn. Göcek'},
  {key:'service',name:'KolayService',short:'Teknik servis bulma + randevu',accent:'#0E7C86',cat:'Yer & Hizmet',ph:'Servis türü veya il ara…'},
  {key:'captain',name:'KolayKaptan',short:'Kaptan & mürettebat bulma + iş ilanları',accent:'#1E3A5F',cat:'Yer & Hizmet',ph:'Rol, bölge veya lisans ara…'},
  {key:'fish',name:'KolayFish',short:'Taze balık satış noktaları + hal fiyatları',accent:'#E0533D',cat:'KolayFish',ph:'Tür, il veya satıcı ara…'},
  {key:'academy',name:'KolayAcademy',short:'Denizcilik eğitimi: ADB/SRC, yelken, dalış',accent:'#7A2E48',cat:'Eğitim & Belge',ph:'Kurs, kategori veya bölge ara…'},
  {key:'transitlog',name:'KolayTransitLog',short:'Yat transit log başvuru + takip',accent:'#1F6FB2',cat:'Eğitim & Belge',ph:'Başvuru no veya hizmet ara…'},
  {key:'vip',name:'KolayVIP Transfer',short:'Havalimanı ↔ marina/yat özel VIP transfer',accent:'#5B3A8E',cat:'Konaklama & Transfer',ph:'Rota, araç veya tarih ara…'},
  {key:'hotel',name:'KolayHotel',short:'Sahil & marina yakını otel + rezervasyon',accent:'#C89B5A',cat:'Konaklama & Transfer',ph:'Bölge, otel veya tarih ara…'},
  {key:'power',name:'KolayPower',short:'Tekne solar & enerji depolama + kurulum',accent:'#A8C400',cat:'Ürün & Fiyat',ph:'Solar, akü veya inverter ara…'},
  {key:'auction',name:'KolayAuction',short:'Denizcilik açık artırma + canlı teklif',accent:'#37474F',cat:'Tekne & Yat',ph:'Tekne, motor veya ekipman ara…'},
  {key:'club',name:'KolayClub',short:'Yat & denizci kulübü: üyelik + etkinlik',accent:'#1D5FA8',cat:'Topluluk & Etkinlik',ph:'Etkinlik veya ayrıcalık ara…'},
  {key:'trip',name:'KolayTrip',short:'Deniz gezisi & deneyim + rezervasyon',accent:'#17A2B8',cat:'Charter & Aktivite',ph:'Bölge, tema veya tarih ara…'},
  {key:'isgucu',name:'KolayİşGücü',short:'Denizcilik işgücü & mürettebat + iş ilanları',accent:'#34495E',cat:'Yer & Hizmet',ph:'Rol, bölge veya ilan ara…'},
  {key:'photo',name:'KolayPhoto',short:'Tekne/yat fotoğrafçıları + rezervasyon',accent:'#6C5CE7',cat:'Yer & Hizmet',ph:'Çekim türü veya bölge ara…'},
  {key:'tickets',name:'KolayTickets',short:'Yaz etkinlik biletleri: konser, festival, regatta',accent:'#D6336C',cat:'Topluluk & Etkinlik',ph:'Etkinlik, mekan veya tarih ara…'},
  {key:'masaj',name:'KolayMasaj',short:'Teknede & marinada masaj + wellness randevu',accent:'#7FA394',cat:'Yer & Hizmet',ph:'Hizmet türü veya bölge ara…'},
  {key:'racing',name:'KolayRacing',short:'Yat yarışları & regatta: takvim, kayıt, sonuçlar',accent:'#E8590C',cat:'Topluluk & Etkinlik',ph:'Yarış, kulüp veya bölge ara…'},
  {key:'exper',name:'KolayExper',short:'Tekne ekspertiz şirketleri: sörvey + rapor + randevu',accent:'#4C6EF5',cat:'Yer & Hizmet',ph:'Ekspertiz firması veya bölge ara…'},
  {key:'radyo',name:'KolayRadyo & TV',short:'Ücretsiz denizcilik radyo + TV: canlı yayın, program, podcast',accent:'#0EA5A4',cat:'Topluluk & Etkinlik',ph:'Kanal, program veya podcast ara…'},
  {key:'stars',name:'KolayStars',short:'Denizcilik ünlüleri & influencer\'ları: profil, işbirliği, etkinlik',accent:'#C026A6',cat:'Topluluk & Etkinlik',ph:'İsim, uzmanlık veya platform ara…'},
  {key:'miles',name:'KolayMiles',short:'Ortak mil / puan defteri: kazan, harca, geri al — tüm Kolay uygulamalarında',accent:'#7A5AF8',cat:'Topluluk & Etkinlik',ph:'Mil, ödül veya işlem ara…'}
];
// Single source of truth — marketing copy must track MODULES (31 vertical domains).
const PLATFORM_COUNT = MODULES.length;

// Each module has its own public domain. The hub (kolaymarin.com) and every
// standalone module domain run this same SPA; the ecosystem menu is a launcher
// that navigates to the module's own domain rather than rendering in-place.
// 'marin' (KolayYedekParçam) is served by the hub app itself → back to the hub.
const HUB_URL = 'https://kolaymarin.com';
const MODULE_DOMAIN = {
  marin:'https://kolaymarin.com', mazot:'https://kolaymazot.com', insurance:'https://kolaysigorta.com',
  yacht:'https://kolayyacht.com', broker:'https://kolaybroker.com', bayrak:'https://kolaybayrak.com',
  kislama:'https://kolaykislama.com', charter:'https://kolaycharter.com', fishing:'https://kolayfishing.com',
  susporu:'https://kolaysusporu.com', marina:'https://kolaymarina.com', service:'https://kolayservice.com',
  captain:'https://kolaykaptan.com', fish:'https://kolayfish.com', academy:'https://kolayacademy.com',
  transitlog:'https://kolaytransitlog.com', vip:'https://kolayviptransfer.com', hotel:'https://kolayhotel.com',
  power:'https://kolaypower.com', auction:'https://kolayacikarttirma.com', club:'https://kolayclub.com',
  trip:'https://kolaytrip.com', isgucu:'https://kolayisgucu.com', photo:'https://kolayphoto.com',
  tickets:'https://kolaytickets.com', masaj:'https://kolaymasaj.com', racing:'https://kolayracing.com',
  exper:'https://kolayexper.com', radyo:'https://kolayradio.com', stars:'https://kolaystars.com',
  miles:'https://kolaymiles.com'
};
// When a standalone module page sets window.__EKO_MODULE, the SPA boots straight
// into that module's view instead of the hub home.
const BOOT_MODULE = (typeof window!=='undefined' && window.__EKO_MODULE && MODULE_DOMAIN[window.__EKO_MODULE]) ? window.__EKO_MODULE : null;
const ICON_OF = {marin:'wrench',mazot:'fuel',insurance:'shield',yacht:'yacht',broker:'handshake',bayrak:'flag',kislama:'lift',charter:'route',fishing:'hook',susporu:'diver',marina:'anchor',service:'wrench',captain:'cap',fish:'fish',academy:'grad',transitlog:'doc',vip:'vip',hotel:'hotel',power:'power',auction:'auction',club:'club',trip:'trip',isgucu:'hardhat',photo:'photo',tickets:'ticket',masaj:'masaj',racing:'race',exper:'exper',radyo:'radio',stars:'star2',miles:'ticket'};
const CAT_ORDER = ['Ürün & Fiyat','Tekne & Yat','Charter & Aktivite','Yer & Hizmet','Konaklama & Transfer','Topluluk & Etkinlik','KolayFish','Eğitim & Belge'];

// landing content per module
const LAND = {
  marin:{eyebrow:'yedek parça · fiyat karşılaştırma',h1:'Doğru parçayı en uygun fiyata bul',sub:'48.000+ denizcilik yedek parçasını 7 satıcıda karşılaştır, en ucuza tek tıkla ulaş.',searchCta:'Ara',catsTitle:'Popüler kategoriler',cats:['Pervane','Anot','Pompa','Elektronik','Filtre','Halat'],featuredTitle:'Popüler parçalar',listTitle:'Arama sonuçları',listFresh:'fiyatlar saatlik güncellenir',honesty:'Fiyatlar satıcı beslemelerinden alınır ve saatlik güncellenir; nihai fiyat için satıcı sayfasını kontrol edin.',
    cross:[['marina','Parçayı taktıracağın marinayı bul'],['service','Montaj için teknik servis bul']],
    faq:[['Fiyatlar ne sıklıkta güncellenir?','Satıcı beslemeleri saatlik senkronize edilir; her teklifte son güncelleme zamanı gösterilir.'],['Satın alma burada mı yapılıyor?','Hayır, Kolaymarin karşılaştırma yapar; satın alma seçtiğiniz satıcının kendi sitesinde tamamlanır.'],['OEM numarasıyla arayabilir miyim?','Evet, parça adı, marka veya OEM/parça numarasıyla arama yapabilirsiniz.']],
    featured:[{title:'Çinko Anot Seti',ph:'parça görseli',price:'₺1.450',sub:'Quicksilver · 3 satıcı',fresh:'3 saat önce güncellendi'},{title:'Deniz Suyu Pompası',ph:'parça görseli',price:'₺3.890',sub:'Vetus · 5 satıcı',fresh:'1 saat önce güncellendi'},{title:'Yakıt Filtresi',ph:'parça görseli',price:'₺640',sub:'Mercury · 4 satıcı',fresh:'az önce güncellendi'}]},
  marina:{eyebrow:'marina rehberi',h1:'Rotandaki marinayı bul, bağla',sub:'Türkiye kıyılarındaki marinaların doluluğunu, fiyatını ve olanaklarını tek ekranda karşılaştır.',searchCta:'Marina bul',catsTitle:'Bölgeler',cats:['Ege','Akdeniz','Marmara','Karadeniz','Göcek','Bodrum'],featuredTitle:'Öne çıkan marinalar',listTitle:'Marinalar',listFresh:'fiyatlar günlük güncellenir',honesty:'Fiyatlar marina tarafından bildirilir; bağlama uygunluğu ve güncel ücret için marinayı arayın.',
    cross:[['mazot','Bu marinalarda yakıt ikmali'],['service','Marinada teknik servis firmaları']],
    faq:[['Bağlama yeri rezerve edebilir miyim?','Marina detayından iletişime geçerek müsaitlik ve rezervasyon talebi oluşturabilirsiniz.'],['Doluluk bilgisi ne kadar güncel?','Doluluk durumu marina işletmecisi tarafından güncellenir; her kartta son güncelleme görünür.'],['Tekne boyuma uygun marina nasıl bulurum?','Filtrelerden tekne boyunuzu (m) seçerek yalnızca uygun marinaları listeleyebilirsiniz.'],['Fiyatlar neyi kapsıyor?','Listelenen günlük bağlama ücretidir; elektrik, su ve ek hizmetler marinaya göre değişir.']],
    featured:[{title:'D-Marin Göcek',ph:'marina fotoğrafı',price:'₺2.100',sub:'Muğla · Müsait',fresh:'bugün güncellendi'},{title:'Setur Kalamış',ph:'marina fotoğrafı',price:'₺1.850',sub:'İstanbul · Sınırlı',fresh:'1 gün önce güncellendi'},{title:'Çeşme Marina',ph:'marina fotoğrafı',price:'₺1.640',sub:'İzmir · Müsait',fresh:'bugün güncellendi'}]},
  fish:{eyebrow:'balık hali · satış noktaları',h1:'Bugünün balık fiyatları, yakınındaki satıcı',sub:'Güncel hal fiyatlarını gör, taze balık satış noktalarını harita üzerinde bul.',searchCta:'Ara',catsTitle:'Bu mevsim',cats:['Çupra','Levrek','Palamut','Lüfer','Hamsi','Mezgit'],featuredTitle:'Öne çıkan satış noktaları',listTitle:'Satış noktaları',listFresh:'fiyatlar bugün 09:00 güncellendi',honesty:'Listelenen fiyatlar toptan hal fiyatlarıdır; perakende fiyat ve bulunurluk satıcıya göre değişir.',
    cross:[['fishing','Kendin tutmak ister misin? Balık avı turları'],['marina','En yakın marina ve iskeleler']],
    faq:[['Fiyatlar perakende mi?','Hayır, gösterilen değerler toptan balık hali fiyatlarıdır; perakendede farklılık olabilir.'],['Ne sıklıkta güncelleniyor?','Hal fiyatları her sabah güncellenir; tabloda son güncelleme saati gösterilir.'],['Satış noktası açık mı görebilir miyim?','Evet, her satıcı kartında açık/kapalı durumu ve çalışma saati gösterilir.'],['Hangi şehirler kapsanıyor?','İzmir, İstanbul, Muğla, Antalya başta olmak üzere büyük hal ve sahil illeri kapsanır.']],
    featured:[{title:'Kumkapı Balıkçısı',ph:'vitrin fotoğrafı',price:'Açık',sub:'İstanbul · 07:00–19:00',fresh:'bugün açıldı'},{title:'Çeşme Balık Hali',ph:'vitrin fotoğrafı',price:'Açık',sub:'İzmir · 06:00–18:00',fresh:'bugün açıldı'},{title:'Bodrum Balıkçılar',ph:'vitrin fotoğrafı',price:'Kapalı',sub:'Muğla · 08:00–20:00',fresh:'21:00 kapandı'}]},
  fishing:{eyebrow:'ekipman + balık avı turları',h1:'Ekipmanını al, turunu ayarla',sub:'Olta, makara ve yemde fiyat karşılaştır; bölgene göre balık avı turu bul ve talep gönder.',searchCta:'Ara',catsTitle:'Kategoriler',cats:['Olta','Makara','Misina','Yem','Giyim','Turlar'],featuredTitle:'Öne çıkan turlar',listTitle:'Balık avı turları',listFresh:'müsaitlik günlük güncellenir',honesty:'Tur fiyatları sağlayıcı tarafından bildirilir; rezervasyon talebinizi tur sağlayıcı onaylar.',
    cross:[['captain','Tur için kaptan mı lazım? Mürettebat bul'],['fish','Avladığını sat: balık satış noktaları']],
    faq:[['Rezervasyon kesin mi?','Gönderdiğiniz bir rezervasyon talebidir; tur sağlayıcı müsaitliği teyit eder.'],['Ekipman dahil mi?','Çoğu turda olta ve yem dahildir; tur detayında dahil olanlar listelenir.'],['Yarım/tam gün farkı nedir?','Süre tur kartında belirtilir; fiyatlar kişi başıdır.'],['Başlangıç seviyesi uygun mu?','Evet, birçok tur başlangıç seviyesine uygundur; detayda seviye gösterilir.']],
    featured:[{title:'Boğaz Lüfer Turu',ph:'tekne fotoğrafı',price:'₺1.200',sub:'İstanbul · yarım gün',fresh:'bugün güncellendi'},{title:'Gökova Trolling',ph:'tekne fotoğrafı',price:'₺2.400',sub:'Muğla · tam gün',fresh:'2 gün önce güncellendi'},{title:'Çeşme Açık Deniz',ph:'tekne fotoğrafı',price:'₺3.100',sub:'İzmir · tam gün',fresh:'bugün güncellendi'}]},
  yacht:{eyebrow:'yat kataloğu · satılık + kiralık',h1:'Doğru yatı hızlıca bul',sub:'Satılık ve kiralık yatları teknik özellikleriyle yan yana karşılaştır, broker ile iletişime geç.',searchCta:'Ara',catsTitle:'Tipler',cats:['Motor yat','Yelkenli','Katamaran','Süper yat','Gulet','Trawler'],featuredTitle:'Öne çıkan yatlar',listTitle:'Yatlar',listFresh:'ilanlar günlük güncellenir',honesty:'İlan bilgileri broker tarafından sağlanır; fiyat ve müsaitlik için broker ile teyitleşin.',
    cross:[['broker','Aracılık için broker rehberi'],['charter','Sabit rota mı? Charter hatları']],
    faq:[['Satılık ve kiralık aynı yerde mi?','Evet, üstteki mod anahtarıyla Satılık / Kiralık arasında geçiş yaparsınız.'],['Karşılaştırma nasıl çalışır?','Yatları seçip karşılaştırma çekmecesine ekler, teknik özellikleri yan yana görürsünüz.'],['Fiyat görünmüyor, neden?','Bazı ilanlarda satıcı "Fiyat sorunuz" tercih eder; broker ile iletişime geçebilirsiniz.'],['Kiralama ödemesi burada mı?','Hayır, kiralama talebi oluşturursunuz; sözleşme ve ödeme broker ile yürür.']],
    featured:[{title:'Azimut 55 Fly',ph:'yat görseli',price:'€480.000',sub:'2019 · Motor yat',fresh:'bugün güncellendi'},{title:'Bavaria C45',ph:'yat görseli',price:'Haftalık €9.500',sub:'Kiralık · Yelkenli',fresh:'1 gün önce güncellendi'},{title:'Lagoon 42',ph:'yat görseli',price:'€395.000',sub:'2021 · Katamaran',fresh:'bugün güncellendi'}]},
  transitlog:{eyebrow:'transit log · başvuru + takip',h1:'Transit log başvurunu çevrimiçi başlat',sub:'Yabancı bayraklı yatın için transit log başvurusunu adım adım yap, durumunu takip et.',searchCta:'Sorgula',catsTitle:'Hizmetler',cats:['Yeni başvuru','Yenileme','Giriş-çıkış','Belge danışmanlığı','Durum takibi','SSS'],featuredTitle:'Nasıl çalışır',listTitle:'Başvurularım',listFresh:'durumlar günlük güncellenir',honesty:'Süreler resmi makam işlemlerine bağlı olarak tahminîdir; nihai onay ilgili idarenindir.',
    cross:[['bayrak','Tescil işlemleri: Bayrak Ofisi'],['insurance','Tekne sigortası teklifleri']],
    faq:[['Transit log nedir?','Yabancı bayraklı teknelerin Türk sularındaki seyrini belgeleyen resmi kayıttır.'],['Ne kadar geçerlidir?','Genellikle bir sezon/yıl geçerlidir; detaylar başvuru sırasında belirtilir.'],['Hangi belgeler gerekir?','Tekne ruhsatı, sigorta poliçesi ve pasaport bilgileri başlıca belgelerdir.'],['Başvuru ne kadar sürer?','Belgeler tamsa işlem birkaç iş günü sürebilir; takip ekranından izleyebilirsiniz.']],
    featured:[{title:'1. Bilgi gir',ph:'adım 1',price:'',sub:'Tekne & rota bilgileri',fresh:'~5 dakika'},{title:'2. Belge yükle',ph:'adım 2',price:'',sub:'Ruhsat, sigorta, pasaport',fresh:'tek seferlik'},{title:'3. Takip et',ph:'adım 3',price:'',sub:'Durumu canlı izle',fresh:'günlük güncelleme'}]},
  bayrak:{eyebrow:'tescil · bayrak kaydı · belge',h1:'Profesyonel yat kayıt ve denizcilik hizmetleri',sub:'Yatını kaydet, belgelerini yönet, tescil ve bayrak işlemlerini tek panelden yürüt.',searchCta:'Hizmet ara',catsTitle:'Tescil ve ruhsat işlemleri',cats:['Bağlama kütüğü','Tescil belgesi','İsim kontrolü','Yurtdışı şirket','Transit log','Kasko sigortası'],featuredTitle:'Hizmetlerimiz',listTitle:'Hizmet kataloğu',listFresh:'hizmet süreleri tahminîdir',honesty:'Süreler tahminîdir; resmi harçlar ve giderler hizmet bedeline dahil değildir.',
    cross:[['transitlog','Tescil sonrası: transit log'],['insurance','Tekne kasko sigortası teklifleri']],
    faq:[['Tescil ne kadar sürer?','Bağlama kütüğü kaydı ortalama 7-10 iş günü içinde tamamlanır.'],['Hangi belgeler gerekli?','Satış sözleşmesi, teknik özellikler, sahiplik ve kimlik belgeleri başlıcalarıdır.'],['Yurtdışı şirketle kayıt mümkün mü?','Evet, yurtdışı şirket kurulumu ve isim kontrolü hizmetlerimiz mevcuttur.'],['Ödeme nasıl yapılır?','Hizmet talebi sonrası panelden güvenli ödeme adımına yönlendirilirsiniz.']],
    featured:[{title:'Bayrak Kaydı',ph:'belge görseli',price:'',sub:'7-10 iş günü',fresh:'tam uyum'},{title:'Dokümantasyon',ph:'belge görseli',price:'',sub:'Eksiksiz belge hazırlığı',fresh:'deneyimli ekip'},{title:'Mürettebat & Sigorta',ph:'belge görseli',price:'',sub:'Belge + kasko',fresh:'tek çatı'}]},
  service:{eyebrow:'teknik servis · randevu',h1:'Teknene uygun servisi bul',sub:'Motor, elektrik, boya ve daha fazlası için doğrulanmış servisleri karşılaştır, randevu talep et.',searchCta:'Servis bul',catsTitle:'Servis kategorileri',cats:['Motor','Jeneratör','Elektrik','Boya & Elyaf','Yelken','Klima'],featuredTitle:'Öne çıkan servisler',listTitle:'Servisler',listFresh:'müsaitlik günlük güncellenir',honesty:'Fiyatlar tahminîdir; kesin teklif servis firması tarafından randevu sonrası verilir.',
    cross:[['kislama','Karada bakım için tersane/çekek yeri'],['marina','Servisin geleceği marinayı bul']],
    faq:[['Randevu kesin mi?','Gönderdiğiniz bir randevu talebidir; firma onaylar veya teklif verir.'],['Yerinde servis var mı?','Bazı firmalar mobil (yerinde) servis verir; filtreden seçebilirsiniz.'],['Fiyatları görebilir miyim?','Tahmini fiyat aralıkları gösterilir; kesin tutar randevu sonrası netleşir.'],['Doğrulanmış servis ne demek?','Belgeleri ve referansları kontrol edilmiş, doğrulanmış rozetli firmalardır.']],
    featured:[{title:'Ege Marine Servis',ph:'atölye fotoğrafı',price:'₺900–2.500',sub:'İzmir · Motor, elektrik',fresh:'bu hafta uygun'},{title:'Bodrum Teknik',ph:'atölye fotoğrafı',price:'₺1.200–4.000',sub:'Muğla · Boya & elyaf',fresh:'2 gün önce güncellendi'},{title:'Marmara Yat Servis',ph:'atölye fotoğrafı',price:'₺800–3.200',sub:'İstanbul · Jeneratör',fresh:'bugün güncellendi'}]},
  charter:{eyebrow:'charter hatları · rota / sefer',h1:'Mavi yolculuğun hattını seç',sub:'Operatörlerin sabit rotalarını ve kabin charter seferlerini keşfet, rezervasyon talebi gönder.',searchCta:'Hat bul',catsTitle:'Bölgeler',cats:['Gökova','Hisarönü','Fethiye–Kekova','Bodrum','Yunan adaları','Günübirlik'],featuredTitle:'Öne çıkan hatlar',listTitle:'Charter hatları',listFresh:'sefer müsaitliği günlük güncellenir',honesty:'Fiyatlara dahil/hariç kalemler değişir; rezervasyon talebinizi operatör teyit eder.',
    cross:[['captain','Tekne için kaptan & mürettebat'],['yacht','Tüm tekneyi mi istersin? Yat kiralama']],
    faq:[['Kabin charter nedir?','Tüm tekneyi değil, tekil kabini kişi başı kiraladığınız paylaşımlı seferdir.'],['Yemek dahil mi?','Hat detayında dahil/hariç kalemler (kabin, yemek, koy ücreti) açıkça listelenir.'],['Tüm tekneyi kiralayabilir miyim?','Evet, özel charter seçeneğiyle tüm tekne için talep oluşturabilirsiniz.'],['Rezervasyon kesin mi?','Bir taleptir; operatör sefer müsaitliğini onayladığında kesinleşir.']],
    featured:[{title:'Bodrum–Gökova 7 gün',ph:'gulet fotoğrafı',price:'Kabin ₺18.500',sub:'Gulet · 8 kabin',fresh:'bugün güncellendi'},{title:'Fethiye–Kekova 4 gün',ph:'gulet fotoğrafı',price:'Kabin ₺11.200',sub:'Katamaran · 4 kabin',fresh:'1 gün önce güncellendi'},{title:'Gökova Günübirlik',ph:'tekne fotoğrafı',price:'Kişi ₺1.450',sub:'Motoryat · 12 kişi',fresh:'bugün güncellendi'}]},
  broker:{eyebrow:'yat brokerliği',h1:'Doğru brokerle doğru yatı bul',sub:'Uzmanlık ve bölgeye göre doğrulanmış brokerleri keşfet, portföyleri incele, talep gönder.',searchCta:'Broker bul',catsTitle:'Uzmanlık',cats:['Motoryat','Yelkenli','Süper yat','Katamaran','İkinci el','Yeni'],featuredTitle:'Öne çıkan brokerler',listTitle:'Brokerlar',listFresh:'portföyler günlük güncellenir',honesty:'Portföy bilgileri broker tarafından sağlanır; güncel durum için broker ile iletişime geçin.',
    cross:[['yacht','Tüm satılık & kiralık ilanlar'],['insurance','Alım sonrası: tekne sigortası']],
    faq:[['Broker hizmeti ücretli mi?','Komisyon yapısı brokere göre değişir; iletişimde netleştirebilirsiniz.'],['Doğrulanmış broker ne demek?','Referans ve belgeleri kontrol edilmiş, doğrulanmış rozetli brokerlerdir.'],['Alıcı talebi nasıl çalışır?','İlgilendiğiniz yat tipi ve bütçeyi iletir, broker size uygun portföy sunar.'],['Portföydeki yatları görebilir miyim?','Evet, broker profilinde aktif portföy yat kartları olarak listelenir.']],
    featured:[{title:'Deniz Yachting',ph:'broker logosu',price:'',sub:'Bodrum · Motoryat',fresh:'doğrulanmış'},{title:'Aegean Brokerage',ph:'broker logosu',price:'',sub:'Göcek · Yelkenli',fresh:'doğrulanmış'},{title:'Blue Marine Yachts',ph:'broker logosu',price:'',sub:'İstanbul · Süper yat',fresh:'doğrulanmış'}]},
  insurance:{eyebrow:'tekne / yat sigortası',h1:'Teknene doğru sigortayı bul',sub:'Birkaç soruda kasko ve sorumluluk tekliflerini karşılaştır, hızlı teklif talebi al.',searchCta:'Teklif al',catsTitle:'Sigorta türleri',cats:['Kasko','Tekne sorumluluk','Ferdi kaza','Çekme/kurtarma','Charter','Yıllık'],featuredTitle:'Nasıl çalışır',listTitle:'Teklif karşılaştırma',listFresh:'primler tahminîdir',honesty:'Primler tahminîdir; nihai teklif sigorta şirketinin değerlendirmesine bağlıdır.',
    cross:[['bayrak','Tescil & belge: Bayrak Ofisi'],['marina','Teknenin bağlı olduğu marina']],
    faq:[['Teklif almak ücretli mi?','Hayır, teklif karşılaştırma ücretsizdir; sadece poliçe satın alımında ödeme olur.'],['Primler kesin mi?','Gösterilen primler tahminîdir; kesin teklif şirket değerlendirmesiyle netleşir.'],['Charter kullanımı kapsanır mı?','Evet, kullanım türünü (özel/charter) belirterek uygun teminat alırsınız.'],['Hangi teminatlar var?','Kasko, tekne sorumluluk (P&I), ferdi kaza ve çekme/kurtarma başlıcalarıdır.']],
    featured:[{title:'1. Tekneni tanımla',ph:'adım 1',price:'',sub:'Tip, boy, değer, yıl',fresh:'~2 dakika'},{title:'2. Teminat seç',ph:'adım 2',price:'',sub:'Kasko, sorumluluk…',fresh:'esnek'},{title:'3. Teklifleri gör',ph:'adım 3',price:'',sub:'Yan yana karşılaştır',fresh:'anında'}]},
  mazot:{eyebrow:'marine yakıt · ikmal',h1:'Güncel yakıt fiyatları, en yakın ikmal',sub:'Marina istasyonları ve denizde ikmal noktalarının güncel motorin/benzin fiyatlarını karşılaştır.',searchCta:'Ara',catsTitle:'Bölgeler',cats:['Ege','Akdeniz','Marmara','Denizde ikmal','Motorin','Benzin'],featuredTitle:'Öne çıkan ikmal noktaları',listTitle:'İkmal noktaları',listFresh:'fiyatlar bugün güncellendi',honesty:'Fiyatlar bilgilendirme amaçlıdır; pompada güncel fiyatı teyit edin.',
    cross:[['marina','İkmal yapacağın marinayı bul'],['service','Yakıt sistemi için teknik servis']],
    faq:[['Fiyatlar pompayla aynı mı?','Bilgilendirme amaçlıdır; ufak farklar olabilir, pompada teyit edin.'],['Denizde ikmal var mı?','Evet, denizde ikmal veren noktaları filtreden seçebilirsiniz.'],['Ne sıklıkta güncelleniyor?','Fiyatlar günlük güncellenir; her satırda son güncelleme gösterilir.'],['Motorin ve benzin ayrı mı?','Evet, her nokta için iki yakıt türünün fiyatı ayrı listelenir.']],
    featured:[{title:'Göcek İkmal',ph:'istasyon fotoğrafı',price:'₺44,80/L',sub:'Muğla · Motorin',fresh:'bugün güncellendi'},{title:'Kalamış İstasyon',ph:'istasyon fotoğrafı',price:'₺45,20/L',sub:'İstanbul · Denizde ikmal',fresh:'bugün güncellendi'},{title:'Çeşme Yakıt',ph:'istasyon fotoğrafı',price:'₺44,60/L',sub:'İzmir · Motorin',fresh:'bugün güncellendi'}]},
  captain:{eyebrow:'kaptan & mürettebat',h1:'Kaptanını ve ekibini bul',sub:'Skipper, aşçı, deckhand ve mühendis profillerini incele; profesyoneller için iş ilanları.',searchCta:'Ara',catsTitle:'Roller',cats:['Kaptan/Skipper','Aşçı','Deckhand','Host/Hostess','Mühendis','İş ilanları'],featuredTitle:'Öne çıkan profiller',listTitle:'Kaptan & mürettebat',listFresh:'müsaitlik günlük güncellenir',honesty:'Ücret beklentileri tahminîdir; profesyonelle doğrudan iletişimde netleştirilir.',
    cross:[['charter','Sefer için tekne & rota bul'],['academy','Belge almak mı? Denizcilik eğitimi']],
    faq:[['İşe alım burada mı yapılır?','Profil üzerinden iletişim/işe al talebi oluşturursunuz; sözleşme taraflar arasındadır.'],['Lisanslar doğrulanıyor mu?','Profiller lisans rozetleri taşır (Yat Kaptanı, STCW, SRC); detayda görünür.'],['İş ilanı verebilir miyim?','Evet, tekne sahibi olarak ilan oluşturup başvuruları değerlendirebilirsiniz.'],['Ücret nasıl belirlenir?','Profilde tahmini günlük/haftalık beklenti gösterilir; nihai ücret görüşmeyle netleşir.']],
    featured:[{title:'Kapt. Mehmet A.',ph:'profil fotoğrafı',price:'₺6.500/gün',sub:'Yat Kaptanı · 14 yıl',fresh:'bu hafta müsait'},{title:'Aşçı Selin K.',ph:'profil fotoğrafı',price:'₺4.200/gün',sub:'Gulet aşçısı · 8 yıl',fresh:'müsait'},{title:'Deckhand Can T.',ph:'profil fotoğrafı',price:'₺2.800/gün',sub:'STCW · 4 yıl',fresh:'bugün güncellendi'}]},
  kislama:{eyebrow:'tersane · çekek yeri · kışlama',h1:'Teknen için doğru çekek yerini bul',sub:'Karada/denizde kışlama, travel-lift ve karina için fiyat ve uygunluk karşılaştır, rezervasyon iste.',searchCta:'Tersane bul',catsTitle:'Hizmetler',cats:['Karada kışlama','Denizde kışlama','Travel-lift','Karina','Antifouling','Raspa'],featuredTitle:'Öne çıkan tersaneler',listTitle:'Tersaneler & çekek yerleri',listFresh:'müsaitlik günlük güncellenir',honesty:'Fiyatlar tahminîdir; tekne boyu/ağırlığına göre kesin teklif için iletişime geçin.',
    cross:[['service','Karada bakım için teknik servis'],['marina','Sezon sonrası bağlama yeri']],
    faq:[['Travel-lift kapasitesi önemli mi?','Evet, teknenizin ağırlığına uygun lift kapasitesi olan tersaneyi seçmelisiniz.'],['Kendi işçimi getirebilir miyim?','Tersaneye göre değişir; detayda "kendi işçini getir" kuralı belirtilir.'],['Fiyat neye göre?','Genellikle metre veya aya göre hesaplanır; detayda fiyat tablosu vardır.'],['Rezervasyon kesin mi?','Bir taleptir; tersane müsaitliği teyit edip onaylar.']],
    featured:[{title:'Yalıkavak Tersane',ph:'tersane fotoğrafı',price:'₺320/m',sub:'Muğla · 75 ton lift',fresh:'bu hafta uygun'},{title:'Tuzla Çekek',ph:'tersane fotoğrafı',price:'₺280/m',sub:'İstanbul · 150 ton lift',fresh:'2 gün önce güncellendi'},{title:'Urla Marin Tersane',ph:'tersane fotoğrafı',price:'₺300/m',sub:'İzmir · 50 ton lift',fresh:'bugün güncellendi'}]},
  susporu:{eyebrow:'su sporları · dalış',h1:'Denizde adrenalini bul',sub:'Dalış, jet ski, parasailing ve daha fazlası — aktivite ve ekipman kiralama rezervasyonu.',searchCta:'Ara',catsTitle:'Aktiviteler',cats:['Dalış','Jet ski','Parasailing','Wakeboard','SUP/Kano','Şnorkel'],featuredTitle:'Öne çıkan aktiviteler',listTitle:'Aktiviteler',listFresh:'müsaitlik günlük güncellenir',honesty:'Fiyatlar kişi başıdır; ekipman, eğitmen ve sigorta dahil olanları detayda görebilirsiniz.',
    cross:[['academy','Dalış brövesi almak ister misin?'],['charter','Tüm günlük tekne turu']],
    faq:[['Başlangıç seviyesi uygun mu?','Birçok aktivite başlangıç seviyesine uygundur; detayda seviye gösterilir.'],['Ekipman dahil mi?','Çoğu aktivitede ekipman, eğitmen ve sigorta dahildir; detayda listelenir.'],['Yaş sınırı var mı?','Aktiviteye göre minimum yaş belirtilir; rezervasyonda kontrol edilir.'],['Rezervasyon kesin mi?','Bir taleptir; merkez müsaitliği teyit eder.']],
    featured:[{title:'Kaş Dalış Turu',ph:'dalış fotoğrafı',price:'₺1.400',sub:'Antalya · Başlangıç',fresh:'bugün güncellendi'},{title:'Bodrum Jet Ski',ph:'aktivite fotoğrafı',price:'₺900',sub:'Muğla · 30 dk',fresh:'müsait'},{title:'Çeşme Parasailing',ph:'aktivite fotoğrafı',price:'₺1.100',sub:'İzmir · 15 dk',fresh:'bugün güncellendi'}]},
  academy:{eyebrow:'denizcilik eğitimi',h1:'Denize çıkmadan önce öğren',sub:'Amatör Denizci Belgesi, telsiz, yelken ve dalış kurslarını keşfet, ön kayıt talebi gönder.',searchCta:'Kurs bul',catsTitle:'Kategoriler',cats:['ADB','Telsiz/SRC','Yelken','Dalış','İlk Yardım','Seyir'],featuredTitle:'Öne çıkan kurslar',listTitle:'Kurslar',listFresh:'kontenjanlar günlük güncellenir',honesty:'Kontenjan ve tarihler kuruma göre değişir; kesin bilgi için kurumla iletişime geçin.',
    cross:[['captain','Belgeni aldın mı? Kaptan/mürettebat ilanları'],['susporu','Dalış pratiği için su sporları']],
    faq:[['ADB nasıl alınır?','Teorik eğitim ve sınav süreci kurslarda anlatılır; rehber içeriğimizden de okuyabilirsiniz.'],['Online kurs var mı?','Evet, format (online/sınıf/uygulama) her kursta belirtilir.'],['Sertifika geçerli mi?','Kurslar yetkili kurs merkezlerince verilir; sertifika bilgisi kurs detayında yer alır.'],['Kayıt kesin mi?','Bir ön kayıt talebidir; kurum kontenjanı teyit eder.']],
    featured:[{title:'Amatör Denizci Belgesi',ph:'kurs görseli',price:'₺3.500',sub:'Sınıf + sınav · 2 hafta',fresh:'kontenjan var'},{title:'SRC Telsiz Kursu',ph:'kurs görseli',price:'₺2.200',sub:'Online · 1 hafta',fresh:'kontenjan var'},{title:'Yelken Başlangıç',ph:'kurs görseli',price:'₺4.800',sub:'Uygulama · 5 gün',fresh:'bugün güncellendi'}]},
  vip:{eyebrow:'VIP transfer · özel şoför',h1:'Havalimanından yatınıza VIP transfer',sub:'Havalimanı, marina, otel ve adres arası özel şoförlü konforlu transfer; rota ve araç seç, talep gönder.',searchCta:'Transfer bul',catsTitle:'Araç sınıfları',cats:['VIP Van','Lüks Sedan','Minibüs','Tekne/Tender','Havalimanı','Marina'],featuredTitle:'Öne çıkan transferler',listTitle:'Transferler',listFresh:'fiyatlar güzergâha göre değişir',honesty:'Fiyat rota ve saate göre tahminîdir; sağlayıcı teyit eder.',
    cross:[['hotel','Konaklama da lazım mı? Oteller'],['charter','Yat/charter misafir transferi']],
    faq:[['Fiyat neye göre belirleniyor?','Fiyat rota, mesafe ve saate göre tahminîdir; kesin tutarı sağlayıcı teyit eder.'],['Uçuş takibi yapılıyor mu?','Rezervasyonda uçuş numarası girersiniz; sağlayıcı uçuş saatine göre karşılama planlar.'],['Çocuk koltuğu var mı?','Birçok araçta çocuk koltuğu ve ek olanaklar mevcuttur; talepte belirtebilirsiniz.'],['Tekne/tender transferi mümkün mü?','Evet, marina içi ve adaya tekne/tender transferi araç sınıfları arasında yer alır.']],
    featured:[{title:'VIP Van · Havalimanı → Göcek',ph:'araç görseli',price:'₺4.500',sub:'6 yolcu · ~3 saat',fresh:'bugün güncellendi'},{title:'Lüks Sedan · Bodrum',ph:'araç görseli',price:'₺2.800',sub:'3 yolcu · ~45 dk',fresh:'bugün güncellendi'},{title:'Minibüs · Dalaman → Marmaris',ph:'araç görseli',price:'₺3.900',sub:'12 yolcu · ~1,5 saat',fresh:'1 gün önce güncellendi'}]},
  hotel:{eyebrow:'konaklama · marina yakını',h1:'Marina yakını konaklama',sub:'Sahil ve marinaya yakın otelleri karşılaştır, tarih seç, rezervasyon talebi gönder.',searchCta:'Otel bul',catsTitle:'Konaklama tipleri',cats:['Marina oteli','Butik sahil','Tatil köyü','Apart','Ege','Akdeniz'],featuredTitle:'Öne çıkan oteller',listTitle:'Oteller',listFresh:'fiyatlar günlük güncellenir',honesty:'Fiyatlar tahminîdir; müsaitlik otel tarafından teyit edilir.',
    cross:[['marina','Teknenin bağlı olduğu marina'],['charter','Charter öncesi konaklama']],
    faq:[['Rezervasyon kesin mi?','Gönderdiğiniz bir taleptir; müsaitlik ve fiyat otel tarafından teyit edilir.'],['Marinaya mesafe gösteriliyor mu?','Evet, her otel kartında en yakın marina ve mesafe bilgisi yer alır.'],['Fiyata neler dahil?','Gecelik oda fiyatıdır; kahvaltı ve ek hizmetler otele göre değişir, detayda belirtilir.'],['İptal koşulları ne?','İptal ve giriş/çıkış politikaları otel detayında açıkça listelenir.']],
    featured:[{title:'Marina Bay Otel',ph:'otel görseli',price:'₺3.200',sub:'Göcek · marinaya 50 m',fresh:'bugün güncellendi'},{title:'Butik Sahil Konak',ph:'otel görseli',price:'₺2.400',sub:'Bodrum · sahil',fresh:'1 gün önce güncellendi'},{title:'Çeşme Tatil Köyü',ph:'otel görseli',price:'₺4.100',sub:'İzmir · havuzlu',fresh:'bugün güncellendi'}]},
  power:{eyebrow:'solar & enerji depolama',h1:'Teknende enerji bağımsızlığı',sub:'Solar panel, akü, inverter ve izleme ürünlerini karşılaştır; kurulumcu bul, ihtiyacını hesapla.',searchCta:'Ürün bul',catsTitle:'Kategoriler',cats:['Solar panel','Akü/Batarya','İnverter','Şarj regülatörü','İzleme','Kurulumcular'],featuredTitle:'Öne çıkan ürünler',listTitle:'Ürünler',listFresh:'fiyatlar saatlik güncellenir',honesty:'Fiyatlar satıcı beslemelerinden gelir; nihai fiyat için satıcıyı kontrol edin.',
    cross:[['yacht','Sistemi kuracağın yat'],['service','Kurulum için teknik servis']],
    faq:[['İhtiyacımı nasıl hesaplarım?','Enerji hesaplayıcıda tekne ve günlük tüketiminizi girer, önerilen sistemi görürsünüz.'],['Kurulum dahil mi?','Ürün satışı ayrı; kurulumcular bölümünden yerinde kurulum teklifi alabilirsiniz.'],['Fiyatlar güncel mi?','Satıcı beslemeleri saatlik güncellenir; her üründe son güncelleme gösterilir.'],['Hangi kapasiteler var?','Panel (W), akü (Ah/kWh) ve inverter (W) kapasiteleri kart üzerinde belirtilir.']],
    featured:[{title:'Solar Panel 200W Mono',ph:'ürün görseli',price:'₺6.400',sub:'Victron · 4 satıcı',fresh:'2 saat önce güncellendi'},{title:'LiFePO4 Akü 100Ah',ph:'ürün görseli',price:'₺18.900',sub:'3 satıcı',fresh:'1 saat önce güncellendi'},{title:'İnverter 2000W',ph:'ürün görseli',price:'₺9.200',sub:'5 satıcı',fresh:'bugün güncellendi'}]},
  auction:{eyebrow:'açık artırma · canlı teklif',h1:'Denizcilik açık artırmaları',sub:'İkinci el tekne, motor ve ekipman için canlı teklif ver; geri sayımı takip et.',searchCta:'İlan bul',catsTitle:'Kategoriler',cats:['Tekne/Yat','Motor','Elektronik','Ekipman','Römork','Aktif olanlar'],featuredTitle:'Aktif açık artırmalar',listTitle:'Açık artırmalar',listFresh:'teklifler canlı güncellenir',honesty:'Sonuç kapanışta kesinleşir; güncel teklif anlık değişebilir.',
    cross:[['yacht','Sabit fiyat mı? Yat kataloğu'],['broker','Aracılık için broker']],
    faq:[['Teklif vermek bağlayıcı mı?','Teklifler açık artırma kurallarına tabidir; kapanışta en yüksek teklif kazanır.'],['Kalan süreyi nereden görürüm?','Her ilanda canlı geri sayım ve güncel teklif tutarı gösterilir.'],['Ödeme burada mı yapılır?','Prototipte ödeme yoktur; kazanan sonrası süreç satıcıyla yürür.'],['Ekspertiz bilgisi var mı?','İlan detayında mevcut spec, durum ve varsa ekspertiz notları listelenir.']],
    featured:[{title:'2016 Jeanneau 349',ph:'ilan görseli',price:'₺2.850.000',sub:'Güncel teklif · 2 gün kaldı',fresh:'canlı'},{title:'Yamaha F150 Motor',ph:'ilan görseli',price:'₺185.000',sub:'Güncel teklif · 6 saat kaldı',fresh:'canlı'},{title:'Raymarine Elektronik Set',ph:'ilan görseli',price:'₺42.000',sub:'Güncel teklif · 1 gün kaldı',fresh:'canlı'}]},
  club:{eyebrow:'kulüp · üyelik & topluluk',h1:'Denizciler kulübüne katıl',sub:'Üyelik planları, etkinlikler ve partner ayrıcalıkları; ekosistem genelinde indirimler.',searchCta:'Keşfet',catsTitle:'Bölümler',cats:['Üyelik','Etkinlikler','Ayrıcalıklar','Topluluk','Regatta','Buluşma'],featuredTitle:'Yaklaşan etkinlikler',listTitle:'Etkinlikler',listFresh:'program haftalık güncellenir',honesty:'Kontenjan ve ayrıcalıklar üyelik planına göre değişir.',
    cross:[['tickets','Etkinlik biletleri'],['charter','Üyelere özel charter']],
    faq:[['Üyelik neler sağlar?','Partner marina, servis ve charter indirimleri ile özel etkinliklere erişim sağlar.'],['Planlar neler?','Aylık ve yıllık planlar mevcuttur; kapsam üyelik sayfasında karşılaştırılır.'],['Etkinliğe nasıl katılırım?','Etkinlik detayından katılım talebi oluşturursunuz; kontenjan sınırlıdır.'],['İptal edebilir miyim?','Üyelik dilediğiniz zaman yönetilebilir; koşullar plan detayında belirtilir.']],
    featured:[{title:'Yıllık Üyelik',ph:'üyelik görseli',price:'₺4.900/yıl',sub:'Tüm ayrıcalıklar',fresh:'bugün güncellendi'},{title:'Gökova Regatta 2026',ph:'etkinlik görseli',price:'Üyelere özel',sub:'12 Temmuz · Akyaka',fresh:'kontenjan var'},{title:'Marina Buluşması',ph:'etkinlik görseli',price:'Ücretsiz',sub:'3 Ağustos · Bodrum',fresh:'kontenjan var'}]},
  trip:{eyebrow:'deniz gezisi & deneyim',h1:'Günün deniz deneyimini seç',sub:'Koy turu, gün batımı ve yüzme gezileri; küratörlü günübirlik deneyimler, tek talep.',searchCta:'Gezi bul',catsTitle:'Temalar',cats:['Koy turu','Gün batımı','Yüzme & şnorkel','Balık','Özel','Günübirlik'],featuredTitle:'Öne çıkan geziler',listTitle:'Deniz gezileri',listFresh:'müsaitlik günlük güncellenir',honesty:'Fiyatlar kişi başıdır; sağlayıcı müsaitliği teyit eder.',
    cross:[['charter','Çok günlü mü? Charter hatları'],['susporu','Su sporu aktiviteleri']],
    faq:[['Rezervasyon kesin mi?','Gönderdiğiniz bir taleptir; sağlayıcı müsaitliği teyit eder.'],['Fiyata neler dahil?','Kişi başı fiyata dahil olanlar (öğle yemeği, ikram vb.) gezi detayında listelenir.'],['Çocuklar katılabilir mi?','Çoğu gezi ailelere uygundur; yaş ve indirim bilgisi detayda belirtilir.'],['Kalkış noktası nerede?','Buluşma noktası ve saat gezi detayında harita ile gösterilir.']],
    featured:[{title:'Gökova Koy Turu',ph:'gezi görseli',price:'₺1.450',sub:'Akyaka · günübirlik',fresh:'bugün güncellendi'},{title:'Bodrum Gün Batımı',ph:'gezi görseli',price:'₺950',sub:'2,5 saat · akşam',fresh:'bugün güncellendi'},{title:'Kaş Yüzme & Şnorkel',ph:'gezi görseli',price:'₺1.200',sub:'Antalya · yarım gün',fresh:'1 gün önce güncellendi'}]},
  isgucu:{eyebrow:'işgücü & mürettebat',h1:'Denizcilik işgücü ve iş ilanları',sub:'Aşçı, deckhand, mühendis, marina ve tersane personeli; ilan ver ya da iş ara. Kaptan & skipper için KolayKaptan.',searchCta:'İlan bul',catsTitle:'Roller',cats:['Aşçı','Deckhand','Mühendis','Marina personeli','Tersane personeli','İş ilanları'],featuredTitle:'Öne çıkan ilanlar',listTitle:'İş ilanları',listFresh:'ilanlar günlük güncellenir',honesty:'Ücretler tahminîdir; koşullar işveren ile netleşir.',
    cross:[['captain','Skipper & mürettebat kiralama'],['academy','Belge & eğitim']],
    faq:[['İşe alım burada mı yapılır?','İlana başvurur ya da profil oluşturursunuz; sözleşme taraflar arasındadır.'],['Lisanslar görünür mü?','Profillerde lisans ve deneyim rozetleri (Yat Kaptanı, STCW, SRC) yer alır.'],['İlan vermek ücretli mi?','Prototipte ücret yoktur; işveren ilan oluşturup başvuruları değerlendirir.'],['Sezonluk iş var mı?','Evet, sezonluk ve daimi ilanlar rol ve tarih filtreleriyle listelenir.']],
    featured:[{title:'Yat Aşçısı — Göcek',ph:'ilan görseli',price:'₺55.000/ay',sub:'Sezonluk · Haziran–Eylül',fresh:'bugün güncellendi'},{title:'Tersane Ustası — Tuzla',ph:'ilan görseli',price:'₺48.000/ay',sub:'Daimi',fresh:'1 gün önce güncellendi'},{title:'Marina Teknisyeni — İzmir',ph:'ilan görseli',price:'₺38.000/ay',sub:'Daimi',fresh:'bugün güncellendi'}]},
  photo:{eyebrow:'tekne/yat fotoğrafçıları',h1:'Teknenin en iyi karesi',sub:'Drone, marina ve denizde çekim; yat ilan fotoğrafçısı bul, portfolyo incele, rezervasyon yap.',searchCta:'Fotoğrafçı bul',catsTitle:'Çekim türleri',cats:['Yat ilan','Drone','Etkinlik','Kurumsal','Deniz','Marina'],featuredTitle:'Öne çıkan fotoğrafçılar',listTitle:'Fotoğrafçılar',listFresh:'müsaitlik günlük güncellenir',honesty:'Paket fiyatları sağlayıcıya göre değişir; talebi fotoğrafçı onaylar.',
    cross:[['broker','İlan görseli için broker'],['charter','Etkinlik & charter çekimi']],
    faq:[['Ne tür çekimler var?','Yat ilan, drone, etkinlik ve kurumsal çekim türleri fotoğrafçı profilinde belirtilir.'],['Paket fiyatları sabit mi?','Paketler sağlayıcıya göre değişir; detayda çekim süresi ve teslim şartları yer alır.'],['Teslim ne kadar sürer?','İşlenmiş fotoğrafların teslim süresi paket detayında belirtilir.'],['Drone izni gerekli mi?','Bazı bölgelerde uçuş izni gerekir; fotoğrafçı süreci yönetir.']],
    featured:[{title:'Deniz Işık Studio',ph:'portfolyo görseli',price:'₺3.500',sub:'Bodrum · Yat ilan + drone',fresh:'bu hafta uygun'},{title:'Ege Drone Works',ph:'portfolyo görseli',price:'₺2.800',sub:'İzmir · Drone',fresh:'bugün güncellendi'},{title:'Marina Frame',ph:'portfolyo görseli',price:'₺2.200',sub:'Göcek · Etkinlik',fresh:'1 gün önce güncellendi'}]},
  tickets:{eyebrow:'yaz etkinlik biletleri',h1:'Bu yaz denizde',sub:'Sahil ve marina konserleri, festivaller, yat partileri ve regatta; etkinlik bul, bilet talebi gönder.',searchCta:'Etkinlik bul',catsTitle:'Türler',cats:['Konser','Festival','Yat partisi','Regatta','DJ','Sahil'],featuredTitle:'Öne çıkan etkinlikler',listTitle:'Etkinlikler',listFresh:'program haftalık güncellenir',honesty:'Bilet talebidir; organizatör teyit eder.',
    cross:[['club','Üyelik & ayrıcalıklar'],['trip','Deniz gezileri']],
    faq:[['Bilet nasıl alınır?','Etkinlik detayından bilet tipi seçip talep oluşturursunuz; organizatör teyit eder.'],['Bilet tipleri neler?','Standart, VIP ve masa/loca gibi biletler etkinlik detayında listelenir.'],['İade var mı?','İade ve değişim koşulları etkinliğe göre değişir; detayda belirtilir.'],['Mekan nerede?','Etkinlik mekanı ve konumu detayda harita ile gösterilir.']],
    featured:[{title:'Marina Sunset DJ',ph:'etkinlik görseli',price:'₺650',sub:'Bodrum · 18 Temmuz',fresh:'bilet var'},{title:'Ege Deniz Festivali',ph:'etkinlik görseli',price:'₺400',sub:'Çeşme · 2-4 Ağustos',fresh:'bilet var'},{title:'Yat Partisi · Göcek',ph:'etkinlik görseli',price:'₺1.200',sub:'26 Temmuz',fresh:'sınırlı'}]},
  masaj:{eyebrow:'teknede masaj & wellness',h1:'Teknende profesyonel masaj',sub:'Marina, tekne ve otelde mobil terapist bul; masaj ve spa hizmetleri için randevu talebi gönder.',searchCta:'Terapist bul',catsTitle:'Hizmet türleri',cats:['İsveç','Deep tissue','Aromaterapi','Refleksoloji','Spa','Mobil'],featuredTitle:'Öne çıkan terapistler',listTitle:'Terapistler',listFresh:'müsaitlik günlük güncellenir',honesty:'Fiyatlar seans başıdır ve terapiste göre değişir; talebi terapist onaylar.',
    cross:[['hotel','Konaklamanda wellness'],['club','Üyelere özel indirim']],
    faq:[['Terapist tekneye geliyor mu?','Evet, mobil terapistler marina, tekne ve otele yerinde hizmet verir; profilde belirtilir.'],['Randevu kesin mi?','Gönderdiğiniz bir randevu talebidir; terapist müsaitliği teyit eder.'],['Fiyata neler dahil?','Seans başı fiyattır; paket ve ek hizmetler terapist detayında listelenir.'],['Hangi masaj türleri var?','İsveç, deep tissue, aromaterapi, refleksoloji ve spa paketleri sunulur.']],
    featured:[{title:'Marina Wellness · Ece D.',ph:'terapist görseli',price:'₺1.800',sub:'Göcek · Aromaterapi · mobil',fresh:'bu hafta uygun'},{title:'Deep Tissue · Kaan M.',ph:'terapist görseli',price:'₺1.500',sub:'Bodrum · Deep tissue',fresh:'bugün güncellendi'},{title:'Tekne Spa · Selin A.',ph:'terapist görseli',price:'₺2.200',sub:'Marmaris · Spa paketi',fresh:'1 gün önce güncellendi'}]},
  racing:{eyebrow:'yat yarışları & regatta',h1:'Yarışını bul, kaydını yap',sub:'Regatta ve yat yarışı takvimi; kulüp, kategori ve bölgeye göre yarış bul, ekibinle kayıt ol.',searchCta:'Yarış bul',catsTitle:'Kategoriler',cats:['Regatta','Kruvazör','One-design','Optimist','Katamaran','Kupa'],featuredTitle:'Yaklaşan yarışlar',listTitle:'Yarışlar',listFresh:'takvim haftalık güncellenir',honesty:'Yarış tarihleri ve kategoriler organizatöre bağlıdır; kayıt organizatör tarafından teyit edilir.',
    cross:[['club','Kulüp üyeliği & etkinlikler'],['captain','Ekip & mürettebat bul']],
    faq:[['Yarışa nasıl kayıt olurum?','Yarış detayından ekip ve tekne bilgisiyle kayıt talebi oluşturursunuz; organizatör teyit eder.'],['Hangi kategoriler var?','Regatta, kruvazör, one-design ve sınıf yarışları kategori filtresinde listelenir.'],['Sonuçlar nerede?','Sonuçlanan yarışların sıralaması yarış detayında yayımlanır.'],['Ekip bulabilir miyim?','Evet, KolayKaptan ile mürettebat/ekip bulabilirsiniz; çapraz bağlantı mevcuttur.']],
    featured:[{title:'Bodrum Kupası',ph:'yarış görseli',price:'₺2.500',sub:'Bodrum · 12-14 Temmuz',fresh:'kayıtlar açık'},{title:'Çeşme Regatta',ph:'yarış görseli',price:'₺1.800',sub:'İzmir · 2-3 Ağustos',fresh:'kayıtlar açık'},{title:'Marmaris Race Week',ph:'yarış görseli',price:'₺3.200',sub:'Muğla · 5-9 Kasım',fresh:'erken kayıt'}]},
  exper:{eyebrow:'tekne ekspertiz · sörvey',h1:'Tekneni uzmana incelet',sub:'İkinci el alım, sigorta ve tescil için yetkili tekne ekspertiz (sörvey) firmalarını bul, rapor ve randevu al.',searchCta:'Ekspertiz bul',catsTitle:'Ekspertiz türleri',cats:['Alım öncesi','Sigorta sörveyi','Tekne değerleme','Motor ekspertiz','Hasar tespiti','Tonaj'],featuredTitle:'Öne çıkan ekspertizler',listTitle:'Ekspertiz firmaları',listFresh:'müsaitlik günlük güncellenir',honesty:'Ücretler tekne boyu ve kapsamına göre tahminîdir; rapor firma tarafından düzenlenir.',
    cross:[['broker','Alım için broker rehberi'],['insurance','Sigorta teklifi al']],
    faq:[['Ekspertiz ne zaman gerekir?','İkinci el alımda, sigorta yenilemede ve tescil işlemlerinde tekne sörveyi istenir.'],['Rapor ne kadar sürer?','Kapsamlı sörvey raporu genellikle birkaç iş günü içinde teslim edilir; detayda belirtilir.'],['Fiyat neye göre?','Ücret tekne boyu ve ekspertiz kapsamına göre tahminîdir; kesin teklif firmadan alınır.'],['Randevu kesin mi?','Gönderdiğiniz bir randevu talebidir; firma müsaitliği teyit eder.']],
    featured:[{title:'Ege Marine Sörvey',ph:'ekspertiz görseli',price:'₺4.500',sub:'İzmir · Alım öncesi',fresh:'bu hafta uygun'},{title:'Bodrum Yat Ekspertiz',ph:'ekspertiz görseli',price:'₺6.000',sub:'Muğla · Sigorta sörveyi',fresh:'bugün güncellendi'},{title:'Marmara Deniz Ekspertiz',ph:'ekspertiz görseli',price:'₺3.800',sub:'İstanbul · Değerleme',fresh:'1 gün önce güncellendi'}]},
  radyo:{eyebrow:'ücretsiz denizcilik radyo & tv',h1:'Denizin sesini canlı dinle, ücretsiz',sub:'Denizcilik radyoları, canlı TV yayınları, hava & deniz durumu bültenleri, program ve podcast\'ler — tamamı ücretsiz, reklamsız.',searchCta:'Kanal bul',catsTitle:'Kategoriler',cats:['Canlı Radyo','Canlı TV','Hava & Deniz','Podcast','Müzik','Röportaj'],featuredTitle:'Öne çıkan yayınlar',listTitle:'Tüm kanallar',listFresh:'yayın akışı canlı',honesty:'Yayınlar ücretsizdir; canlı akış demo amaçlıdır.',
    cross:[['racing','Yarış yayınlarını izle'],['stars','Konuk denizcilik yıldızları']],
    faq:[['Gerçekten ücretsiz mi?','Evet, tüm radyo ve TV yayınları ücretsiz ve reklamsızdır; üyelik gerekmez.'],['Hava durumu güncel mi?','Deniz ve hava bültenleri gün içinde düzenli güncellenir; seyir öncesi resmi kaynakla teyit edin.'],['Podcast indirilebilir mi?','Bölümler uygulama içinden dinlenir; indirme yakında eklenecektir.'],['Yayıncı olabilir miyim?','Denizcilik içerik üreticileri başvuru ile kendi kanalını açabilir.']],
    featured:[{title:'Marin FM · Canlı',ph:'radyo görseli',price:'Ücretsiz',sub:'Denizci müzikleri · 7/24',fresh:'şimdi çalıyor'},{title:'Deniz TV · Hava Bülteni',ph:'tv görseli',price:'Ücretsiz',sub:'Ege & Akdeniz · canlı',fresh:'canlı'},{title:'Rota Podcast',ph:'podcast görseli',price:'Ücretsiz',sub:'Kaptan sohbetleri · haftalık',fresh:'yeni bölüm'}]},
  stars:{eyebrow:'denizcilik yıldızları & influencer',h1:'Denizin yıldızları, tek çatı altında',sub:'Kaptanlar, gezginler, sporcular ve içerik üreticileri; profillerini keşfet, işbirliği ve etkinlik için iletişime geç.',searchCta:'İsim bul',catsTitle:'Uzmanlık alanları',cats:['Gezgin','Yarışçı','İçerik Üreticisi','Kaptan','Sporcu','Fotoğrafçı'],featuredTitle:'Öne çıkan isimler',listTitle:'Tüm profiller',listFresh:'takipçi verisi günlük güncellenir',honesty:'Takipçi ve etkileşim verileri tahminîdir; işbirliği koşulları kişiyle görüşülür.',
    cross:[['tickets','Etkinlik & buluşma biletleri'],['radyo','Radyo & TV konuklukları']],
    faq:[['İşbirliği nasıl olur?','Profil üzerinden işbirliği talebi gönderirsiniz; içerik üreticisi veya menajeri döner.'],['Takipçi verisi doğru mu?','Rakamlar platform beyanına dayalı tahminîdir; kampanya öncesi teyit edilir.'],['Profil nasıl açılır?','Denizcilik influencer\'ları başvuru ile doğrulanmış profil açabilir.'],['Etkinliğe çağırabilir miyim?','Evet, etkinlik/konuşmacı daveti için profilden talep oluşturabilirsiniz.']],
    featured:[{title:'Kaptan Deniz Yılmaz',ph:'profil görseli',price:'420B takipçi',sub:'Gezgin · YouTube · Instagram',fresh:'doğrulanmış'},{title:'Selin Deniz',ph:'profil görseli',price:'180B takipçi',sub:'Yarışçı · olimpik yelken',fresh:'işbirliğine açık'},{title:'Mavi Rota',ph:'profil görseli',price:'95B takipçi',sub:'İçerik üreticisi · tekne vlog',fresh:'yeni içerik'}]}
};

// marina full list + detail data
const MARINA_ITEMS = [
  {id:'gocek',title:'D-Marin Göcek',place:'Muğla · Ege',price:'₺2.100',priceUnit:'günlük / 12m',badge:'Müsait',tone:'good',tags:['Yakıt','Elektrik','Su','Vinç'],fresh:'bugün güncellendi',rating:'4,8',reviews:312,about:'Göcek koyunda korunaklı, tam donanımlı bir marina. 40m\'ye kadar yatlara hizmet verir; yakıt istasyonu ve teknik servis sahada mevcuttur.',amenities:['Yakıt istasyonu','Elektrik & su','Travel-lift 75t','7/24 güvenlik','WiFi','Kuru havuz','Atık alımı'],specs:[['Kapasite','480 yat'],['Max boy','40 m'],['Max draft','5,5 m'],['VHF','Kanal 73']],prices:[['Günlük (10–12m)','₺2.100'],['Günlük (12–15m)','₺2.650'],['Aylık (12m)','₺28.000'],['Elektrik (kWh)','₺9,50']]},
  {id:'kalamis',title:'Setur Kalamış',place:'İstanbul · Marmara',price:'₺1.850',priceUnit:'günlük / 12m',badge:'Sınırlı',tone:'warn',tags:['Elektrik','Su','Güvenlik','WiFi'],fresh:'1 gün önce güncellendi',rating:'4,6',reviews:248,about:'İstanbul\'un merkezinde, ulaşımı kolay köklü bir marina. Sosyal tesisleri ve restoranlarıyla şehirde konaklama için idealdir.',amenities:['Elektrik & su','7/24 güvenlik','WiFi','Restoran & kafe','Market','Atık alımı'],specs:[['Kapasite','1.080 yat'],['Max boy','50 m'],['Max draft','6 m'],['VHF','Kanal 72']],prices:[['Günlük (10–12m)','₺1.850'],['Günlük (12–15m)','₺2.300'],['Aylık (12m)','₺24.500'],['Elektrik (kWh)','₺9,80']]},
  {id:'cesme',title:'Çeşme Marina',place:'İzmir · Ege',price:'₺1.640',priceUnit:'günlük / 12m',badge:'Müsait',tone:'good',tags:['Yakıt','Elektrik','Su','Market'],fresh:'bugün güncellendi',rating:'4,7',reviews:189,about:'Çeşme merkezde, alışveriş ve eğlence alanlarına yürüme mesafesinde modern bir marina. Sezonluk ve günlük bağlama sunar.',amenities:['Yakıt istasyonu','Elektrik & su','WiFi','Market','Restoranlar','Güvenlik'],specs:[['Kapasite','400 yat'],['Max boy','60 m'],['Max draft','5 m'],['VHF','Kanal 74']],prices:[['Günlük (10–12m)','₺1.640'],['Günlük (12–15m)','₺2.050'],['Aylık (12m)','₺21.000'],['Elektrik (kWh)','₺9,20']]},
  {id:'bodrum',title:'Milta Bodrum Marina',place:'Muğla · Ege',price:'₺2.350',priceUnit:'günlük / 12m',badge:'Müsait',tone:'good',tags:['Yakıt','Elektrik','Su','Vinç'],fresh:'bugün güncellendi',rating:'4,5',reviews:276,about:'Bodrum kalesinin dibinde, kalbinde konumlanan marina. Geniş kapasitesi ve teknik altyapısıyla bilinir.',amenities:['Yakıt istasyonu','Elektrik & su','Travel-lift 100t','Güvenlik','WiFi','Kuru havuz'],specs:[['Kapasite','450 yat'],['Max boy','55 m'],['Max draft','6 m'],['VHF','Kanal 73']],prices:[['Günlük (10–12m)','₺2.350'],['Günlük (12–15m)','₺2.900'],['Aylık (12m)','₺30.000'],['Elektrik (kWh)','₺9,60']]},
  {id:'finike',title:'Setur Finike',place:'Antalya · Akdeniz',price:'₺1.420',priceUnit:'günlük / 12m',badge:'Müsait',tone:'good',tags:['Elektrik','Su','Vinç','Güvenlik'],fresh:'2 gün önce güncellendi',rating:'4,4',reviews:131,about:'Akdeniz\'in sakin koylarına yakın, uzun süreli kışlama için tercih edilen ekonomik bir marina.',amenities:['Elektrik & su','Travel-lift 50t','Güvenlik','Kuru havuz','Atık alımı'],specs:[['Kapasite','320 yat'],['Max boy','45 m'],['Max draft','4,5 m'],['VHF','Kanal 73']],prices:[['Günlük (10–12m)','₺1.420'],['Günlük (12–15m)','₺1.780'],['Aylık (12m)','₺17.500'],['Elektrik (kWh)','₺8,90']]},
  {id:'marmaris',title:'Netsel Marmaris',place:'Muğla · Ege',price:'₺1.980',priceUnit:'günlük / 12m',badge:'Sınırlı',tone:'warn',tags:['Yakıt','Elektrik','Su','Market'],fresh:'bugün güncellendi',rating:'4,6',reviews:203,about:'Marmaris merkezde, çarşıya bitişik canlı bir marina. Mavi tur çıkışları için popüler bir başlangıç noktasıdır.',amenities:['Yakıt istasyonu','Elektrik & su','Market','Restoranlar','WiFi','Güvenlik'],specs:[['Kapasite','750 yat'],['Max boy','55 m'],['Max draft','5,5 m'],['VHF','Kanal 72']],prices:[['Günlük (10–12m)','₺1.980'],['Günlük (12–15m)','₺2.480'],['Aylık (12m)','₺26.000'],['Elektrik (kWh)','₺9,40']]},
  {id:'didim',title:'D-Marin Didim',place:'Aydın · Ege',price:'₺1.560',priceUnit:'günlük / 12m',badge:'Müsait',tone:'good',tags:['Elektrik','Su','Vinç','WiFi'],fresh:'1 gün önce güncellendi',rating:'4,5',reviews:158,about:'Geniş kara parkı ve modern tesisleriyle Ege\'nin güneyinde kapsamlı hizmet veren bir marina.',amenities:['Elektrik & su','Travel-lift 330t','Güvenlik','WiFi','Kuru havuz','Restoran'],specs:[['Kapasite','580 yat'],['Max boy','80 m'],['Max draft','7 m'],['VHF','Kanal 73']],prices:[['Günlük (10–12m)','₺1.560'],['Günlük (12–15m)','₺1.950'],['Aylık (12m)','₺19.500'],['Elektrik (kWh)','₺9,10']]},
  {id:'ataköy',title:'Ataköy Marina',place:'İstanbul · Marmara',price:'₺1.720',priceUnit:'günlük / 12m',badge:'Dolu',tone:'bad',tags:['Elektrik','Su','Güvenlik','Market'],fresh:'bugün güncellendi',rating:'4,3',reviews:142,about:'Şehir merkezine ve havalimanına yakın, mega yatlara da hizmet verebilen büyük bir marina.',amenities:['Elektrik & su','7/24 güvenlik','Market','Restoranlar','WiFi','Atık alımı'],specs:[['Kapasite','700 yat'],['Max boy','90 m'],['Max draft','6,5 m'],['VHF','Kanal 72']],prices:[['Günlük (10–12m)','₺1.720'],['Günlük (12–15m)','₺2.150'],['Aylık (12m)','₺23.000'],['Elektrik (kWh)','₺9,70']]},
];
const BADGE_TONE = {
  good:{bg:'var(--km-good-soft)',fg:'var(--km-good)'},
  warn:{bg:'var(--km-warn-soft)',fg:'var(--km-warn)'},
  bad:{bg:'var(--km-bad-soft)',fg:'var(--km-bad)'},
};

// generic panel rows per module type
const SERVICE_ITEMS = [
  {id:'ege',title:'Ege Marine Servis',place:'İzmir · Ege',price:'₺900',priceUnit:"'den başlayan / iş",badge:'Doğrulanmış',tone:'good',tags:['Motor','Elektrik','Mobil servis'],fresh:'bu hafta uygun',rating:'4,8',reviews:164,about:'Dıştan takma ve içten motor bakımı, marine elektrik ve elektronik kurulumunda uzman ekip. Marina içinde yerinde (mobil) servis verir.',amenities:['Motor bakım & onarım','Marine elektrik','Elektronik kurulum','Mobil (yerinde) servis','Garanti'],specs:[['Deneyim','15 yıl'],['Ekip','6 teknisyen'],['Hizmet bölgesi','İzmir–Çeşme'],['Yanıt','24 saat']],prices:[['Motor yağ bakımı','₺900–1.500'],['Elektronik kurulum','₺1.200–3.000'],['Arıza teşhis','₺500'],['Mobil servis çıkış','₺350']]},
  {id:'bodrum-teknik',title:'Bodrum Teknik',place:'Muğla · Ege',price:'₺1.200',priceUnit:"'den başlayan / iş",badge:'Doğrulanmış',tone:'good',tags:['Boya & Elyaf','Motor','Karina'],fresh:'2 gün önce güncellendi',rating:'4,6',reviews:132,about:'Tekne boyası, jelkot ve elyaf onarımında bölgenin köklü atölyesi. Karina ve antifouling işlerinde deneyimli.',amenities:['Tekne boyası','Jelkot & elyaf','Antifouling','Karina','Kaporta'],specs:[['Deneyim','20 yıl'],['Ekip','9 usta'],['Hizmet bölgesi','Bodrum yarımadası'],['Yanıt','48 saat']],prices:[['Antifouling (m)','₺450'],['Jelkot onarımı','₺1.200–4.000'],['Tam boya','Teklife göre'],['Ekspertiz','₺800']]},
  {id:'marmara-yat',title:'Marmara Yat Servis',place:'İstanbul · Marmara',price:'₺800',priceUnit:"'den başlayan / iş",badge:'Bu hafta uygun',tone:'warn',tags:['Jeneratör','Elektrik','Klima'],fresh:'bugün güncellendi',rating:'4,5',reviews:98,about:'Jeneratör, klima/soğutma ve elektrik sistemlerinde servis. Tuzla ve çevresindeki marinalarda mobil hizmet.',amenities:['Jeneratör servisi','Klima & soğutma','Marine elektrik','Mobil servis','Yedek parça'],specs:[['Deneyim','12 yıl'],['Ekip','5 teknisyen'],['Hizmet bölgesi','Tuzla–Kalamış'],['Yanıt','24 saat']],prices:[['Jeneratör bakım','₺1.500–3.500'],['Klima onarım','₺800–2.200'],['Elektrik arıza','₺600'],['Mobil çıkış','₺400']]},
  {id:'antalya-marine',title:'Antalya Marine',place:'Antalya · Akdeniz',price:'₺950',priceUnit:"'den başlayan / iş",badge:'Doğrulanmış',tone:'good',tags:['Motor','Yelken','Elektronik'],fresh:'1 gün önce güncellendi',rating:'4,7',reviews:121,about:'Motor ve yelken donanımı bakımı, seyir elektroniği kurulumu. Setur Finike ve çevre marinalarda hizmet.',amenities:['Motor servisi','Yelken donanımı','Seyir elektroniği','Direk & armador','Mobil servis'],specs:[['Deneyim','16 yıl'],['Ekip','7 teknisyen'],['Hizmet bölgesi','Antalya–Finike'],['Yanıt','36 saat']],prices:[['Motor bakım','₺950–2.400'],['Elektronik kurulum','₺1.400–3.500'],['Donanım onarım','₺700+'],['Mobil çıkış','₺450']]},
  {id:'cesme-marin',title:'Çeşme Marin Servis',place:'İzmir · Ege',price:'₺700',priceUnit:"'den başlayan / iş",badge:'Bu hafta uygun',tone:'warn',tags:['Elektrik','Elektronik','Mobil servis'],fresh:'bugün güncellendi',rating:'4,4',reviews:76,about:'Marine elektrik ve elektronik odaklı, hızlı arıza teşhisi sunan mobil servis ekibi.',amenities:['Marine elektrik','Elektronik','Akü & şarj','Mobil servis','Uzaktan teşhis'],specs:[['Deneyim','9 yıl'],['Ekip','4 teknisyen'],['Hizmet bölgesi','Çeşme–Alaçatı'],['Yanıt','12 saat']],prices:[['Elektrik arıza','₺700'],['Elektronik kurulum','₺1.100–2.800'],['Akü değişim','₺500+'],['Mobil çıkış','₺300']]},
  {id:'tuzla-motor',title:'Tuzla Motor Atölyesi',place:'İstanbul · Marmara',price:'₺1.100',priceUnit:"'den başlayan / iş",badge:'Doğrulanmış',tone:'good',tags:['Motor','Şanzıman','Karina'],fresh:'2 gün önce güncellendi',rating:'4,6',reviews:143,about:'İçten ve dıştan motor, şanzıman ve şaft sistemlerinde tersane içi tam donanımlı atölye.',amenities:['Motor revizyon','Şanzıman','Şaft & pervane','Karina','Ekspertiz'],specs:[['Deneyim','22 yıl'],['Ekip','10 usta'],['Hizmet bölgesi','Tuzla tersaneler'],['Yanıt','48 saat']],prices:[['Motor revizyon','Teklife göre'],['Şanzıman bakım','₺2.000+'],['Pervane balans','₺900'],['Ekspertiz','₺1.100']]},
  {id:'gocek-servis',title:'Göcek Yat Servis',place:'Muğla · Ege',price:'₺1.000',priceUnit:"'den başlayan / iş",badge:'Doğrulanmış',tone:'good',tags:['Motor','Elektrik','Boya & Elyaf'],fresh:'bugün güncellendi',rating:'4,8',reviews:187,about:'Göcek marinalarında tam kapsamlı yat bakım ve onarım. Sezon öncesi hazırlık paketleri sunar.',amenities:['Motor bakım','Marine elektrik','Boya & elyaf','Sezon hazırlık','Mobil servis'],specs:[['Deneyim','18 yıl'],['Ekip','12 teknisyen'],['Hizmet bölgesi','Göcek–Fethiye'],['Yanıt','24 saat']],prices:[['Sezon hazırlık paketi','₺3.500+'],['Motor bakım','₺1.000–2.600'],['Boya işleri','Teklife göre'],['Mobil çıkış','₺400']]},
  {id:'marmaris-teknik',title:'Marmaris Teknik Servis',place:'Muğla · Ege',price:'₺850',priceUnit:"'den başlayan / iş",badge:'Bu hafta uygun',tone:'warn',tags:['Jeneratör','Klima','Elektronik'],fresh:'1 gün önce güncellendi',rating:'4,5',reviews:109,about:'Jeneratör, klima ve seyir elektroniği servisi. Netsel ve çevre marinalarda yerinde hizmet.',amenities:['Jeneratör','Klima & soğutma','Elektronik','Su yapıcı','Mobil servis'],specs:[['Deneyim','14 yıl'],['Ekip','6 teknisyen'],['Hizmet bölgesi','Marmaris–Datça'],['Yanıt','24 saat']],prices:[['Jeneratör bakım','₺1.400–3.200'],['Klima onarım','₺850–2.000'],['Su yapıcı servis','₺1.200+'],['Mobil çıkış','₺350']]},
];

const FISHING_ITEMS = [
  {id:'bogaz-lufer',title:'Boğaz Lüfer Turu',place:'İstanbul · yarım gün',price:'₺1.200',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Lüfer','Yarım gün','Başlangıç'],fresh:'bugün güncellendi',rating:'4,7',reviews:88,about:'İstanbul Boğazı\'nda akşamüstü lüfer avı. Ekipman ve yem dahildir; başlangıç seviyesine uygundur.',amenities:['Olta & takım dahil','Yem dahil','Cankurtaran yeleği','Sıcak içecek','Kaptan rehberlik'],specs:[['Süre','4 saat'],['Kalkış','Rumeli Kavağı'],['Kapasite','8 kişi'],['Tekne tipi','Balıkçı motoru']],prices:[['Kişi başı','₺1.200'],['Özel tur (tüm tekne)','₺7.500'],['Çocuk (6-12)','₺700'],['Ekstra ekipman','Ücretsiz']]},
  {id:'gokova-trolling',title:'Gökova Trolling',place:'Muğla · tam gün',price:'₺2.400',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Trolling','Tam gün','Orta'],fresh:'2 gün önce güncellendi',rating:'4,8',reviews:64,about:'Gökova körfezinde tam gün trolling turu. Palamut, akya ve orfoz hedeflenir; öğle yemeği dahildir.',amenities:['Trolling takımı','Yem & sun','Öğle yemeği','Buzluk','Kaptan + rehber'],specs:[['Süre','8 saat'],['Kalkış','Akyaka'],['Kapasite','6 kişi'],['Tekne tipi','Motoryat']],prices:[['Kişi başı','₺2.400'],['Özel tur (tüm tekne)','₺12.500'],['Çocuk (6-12)','₺1.400'],['Ekstra yem','Dahil']]},
  {id:'cesme-acik',title:'Çeşme Açık Deniz',place:'İzmir · tam gün',price:'₺3.100',priceUnit:'kişi başı',badge:'Sınırlı',tone:'warn',tags:['Açık deniz','Tam gün','İleri'],fresh:'bugün güncellendi',rating:'4,9',reviews:52,about:'Çeşme açıklarında büyük av hedefli açık deniz turu. Deneyimli balıkçılara yönelik; profesyonel ekipman.',amenities:['Big-game takımı','Yem & canlı yem','Öğle yemeği','Buzluk','Deneyimli kaptan'],specs:[['Süre','9 saat'],['Kalkış','Çeşme Marina'],['Kapasite','5 kişi'],['Tekne tipi','Fisher']],prices:[['Kişi başı','₺3.100'],['Özel tur (tüm tekne)','₺14.500'],['Yarım gün seçeneği','₺1.900'],['Ekstra takım','₺300']]},
  {id:'fethiye-koy',title:'Fethiye Koy Turu',place:'Muğla · yarım gün',price:'₺1.450',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Dip avı','Yarım gün','Başlangıç'],fresh:'1 gün önce güncellendi',rating:'4,6',reviews:71,about:'Fethiye koylarında sakin sularda dip avı ve dinlenme turu. Aileler için uygundur.',amenities:['Olta & takım','Yem dahil','İkram','Yüzme molası','Rehberlik'],specs:[['Süre','5 saat'],['Kalkış','Fethiye Limanı'],['Kapasite','10 kişi'],['Tekne tipi','Gulet']],prices:[['Kişi başı','₺1.450'],['Özel tur (tüm tekne)','₺9.000'],['Çocuk (6-12)','₺850'],['Yüzme molası','Dahil']]},
  {id:'bodrum-gunbatimi',title:'Bodrum Gün Batımı Avı',place:'Muğla · yarım gün',price:'₺1.650',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Işık avı','Akşam','Başlangıç'],fresh:'bugün güncellendi',rating:'4,7',reviews:59,about:'Bodrum açıklarında gün batımı eşliğinde ışık ve dip avı. Manzara ve balık bir arada.',amenities:['Olta & yem','İçecek ikramı','Cankurtaran','Fotoğraf molası','Kaptan rehberlik'],specs:[['Süre','4 saat'],['Kalkış','Milta Marina'],['Kapasite','8 kişi'],['Tekne tipi','Motoryat']],prices:[['Kişi başı','₺1.650'],['Özel tur (tüm tekne)','₺9.800'],['Çocuk (6-12)','₺950'],['İkram','Dahil']]},
  {id:'kas-derin',title:'Kaş Derin Su Turu',place:'Antalya · tam gün',price:'₺2.900',priceUnit:'kişi başı',badge:'Sınırlı',tone:'warn',tags:['Derin su','Tam gün','İleri'],fresh:'2 gün önce güncellendi',rating:'4,8',reviews:41,about:'Kaş\'ın derin sularında sinarit ve orfoz hedefli teknik av turu. İleri seviye ekipman ve rehber.',amenities:['Teknik takım','Canlı yem','Öğle yemeği','Buzluk','Uzman rehber'],specs:[['Süre','9 saat'],['Kalkış','Kaş Marina'],['Kapasite','5 kişi'],['Tekne tipi','Fisher']],prices:[['Kişi başı','₺2.900'],['Özel tur (tüm tekne)','₺13.500'],['Yarım gün','₺1.800'],['Ekstra takım','₺350']]},
  {id:'ayvalik-ada',title:'Ayvalık Adalar Turu',place:'Balıkesir · yarım gün',price:'₺1.350',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Dip avı','Yarım gün','Başlangıç'],fresh:'1 gün önce güncellendi',rating:'4,5',reviews:63,about:'Ayvalık adaları arasında sakin sularda dip avı. Yeni başlayanlar ve aileler için ideal.',amenities:['Olta & takım','Yem dahil','İkram','Yüzme molası','Rehberlik'],specs:[['Süre','5 saat'],['Kalkış','Ayvalık Limanı'],['Kapasite','12 kişi'],['Tekne tipi','Gezi teknesi']],prices:[['Kişi başı','₺1.350'],['Özel tur (tüm tekne)','₺10.500'],['Çocuk (6-12)','₺800'],['Yüzme molası','Dahil']]},
  {id:'datca-orfoz',title:'Datça Orfoz Turu',place:'Muğla · tam gün',price:'₺2.600',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Dip avı','Tam gün','Orta'],fresh:'bugün güncellendi',rating:'4,7',reviews:48,about:'Datça yarımadası kayalık diplerinde orfoz ve lagos avı. Öğle yemeği ve yüzme molası dahil.',amenities:['Dip takımı','Canlı yem','Öğle yemeği','Buzluk','Kaptan + rehber'],specs:[['Süre','8 saat'],['Kalkış','Datça Limanı'],['Kapasite','6 kişi'],['Tekne tipi','Motoryat']],prices:[['Kişi başı','₺2.600'],['Özel tur (tüm tekne)','₺13.000'],['Çocuk (6-12)','₺1.500'],['Ekstra yem','Dahil']]},
];

const CHARTER_ITEMS = [
  {id:'bodrum-gokova-7',title:'Bodrum–Gökova 7 Gün',place:'Muğla · kabin charter',price:'₺18.500',priceUnit:'kabin / hafta',badge:'Müsait',tone:'good',tags:['Gulet','7 gün','8 kabin'],fresh:'bugün güncellendi',rating:'4,8',reviews:74,about:'Bodrum kalkışlı, Gökova körfezinin saklı koylarını gezen klasik 7 gecelik gulet turu. Program: Bodrum → Orak Adası → Çökertme → Sedir Adası → İngiliz Limanı → Bodrum.',amenities:['Kabin & çift kişilik yatak','Tam pansiyon yemek','Mürettebat & kaptan','Şnorkel ekipmanı','Koy ücretleri dahil'],specs:[['Süre','7 gece'],['Kalkış','Bodrum'],['Kapasite','16 kişi · 8 kabin'],['Tekne tipi','Gulet']],prices:[['Kabin (2 kişi)','₺18.500'],['Tüm tekne','₺135.000'],['Çocuk (6-12)','₺9.500'],['İçecek paketi','₺2.500']]},
  {id:'fethiye-kekova-4',title:'Fethiye–Kekova 4 Gün',place:'Muğla · kabin charter',price:'₺11.200',priceUnit:'kabin / sefer',badge:'Sınırlı',tone:'warn',tags:['Katamaran','4 gün','4 kabin'],fresh:'1 gün önce güncellendi',rating:'4,7',reviews:58,about:'Fethiye\'den Kekova batık şehrine uzanan 4 gecelik katamaran turu. Program: Fethiye → Ölüdeniz → Kaş → Kekova → Fethiye.',amenities:['Kabin & banyo','Tam pansiyon','Mürettebat','SUP & şnorkel','Koy ücretleri dahil'],specs:[['Süre','4 gece'],['Kalkış','Fethiye'],['Kapasite','8 kişi · 4 kabin'],['Tekne tipi','Katamaran']],prices:[['Kabin (2 kişi)','₺11.200'],['Tüm tekne','₺46.000'],['Çocuk (6-12)','₺6.000'],['İçecek paketi','₺1.800']]},
  {id:'gokova-gunubirlik',title:'Gökova Günübirlik',place:'Muğla · günübirlik',price:'₺1.450',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Motoryat','Günübirlik','12 kişi'],fresh:'bugün güncellendi',rating:'4,6',reviews:132,about:'Akyaka kalkışlı günübirlik Gökova turu. Kleopar Adası, Kız Kumu ve Akbük koyunda yüzme molaları; öğle yemeği dahil.',amenities:['Öğle yemeği','Yüzme molaları','Şnorkel','İkram','Rehberlik'],specs:[['Süre','8 saat'],['Kalkış','Akyaka'],['Kapasite','24 kişi'],['Tekne tipi','Motoryat']],prices:[['Kişi başı','₺1.450'],['Özel (tüm tekne)','₺22.000'],['Çocuk (6-12)','₺800'],['İçecek','Ekstra']]},
  {id:'gocek-12-ada',title:'Göcek 12 Ada Turu',place:'Muğla · günübirlik',price:'₺1.650',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Gulet','Günübirlik','20 kişi'],fresh:'bugün güncellendi',rating:'4,7',reviews:96,about:'Göcek\'in korunaklı 12 adası arasında yüzme ve dinlenme turu. Yassıca Adaları ve Bedri Rahmi koyunda molalar.',amenities:['Öğle yemeği','Yüzme molaları','Şnorkel','İkram','Rehberlik'],specs:[['Süre','7 saat'],['Kalkış','Göcek'],['Kapasite','20 kişi'],['Tekne tipi','Gulet']],prices:[['Kişi başı','₺1.650'],['Özel (tüm tekne)','₺26.000'],['Çocuk (6-12)','₺950'],['İçecek','Ekstra']]},
  {id:'marmaris-hisaronu-5',title:'Marmaris–Hisarönü 5 Gün',place:'Muğla · kabin charter',price:'₺14.800',priceUnit:'kabin / sefer',badge:'Müsait',tone:'good',tags:['Gulet','5 gün','6 kabin'],fresh:'2 gün önce güncellendi',rating:'4,8',reviews:47,about:'Marmaris\'ten Hisarönü körfezinin sakin koylarına 5 gecelik mavi tur. Bozburun ve Datça duraklı.',amenities:['Kabin & yatak','Tam pansiyon','Mürettebat','Şnorkel','Koy ücretleri'],specs:[['Süre','5 gece'],['Kalkış','Marmaris'],['Kapasite','12 kişi · 6 kabin'],['Tekne tipi','Gulet']],prices:[['Kabin (2 kişi)','₺14.800'],['Tüm tekne','₺82.000'],['Çocuk (6-12)','₺7.800'],['İçecek paketi','₺2.100']]},
  {id:'kas-kekova-gun',title:'Kaş–Kekova Günübirlik',place:'Antalya · günübirlik',price:'₺1.550',priceUnit:'kişi başı',badge:'Sınırlı',tone:'warn',tags:['Motoryat','Günübirlik','16 kişi'],fresh:'bugün güncellendi',rating:'4,6',reviews:81,about:'Kaş\'tan Kekova batık şehri, Simena kalesi ve Üçağız köyüne günübirlik tur. Cam tabanlı tekne ile.',amenities:['Öğle yemeği','Batık şehir turu','Yüzme molası','İkram','Rehberlik'],specs:[['Süre','7 saat'],['Kalkış','Kaş'],['Kapasite','16 kişi'],['Tekne tipi','Motoryat']],prices:[['Kişi başı','₺1.550'],['Özel (tüm tekne)','₺20.000'],['Çocuk (6-12)','₺900'],['İçecek','Ekstra']]},
  {id:'bodrum-yunan-7',title:'Bodrum–Yunan Adaları 7 Gün',place:'Muğla · kabin charter',price:'₺22.000',priceUnit:'kabin / hafta',badge:'Sınırlı',tone:'warn',tags:['Gulet','7 gün','8 kabin'],fresh:'1 gün önce güncellendi',rating:'4,9',reviews:39,about:'Bodrum kalkışlı, Kos ve Kalimnos gibi Yunan adalarını kapsayan 7 gecelik tur. Pasaport ve vize gereklidir.',amenities:['Kabin & yatak','Tam pansiyon','Mürettebat','Liman/geçiş ücretleri','Şnorkel'],specs:[['Süre','7 gece'],['Kalkış','Bodrum'],['Kapasite','16 kişi · 8 kabin'],['Tekne tipi','Gulet']],prices:[['Kabin (2 kişi)','₺22.000'],['Tüm tekne','₺160.000'],['Çocuk (6-12)','₺11.500'],['Liman harçları','Dahil']]},
  {id:'ayvalik-cunda-gun',title:'Ayvalık–Cunda Günübirlik',place:'Balıkesir · günübirlik',price:'₺1.250',priceUnit:'kişi başı',badge:'Müsait',tone:'good',tags:['Gezi teknesi','Günübirlik','30 kişi'],fresh:'bugün güncellendi',rating:'4,5',reviews:104,about:'Ayvalık adaları ve Cunda çevresinde yüzme turu. Şeytan Sofrası manzarası ve koylarda molalar.',amenities:['Öğle yemeği','Yüzme molaları','İkram','Müzik','Rehberlik'],specs:[['Süre','6 saat'],['Kalkış','Ayvalık'],['Kapasite','30 kişi'],['Tekne tipi','Gezi teknesi']],prices:[['Kişi başı','₺1.250'],['Özel (tüm tekne)','₺28.000'],['Çocuk (6-12)','₺700'],['İçecek','Ekstra']]},
];

const MODULE_ITEMS = { marina:MARINA_ITEMS, service:SERVICE_ITEMS, fishing:FISHING_ITEMS, charter:CHARTER_ITEMS };
const DETAIL_CFG = {
  marina:{cta:'Bağlama yeri talep et',ctaSub:'Bağlama talebi',ph:'marina fotoğrafı',note:'Fiyatlar marina tarafından bildirilir ve günlük güncellenir; bağlama uygunluğu için marinayı arayın.'},
  service:{cta:'Randevu talep et',ctaSub:'Randevu talebi',ph:'servis / atölye görseli',note:'Fiyatlar tahminîdir; kesin teklif firma tarafından randevu sonrası verilir.'},
  fishing:{cta:'Rezervasyon talebi gönder',ctaSub:'Kişi başı',ph:'tur / tekne görseli',note:'Fiyatlar kişi başıdır ve tur sağlayıcı tarafından bildirilir; talebinizi sağlayıcı onaylar.'},
  charter:{cta:'Rezervasyon talebi gönder',ctaSub:'Başlangıç fiyatı',ph:'gulet / rota görseli',note:'Dahil/hariç kalemler sefere göre değişir; rezervasyon talebinizi operatör teyit eder.'},
};

const AUTO_CITIES = [['Muğla','Ege'],['İzmir','Ege'],['İstanbul','Marmara'],['Antalya','Akdeniz'],['Aydın','Ege'],['Balıkesir','Marmara'],['Muğla','Akdeniz'],['İzmir','Ege']];
const AUTO_TONES = ['good','good','warn','good','good','warn','good','good'];
const AUTO_BADGES = ['Müsait','Müsait','Sınırlı','Müsait','Yeni','Sınırlı','Müsait','Müsait'];
function autoItems(L0){
  const cats = (L0.cats && L0.cats.length ? L0.cats : ['Genel']);
  const feat = L0.featured || [];
  return Array.from({length:8}, (_,i)=>{
    const f = feat[i]; const city = AUTO_CITIES[i % AUTO_CITIES.length]; const cat = cats[i % cats.length];
    const title = f ? f.title : (cat + ' · ' + city[0]);
    const place = f ? (f.sub || city.join(' · ')) : (city[0] + ' · ' + city[1]);
    const price = (f && f.price) ? f.price : '—';
    return {
      id:'a'+i, cat, title, place, price, priceUnit:'',
      badge:AUTO_BADGES[i], tone:AUTO_TONES[i], tags:cats.slice(0,3),
      fresh:(f && f.fresh) || 'bugün güncellendi',
      rating:(4.4 + ((i%5)*0.1)).toFixed(1).replace('.',','), reviews:40 + i*13,
      about: L0.sub || '',
      amenities: cats.slice(0,5),
      specs:[['Bölge',city[1]],['Kategori',cat],['Durum',AUTO_BADGES[i]],['Güncelleme','bugün']],
      prices:[[cat, price],['Alternatif','Teklife göre']],
    };
  });
}

const PRICE_INDEX = {
  fish:{title:'Bugünün balık hali fiyatları',unit:'₺/kg',fresh:"bugün 09:00 güncellendi",note:'Toptan hal fiyatlarıdır; perakende değişebilir',rows:[
    {name:'Çupra',price:'₺240',dir:'up',delta:'▲ %3',spark:[40,52,48,60,55,68,72]},
    {name:'Levrek',price:'₺260',dir:'down',delta:'▼ %2',spark:[70,66,68,60,58,55,52]},
    {name:'Palamut',price:'₺180',dir:'up',delta:'▲ %8',spark:[30,34,40,38,50,58,66]},
    {name:'Lüfer',price:'₺320',dir:'down',delta:'▼ %1',spark:[62,64,58,60,56,57,55]},
    {name:'Hamsi',price:'₺90',dir:'up',delta:'▲ %5',spark:[20,24,22,30,34,40,44]},
    {name:'Mezgit',price:'₺140',dir:'flat',delta:'—',spark:[45,44,46,45,45,46,45]},
    {name:'İstavrit',price:'₺110',dir:'up',delta:'▲ %4',spark:[30,32,36,34,40,42,46]},
    {name:'Sardalya',price:'₺100',dir:'down',delta:'▼ %3',spark:[52,50,48,45,43,41,40]},
  ]},
  mazot:{title:'Güncel marine yakıt fiyatları',unit:'₺/L',fresh:'bugün güncellendi',note:'Bilgilendirme amaçlıdır; pompada teyit edin',rows:[
    {name:'Göcek İkmal · Motorin',price:'₺44,80',dir:'up',delta:'▲ %1',spark:[40,42,41,44,45,46,48]},
    {name:'Kalamış · Motorin',price:'₺45,20',dir:'up',delta:'▲ %2',spark:[42,43,44,45,46,47,48]},
    {name:'Çeşme · Motorin',price:'₺44,60',dir:'down',delta:'▼ %1',spark:[47,46,45,44,44,43,43]},
    {name:'Bodrum · Motorin',price:'₺45,50',dir:'up',delta:'▲ %2',spark:[42,44,45,45,46,47,49]},
    {name:'Göcek · Benzin',price:'₺48,90',dir:'up',delta:'▲ %1',spark:[45,46,46,47,48,48,49]},
    {name:'Marmaris · Motorin',price:'₺44,90',dir:'flat',delta:'—',spark:[45,45,44,45,45,45,45]},
    {name:'Fethiye · Motorin',price:'₺45,10',dir:'up',delta:'▲ %3',spark:[41,42,44,45,46,47,49]},
    {name:'Ayvalık · Motorin',price:'₺44,40',dir:'down',delta:'▼ %2',spark:[47,46,45,45,44,43,43]},
  ]},
};

// ===== KolayBayrak (bespoke) =====
const KB_STAGES = ['Başvuru alındı','Belge incelemesi','Resmi işlem','Tamamlandı'];
const KB_STAGE_TONE = ['good','warn','warn','good'];
const KB_SERVICES = [
  {id:'baglama',title:'Bağlama Kütüğü Tescili',cat:'Tescil',price:4500,duration:'7–10 iş günü',icon:'flag',
    summary:'Teknenizi bağlama kütüğüne kaydettirin; Türk bağlama kütüğü ruhsatınızı (TR flag) uçtan uca çıkaralım.',
    includes:['Bağlama kütüğü başvuru dosyası','Ruhsat düzenleme takibi','Liman başkanlığı işlemleri','Dosya teslim & kargo'],
    requirements:['Satış sözleşmesi / fatura','Tekne teknik özellik belgesi','Sahiplik & kimlik belgesi','CE / uygunluk belgesi']},
  {id:'gemi-tescil',title:'Gemi Tescil Belgesi (MGSB)',cat:'Tescil',price:6800,duration:'10–15 iş günü',icon:'doc',
    summary:'Milli Gemi Siciline tescil ve gemi tasdiknamesi düzenleme sürecini baştan sona yönetelim.',
    includes:['Sicil başvuru dosyası','Tasdikname takibi','Noter & tercüme koordinasyonu','Dosya teslim'],
    requirements:['Mülkiyet belgeleri','Tonaj belgesi','Denize elverişlilik belgesi','Kimlik / şirket evrakı']},
  {id:'isim',title:'İsim Tescili & Kontrolü',cat:'Belge',price:1200,duration:'2–3 iş günü',icon:'exper',
    summary:'Tekne isminizin uygunluğunu kontrol edip resmi isim tescilini gerçekleştirelim.',
    includes:['İsim müsaitlik sorgusu','Resmi isim tescili','Onay yazısı teslimi'],
    requirements:['Tercih edilen 3 isim','Tekne ruhsat bilgisi']},
  {id:'offshore',title:'Yurtdışı Şirket & Bayrak (Offshore)',cat:'Uluslararası',price:28000,duration:'3–4 hafta',icon:'route',
    summary:'Yatınız için offshore şirket kurulumu ve yabancı bayrak (Delaware, BVI, Marshall Is.) tescili.',
    includes:['Şirket kuruluşu','Yabancı bayrak tescili','Uluslararası tonaj koordinasyonu','Yıllık temsilcilik (1. yıl)'],
    requirements:['Pasaport / kimlik','Tekne mülkiyet belgeleri','Adres beyanı']},
  {id:'transitlog',title:'Transit Log Başvurusu',cat:'Belge',price:2400,duration:'3–5 iş günü',icon:'doc',
    summary:'Yabancı bayraklı yatınız için Türk sularında transit log kaydını çıkaralım.',
    includes:['Transit log başvurusu','Gümrük & liman koordinasyonu','Dijital durum takibi'],
    requirements:['Tekne ruhsatı','Sigorta poliçesi','Pasaport bilgileri']},
  {id:'tonaj',title:'Tonaj Belgesi & Ölçüm',cat:'Belge',price:3900,duration:'1–2 hafta',icon:'yacht',
    summary:'Uluslararası/ulusal tonaj ölçümü ve belge düzenleme sürecini yönetelim.',
    includes:['Tonaj ölçüm koordinasyonu','Belge düzenleme','Sınıf kuruluşu iletişimi'],
    requirements:['Tekne planları','Teknik özellikler','Mevcut belgeler']},
  {id:'kasko',title:'Kasko & Tekne Sigortası Aracılığı',cat:'Sigorta',price:0,priceLabel:'Teklife göre',duration:'2–4 iş günü',icon:'shield',
    summary:'Tescil sonrası tekneniz için kasko ve P&I tekliflerini toplayıp poliçeyi düzenleyelim.',
    includes:['Çoklu şirket teklifi','Poliçe düzenleme','Hasar süreci desteği'],
    requirements:['Tekne değeri & yıl','Kullanım türü','Mevcut poliçe (varsa)']},
  {id:'murettebat',title:'Mürettebat Belgelendirme',cat:'Belge',price:2800,duration:'1–2 hafta',icon:'cap',
    summary:'Mürettebat için gerekli denizcilik belge ve sertifikalarının hazırlanması.',
    includes:['Belge dosyası hazırlığı','STCW koordinasyonu','Başvuru takibi'],
    requirements:['Mürettebat kimlik & fotoğraf','Mevcut sertifikalar','Sağlık raporu']},
];
const KB_SVC_BY_ID = Object.fromEntries(KB_SERVICES.map(s=>[s.id,s]));
const KB_CATS = ['Tescil','Belge','Uluslararası','Sigorta'];
const KB_OWNER = 'Ahmet Yıldız';
const KB_SEED_APPS = [
  {ref:'KB-2026-0412',owner:'me',ownerName:KB_OWNER,boat:'Azimut 55 Fly',serviceId:'baglama',service:'Bağlama Kütüğü Tescili',amount:5400,stage:2,date:'24 Haz 2026'},
  {ref:'KB-2026-0406',owner:'me',ownerName:KB_OWNER,boat:'Sea Breeze',serviceId:'isim',service:'İsim Tescili & Kontrolü',amount:1440,stage:3,date:'18 Haz 2026'},
  {ref:'KB-2026-0418',owner:'other',ownerName:'Deniz Kaya',boat:'Blue Horizon',serviceId:'gemi-tescil',service:'Gemi Tescil Belgesi',amount:8160,stage:1,date:'27 Haz 2026'},
  {ref:'KB-2026-0421',owner:'other',ownerName:'Selin Arı',boat:'Poseidon',serviceId:'transitlog',service:'Transit Log Başvurusu',amount:2880,stage:0,date:'29 Haz 2026'},
  {ref:'KB-2026-0399',owner:'other',ownerName:'Murat Şen',boat:'Kraliçe',serviceId:'offshore',service:'Yurtdışı Şirket & Bayrak',amount:33600,stage:2,date:'12 Haz 2026'},
];
const KB_DOCS = [
  {name:'Satış sözleşmesi',boat:'Azimut 55 Fly',status:'Onaylandı',tone:'good'},
  {name:'Teknik özellik belgesi',boat:'Azimut 55 Fly',status:'Onaylandı',tone:'good'},
  {name:'CE uygunluk belgesi',boat:'Azimut 55 Fly',status:'İncelemede',tone:'warn'},
  {name:'Sigorta poliçesi',boat:'Sea Breeze',status:'Onaylandı',tone:'good'},
  {name:'Tonaj belgesi',boat:'Blue Horizon',status:'Bekleniyor',tone:'bad'},
];
const KB_BOATS = [
  {name:'Azimut 55 Fly',type:'Motoryat · 16,8 m',reg:'TR-MUG-4471',flag:'Türk Bayrağı',status:'Tescilli',tone:'good'},
  {name:'Sea Breeze',type:'Yelkenli · 12,4 m',reg:'TR-IST-2290',flag:'Türk Bayrağı',status:'Tescilli',tone:'good'},
  {name:'Blue Horizon',type:'Katamaran · 13,1 m',reg:'—',flag:'Beklemede',status:'Tescil sürüyor',tone:'warn'},
];

function panelFor(key, mod){
  const map = {
    marina:{title:'Gelen bağlama talepleri',cols:['Talep','Tekne / Konu','Tutar','Durum','Tarih'],subj:['12m yelkenli, 3 gece','15m motoryat, sezon','10m yelkenli, 1 hafta','18m gulet, 2 gece','11m katamaran, aylık','13m motoryat, 5 gece']},
    service:{title:'Gelen randevu talepleri',cols:['Talep','Hizmet / Konu','Tahmini','Durum','Tarih'],subj:['Motor yağ bakımı','Jeneratör arızası','Tekne boyası','Elektronik kurulum','Klima onarımı','Antifouling']},
    default:{title:'Gelen talepler',cols:['Talep','Konu','Tutar','Durum','Tarih'],subj:['Yeni rezervasyon talebi','Bilgi talebi','Teklif talebi','Randevu talebi','İletişim talebi','Ön kayıt talebi']},
  };
  const cfg = map[key] || map.default;
  const stt = [['İnceleniyor','warn'],['Onaylandı','good'],['Yeni','good'],['Beklemede','warn'],['Tamamlandı','good'],['İnceleniyor','warn']];
  const amts = ['₺2.100','₺3.900','₺1.450','₺6.200','₺900','₺4.800'];
  const dates = ['30 Haziran 2026','29 Haziran 2026','29 Haziran 2026','28 Haziran 2026','27 Haziran 2026','26 Haziran 2026'];
  const rows = cfg.subj.map((s,i)=>{
    const t = BADGE_TONE[stt[i][1]];
    return {ref:'KM-2026-04'+(27-i*3), subject:s, amount:amts[i], status:stt[i][0], statusBg:t.bg, statusFg:t.fg, date:dates[i]};
  });
  return {
    tableTitle:cfg.title, cols:cfg.cols, rows,
    stats:[
      {k:'Açık talepler', v:'14', delta:'▲ bu hafta 3', deltaColor:'var(--km-good)'},
      {k:'Görüntülenme', v:'2.480', delta:'▲ %12 artış', deltaColor:'var(--km-good)'},
      {k:'Yanıt oranı', v:'%92', delta:'son 30 gün', deltaColor:'var(--km-ink-400)'},
    ],
  };
}

const CATFAC=(function(){return function(c){var M={
  '':{_:1,Marmara:1,Ege:1,Göcek:1,Akdeniz:1},
  parca:{_:0.6,Marmara:1,Ege:0.9,Göcek:0.7,Akdeniz:0.8},
  marina:{_:0.4,Marmara:0.7,Ege:1,Göcek:1,Akdeniz:0.95},
  servis:{_:0.6,Marmara:1,Ege:0.85,Göcek:0.75,Akdeniz:0.8},
  sigorta:{_:0.7,Marmara:0.95,Ege:0.9,Göcek:0.6,Akdeniz:0.85},
  charter:{_:0.35,Marmara:0.5,Ege:1,Göcek:1,Akdeniz:0.9}
};if(M[c])return M[c];if(!c)return M[''];var h=0;for(var i=0;i<c.length;i++)h=(h*31+c.charCodeAt(i))>>>0;function f(o){return 0.35+((h>>(o*3))&7)/7*0.65;}return {_:f(0),Marmara:f(1),Ege:f(2),Göcek:f(3),Akdeniz:f(4)};};})();
const TICKER=[['İstanbul','çinko anot seti','az önce'],['Bodrum','yat charter haftalık','1 dk önce'],['İzmir','volvo d6 yakıt filtresi','1 dk önce'],['Göcek','marina bağlama yeri','2 dk önce'],['Antalya','tekne sigortası kasko','2 dk önce'],['Marmaris','deniz suyu pompası','3 dk önce'],['Fethiye','travel-lift kışlama','3 dk önce'],['Çanakkale','can salı sertifika','4 dk önce']];
// approx viewBox (0 0 1007.478 527.323) coords per ticker city, for the live-search map pin
const MAPPIN={'İstanbul':[195,80],'Bodrum':[100,360],'İzmir':[67,240],'Göcek':[168,358],'Antalya':[261,373],'Marmaris':[128,370],'Fethiye':[178,360],'Çanakkale':[51,128]};

// Kıyı şehirleri — hava durumu widget'ı için sabit koordinat listesi (Open-Meteo API key gerektirmez).
const WEATHER_CITIES=[
  {name:'İstanbul',lat:41.01,lon:28.95},{name:'İzmir',lat:38.42,lon:27.14},{name:'Bodrum',lat:37.03,lon:27.43},
  {name:'Marmaris',lat:36.85,lon:28.27},{name:'Göcek',lat:36.75,lon:28.94},{name:'Fethiye',lat:36.62,lon:29.12},
  {name:'Antalya',lat:36.90,lon:30.71},{name:'Mersin',lat:36.80,lon:34.64},{name:'Çanakkale',lat:40.15,lon:26.41},
  {name:'Ayvalık',lat:39.32,lon:26.69},{name:'Kuşadası',lat:37.86,lon:27.26},{name:'Samsun',lat:41.29,lon:36.33},
  {name:'Trabzon',lat:41.00,lon:39.72},{name:'Sinop',lat:42.03,lon:35.15},{name:'Yalova',lat:40.65,lon:29.28},
  {name:'Kocaeli',lat:40.85,lon:29.88},{name:'Bursa',lat:40.18,lon:29.06},{name:'Balıkesir',lat:39.65,lon:27.89},
];
// WMO weather_code → Türkçe etiket + ikon (Open-Meteo current değerinden gelir).
function weatherLabel(code){
  if(code===0) return {label:'Açık',icon:'☀️'};
  if(code===1||code===2) return {label:'Parçalı bulutlu',icon:'⛅'};
  if(code===3) return {label:'Bulutlu',icon:'☁️'};
  if(code===45||code===48) return {label:'Sisli',icon:'🌫️'};
  if(code>=51&&code<=57) return {label:'Çisenti',icon:'🌦️'};
  if(code>=61&&code<=67) return {label:'Yağmurlu',icon:'🌧️'};
  if(code>=71&&code<=77) return {label:'Karlı',icon:'❄️'};
  if(code>=80&&code<=82) return {label:'Sağanak',icon:'🌧️'};
  if(code>=95) return {label:'Fırtınalı',icon:'⛈️'};
  return {label:'—',icon:'🌊'};
}

class Component extends React.Component {
  constructor(props){
    super(props);
    this.state = { view: BOOT_MODULE?'landing':'home', moduleKey: BOOT_MODULE||'marin', menuOpen:false, query:'', detailId:null, bookingRef:null, bookingStep:1, bookingDone:false, aiOpen:false, listFilter:'', listSort:'', yachtMode:'satilik', listLoading:false, loginOpen:false, authed:false, authNext:null, filterOpen:false, bayrakView:'catalog', bayrakServiceId:'baglama', bayrakCat:'', bayrakOwnerTab:'basvurular', bayrakRole:'owner', bayrakAdminFilter:'', bayrakApps:KB_SEED_APPS, lang:'tr', sellerOpen:false, sellerDone:false, howOpen:false, panelTab:'genel', adminAuthed:false, authMode:'login', reqDetail:null, reqReplied:false, activePin:null, reviewReplyOpen:null, reviewReplied:[], radyoChannel:0, radyoPlaying:false, photoOpen:false, locOpen:false, loc:'', regStep:'form', otpSent:false, mapCat:'', liveCount:1284, tickerIx:0, weatherCity:'İstanbul', weatherPlace:'İstanbul', weatherData:null, weatherLoading:false, weatherErr:'' };
  }

  // Türkçe sesli asistan (KolayAsistan "Deniz") — tarayıcı SpeechSynthesis.
  speakTr(text){
    try{
      if(typeof window==='undefined' || !window.speechSynthesis) return;
      window.speechSynthesis.cancel();
      const u = new SpeechSynthesisUtterance(text);
      u.lang = 'tr-TR';
      window.speechSynthesis.speak(u);
    }catch(e){}
  }

  // Gerçek API'den canlı veri çek (il arama istatistikleri, popüler aramalar, platform sayıları).
  // Uç nokta yoksa / offline ise sessizce statik prototip verisine düşer.
  _loadLive(){
    const api = (typeof window!=='undefined') && window.kolaymarinApi;
    if(!api) return;
    const live = {};
    const done = ()=>{ window.__ECO_LIVE = live; if(this._mounted) this.forceUpdate(); };
    let pending = 0; const settle = ()=>{ if(--pending<=0) done(); };
    const call = (fn, key, map)=>{ if(typeof api[fn]!=='function') return; pending++; Promise.resolve().then(()=>api[fn]()).then(r=>{ try{ live[key]=map?map(r):r; }catch(e){} }).catch(()=>{}).then(settle); };
    call('searchProvinceStats','provinceCounts', r=>r);
    call('popularSearches','popular', r=> Array.isArray(r)? r : (r && r.items) || []);
    call('getStats','stats', r=>r);
    call('ecosystemPhotos','photos', r=> (r && r.manifest) || {});
    // Zengin liste verisi olan modüllerin kart görselleri (card-<id> asset'leri).
    if(typeof api.ecosystemPhotosByApp === 'function'){
      ['marina','service','fishing','charter'].forEach(function(appKey){
        pending++;
        Promise.resolve().then(()=>api.ecosystemPhotosByApp(appKey)).then(r=>{
          try{
            const map={};
            (Array.isArray(r)?r:[]).forEach(a=>{ if(a && a.assetType && a.publicUrl) map[a.assetType]=a.publicUrl; });
            (live.appAssets = live.appAssets || {})[appKey]=map;
          }catch(e){}
        }).catch(()=>{}).then(settle);
      });
    }
    if(pending===0) done();
  }

  render(){
    const V = this.renderVals();
    return (window.EKO && window.EKO.page) ? window.EKO.page(V) : el('div',{style:{padding:40,fontFamily:'monospace'}},'EKO views yüklenemedi.');
  }

  go(view, patch){ this.setState({ view, menuOpen:false, ...(patch||{}) }); if(typeof window!=='undefined') window.scrollTo(0,0); }
  openModule(key){ this.setState({ moduleKey:key, view:'landing', menuOpen:false, query:'', bayrakView:'catalog', bayrakCat:'' }); if(typeof window!=='undefined') window.scrollTo(0,0); }
  // Ecosystem launcher: go to a module's own domain. Same-domain module (or the
  // hub's own 'marin' product) switches view in-place instead of reloading.
  navTo(key){
    if(key===BOOT_MODULE){ this.openModule(key); return; }
    if(!BOOT_MODULE && key==='marin'){ this.openModule('marin'); return; }
    var url = MODULE_DOMAIN[key];
    if(typeof window!=='undefined' && url){ window.location.href = url; return; }
    this.openModule(key);
  }
  goHomeNav(){ if(BOOT_MODULE && typeof window!=='undefined'){ window.location.href = HUB_URL; return; } this.go('home'); }
  bgo(v){ this.setState({ view:'landing', bayrakView:v, menuOpen:false, filterOpen:false }); if(typeof window!=='undefined') window.scrollTo(0,0); }
  bkOpenService(id){ this.setState({ view:'landing', bayrakView:'service', bayrakServiceId:id, menuOpen:false }); if(typeof window!=='undefined') window.scrollTo(0,0); }
  bkStart(){ if(this.state.authed){ this.bgo('checkout'); } else { this.setState({ loginOpen:true, authNext:'checkout' }); } }
  signIn(){ const nx=this.state.authNext; this.setState({ authed:true, loginOpen:false, authNext:null }); if(nx==='checkout'){ this.bgo('checkout'); } }
  signOut(){ this.setState({ authed:false, bayrakView:'catalog' }); }
  bkPay(){ const s=this.state; const svc=KB_SVC_BY_ID[s.bayrakServiceId]||KB_SERVICES[0]; const amount=Math.round((svc.price||0)*1.2); const ref='KB-2026-0'+(430+Math.floor(Math.random()*69)); const app={ref,owner:'me',ownerName:KB_OWNER,boat:this._boatName||'Yeni tekne',serviceId:svc.id,service:svc.title,amount,stage:0,date:'30 Haz 2026'}; this.setState(p=>({ bayrakApps:[app,...p.bayrakApps], bayrakView:'success', bayrakRef:ref })); if(typeof window!=='undefined') window.scrollTo(0,0); }
  advanceApp(ref){ this.setState(p=>({ bayrakApps:p.bayrakApps.map(a=> a.ref===ref ? {...a, stage:Math.min(3,a.stage+1)} : a) })); }
  openRegion(region){ this.setState({ moduleKey:'marina', view:'list', menuOpen:false, listFilter:region, listSort:'', listLoading:true, bayrakView:'catalog' }); if(typeof window!=='undefined') window.scrollTo(0,0); if(this._lt)clearTimeout(this._lt); this._lt=setTimeout(()=>this.setState({listLoading:false}),550); }

  // Open-Meteo — ücretsiz, API key gerektirmez, doğrudan tarayıcıdan çağrılır.
  _fetchWeather(lat, lon, place){
    this.setState({ weatherLoading:true, weatherErr:'', weatherPlace:place });
    const url = 'https://api.open-meteo.com/v1/forecast?latitude='+lat+'&longitude='+lon+'&current=temperature_2m,weather_code,wind_speed_10m&timezone=auto';
    fetch(url).then(r=>r.json()).then(d=>{
      if(!this._mounted) return;
      const c = d && d.current;
      if(!c){ this.setState({ weatherLoading:false, weatherErr:'Hava durumu alınamadı.' }); return; }
      this.setState({ weatherLoading:false, weatherData:{ temp:Math.round(c.temperature_2m), wind:Math.round(c.wind_speed_10m), ...weatherLabel(c.weather_code) } });
    }).catch(()=>{ if(this._mounted) this.setState({ weatherLoading:false, weatherErr:'Hava durumu alınamadı.' }); });
  }
  setWeatherCity(name){
    const city = WEATHER_CITIES.find(c=>c.name===name) || WEATHER_CITIES[0];
    this.setState({ weatherCity:city.name });
    this._fetchWeather(city.lat, city.lon, city.name);
  }
  useMyLocation(){
    if(typeof navigator==='undefined' || !navigator.geolocation){ this.setState({ weatherErr:'Konum bu tarayıcıda desteklenmiyor.' }); return; }
    this.setState({ weatherLoading:true, weatherErr:'' });
    navigator.geolocation.getCurrentPosition(
      (pos)=>{ this.setState({ weatherCity:'' }); this._fetchWeather(pos.coords.latitude, pos.coords.longitude, 'Konumum'); },
      ()=>{ if(this._mounted) this.setState({ weatherLoading:false, weatherErr:'Konum izni verilmedi.' }); },
      { timeout:10000 }
    );
  }

  componentDidMount(){ this._mounted=true; this._loadLive(); this._syncSEO(); this.setWeatherCity(this.state.weatherCity); if(typeof window!=='undefined' && !window.TR_PROVINCES){ let n=0; this._trTimer=setInterval(()=>{ if(window.TR_PROVINCES||n++>40){ clearInterval(this._trTimer); this.forceUpdate(); } },150); } if(typeof window!=='undefined'){ this._liveTimer=setInterval(()=>{ this.setState(p=>({ liveCount: Math.max(900, Math.min(2400, p.liveCount + (Math.floor(Math.random()*17)-7))), tickerIx: p.tickerIx+1 })); }, 2600); } }
  componentWillUnmount(){ this._mounted=false; if(this._trTimer) clearInterval(this._trTimer); if(this._liveTimer) clearInterval(this._liveTimer); }
  componentDidUpdate(){ this._syncSEO(); }
  _syncSEO(){ if(typeof document==='undefined')return; const m=MODULES.find(x=>x.key===this.state.moduleKey)||{}; const home=this.state.view==='home'; const t=home?'Kolaymarin — Denizcilik Arama + Ticaret Ağı':((m.name||'Kolaymarin')+' · Kolaymarin'); if(document.title!==t)document.title=t; let d=document.querySelector('meta[name="description"]'); if(!d){d=document.createElement('meta');d.setAttribute('name','description');document.head.appendChild(d);} const desc=home?(PLATFORM_COUNT+' denizcilik platformu tek ekosistemde: yedek parça, marina, charter, yat, sigorta, yakıt ve daha fazlası. Türkiye’nin denizcilik arama + ticaret ağı.'):((m.short||'')+' — Kolaymarin ekosistemi.'); if(d.getAttribute('content')!==desc)d.setAttribute('content',desc); }
  loadList(){ this.setState({view:'list',menuOpen:false,listFilter:'',listSort:'',listLoading:true}); if(typeof window!=='undefined')window.scrollTo(0,0); if(this._lt)clearTimeout(this._lt); this._lt=setTimeout(()=>this.setState({listLoading:false}),550); }

  renderVals(){
    const self=this;
    const s=this.state;
    const modByKey = Object.fromEntries(MODULES.map(m=>[m.key,m]));
    const active = modByKey[s.moduleKey];
    const accentSoft = (m)=> m.accent+'1A';
    const iconEl = (m)=> (ICON[ICON_OF[m.key]]||ICON.anchor)();
    const LIVE_KEYS = {marin:1,marina:1,service:1,fishing:1,charter:1,bayrak:1,radyo:1,stars:1};
    // KolayPhoto döngüsünden gelen REVIEWED görseller; hub 'mazot' anahtarı
    // API tarafında 'yakit' (kolaymazot.com) olarak tutulur.
    const ECO_PHOTOS = (typeof window!=='undefined' && window.__ECO_LIVE && window.__ECO_LIVE.photos) || {};
    const PHOTO_KEY = { mazot:'yakit' };
    const photoOf = (m)=> ECO_PHOTOS[PHOTO_KEY[m.key]||m.key] || null;

    const decorate = (m)=>{ const lv = !!(LIVE_KEYS[m.key]||m.live); return {
      ...m, accentSoft:accentSoft(m), iconEl:iconEl(m), live:lv, coverSrc: photoOf(m) || coverSVG(m.accent),
      phLabel:'görsel ekle',
      active: m.key===s.moduleKey,
      bg: m.key===s.moduleKey ? 'var(--km-deep-soft)' : 'transparent',
      cta: lv ? 'Canlıyı aç' : 'Ürünü aç',
      open: ()=> self.navTo(m.key),
    }; };

    const groups = CAT_ORDER.map((cat,i)=>({ cat, slug:'c'+i, items: MODULES.filter(m=>m.cat===cat).map(decorate) }));
    const footerProducts = MODULES.map(decorate);
    const livePlatformN = MODULES.filter(function(m){ return !!(LIVE_KEYS[m.key]||m.live); }).length;
    const prepPlatformN = PLATFORM_COUNT - livePlatformN;

    const L0 = LAND[s.moduleKey] || LAND.marin;
    const L = { ...L0,
      faq: (L0.faq||[]).map(([q,a])=>({q,a})),
      cross: (L0.cross||[]).map(([k,note])=>{ const cm=modByKey[k]; return { name:cm.name, note, accent:cm.accent, accentSoft:accentSoft(cm), iconEl:iconEl(cm), open:()=>self.navTo(k) }; })
    };

    // list items — rich data where authored, else auto-scaffolded from landing data
    const _cfgPh = ((DETAIL_CFG[s.moduleKey]||{}).ph) || ((L0.featured&&L0.featured[0]&&L0.featured[0].ph)) || 'görsel';
    const listData = MODULE_ITEMS[s.moduleKey] || autoItems(L0);
    const _POS=[[18,60],[34,38],[52,66],[45,24],[66,48],[80,70],[27,82],[70,28]];
    const _pnum=(v)=>{const m=(''+v).replace(/[.\s]/g,'').match(/\d+/);return m?parseInt(m[0],10):0;};
    const ECO_ASSETS = (typeof window!=='undefined' && window.__ECO_LIVE && window.__ECO_LIVE.appAssets) || {};
    const _itemCover = (id)=> (ECO_ASSETS[s.moduleKey]||{})['card-'+id] || null;
    const baseItems = listData.map((it,i)=>{ const t=BADGE_TONE[it.tone]||BADGE_TONE.good; return { ...it, coverSrc:_itemCover(it.id), priceUnit:it.priceUnit||'', badgeBg:t.bg, badgeFg:t.fg, badgeIcon:'', ph:it.ph||_cfgPh, pinN:i+1, pinLeft:_POS[i%8][0]+'%', pinTop:_POS[i%8][1]+'%', pinActive:s.activePin===it.id, showPin:()=>self.setState({activePin:it.id}), open:()=>self.go('detail',{detailId:it.id}) }; });
    let items = s.listFilter ? baseItems.filter(it=> it.cat===s.listFilter || (it.tags||[]).indexOf(s.listFilter)>=0 || (it.place||'').indexOf(s.listFilter)>=0 || (it.title||'').indexOf(s.listFilter)>=0) : baseItems;
    if(s.listSort==='az') items=[...items].sort((a,b)=>(''+a.title).localeCompare(''+b.title,'tr'));
    else if(s.listSort==='fiyat') items=[...items].sort((a,b)=>_pnum(a.price)-_pnum(b.price));
    const filterChips=(L0.cats||[]).map(c=>({label:c, active:c===s.listFilter, bg:c===s.listFilter?active.accent:'var(--km-paper)', fg:c===s.listFilter?'#fff':'var(--km-ink-600)', set:()=>self.setState(p=>({listFilter:p.listFilter===c?'':c}))}));
    const sortOptions=[{k:'',label:'Önerilen'},{k:'fiyat',label:'Fiyat'},{k:'az',label:'A-Z'}].map(o=>({label:o.label, active:(s.listSort||'')===o.k, bg:(s.listSort||'')===o.k?'var(--km-deep)':'var(--km-paper)', fg:(s.listSort||'')===o.k?'#fff':'var(--km-ink-600)', set:()=>self.setState({listSort:o.k})}));

    // detail — generic across all modules
    let detail=null;
    if(s.view==='detail' || s.view==='booking'){
      const it = listData.find(x=>x.id===s.detailId) || listData[0];
      const t=BADGE_TONE[it.tone]||BADGE_TONE.good;
      const cfg = DETAIL_CFG[s.moduleKey] || {cta:'Talep gönder',ctaSub:'Talep',ph:_cfgPh,note:'Bilgiler sağlayıcı tarafından sağlanır; talebinizi sağlayıcı teyit eder.'};
      detail = { title:it.title, place:it.place, rating:it.rating, reviews:it.reviews, badge:it.badge, badgeBg:t.bg, badgeFg:t.fg, badgeIcon:'', ph:cfg.ph+' — '+it.title, slotKey:it.id, coverSrc:_itemCover(it.id), price:it.price, about:it.about,
        amenities:it.amenities, specs:it.specs.map(([k,v])=>({k,v})), prices:it.prices.map(([k,v])=>({k,v})),
        priceNote:cfg.note, ctaSub:cfg.ctaSub, ctaLabel:cfg.cta,
        reviewList:[
          {ini:'M.K.',name:'Mehmet K.',date:'2 hafta önce',text:'Süreç baştan sona sorunsuzdu, iletişim çok iyiydi. Beklentimi fazlasıyla karşıladı, tavsiye ederim.'},
          {ini:'A.Y.',name:'Ayşe Y.',date:'1 ay önce',text:'Talebime çok hızlı dönüş yapıldı; fiyat ve hizmet kalitesi gayet iyiydi.'},
        ] };
    }

    const panel = panelFor(s.moduleKey, active);
    const navColor = (v)=> s.view===v ? active.accent : 'var(--km-ink-500)';

    // ===== KolayRadyo & TV + KolayStars data =====
    const RADYO_CH = [
      {name:'Marin FM',type:'Radyo',now:'Denizci Türküleri',cat:'Müzik',live:true,listeners:'2.140'},
      {name:'Deniz TV',type:'TV',now:'Canlı Hava & Deniz Bülteni',cat:'Hava & Deniz',live:true,listeners:'5.380'},
      {name:'Rota Radyo',type:'Radyo',now:'Sabah Seyri · caz',cat:'Müzik',live:true,listeners:'1.760'},
      {name:'Kaptan Sohbetleri',type:'Podcast',now:'Bölüm 42 · Atlantik geçişi',cat:'Röportaj',live:false,listeners:'980'},
      {name:'Yelken TV',type:'TV',now:'Regatta tekrarları',cat:'Canlı TV',live:true,listeners:'3.210'},
      {name:'Balıkçı Radyo',type:'Radyo',now:'Hal fiyatları & sohbet',cat:'Röportaj',live:true,listeners:'1.120'},
    ];
    const _rc = s.radyoChannel||0;
    const radyoNow = (function(){ const c=RADYO_CH[_rc]||RADYO_CH[0]; return { name:c.name, type:c.type, now:c.now, listeners:c.listeners, live:c.live }; })();
    const radyoChannels = RADYO_CH.map((c,i)=>({ name:c.name, type:c.type, now:c.now, cat:c.cat, listeners:c.listeners, live:c.live, active:i===_rc, dot:c.live?'var(--km-bad)':'var(--km-ink-300)', typeBg:c.type==='TV'?'var(--km-deep-soft)':(c.type==='Podcast'?'var(--km-accent-soft)':active.accent+'22'), typeFg:c.type==='TV'?'var(--km-deep)':(c.type==='Podcast'?'var(--km-accent-2)':active.accent), pick:()=>self.setState({radyoChannel:i,radyoPlaying:true}) }));
    const STARS = [
      {name:'Kaptan Deniz Yılmaz',role:'Gezgin & Vlog',plat:'YouTube · Instagram',followers:'420B',eng:'%7,2',verified:true,ini:'DY'},
      {name:'Selin Deniz',role:'Olimpik Yelkenci',plat:'Instagram · TikTok',followers:'180B',eng:'%9,1',verified:true,ini:'SD'},
      {name:'Mavi Rota',role:'Tekne Vlog',plat:'YouTube',followers:'95B',eng:'%6,4',verified:true,ini:'MR'},
      {name:'Ece Marin',role:'Sualtı Fotoğrafçı',plat:'Instagram',followers:'128B',eng:'%8,0',verified:true,ini:'EM'},
      {name:'Barış Kaptan',role:'Kaptan & Eğitmen',plat:'YouTube · Podcast',followers:'64B',eng:'%5,8',verified:false,ini:'BK'},
      {name:'Derya Sailing',role:'Solo Yelken',plat:'Instagram · Blog',followers:'210B',eng:'%7,9',verified:true,ini:'DS'},
    ];
    const starsList = STARS.map(p=>({ name:p.name, role:p.role, plat:p.plat, followers:p.followers, eng:p.eng, verified:p.verified, ini:p.ini, open:()=>self.setState({loginOpen:true}) }));

    const _home = s.view==='home';
    const _modAccent = _home ? '#F2A310' : active.accent;
    const _wmSuf = _home ? 'marin' : active.name.replace(/^Kolay/,'');
    const _bs = s.bookingStep || 1;
    const bookingSteps = [{n:'1',label:'Seçim & tarih'},{n:'2',label:'İletişim'},{n:'3',label:'Özet'}].map((st,idx)=>{const num=idx+1;const active2=num===_bs;const done=num<_bs;return {...st,bg:(active2||done)?_modAccent:'var(--km-line)',fg:(active2||done)?'#fff':'var(--km-ink-400)'};});

    // ===== KolayBayrak bespoke =====
    const isBk = s.moduleKey==='bayrak';
    const bkFmt = (svc)=> svc.priceLabel ? svc.priceLabel : fmtTRY(svc.price);
    const bkIcon = (svc)=> (ICON[svc.icon]||ICON.flag)();
    const bkCatChips = ['', ...KB_CATS].map(c=>({label:c===''?'Tümü':c, active:(s.bayrakCat||'')===c, bg:(s.bayrakCat||'')===c?'var(--kb)':'var(--km-paper)', fg:(s.bayrakCat||'')===c?'#fff':'var(--km-ink-600)', bd:(s.bayrakCat||'')===c?'var(--kb)':'var(--km-line)', set:()=>self.setState(p=>({bayrakCat:p.bayrakCat===c?'':c}))}));
    const bkServices = KB_SERVICES.filter(sv=> !s.bayrakCat || sv.cat===s.bayrakCat).map(sv=>({ ...sv, priceText:bkFmt(sv), iconEl:bkIcon(sv), open:()=>self.bkOpenService(sv.id) }));
    const bkSvc = KB_SVC_BY_ID[s.bayrakServiceId] || KB_SERVICES[0];
    const bkFree = !bkSvc.price;
    const bkNet = bkSvc.price||0, bkKdv = Math.round(bkNet*0.2), bkTot = bkNet+bkKdv;
    const bkService = { ...bkSvc, priceText:bkFmt(bkSvc), iconEl:bkIcon(bkSvc), includesList:bkSvc.includes, reqList:bkSvc.requirements, durationText:bkSvc.duration, catLabel:bkSvc.cat };
    const bkCheckout = { title:bkSvc.title, duration:bkSvc.duration, free:bkFree, net:fmtTRY(bkNet), kdv:fmtTRY(bkKdv), total:bkFree?(bkSvc.priceLabel||'Teklife göre'):fmtTRY(bkTot), payLabel:bkFree?'Teklif talebini gönder':('Güvenli öde · '+fmtTRY(bkTot)), iconEl:bkIcon(bkSvc) };
    const bkStepper = (stage)=> KB_STAGES.map((label,i)=>({ n:String(i+1), label, cbg:i<=stage?'var(--kb)':'var(--km-paper)', cfg:i<=stage?'#fff':'var(--km-ink-400)', cbd:i<=stage?'var(--kb)':'var(--km-line-strong)', showLine:i>0, lbg:i<=stage?'var(--kb)':'var(--km-line)' }));
    const bkApps = s.bayrakApps;
    const bkOwnerApps = bkApps.filter(a=>a.owner==='me').map(a=>{ const t=BADGE_TONE[KB_STAGE_TONE[a.stage]]; return { ...a, amountText:fmtTRY(a.amount), statusLabel:KB_STAGES[a.stage], statusBg:t.bg, statusFg:t.fg, steps:bkStepper(a.stage) }; });
    const bkAdminChips = [{k:'',label:'Tümü'},{k:0,label:'Yeni'},{k:1,label:'Belge'},{k:2,label:'İşlemde'},{k:3,label:'Tamamlandı'}].map(o=>({label:o.label, active:s.bayrakAdminFilter===o.k, bg:s.bayrakAdminFilter===o.k?'var(--km-deep)':'var(--km-paper)', fg:s.bayrakAdminFilter===o.k?'#fff':'var(--km-ink-600)', set:()=>self.setState({bayrakAdminFilter:o.k})}));
    const bkAdminApps = bkApps.filter(a=> (s.bayrakAdminFilter===''||s.bayrakAdminFilter===undefined) ? true : a.stage===s.bayrakAdminFilter).map(a=>{ const t=BADGE_TONE[KB_STAGE_TONE[a.stage]]; return { ...a, amountText:fmtTRY(a.amount), statusLabel:KB_STAGES[a.stage], statusBg:t.bg, statusFg:t.fg, canAdvance:a.stage<3, done:a.stage===3, advLabel:a.stage<3?('İlerlet → '+KB_STAGES[a.stage+1]):'Tamamlandı', advance:()=>self.advanceApp(a.ref) }; });
    const bkStats = [
      {k:'Toplam başvuru', v:String(bkApps.length), d:'tüm zamanlar', dc:'var(--km-ink-400)'},
      {k:'İşlemde', v:String(bkApps.filter(a=>a.stage<3).length), d:'aktif dosya', dc:'var(--km-warn)'},
      {k:'Tamamlanan', v:String(bkApps.filter(a=>a.stage===3).length), d:'teslim edildi', dc:'var(--km-good)'},
      {k:'Toplam tahsilat', v:fmtTRY(bkApps.reduce((n,a)=>n+a.amount,0)), d:'KDV dahil', dc:'var(--km-good)'},
    ];
    const bkDocs = KB_DOCS.map(d=>{ const t=BADGE_TONE[d.tone]; return {...d, bg:t.bg, fg:t.fg}; });
    const bkBoats = KB_BOATS.map(b=>{ const t=BADGE_TONE[b.tone]; return {...b, bg:t.bg, fg:t.fg}; });
    const bkPayments = bkApps.filter(a=>a.owner==='me').map((a,i)=>({ inv:'FT-2026-'+(120+i), service:a.service, amount:fmtTRY(a.amount), date:a.date, status:'Ödendi' }));
    const bkProcess = [{n:'1',t:'Hizmeti seç',d:'Katalogdan ihtiyacına uygun tescil/belge hizmetini seç.'},{n:'2',t:'Başvur & öde',d:'KolayLogin ile giriş yap, bilgileri gir ve güvenli ödemeyi tamamla.'},{n:'3',t:'Belge & takip',d:'Belgelerini yükle; uzman ekip resmi işlemleri yürütür.'},{n:'4',t:'Teslim',d:'Ruhsat/belge hazır olunca panelinden indir, kargoyla teslim al.'}];
    const bkOwnerTabs = [{k:'basvurular',label:'Başvurularım'},{k:'belgeler',label:'Belgelerim'},{k:'tekneler',label:'Teknelerim'},{k:'odemeler',label:'Ödemeler'}].map(o=>({label:o.label, active:s.bayrakOwnerTab===o.k, set:()=>self.setState({bayrakOwnerTab:o.k}), bg:s.bayrakOwnerTab===o.k?'var(--kb)':'var(--km-paper)', fg:s.bayrakOwnerTab===o.k?'#fff':'var(--km-ink-600)', bd:s.bayrakOwnerTab===o.k?'var(--kb)':'var(--km-line)'}));

    const V = {
      modAccent:_modAccent, wordmarkSuf:_wmSuf,
      aiOpen:s.aiOpen, icAi:ICON.ai(), icSpeaker:ICON.speaker(), toggleAi:()=>{const willOpen=!s.aiOpen; self.setState(p=>({aiOpen:!p.aiOpen})); if(willOpen) self.speakTr('Merhaba! Ben Deniz, sesli asistanın. Ne aradığını yaz ya da söyle, sana en uygun sonucu bulayım.');}, closeAi:()=>{ if(typeof window!=='undefined'&&window.speechSynthesis) window.speechSynthesis.cancel(); self.setState({aiOpen:false}); }, speakGreeting:()=>self.speakTr('Merhaba! Ben Deniz, sesli asistanın. Ne aradığını yaz ya da söyle, sana en uygun sonucu bulayım. Örneğin en uygun seçeneği ya da sana özel önerileri isteyebilirsin.'),
      icUser:ICON.user(), loginOpen:s.loginOpen, toggleLogin:()=>self.setState(p=>({loginOpen:!p.loginOpen})), closeLogin:()=>self.setState({loginOpen:false}),
      hasMap:['marina','fish','mazot','service','charter','kislama','susporu','trip','tickets','racing'].indexOf(s.moduleKey)>=0,
      activePinData:(function(){ if(s.activePin==null) return null; const it=items.find(x=>x.id===s.activePin); if(!it) return null; const t=BADGE_TONE[it.tone]||BADGE_TONE.good; return {title:it.title, place:it.place, price:it.price, priceUnit:it.priceUnit||'', badge:it.badge, badgeBg:t.bg, badgeFg:t.fg, left:it.pinLeft, top:it.pinTop, open:it.open}; })(),
      closePin:()=>self.setState({activePin:null}),
      stopPin:(e)=>{ if(e){e.stopPropagation();} self.setState({activePin:null}); },
      hasModeSwitch:s.moduleKey==='yacht',
      isAcademy:s.moduleKey==='academy', academySyllabus:[{n:'1',t:'Denizcilik temelleri & terminoloji'},{n:'2',t:'Seyir & harita okuma'},{n:'3',t:'Kurallar & COLREG'},{n:'4',t:'Telsiz kullanımı (SRC)'},{n:'5',t:'Güvenlik & can kurtarma'},{n:'6',t:'Bağlama & manevra'},{n:'7',t:'Meteoroloji temelleri'},{n:'8',t:'Uygulama & sınav hazırlık'}],
      isRacing:s.moduleKey==='racing', racingCal:[{race:'Bodrum Kupası',region:'Bodrum',date:'12-14 Temmuz',cat:'IRC',status:'Kayıtlar açık',sbg:'var(--km-good-soft)',sfg:'var(--km-good)'},{race:'Çeşme Regatta',region:'İzmir',date:'2-3 Ağustos',cat:'ORC',status:'Kayıtlar açık',sbg:'var(--km-good-soft)',sfg:'var(--km-good)'},{race:'Marmaris Race Week',region:'Muğla',date:'5-9 Kasım',cat:'IRC/ORC',status:'Erken kayıt',sbg:'var(--km-warn-soft)',sfg:'var(--km-warn)'},{race:'Gökova Cup',region:'Gökova',date:'20-21 Eylül',cat:'Gulet',status:'Kayıtlar açık',sbg:'var(--km-good-soft)',sfg:'var(--km-good)'},{race:'Boğaz Yarışı',region:'İstanbul',date:'18 Ekim',cat:'Açık',status:'Yakında',sbg:'var(--km-paper-3)',sfg:'var(--km-ink-500)'},{race:'Ayvalık Trofesi',region:'Balıkesir',date:'6-7 Eylül',cat:'One-design',status:'Kayıtlar açık',sbg:'var(--km-good-soft)',sfg:'var(--km-good)'}],
      isExper:s.moduleKey==='exper', experItems:['Tekne teknesi & jelkot durumu','Güverte donanımı & reling','Motor & şanzıman','Elektrik & akü sistemleri','Sintine & su tahliye','Yangın & güvenlik ekipmanı','Sızdırmazlık & valfler','Elektronik & seyir cihazları'],
      isAuction:s.moduleKey==='auction', auctionLive:{title:'2016 Jeanneau Sun Odyssey 349',bid:'₺2.850.000',ends:'2 gün 04:12',bids:'14',minInc:'₺25.000',history:[{who:'K***7',amount:'₺2.850.000',when:'12 dk önce'},{who:'M***2',amount:'₺2.825.000',when:'40 dk önce'},{who:'A***9',amount:'₺2.800.000',when:'1 saat önce'},{who:'S***3',amount:'₺2.750.000',when:'2 saat önce'}]},
      isCharter:s.moduleKey==='charter', itinerary:[{d:'1. Gün',t:'Bodrum kalkış → Orak Adası',n:'Öğleden sonra kalkış, akşam koyda demirleme'},{d:'2. Gün',t:'Orak Adası → Çökertme',n:'Sabah yüzme, öğleden sonra Çökertme koyu'},{d:'3. Gün',t:'Çökertme → Sedir Adası',n:'Kleopatra plajı ve antik liman'},{d:'4. Gün',t:'Sedir → İngiliz Limanı',n:'Korunaklı koyda gece'},{d:'5. Gün',t:'İngiliz Limanı → Karacasöğüt',n:'Orman manzaralı demirleme'},{d:'6. Gün',t:'Karacasöğüt → Orak',n:'Son yüzme molaları'},{d:'7. Gün',t:'Orak → Bodrum dönüş',n:'Öğleden önce limana varış'}],
      isRadyo:s.moduleKey==='radyo', radyoNow:radyoNow, radyoChannels:radyoChannels, radyoTogglePlay:()=>self.setState(p=>({radyoPlaying:!p.radyoPlaying})), radyoPlaying:s.radyoPlaying, radyoPlayLabel:s.radyoPlaying?'❚❚ Duraklat':'► Canlı dinle', radyoPlayIcon:s.radyoPlaying?'❚❚':'►', radyoPickChannel:(i)=>self.setState({radyoChannel:i,radyoPlaying:true}),
      isStars:s.moduleKey==='stars', starsList:starsList, starsStats:[{k:'Doğrulanmış profil',v:'240+'},{k:'Toplam erişim',v:'8,4M'},{k:'Aktif işbirliği',v:'56'}],
      isCrew:['captain','isgucu'].indexOf(s.moduleKey)>=0, crewPeople: s.moduleKey==='isgucu' ? [{name:'Aşçı Selin K.',role:'Gulet Aşçısı',exp:'8 yıl',rate:'₺55.000/ay',lic:['STCW','Hijyen']},{name:'Deckhand Can T.',role:'Deckhand',exp:'4 yıl',rate:'₺2.800/gün',lic:['STCW']},{name:'Müh. Aylin R.',role:'Gemi Mühendisi',exp:'10 yıl',rate:'₺5.500/gün',lic:['STCW','AEC']},{name:'Usta Kerim B.',role:'Tersane Ustası',exp:'16 yıl',rate:'₺48.000/ay',lic:['Kaynak','İSG']}] : [{name:'Kapt. Mehmet A.',role:'Yat Kaptanı',exp:'14 yıl',rate:'₺6.500/gün',lic:['Yat Kaptanı','STCW','SRC']},{name:'Aşçı Selin K.',role:'Gulet Aşçısı',exp:'8 yıl',rate:'₺4.200/gün',lic:['STCW','Hijyen']},{name:'Deckhand Can T.',role:'Deckhand',exp:'4 yıl',rate:'₺2.800/gün',lic:['STCW']},{name:'Müh. Aylin R.',role:'Gemi Mühendisi',exp:'10 yıl',rate:'₺5.500/gün',lic:['STCW','AEC']}],
      isInsurance:s.moduleKey==='insurance', insurerQuotes:[{name:'Deniz Sigorta',coverage:'Kasko + Sorumluluk',muaf:'%2',prim:'₺18.500'},{name:'Mavi Marin Sigorta',coverage:'Tam Kasko',muaf:'%1,5',prim:'₺22.400'},{name:'Anka Yat Sigorta',coverage:'Kasko + P&I',muaf:'%2,5',prim:'₺16.900'},{name:'Ege Sigorta',coverage:'Sorumluluk',muaf:'—',prim:'₺7.200'},{name:'Poseidon Sigorta',coverage:'Kasko + Çekme/Kurtarma',muaf:'%2',prim:'₺20.100'},{name:'Marmara Sigorta',coverage:'Tam Kasko + P&I',muaf:'%1',prim:'₺25.800'}],
      isBroker:s.moduleKey==='broker', brokerPortfolio:[{title:'Azimut 55 Fly',sub:'2019 · Motoryat',price:'€480.000'},{title:'Bavaria C45',sub:'2021 · Yelkenli',price:'€295.000'},{title:'Lagoon 42',sub:'2020 · Katamaran',price:'€395.000'},{title:'Sunseeker 76',sub:'2018 · Süperyat',price:'Fiyat sorunuz'}],
      yachtModeNote:(s.yachtMode||'satilik')==='kiralik'?'Haftalık / günlük kiralama · mürettebatlı veya mürettebatsız':'İkinci el & sıfır yat ilanları · fiyat veya broker ile iletişim',
      yachtModes: s.moduleKey==='yacht' ? [{k:'satilik',label:'Satılık'},{k:'kiralik',label:'Kiralık · Charter'}].map(o=>({label:o.label, bg:(s.yachtMode||'satilik')===o.k?active.accent:'transparent', fg:(s.yachtMode||'satilik')===o.k?'#fff':'var(--km-ink-600)', set:()=>self.setState({yachtMode:o.k})})) : [],
      hasPriceIndex:!!PRICE_INDEX[s.moduleKey], priceIndex: PRICE_INDEX[s.moduleKey] ? { title:PRICE_INDEX[s.moduleKey].title, unit:PRICE_INDEX[s.moduleKey].unit, fresh:PRICE_INDEX[s.moduleKey].fresh, note:PRICE_INDEX[s.moduleKey].note, rows:PRICE_INDEX[s.moduleKey].rows.map(r=>({name:r.name,price:r.price,delta:r.delta,dcolor:r.dir==='up'?'var(--km-good)':r.dir==='down'?'var(--km-bad)':'var(--km-ink-400)',bars:r.spark.map(v=>({h:v+'%'}))})) } : null,
      bookingSteps, bookingPending:!s.bookingDone, bookingDone:!!s.bookingDone,
      step1Display:_bs===1?'block':'none', step2Display:_bs===2?'block':'none', step3Display:_bs===3?'block':'none',
      canBack:_bs>1, canNext:_bs<3, isLastStep:_bs===3,
      stepNext:()=>self.setState(p=>({bookingStep:Math.min(3,(p.bookingStep||1)+1)})),
      stepBack:()=>self.setState(p=>({bookingStep:Math.max(1,(p.bookingStep||1)-1)})),
      submitBooking:()=>{const ref='KM-2026-0'+(400+Math.floor(Math.random()*99));self.setState({bookingDone:true,bookingRef:ref});if(typeof window!=='undefined')window.scrollTo(0,0);},
      // icons
      icMenu:ICON.menu(), icSearch:ICON.search(), icX:ICON.x(), icCheck:ICON.check(), icArrow:ICON.arrow(), icClock:ICON.clock(), icStar:ICON.star(), icHome:ICON.home(), icPanel:ICON.panel(), icBig:ICON.big(),
      // shell
      activeModule: { ...active, accentSoft:accentSoft(active), iconEl:iconEl(active), coverSrc: photoOf(active) || coverSVG(active.accent) },
      groups, footerProducts,
      quickSearch:(function(){
        var live=(typeof window!=='undefined'&&window.__ECO_LIVE&&window.__ECO_LIVE.popular)||[];
        var terms=live.map(function(p){return (typeof p==='string')?p:(p&&(p.query||p.term||p.q||p.label||p.name));}).filter(Boolean).slice(0,6);
        if(terms.length) return terms.map(function(t){return {label:t, open:function(){ self.setState({query:t, moduleKey:'marin'}); self.loadList(); }};});
        return [['marina','Marina'],['marin','Yedek parça'],['charter','Charter'],['mazot','Yakıt'],['bayrak','Tescil & bayrak'],['service','Teknik servis']].map(function(x){return {label:x[1], open:()=>self.navTo(x[0])};});
      })(),
      regionChips:['Ege','Marmara','Akdeniz','Göcek','Bodrum'].map(function(r){return {label:r, open:()=>self.openRegion(r)};}),
      weather:{
        cityOptions:WEATHER_CITIES.map(c=>c.name),
        selectedCity:s.weatherCity,
        onCityChange:(e)=>self.setWeatherCity(e.target.value),
        useMyLocation:()=>self.useMyLocation(),
        loading:s.weatherLoading,
        error:s.weatherErr,
        place:s.weatherPlace,
        data:s.weatherData,
      },
      trProvinces:(function(){var P=(typeof window!=='undefined'&&window.TR_PROVINCES)||[];if(!P.length)return [];
        var COUNTS={'İstanbul':6200,'İzmir':5400,'Muğla':4800,'Antalya':3600,'Balıkesir':2100,'Aydın':1600,'Kocaeli':1700,'Bursa':1500,'Çanakkale':1300,'Mersin':1500,'Tekirdağ':900,'Adana':850,'Hatay':700,'Samsun':750,'Trabzon':650,'Yalova':500,'Sakarya':420,'Ordu':300,'Giresun':240,'Rize':220,'Sinop':280,'Zonguldak':230,'Artvin':160,'Kastamonu':150,'Düzce':180};
        var _lc=(typeof window!=='undefined'&&window.__ECO_LIVE&&window.__ECO_LIVE.provinceCounts); if(_lc&&typeof _lc==='object'){ COUNTS=Object.assign({},COUNTS,_lc); }
        var REGION={'İstanbul':'Marmara','Kocaeli':'Marmara','Bursa':'Marmara','Balıkesir':'Marmara','Çanakkale':'Marmara','Tekirdağ':'Marmara','Yalova':'Marmara','Sakarya':'Marmara','İzmir':'Ege','Aydın':'Ege','Muğla':'Göcek','Antalya':'Akdeniz','Mersin':'Akdeniz','Adana':'Akdeniz','Hatay':'Akdeniz'};
        var RAMP=['#78350f','#b45309','#d97706','#f59e0b','#fbbf24'];var cf=CATFAC(s.mapCat);
        function binIdx(c){if(!c)return -1;if(c<300)return 0;if(c<800)return 1;if(c<1700)return 2;if(c<3500)return 3;return 4;}
        return P.map(function(p){var reg=REGION[p.name]||p.name;var c=Math.round((COUNTS[p.name]||0)*(cf[reg]!=null?cf[reg]:cf._));var idx=binIdx(c);var fill=idx<0?'#123a5c':RAMP[idx];return {d:p.d,name:p.name,fill:fill,stroke:idx>=0?'#fbbf24':'rgba(255,255,255,.14)',title:p.name+(c?': '+c.toLocaleString('tr-TR')+' ilan':': —'),open:(function(r){return function(){self.openRegion(r);};})(reg)};});
      })(),
      mapCats:[{k:'',l:'Tümü'}].concat(MODULES.map(function(m){return {k:m.key,l:m.name.replace('Kolay','')};})).map(function(c){var on=s.mapCat===c.k;return {label:c.l,set:(function(k){return function(){self.setState({mapCat:k});};})(c.k),fg:on?'#0F1B2D':'#DCE8F3',bg:on?'var(--km-accent)':'rgba(255,255,255,.07)',bd:on?'var(--km-accent)':'rgba(255,255,255,.16)'};}),
      liveCount:s.liveCount.toLocaleString('tr-TR'),
      tickerKey:'tk'+s.tickerIx, tickerCity:TICKER[s.tickerIx%TICKER.length][0], tickerQuery:(function(){var live=(typeof window!=='undefined'&&window.__ECO_LIVE&&window.__ECO_LIVE.popular)||[];var terms=live.map(function(p){return (typeof p==='string')?p:(p&&(p.query||p.term||p.q||p.label||p.name));}).filter(Boolean);return terms.length? terms[s.tickerIx%terms.length] : TICKER[s.tickerIx%TICKER.length][1];})(), tickerAgo:TICKER[s.tickerIx%TICKER.length][2],
      tickerX:((MAPPIN[TICKER[s.tickerIx%TICKER.length][0]]||[121,350])[0]/1007.478*100).toFixed(2)+'%',
      tickerY:((MAPPIN[TICKER[s.tickerIx%TICKER.length][0]]||[121,350])[1]/527.323*100).toFixed(2)+'%',
      heatRank:(function(){var cf=CATFAC(s.mapCat);var base=[['İstanbul','Marmara',6200],['İzmir','Ege',5400],['Muğla','Göcek',4800],['Antalya','Akdeniz',3600],['Balıkesir','Marmara',2100],['Kocaeli','Marmara',1700],['Aydın','Ege',1600]];var w=base.map(function(h){return [h[0],h[1],Math.round(h[2]*(cf[h[1]]!=null?cf[h[1]]:cf._))];}).sort(function(a,b){return b[2]-a[2];}).slice(0,5);var mx=w[0][2]||1;return w.map(function(h,i){var t=Math.log1p(h[2])/Math.log1p(6200);var A=[220,235,245],B=[242,163,16];var col='#'+[0,1,2].map(function(k){return Math.round(A[k]+(B[k]-A[k])*t).toString(16).padStart(2,'0');}).join('');return {name:h[0],count:h[2].toLocaleString('tr-TR'),dot:col,barPct:Math.round(h[2]/mx*100)+'%',delay:(i*0.06)+'s',open:()=>self.openRegion(h[1])};});})(),
      trustPartners:['D-Marin','Setur Marinas','Volvo Penta','Garmin','Yamaha','Vetus'],
      icInstagram:ICON.instagram(), icYoutube:ICON.youtube(), icLinkedin:ICON.linkedin(), icGlobe:ICON.globe(), icStore:ICON.store(),
      langTR:s.lang==='tr', langLabel:s.lang==='tr'?'Türkçe':'English', langOther:s.lang==='tr'?'EN':'TR', toggleLang:()=>self.setState(p=>({lang:p.lang==='tr'?'en':'tr'})),
      sellerOpen:s.sellerOpen, sellerDone:s.sellerDone, sellerPending:!s.sellerDone,
      openSeller:()=>self.setState({sellerOpen:true,sellerDone:false,menuOpen:false}),
      closeSeller:()=>self.setState({sellerOpen:false}),
      submitSeller:()=>self.setState({sellerDone:true}),
      howOpen:s.howOpen, openHow:()=>self.setState({howOpen:true,menuOpen:false}), closeHow:()=>self.setState({howOpen:false}),
      openSellerFromHow:()=>self.setState({howOpen:false,sellerOpen:true,sellerDone:false}),
      howSteps:[
        {n:'1',t:'Keşfet',d:'Tek platformdan '+PLATFORM_COUNT+' denizcilik hizmetini keşfet; kategoriye veya bölgeye göre süz.'},
        {n:'2',t:'Ara & karşılaştır',d:'Fiyat, konum ve olanakları yan yana karşılaştır; güncel verilerle en uygununu bul.'},
        {n:'3',t:'Talep & öde',d:'Tek KolayLogin ile talep oluştur; gerektiğinde güvenli ödemeyle işlemi başlat.'},
        {n:'4',t:'Panelden takip et',d:'Tüm taleplerini, belgelerini ve ödemelerini tek panelden canlı takip et.'},
      ],
      platformCount: PLATFORM_COUNT,
      heroStats: (function(){
        var eco = (typeof window!=='undefined' && window.__ECO_LIVE && window.__ECO_LIVE.stats) || {};
        var members = (typeof eco.memberCount==='number' && eco.memberCount>0) ? eco.memberCount : 12840;
        var parts = (typeof eco.productCount==='number' && eco.productCount>0) ? eco.productCount : 48000;
        return [
          { to: PLATFORM_COUNT, label: 'platform' },
          { to: members, suffix: '+', label: 'üye' },
          { to: parts, suffix: '+', label: 'parça' },
          { to: 3200, label: 'satılık tekne' },
          { to: 1850, label: 'kiralık tekne (charter)' },
          { to: 640, label: 'teknik servis' },
          { to: 480, label: 'marina' },
          { to: 220, label: 'kışlama / çekek' },
          { to: 540, label: 'kaptan / mürettebat' },
          { to: 45, label: 'sigorta şirketi' },
          { to: 180, label: 'denizde mazot noktası' },
          { to: 2600, label: 'taze balık ilanı' },
          { to: 9400, suffix: '+', label: 'olta & av malzemesi' },
          { to: 3400, suffix: '+', label: 'satıcı / e-ticaret' },
          { to: 120, suffix: '+', label: 'tekne markası' },
          { to: 7, label: 'bölge' },
        ];
      })(),
      menuOpen:s.menuOpen, query:s.query,
      toggleMenu:()=>self.setState(p=>({menuOpen:!p.menuOpen})),
      closeMenu:()=>self.setState({menuOpen:false}),
      stop:(e)=>e.stopPropagation(),
      onQuery:(e)=>self.setState({query:e.target.value}),
      doSearch:()=> self.loadList(),
      openList:()=>self.loadList(),
      goHome:()=>self.goHomeNav(),
      goLanding:()=>self.setState({view:'landing',menuOpen:false}),
      goPanel:()=>self.go('panel'),
      openMarin:()=>self.openModule('marin'),
      scrollGrid:()=>{ const g=document.getElementById('km-grid'); if(g) window.scrollTo(0, g.offsetTop-70); },
      openBooking:()=> self.go('booking',{bookingStep:1,bookingDone:false,bookingRef:null}),
      bookingRef:s.bookingRef,
      // views
      isHome:s.view==='home', isLanding:s.view==='landing'&&!isBk, isList:s.view==='list'&&!isBk, isDetail:s.view==='detail'&&!isBk, isBooking:s.view==='booking'&&!isBk, isPanel:s.view==='panel'&&!isBk,
      isAdmin:s.view==='admin',
      adminStats:[{k:'Aktif platform',v:String(PLATFORM_COUNT),d:livePlatformN+' canlı · '+prepPlatformN+' hazırlıkta',dc:'var(--km-ink-400)'},{k:'Kayıtlı işletme',v:'1.284',d:'▲ bu ay 46',dc:'var(--km-good)'},{k:'Aylık arama',v:'312B',d:'▲ %12',dc:'var(--km-good)'},{k:'Onay bekleyen',v:'7',d:'işletme başvurusu',dc:'var(--km-warn)'}],
      adminModules:MODULES.slice(0,8).map(function(m){var lv=!!(LIVE_KEYS[m.key]||m.live);return {name:m.name, cat:m.cat, accent:m.accent, statusLabel:lv?'Canlı':'Hazırlıkta', sfg:lv?'var(--km-good)':'var(--km-warn)', sbg:lv?'var(--km-good-soft)':'var(--km-warn-soft)', listings:lv?(40+m.name.length*3):0};}),
      adminApprovals:[{name:'Ege Marine Servis',mod:'KolayService',date:'30 Haz',city:'İzmir'},{name:'Blue Yacht Broker',mod:'KolayBroker',date:'29 Haz',city:'Muğla'},{name:'Deniz Yakıt A.Ş.',mod:'KolayMazot',date:'28 Haz',city:'İstanbul'}],
      adminActivity:[{t:'KolayBayrak · yeni başvuru KB-2026-0431',d:'12 dk önce'},{t:'KolayService · işletme onaylandı (Göcek Teknik)',d:'1 saat önce'},{t:'KolayMazot · 3 fiyat güncellemesi',d:'2 saat önce'},{t:'Kolaymarina · yeni yorum bildirimi',d:'4 saat önce'}],
      L, items, itemCount:items.length, detail, panel:{...panel, rows:panel.rows.map((r,i)=>({...r, open:()=>self.setState({reqDetail:{...r, who:['Mehmet K.','Ayşe Y.','Can T.','Selin A.','Murat Ş.','Deniz K.'][i%6], phone:'+90 5xx xxx '+(10+i)+' '+(20+i), note:'Müşteri '+r.subject.toLowerCase()+' konusunda bilgi ve fiyat talep ediyor. En uygun teklifi ve müsaitlik durumunu paylaşmanızı bekliyor.'}, reqReplied:false})})) },
      reqDetail:s.reqDetail, reqDetailOpen:!!s.reqDetail, reqReplied:s.reqReplied, reqReplyPending:!s.reqReplied,
      closeReqDetail:()=>self.setState({reqDetail:null}),
      sendReqReply:()=>self.setState({reqReplied:true}),
      reqTimeline:s.reqDetail?[{t:'Talep alındı',d:s.reqDetail.date,done:true},{t:'İnceleniyor',d:s.reqDetail.date,done:true},{t:'Yanıt gönderildi',d:s.reqReplied?'Şimdi':'Bekliyor',done:s.reqReplied},{t:'Tamamlandı',d:'—',done:false}].map(x=>({t:x.t,d:x.d,mark:x.done?'✓':'',dotBg:x.done?'var(--km-good)':'var(--km-paper)',dotFg:x.done?'#fff':'var(--km-ink-400)',dotBd:x.done?'var(--km-good)':'var(--km-line-strong)',tc:x.done?'var(--km-ink-900)':'var(--km-ink-500)'})):[],
      panelTab:s.panelTab,
      panelTabs:[['genel','Genel Bakış'],['talepler','Talepler'],['ilanlar','İlanlar & İçerik'],['fiyat','Fiyatlandırma'],['yorumlar','Yorumlar'],['ayarlar','Ayarlar']].map(function(t){return {label:t[1], set:()=>self.setState({panelTab:t[0]}), bg:s.panelTab===t[0]?active.accent:'var(--km-paper)', fg:s.panelTab===t[0]?'#fff':'var(--km-ink-600)', bd:s.panelTab===t[0]?active.accent:'var(--km-line)'};}),
      pTabGenel:s.panelTab==='genel', pTabGenelOrTalep:s.panelTab==='genel'||s.panelTab==='talepler', pTabIlan:s.panelTab==='ilanlar', pTabFiyat:s.panelTab==='fiyat', pTabYorum:s.panelTab==='yorumlar', pTabAyar:s.panelTab==='ayarlar',
      panelListings:[{title:active.name+' · Aktif ilan',sub:'Yayında · 1.240 görüntülenme · 18 talep',status:'Yayında',tone:'good'},{title:active.name+' · İkincil ilan',sub:'Yayında · 860 görüntülenme · 7 talep',status:'Yayında',tone:'good'},{title:active.name+' · Yeni taslak',sub:'Henüz yayınlanmadı',status:'Taslak',tone:'warn'}].map(function(x){var t=BADGE_TONE[x.tone];return {title:x.title,sub:x.sub,status:x.status,bg:t.bg,fg:t.fg};}),
      panelPricing:(L0.cats||['Standart']).slice(0,4).map(function(c,i){return {name:c, price:fmtTRY(1500+i*850), unit:'başlangıç'};}),
      panelReviews:[{ini:'M.K.',name:'Mehmet K.',date:'2 hafta önce',rating:'5,0',text:'Hızlı ve ilgili hizmet, iletişim çok iyiydi.'},{ini:'A.Y.',name:'Ayşe Y.',date:'1 ay önce',rating:'4,5',text:'Fiyat/performans dengesi gayet iyi, tekrar tercih ederim.'},{ini:'C.T.',name:'Can T.',date:'2 ay önce',rating:'4,0',text:'Sonuçtan memnunum; süreç biraz daha hızlı olabilirdi.'}].map(function(rv,i){return {...rv, open:s.reviewReplyOpen===i, replied:s.reviewReplied.indexOf(i)>=0, notReplied:s.reviewReplied.indexOf(i)<0, toggle:()=>self.setState(p=>({reviewReplyOpen:p.reviewReplyOpen===i?null:i})), send:()=>self.setState(p=>({reviewReplied:p.reviewReplied.indexOf(i)>=0?p.reviewReplied:[...p.reviewReplied,i], reviewReplyOpen:null}))};}),
      filterChips, sortOptions, listEmpty:items.length===0&&!s.listLoading, clearFilter:()=>self.setState({listFilter:'',listSort:''}),
      filterOpen:s.filterOpen, toggleFilter:()=>self.setState(p=>({filterOpen:!p.filterOpen})), closeFilter:()=>self.setState({filterOpen:false}),
      activeFilterCount:(s.listFilter?1:0)+(s.listSort?1:0), hasActiveFilter:!!(s.listFilter||s.listSort), icFilter:ICON.filter(),
      icCamera:ICON.camera(), icPin:ICON.pin(),
      photoOpen:s.photoOpen, openPhoto:()=>self.setState({photoOpen:true,menuOpen:false}), closePhoto:()=>self.setState({photoOpen:false}),
      locOpen:s.locOpen, openLoc:()=>self.setState(p=>({locOpen:!p.locOpen})), closeLoc:()=>self.setState({locOpen:false}),
      loc:s.loc||'Tüm bölgeler', locList:['Tüm bölgeler','Ege','Marmara','Akdeniz','Göcek','Bodrum','İstanbul'].map(function(x){var on=(s.loc||'Tüm bölgeler')===x;return {label:x, active:on?'700':'500', on:on, color:on?'var(--km-deep)':'var(--km-ink-700)', bg:on?'var(--km-deep-soft)':'none', set:()=>{ if(x==='Tüm bölgeler'){ self.setState({loc:'',locOpen:false}); } else { self.setState({loc:x,locOpen:false}); self.openRegion(x); } }};}),
      regStep:s.regStep, otpSent:s.otpSent, isRegForm:s.authMode==='register'&&s.regStep==='form', isRegOtp:s.authMode==='register'&&s.regStep==='otp',
      sendOtp:()=>self.setState({regStep:'otp',otpSent:true}), backToForm:()=>self.setState({regStep:'form'}),
      listLoading:s.listLoading, itemsDisplay:s.listLoading?'none':'grid',
      navHomeColor:navColor('home'), navSearchColor:navColor('list'), navPanelColor:navColor('panel'),
      // auth + bayrak
      authed:s.authed, signIn:()=>self.signIn(), signOut:()=>self.signOut(), ownerName:KB_OWNER,
      isBayrak: isBk && s.view!=='home',
      bkCatalog:s.bayrakView==='catalog', bkService:s.bayrakView==='service', bkPayView:s.bayrakView==='checkout', bkSuccess:s.bayrakView==='success', bkOwner:s.bayrakView==='owner', bkAdmin:s.bayrakView==='admin'&&s.adminAuthed, bkAdminGate:s.bayrakView==='admin'&&!s.adminAuthed,
      adminSignIn:()=>self.setState({adminAuthed:true}), adminSignOut:()=>self.setState({adminAuthed:false,bayrakRole:'owner',bayrakView:'owner'}),
      isRegister:s.authMode==='register', isLoginMode:s.authMode==='login', setLoginMode:()=>self.setState({authMode:'login',regStep:'form'}), setRegisterMode:()=>self.setState({authMode:'register',regStep:'form'}),
      bkRoleOwner:s.bayrakRole==='owner', setRoleOwner:()=>self.setState({bayrakRole:'owner',bayrakView:'owner'}), setRoleAdmin:()=>self.setState({bayrakRole:'admin',bayrakView:'admin'}),
      bkHeroStats:[{v:'3.200+',k:'tamamlanan işlem'},{v:'12 yıl',k:'tescil uzmanlığı'},{v:'%98',k:'zamanında teslim'}],
      bkServices, bkCatChips, bkProcess,
      bkSvcDetail:bkService, bkFree, notFreeCheckout:!bkFree, bkCheckout, icDoc:ICON.doc(),
      bkStart:()=>self.bkStart(), bkPay:()=>self.bkPay(), bkRef:s.bayrakRef,
      goCatalog:()=>self.bgo('catalog'), goOwner:()=>self.bgo('owner'), goAdmin:()=>self.setState({bayrakRole:'admin',bayrakView:'admin',view:'landing'}),
      bkOwnerTabs, bkOwnerTab:s.bayrakOwnerTab,
      bkTabBasv:s.bayrakOwnerTab==='basvurular', bkTabBelge:s.bayrakOwnerTab==='belgeler', bkTabTekne:s.bayrakOwnerTab==='tekneler', bkTabOdeme:s.bayrakOwnerTab==='odemeler',
      notAuthed:!s.authed,
      bkOwnerApps, bkDocs, bkBoats, bkPayments,
      bkStats, bkAdminChips, bkAdminApps,
    };
    if(isBk){
      V.goLanding=()=>self.bgo('catalog');
      V.goPanel=()=>self.bgo('owner');
      V.openList=()=>self.bgo('catalog');
      V.doSearch=()=>self.bgo('catalog');
    }
    return V;
  }
}

// ---- mount ----
(function(){
  function mount(){
    var root = document.getElementById('root');
    if(!root) return;
    if(ReactDOM.createRoot){ ReactDOM.createRoot(root).render(el(Component)); }
    else { ReactDOM.render(el(Component), root); }
  }
  if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', mount); }
  else { mount(); }
})();
