@php // ✅ ÇOKLU HARİTA: 3-4 kişilik haritalarda r_dis büyütülür (bkz. // ChartVisualizerService), viewBox da buna göre dinamik olmalı — aksi // halde ek halkalar tuvalin dışına taşıp kırpılır. 2 kişilik akışta // r_dis her zaman 398 kaldığı için bu, eski "-24 -24 848 848" ile // BİREBİR AYNI sonucu üretir. // ✅ TRANSİT: transit halkası (outerRing.r) bazen r_dis'ten BÜYÜK olabilir // (transit modunda iç harita küçültülür, transit halkası ise ayrı bir // sabit/yeniden hesaplanmış yarıçapta dışa çizilir) — bu yüzden viewBox // ikisinin BÜYÜĞÜNE göre hesaplanmalı, aksi halde transit halkası // tuvalin dışında kırpılır. $__svgCx = isset($cx) ? (float) $cx : 400.0; $__svgCy = isset($cy) ? (float) $cy : 400.0; $__svgOuterRingR = (!empty($outerRing['r']) && is_numeric($outerRing['r'])) ? (float) $outerRing['r'] : 0.0; $__svgRDis = max(isset($r_dis) ? (float) $r_dis : 398.0, $__svgOuterRingR); // ✅ Uranyen Doğum Haritası: mikro transneptünyen bandı r_dis'in DIŞINDA // (+34 etiket + metin genişliği) çizildiğinden, viewBox'ı kırpmayacak // kadar genişletmemiz gerekir. // ✅ Uranyen çok halkalı dial (pairRing dolu): dış halkalar r_dis'in (398) // dışına uzanır — gereken pad'i layout hesaplar (2 halka → 72, 3 halka → ~136). $__svgPad = !empty($isUranianNatal) ? 90.0 : (!empty($uranianDialLayout['pairRing']) ? (float) ($uranianDialLayout['pairRing']['pad'] ?? 72.0) : (!empty($isLifeClock) ? 35.0 : 2.0)); $__svgMinX = round($__svgCx - $__svgRDis - $__svgPad, 1); $__svgMinY = round($__svgCy - $__svgRDis - $__svgPad, 1); $__svgSize = round(2 * ($__svgRDis + $__svgPad), 1); @endphp @if (!empty($isUranianDial)) @include('frontend.panel.partials.uranian-dial-svg-body') @elseif (!empty($isLifeClock)) @include('frontend.panel.partials.life-clock-svg-body') @else @php $overlayType = $overlay_type ?? null; // prepareVisualData options’tan gelsin $ownerA = $owner_a ?? null; $ownerB = $owner_b ?? null; // Tooltip'lerde kullanmak üzere harita adı ve ev sistemi $chartTitleForTooltip = $chart_title ?? null; $chartHouseSystemCode = $house_system_code ?? null; $chartHouseSystemLabel = $house_system_label ?? null; $chartHouseSystemText = $chartHouseSystemLabel ?? $chartHouseSystemCode ?? ''; // Ortak satır: "Harita Adı - Ev Sistemi" $tooltipChartLine = ''; if ($chartTitleForTooltip || $chartHouseSystemText) { $tooltipChartLine = trim( ($chartTitleForTooltip ?? '') . ($chartHouseSystemText ? ' - ' . $chartHouseSystemText : '') ); } // ✅ İki harita üst üste (transit veya ilişki): gezegen tooltip'inde sadece o gezegenin harita adı $tooltipChartLineInner = $tooltipChartLine; $tooltipChartLineTransit = ''; $hasOverlay = !empty($transitOverlayPlanetData) || !empty($relationshipOverlayPlanetData); if ($hasOverlay && $chartTitleForTooltip && str_contains((string) $chartTitleForTooltip, ' + ')) { $parts = explode(' + ', $chartTitleForTooltip, 2); $innerTitle = trim($parts[0]); $outerTitle = trim($parts[1] ?? 'Transit'); $tooltipChartLineInner = trim($innerTitle . ($chartHouseSystemText ? ' - ' . $chartHouseSystemText : '')); $tooltipChartLineTransit = trim($outerTitle . ($chartHouseSystemText ? ' - ' . $chartHouseSystemText : '')); } // ✅ EKLE: Gizlenip açılacak nesnelerin listesi (Uranyenler, Sabit Yıldızlar, Asteroidler, Arap Noktaları + chart'a eklenen custom points) $extractCustomExtraKeys = static function (array $rows): array { $keys = []; foreach ($rows as $row) { if (!empty($row['is_extra']) && !empty($row['key'])) { $keys[] = (string) $row['key']; } } return $keys; }; $customExtraKeys = array_values(array_unique(array_merge( $extractCustomExtraKeys((array) ($planetData ?? [])), $extractCustomExtraKeys((array) ($relationshipOverlayPlanetData ?? [])), $extractCustomExtraKeys((array) ($transitOverlayPlanetData ?? [])) ))); $uranianBaseKeys = ['Cupido', 'Hades', 'Zeus', 'Kronos', 'Apollon', 'Admetos', 'Vulkanus', 'Poseidon']; $baseExtraObjects = [ 'Hades', 'Zeus', 'Kronos', 'Apollon', 'Admetos', 'Vulkanus', 'Poseidon', 'Sirius', 'Antares', 'Aldebaran', 'Regulus', 'Spica', 'Algol', 'Vega', 'Fomalhaut', 'Ceres', 'Pallas', 'Juno', 'Vesta', 'Cupido', ]; // Uranyen doğum haritasında uranyen noktalar ana katmanda görünür kalmalı; // extra toggle sadece yıldız/asteroid benzeri objeleri etkilemeli. if (!empty($isUranianNatal) || !empty($isUranianDial)) { $baseExtraObjects = array_values(array_diff($baseExtraObjects, $uranianBaseKeys)); } $extraObjectsList = array_values(array_unique(array_merge( $baseExtraObjects, $extra_object_keys ?? [], $customExtraKeys ))); @endphp @if ($overlayType === 'relationship' && $ownerA && $ownerB) {{ $ownerA['label'] }} {{ $ownerB['label'] }} @endif @if (!empty($outerRing) && !empty($outerRing['r'])) @foreach ($outerRing['degreeLines'] as $tick) @endforeach @endif {{-- ─────────────────────────────────────────────────────────────────── YILLIK DOLUNAY & YENİ AY HALKA — lunar_phases harita türü için Astro-Seek dış halkası: tek yarıçaplı halka (dış çemberin İÇİNDE), her marker zodyak boylamında; çakışanlar açısal olarak yan yana açılır (konumlar IndexController::layoutLunarPhasesRing içinde hesaplanır). Markerlar icons klasöründeki ay görselleridir; üzerine görselin rengine göre okunabilir renkte sıra numarası yazılır. ──────────────────────────────────────────────────────────────────── --}} @if (!empty($lunarPhasesRing)) @php // type + eclipse → [ikon dosyası, sıra numarası metin rengi] // Renkler ikon görselinin baskın rengine göre okunabilir seçildi: // Yeni Ay (lacivert) → beyaz metin // Dolunay (açık gri) → koyu metin // Yeni Ay tut. (koyu zeytin) → açık altın metin // Dolunay tut. (açık şeftali) → koyu metin $lpIcons = [ 'new_moon' => [ 'normal' => ['icon' => '/assets/icons/transits_new_moon.png', 'text' => '#ffffff'], 'eclipse' => ['icon' => '/assets/icons/transits_new_moon_eclipse.png', 'text' => '#fff4cf'], ], 'full_moon' => [ 'normal' => ['icon' => '/assets/icons/transits_full_moon.png', 'text' => '#1c1c22'], 'eclipse' => ['icon' => '/assets/icons/transits_full_moon_eclipse.png', 'text' => '#2a1404'], ], ]; $lpIconSize = 32.0; // px (çap) — Astro-Seek benzeri büyük ikon @endphp @foreach ($lunarPhasesRing as $phase) @php if (!empty($isPreNatal) && empty($phase['eclipse'])) { continue; } $lpType = $phase['type'] ?? 'full_moon'; $lpIsNew = ($lpType === 'new_moon'); $lpIsEclipse = !empty($phase['eclipse']); $lpIdx = (int) ($phase['ring_index'] ?? ($loop->index + 1)); $lpMeta = $lpIcons[$lpType][$lpIsEclipse ? 'eclipse' : 'normal']; $lpIcon = $lpMeta['icon']; $lpTxtFill = $lpMeta['text']; $lpX = (float) ($phase['ring_x'] ?? 0); $lpY = (float) ($phase['ring_y'] ?? 0); $lpTx = (float) ($phase['tick_x'] ?? $lpX); $lpTy = (float) ($phase['tick_y'] ?? $lpY); if ($lpIsEclipse) { $lpTypeLabel = $lpIsNew ? 'Güneş Tutulması' : 'Ay Tutulması'; } else { $lpTypeLabel = $lpIsNew ? 'Yeni Ay' : 'Dolunay'; } $lpLabel = '#' . $lpIdx . ' ' . $lpTypeLabel . ' — ' . ($phase['date'] ?? '') . ' ' . ($phase['time'] ?? ''); @endphp {{-- Dış çemberdeki gerçek boylamdan marker'a ince hizalama çizgisi --}} {{ $lpLabel }} {{ $lpIdx }} @endforeach @endif {{-- ─────────────────────────────────────────────────────────────────── --}} @if (empty($isUranianNatal) && empty($isUranianDial)) @endif {{-- Arka plan --}} @if (!empty($relationshipOverlayPlanetData)) {{-- ilişki: A mavi --}} @if (!empty($zodiacSlices)) @foreach ($zodiacSlices as $s) @endforeach @endif {{-- ilişki: B pembe --}} @if (!empty($relationshipZodiacSlices)) @foreach ($relationshipZodiacSlices as $s) @endforeach @endif {{-- ✅ ÇOKLU HARİTA: C yeşil / D turuncu arkaplan (sadece 3-4 kişide dolu) --}} @if (!empty($relationshipZodiacSlicesC)) @foreach ($relationshipZodiacSlicesC as $s) @endforeach @endif @if (!empty($relationshipZodiacSlicesD)) @foreach ($relationshipZodiacSlicesD as $s) @endforeach @endif @else {{-- tekli harita: sadece zodiacSlices varsa boya --}} @if (!empty($zodiacSlices)) @foreach ($zodiacSlices as $s) @endforeach @endif @endif @if (empty($isCustomGraphics)) @endif {{-- ✅ TRANSIT DEGREE TICKS (burçların olduğu ringde) --}} @if (!empty($transitDegreeLines)) @foreach ($transitDegreeLines as $tick) @endforeach @endif {{-- ✅ RELATIONSHIP DEGREE TICKS (2. derece halkası) --}} {{-- @if (!empty($relationshipDegreeLines)) @foreach ($relationshipDegreeLines as $tick) @endforeach @endif --}} {{-- ✅ TRADITIONAL / HORARY CHART MODE: Terms (Bounds) Ring --}} {{-- Sidereal haritada Terms halkası gösterilmez --}} @if ((!empty($isTraditional) || !empty($isHorary)) && !empty($traditionalPlanetRing) && empty($relationshipOverlayPlanetData)) @php $trData = $traditionalPlanetRing; @endphp {{-- 1) Terimlerin olduğu halkayı hafif bir renkle belirginleştir (Opsiyonel) --}} {{-- Halkanın sınır çizgileri --}} {{-- --}} {{-- 2) Bölücü Çizgiler ve Semboller --}} @foreach ($trData['terms'] as $term) {{-- Bölücü Çizgi --}} {{-- Yönetici Gezegen Sembolü --}} {{ $term['sym'] }} @endforeach @endif {{-- ✅ PROFECTION MODE: Dodecatemoria (Mikro-Zodyak) Ring --}} {{-- Transit modu yoksa, dodecatemoria burada render edilir (iç halka) --}} {{-- Sidereal ve Heliocentric haritada Dodecatemoria gösterilmez --}} @if (!empty($dodecatemoriaRing) && empty($relationshipOverlayPlanetData) && empty($transitOverlayPlanetData) && empty($isSidereal) && empty($isHeliocentric)) @php $dodecData = $dodecatemoriaRing; @endphp {{-- Halka sınır çizgileri --}} {{-- Bölücü Çizgiler ve Burç Sembolleri --}} @foreach ($dodecData['segments'] as $segment) {{-- Bölücü Çizgi --}} {{-- Mikro-Zodyak Burç Sembolü --}} {{ $segment['sym'] }} @endforeach @endif @foreach ($zodiacData as $zodiac) @if (empty($isCustomGraphics)) @endif {{-- ✅ Custom Graphics stilinde sabit 30°-aralıklı burç sembolü metni gösterilmez; yerini aynı halka bandındaki 12 ev-cusp'a özel "derece burç dakika" etiketleri alır. --}} @if (empty($isCustomGraphics)) {{ $zodiac['label'] ?? '' }} {!! $zodiac['name'] !!} @endif @endforeach @if (empty($isCustomGraphics)) @endif @foreach ($degreeLines as $tick) @endforeach {{-- ✅ URANYEN DOĞUM HARİTASI: dış etiket bandı — açı cetvelinin ($r_dis) DIŞINDA, halka/çember çizgisi OLMADAN. Referans stile yakınlık için tüm görünür noktalar dış bantta küçük etiketle gösterilir; her etiket gerçek konuma ince bir çizgiyle bağlanır. --}} @if (!empty($isUranianNatal) && !empty($microOuterLabels)) @foreach ($microOuterLabels as $micro) @php $microFont = !empty($micro['plain']) ? "-apple-system,'Segoe UI',sans-serif" : "'HamburgSymbols', sans-serif"; $microRot = (float) ($micro['rotate'] ?? 0.0); @endphp {{ sprintf('%02d°', $micro['line_2_degree']) }} {!! $micro['sym'] !!} {!! $micro['line_3_sign'] !!} {{ sprintf('%02d\'', $micro['line_4_min']) }}@if ($micro['is_retro']) R@endif @endforeach @endif {{-- Heliocentric'te ev çizgileri gösterilmez --}} {{-- ASC/MC/DSC/IC çizgileri: Her zaman göster --}} {{-- Doğum saati bilinmiyorsa ev/eksen çizgileri gösterilmez (saat olmadan anlamsız) --}} @if (empty($isHeliocentric) && empty($is_time_unknown)) @foreach ($houseLines as $line) @endforeach @endif {{-- Modal açıkken haritanın en dışında ASC/MC/DSC/IC etiketleri (derece + burç, alt alta) --}} @if (!empty($modalAxisLabels) && empty($is_time_unknown) && empty($isCustomGraphics)) @foreach ($modalAxisLabels as $lab) @if (!empty($lab['text'])) {{ $lab['text'] }} @endif {{ $lab['deg_formatted'] ?? '' }} {!! $lab['sign_sym'] ?? '' !!} @endforeach @endif {{-- ✅ Custom Graphics stili: mevcut burç halkasının (r_cetvel..r_dis) TAM İÇİNDE, 12 ev cuspunun HER BİRİNDE tek satırda "derece [burç sembolü] dakika" etiketi. Ayrı/dış bir halka OLUŞTURMAZ — sabit burç sembolü ringinin yerini alır, bu yüzden burç halkasının hemen dibinde boş bant kalmaz. --}} @if (!empty($houseCuspOuterLabels) && empty($is_time_unknown)) @foreach ($houseCuspOuterLabels as $lab) {{ $lab['deg_only'] ?? '' }} {!! $lab['sign_sym'] ?? '' !!} {{ $lab['min_only'] ?? '' }} @endforeach @endif {{-- ✅ Ana harita ASC/MC yazıları (çizgi ucunda) --}} {{-- @if (!empty($axisLabels)) @foreach ($axisLabels as $a) {{ $a['text'] }} @endforeach @endif --}} {{-- ✅ İç harita ASC/MC yazıları --}} {{-- @if (!empty($axisLabels)) @foreach ($axisLabels as $lab) {{ $lab['text'] }} @endforeach @endif --}} {{-- ✅ ASPECT LINES --}} @if (!empty($relationshipOverlayPlanetData)) {{-- ✅ Kişi B (dış) aspect çizgileri --}} @foreach ($relationshipAspectLinesB as $aspect) @php $p1Key = $aspect['p1_key'] ?? null; $p2Key = $aspect['p2_key'] ?? null; $extraKeys = array_values(array_unique(array_filter(array_merge( (array) ($aspect['extra_keys'] ?? []), [in_array($p1Key, $extraObjectsList, true) ? $p1Key : null], [in_array($p2Key, $extraObjectsList, true) ? $p2Key : null] )))); $isExtraLine = !empty($extraKeys); @endphp @endforeach {{-- ✅ Kişi A (iç) aspect çizgileri --}} @foreach ($relationshipAspectLinesA as $aspect) @php $p1Key = $aspect['p1_key'] ?? null; $p2Key = $aspect['p2_key'] ?? null; $extraKeys = array_values(array_unique(array_filter(array_merge( (array) ($aspect['extra_keys'] ?? []), [in_array($p1Key, $extraObjectsList, true) ? $p1Key : null], [in_array($p2Key, $extraObjectsList, true) ? $p2Key : null] )))); $isExtraLine = !empty($extraKeys); @endphp @endforeach @elseif (!empty($showAspectSymbols)) {{-- ✅ Açı sembolleri (natal custom graphics VEYA diğer tek kişilik haritalar): ince düz çizgi + ortada açı sembolü (☌ ⚹ □ △ ☍) --}} @foreach ($customGraphicsAspectLines as $aspect) @php $p1Key = $aspect['p1_key'] ?? null; $p2Key = $aspect['p2_key'] ?? null; $extraKeys = array_values(array_unique(array_filter(array_merge( (array) ($aspect['extra_keys'] ?? []), [in_array($p1Key, $extraObjectsList, true) ? $p1Key : null], [in_array($p2Key, $extraObjectsList, true) ? $p2Key : null] )))); $isExtraLine = !empty($extraKeys); $aspectName = (string) ($aspect['aspect_name'] ?? ''); $symbolFontSize = '20px'; $symbolFontWeight = '850'; $symbolStrokeWidth = '3.2px'; if ($aspectName === 'square') { $symbolFontSize = '28px'; $symbolFontWeight = '900'; $symbolStrokeWidth = '3.2px'; } elseif ($aspectName === 'opposition') { $symbolFontSize = '28px'; $symbolFontWeight = '900'; $symbolStrokeWidth = '3.4px'; } elseif ($aspectName === 'conjunction') { $symbolFontSize = '25px'; $symbolFontWeight = '900'; $symbolStrokeWidth = '3.3px'; } @endphp {{ $aspect['symbol'] }} @endforeach @else {{-- ✅ Tekli harita (mevcut davranış: kırmızı/mavi) --}} @foreach ($aspectLines as $aspect) @php $p1Key = $aspect['p1_key'] ?? null; $p2Key = $aspect['p2_key'] ?? null; $extraKeys = array_values(array_unique(array_filter(array_merge( (array) ($aspect['extra_keys'] ?? []), [in_array($p1Key, $extraObjectsList, true) ? $p1Key : null], [in_array($p2Key, $extraObjectsList, true) ? $p2Key : null] )))); $isExtraLine = !empty($extraKeys); @endphp @endforeach @endif {{-- Heliocentric'te ev numaraları gösterilmez --}} {{-- Doğum saati bilinmiyorsa ev numaraları da gösterilmez --}} @if (empty($isHeliocentric) && empty($is_time_unknown)) @foreach ($houseNumbers as $num) {{ $num['num'] }} @endforeach @endif {{-- ✅ AY YAYI: Doğum saati bilinmiyorsa Ay'ın gün boyu (00:00–23:59) hareketi --}} @if (!empty($is_time_unknown) && !empty($moon_arc)) @foreach ($moon_arc['ticks'] as $tick) @endforeach @foreach ($moon_arc['labels'] as $lab) {{ $lab['text'] }} @endforeach @endif {{-- Ev Giriş Dereceleri --}} {{-- @foreach ($houseLabels as $label) {{ $label['text_deg'] }} {{ $label['text_min'] }} @endforeach --}} @if (empty($relationshipOverlayPlanetData)) @foreach ($planetData as $planet) {{-- ✅ Doğum saati bilinmiyorsa ASC/DSC/MC/IC noktalarını (tick + yazı) hiç gösterme --}} @if (!empty($is_time_unknown) && in_array($planet['line_1_planet'] ?? '', ['ASC', 'DSC', 'MC', 'IC'])) @continue @endif {{-- Kılavuz Çizgi (Metnin altındaki çizgi) --}} {{-- @if (isset($planet['guide_line'])) @endif --}} {{-- ✅ Dış kısa kalın tick --}} {{-- {{ $planet['color'] }} --}} {{-- ✅ Dış kısa kalın tick (Sadece ANA GEZEGENLER için) --}} {{-- Astroidleri ve Extra nesneleri buradan hariç tutuyoruz --}} {{-- ✅ 1. Ana Gezegenler (Astroid ve Extra/Yıldız olmayanlar) --}} {{-- ============================================================ --}} {{-- DERECE ÇİZGİLERİ (TICK LINES) - 3 FARKLI GRUP --}} {{-- ============================================================ --}} {{-- 1. GRUP: ANA GEZEGENLER (Asteroid DEĞİL, Extra DEĞİL, ASC/MC/DSC/IC DEĞİL - onlar 4. grupta) --}} @php $isFixedAxis = in_array($planet['line_1_planet'] ?? '', ['ASC', 'DSC', 'MC', 'IC']); @endphp @if (isset($planet['degree_tick']) && empty($planet['is_asteroid']) && empty($planet['is_extra']) && !$isFixedAxis && empty($isCustomGraphics)) @endif {{-- 4. GRUP: ASC/MC/DSC/IC tick - her zaman göster --}} @if (isset($planet['degree_tick']) && $isFixedAxis && empty($isCustomGraphics)) @endif {{-- 2. GRUP: ASTROIDLER --}} {{-- (Sadece is_asteroid olanlar) --}} @if (isset($planet['degree_tick']) && !empty($planet['is_asteroid']) && empty($isCustomGraphics)) @endif {{-- 3. GRUP: SABİT YILDIZLAR VE URANYENLER (EXTRA) --}} {{-- (is_extra olanlar. Panelden gizlenip açılabilmeleri için class ekledik) --}} @if (isset($planet['degree_tick']) && !empty($planet['is_extra']) && empty($planet['is_asteroid']) && empty($isCustomGraphics)) @endif {{-- Bağlantı Çizgisi (İçeriden dışarıya kesik çizgi) --}} @if (isset($planet['link_line']) && $planet['draw_link_line']) @endif {{-- İsteğe bağlı: Gezegenin gerçek konumuna küçük bir nokta koyalım --}} {{-- @if (isset($planet['inner_point'])) @endif --}} {{-- TEK METİN BLOKU --}} @if (isset($planet['text_pos'])) @php $isFixedPoint = in_array($planet['line_1_planet'], ['ASC', 'DSC', 'MC', 'IC']); // ✅ YILDIZ KONTROLÜ // is_star flag'i ChartVisualizerService'den gelmeli. // Gelmiyorsa manuel kontrol ekle: $starList = [ 'Aldebaran', 'Algol', 'Antares', 'Regulus', 'Sirius', 'Spica', 'Vega', 'Fomalhaut', // 'Betelgeuse', ]; $isStar = !empty($planet['is_star']) || in_array($planet['key'] ?? '', $starList); if ($isFixedPoint) { // ASC ve MC her zaman düz (0 derece) $rot = 0; $dyVal = '0.em'; // Tek satır olduğu için dikey ortala } else { // 1. Temel Dönüş Açısı (Çembere dik olması için +90) $angle = $planet['text_pos']['rotate']; $rot = $angle + 90; // 2. Açıyı 0-360 aralığına normalize et (Kontrol yapabilmek için) $checkRot = fmod($rot, 360); if ($checkRot < 0) { $checkRot += 360; } // Ana metin +90 dönmüşse, harfleri -90 döndürürsek dik dururlar. $counterRot = -$rot; // 3. OKUNABİLİRLİK KONTROLÜ: // Eğer açı 90 ile 270 arasındaysa metin baş aşağıdır (Ters durur). // Bu durumda metni 180 derece çevirerek düzeltiriz. // if ($checkRot > 90 && $checkRot < 270) { // $rot += 180; // } // Gezegenler için dikey öteleme (4 satır olduğu için yukarı al) $dyVal = '-1.2em'; } // ✅ FONT SEÇİMİ // Yıldızlar için 'Segoe UI' veya 'Arial' kullan, diğerleri için sembol fontu. $symbolFont = $isFixedPoint || $isStar ? "'Segoe UI', sans-serif" : "'HamburgSymbols', sans-serif"; $symbolSize = $isFixedPoint ? '14px' : ($isStar ? '24px' : '26px'); // Yıldız biraz büyük olsun @endphp {{-- stroke: #f4f6f8; --}} @php // Transit chart mı? (outerRing doluysa transit) $isTransitChart = !empty($outerRing) || !empty($transitOverlayPlanetData); // Boşlukları duruma göre ayarla $dyLine1 = $isTransitChart ? '-1.4em' : '-2em'; // 1. satır (sembol) @endphp @php $isToggleExtra = !empty($planet['is_extra']) || !empty($planet['is_asteroid']); // ✅ Yıldızlar eklendiğinde kullanılacak pozisyon bilgileri $posWithExtras = $planet['text_pos_with_extras'] ?? $planet['text_pos']; $rotWithExtras = ($posWithExtras['rotate'] ?? $planet['text_pos']['rotate']) + 90; // ✅ Hangi extra objelerle çakışıyor? $conflictingExtras = $planet['conflicting_extras'] ?? []; @endphp @php // ✅ ASTRO-SEEK TARZI YERLEŞİM (sıfırdan): // Etiket döndürülmez; 4 parça gezegenin açısı boyunca kademeli // yarıçaplara dizilir, her parça DİK durur. $cx = 400; $cy = 400; $ax = $planet['text_pos']['x']; $ay = $planet['text_pos']['y']; $theta = atan2($ay - $cy, $ax - $cx); // gezegenin açısı (radyan) // Kademeli yarıçaplar (glif ile çentik arasında ~10px boşluk). // ✅ Transit/ilişki gibi modlarda iç harita küçüldüğünde gezegen // glifleri de otomatik içe kaymalı. Bu yüzden sabit piksel yerine, // moda göre ölçeklenen gerçek halka geometrisine (r_orta..r_cetvel) // bağlı bir bant kullanıyoruz. Natal-only modda (r_orta=160, // r_cetvel=330) eski değerleri birebir üretir. $rOrtaBase = isset($r_orta) ? (float) $r_orta : 160.0; $rCetvelBase = isset($r_cetvel) ? (float) $r_cetvel : 330.0; $bandSpan = max(1.0, $rCetvelBase - $rOrtaBase); // varsayılan 170 $bandScale = $bandSpan / 170.0; $rGlyph = $rOrtaBase + 123 * $bandScale; // glif (en dış) // Satırlar arası boşluğu hafif artır (özellikle derece/burç/dakika okunurluğu için) $labelSpacingBoost = 2.0 * $bandScale; $rDeg = $rOrtaBase + 91 * $bandScale - $labelSpacingBoost; // derece $rSign = $rOrtaBase + 66 * $bandScale - (2.0 * $labelSpacingBoost); // burç glifi $rMin = $rOrtaBase + 43 * $bandScale - (2.8 * $labelSpacingBoost); // dakika (en iç) // Gezegen gliflerini büyüt, ancak halka sınırlarını taşırma. // 1) Dış sınır (cetvel halkası) ile glif merkezi arasındaki mesafe // 2) Glif satırı ile derece satırı arasındaki mesafe // üzerinden güvenli bir maksimum font boyutu hesaplanır. $outerGap = max(8.0, $rCetvelBase - $rGlyph - 2.0); $gapToDegree = max(8.0, $rGlyph - $rDeg - 8.0); $maxGlyphByGeometry = max(20.0, min($outerGap * 2.0, $gapToDegree * 2.0)); $planetGlyphTarget = 30.0; // önceki 26px'ten bilinçli büyütme $starGlyphTarget = 22.0; // yıldız metin glifi de bir miktar büyüsün $glyphSizePx = $isStar ? max(18.0, min($maxGlyphByGeometry, $starGlyphTarget)) : max(22.0, min($maxGlyphByGeometry, $planetGlyphTarget)); // Glif büyüdüğünde eşlik eden derece/dakika/burç etiketleri de // orantılı büyüsün; fakat okunurluk ve çakışma için üst sınırlı kalsın. $growth = max(0.0, $glyphSizePx - 26.0); $degreeSizePx = max(14.8, min(18.0, 14.8 + ($growth * 0.60))); $signSizePx = max(16.8, min(20.4, 16.8 + ($growth * 0.65))); $minuteSizePx = max(13.6, min(16.2, 13.6 + ($growth * 0.45))); $gx = $cx + $rGlyph * cos($theta); $gy = $cy + $rGlyph * sin($theta); $degX = $cx + $rDeg * cos($theta); $degY = $cy + $rDeg * sin($theta); $signX = $cx + $rSign * cos($theta); $signY = $cy + $rSign * sin($theta); $minX = $cx + $rMin * cos($theta); $minY = $cy + $rMin * sin($theta); // Extra'larla çakışma kayması (panel.js grubu translate ile uygular) $shiftX = ($posWithExtras['x'] ?? $ax) - $ax; $shiftY = ($posWithExtras['y'] ?? $ay) - $ay; // Tooltip metni $tipName = trim($planet['name'] ?? ($planet['key'] ?? '')); $tipDeg = trim((string) ($planet['line_2_degree'] ?? '')); $tipMin = trim((string) ($planet['line_4_min'] ?? "00'")); $tipSign = trim((string) ($planet['sign_name'] ?? '')); $tipRetro = !empty($planet['is_retro']) ? 'Retro' : ''; $tipHouse = $planet['house'] ?? null; $ownerName = $planet['owner_name'] ?? ''; $tipText = $tipName . "\n" . ($tipDeg ? "{$tipDeg} {$tipMin}" : '') . ($tipSign ? "\n{$tipSign}" : '') . ($tipRetro ? "\n{$tipRetro}" : '') . ($tipHouse ? "\n{$tipHouse}. Ev" : '') . ($tooltipChartLineInner ? "\n{$tooltipChartLineInner}" : '') . ($ownerName ? "\n{$ownerName}" : ''); // Glif fontu: yıldızlar ve 'plain' noktalar (HamburgSymbols'ta // glifi olmayan, çok harfli kısaltmalar — ör. genişletilmiş // asteroid kataloğu) düz metin fontuyla, gezegenler sembol fontuyla. $isPlainSymbol = !empty($planet['is_plain']); $glyphFont = ($isStar || $isPlainSymbol) ? "'Segoe UI', sans-serif" : "'HamburgSymbols', sans-serif"; $glyphSize = $isPlainSymbol ? '11px' : (number_format($glyphSizePx, 1, '.', '') . 'px'); $degreeSize = number_format($degreeSizePx, 1, '.', '') . 'px'; $signSize = number_format($signSizePx, 1, '.', '') . 'px'; $minuteSize = number_format($minuteSizePx, 1, '.', '') . 'px'; @endphp @if ($isFixedPoint) {{-- ASC/DSC/MC/IC: tek satır, dik --}} {{-- ✅ Custom Graphics stilinde ASC/DSC/MC/IC yazıları hiç gösterilmez (haritanın en dışındaki 12 ev-cusp derece etiketleri onların yerini alır) --}} @if (empty($isCustomGraphics)) {{ $tipText }}{!! $planet['line_1_planet'] !!} @endif @else {{-- ✅ ASTRO-SEEK TARZI: 4 dik parça, açı boyunca kademeli yarıçaplarda --}} {{-- data-visual-deg / data-min-spacing: panel.js'in ekstralar açıkken görünür öğeleri (normal + işaretli extra) backend spreadAngles() portuyla BİRLİKTE yeniden dağıtabilmesi için gerçek görsel açı + taban boşluk değeri. --}} {{ $tipText }} {{-- Glif (en dış) + Retro R --}} {{-- ✅ 'plain' noktalar (HamburgSymbols'ta glifi olmayan çok harfli kısaltmalar — astro-seek.com'un genişletilmiş asteroid kataloğu) astro-seek'in kendi haritasındaki gibi düz, sade metin olarak çizilir (rozet/arka plan yok — astro-seek de kendi radix görselinde "Cere", "Vest" gibi salt kelime kullanıyor, özel bir asteroid sembolü yok). --}} {!! $planet['line_1_planet'] !!}@if (!empty($planet['is_retro']))R@endif {{-- Derece --}} {{ intval($planet['line_2_degree']) }}° {{-- Burç --}} {!! $planet['line_3_sign'] !!} {{-- Dakika (en iç) --}} {{ $planet['line_4_min'] ?? "00'" }} @endif @endif @endforeach @endif {{-- ========================================================================== --}} {{-- ✅ İLİŞKİ ANALİZİ MODU (RELATIONSHIP MODE) --}} {{-- ========================================================================== --}} @if (!empty($relationshipOverlayPlanetData)) {{-- ✅ KİŞİ B - EV ÇİZGİLERİ (pembe) --}} @if (!empty($relationshipHouseLines)) @foreach ($relationshipHouseLines as $line) @endforeach @endif {{-- ✅ Dış harita (Kişi B) ev numaraları 1..12 --}} @php $__fsB = $relationshipOverlayFontScaleB ?? 1.0; @endphp @if (!empty($relationshipHouseNumbers)) @foreach ($relationshipHouseNumbers as $n) {{ $n['num'] }} @endforeach @endif {{-- ✅ Dış harita (Kişi B) ASC/MC yazıları --}} {{-- ✅ Doğum saati bilinmiyorsa ASC/DSC/MC/IC yazıları gösterilmez --}} @if (!empty($relationshipAxisLabels) && empty($is_time_unknown)) @foreach ($relationshipAxisLabels as $lab) {{ $lab['text'] }} @endforeach @endif {{-- 1. AYIRICI ÇEMBER (Pembe Kesikli Çizgi) --}} {{-- Bu çember iki kişi arasında sınır görevi görür --}} @if (!empty($relationshipRing)) @endif {{-- 2. KİŞİ A (İÇERİDEKİLER - Standart Gezegenler) --}} {{-- Bu döngü senin gönderdiğin detaylı görünümü kullanır (Dakika, Burç dahil) --}} @foreach ($planetData as $planet) @if (isset($planet['text_pos'])) @php $angle = $planet['text_pos']['rotate']; // Kişi A içeride olduğu için rotasyon standardı korunur $rot = $angle + 90; // Sabit noktalar (ASC/DSC/MC/IC) için özel ayar $isFixedPoint = in_array($planet['line_1_planet'], ['ASC', 'DSC', 'MC', 'IC']); $dyLine1 = '-2em'; if ($isFixedPoint) { $rot = 0; $dyLine1 = '0'; } @endphp @php $isToggleExtra = !empty($planet['is_extra']) || !empty($planet['is_asteroid']); // ✅ Yıldızlar eklendiğinde kullanılacak pozisyon bilgileri $posWithExtras = $planet['text_pos_with_extras'] ?? $planet['text_pos']; $rotWithExtras = ($posWithExtras['rotate'] ?? $planet['text_pos']['rotate']) + 90; // ✅ Hangi extra objelerle çakışıyor? $conflictingExtras = $planet['conflicting_extras'] ?? []; @endphp {{-- Tooltip: tüm bilgiler (iç halka / relationship A) — sadece bu haritanın adı --}} @php $tipName = trim($planet['name'] ?? ($planet['key'] ?? '')); $tipDeg = trim((string) ($planet['line_2_degree'] ?? '')); $ownerName = $planet['owner_name'] ?? ''; $tipMin = trim((string) ($planet['line_4_min'] ?? "00'")); $tipSign = trim((string) ($planet['sign_name'] ?? '')); $tipRetro = !empty($planet['is_retro']) ? 'Retro' : ''; $tipHouse = $planet['house'] ?? null; $tipText = $tipName . "\n" . ($tipDeg ? "{$tipDeg} {$tipMin}" : '') . ($tipSign ? "\n{$tipSign}" : '') . ($tipRetro ? "\n{$tipRetro}" : '') . ($tipHouse ? "\n{$tipHouse}. Ev" : '') . ($tipHouse && $tooltipChartLineInner ? "\n{$tooltipChartLineInner}" : ($tooltipChartLineInner ? "\n{$tooltipChartLineInner}" : '')) . ($ownerName ? "\n{$ownerName}" : ''); @endphp {{ $tipText }} {{-- 1. SATIR: SEMBOL --}} {!! $planet['line_1_planet'] !!} @if (isset($planet['is_retro']) && $planet['is_retro']) R ​ @endif {{-- DİĞER SATIRLAR (Sabit noktalar değilse) --}} @if (!$isFixedPoint) {{-- 2. SATIR: DERECE --}} {{ intval($planet['line_2_degree']) }}° @endif @endif @endforeach {{-- 3. KİŞİ B (DIŞARIDAKİLER - Overlay Gezegenler) --}} {{-- Bu döngü sadeleştirilmiş görünümü kullanır (Sadece Derece ve Sembol) --}} @foreach ($relationshipOverlayPlanetData as $planet) {{-- Tick Çizgisi --}} {{-- @if (isset($planet['degree_tick_overlay'])) @endif --}} @if (isset($planet['text_pos'])) @php $angle = $planet['text_pos']['rotate']; $rot = $angle + 90; // ✅ EKLE: Yıldız Kontrolü (sunucudan gelen is_extra flag'ini kullan) $pKey = $planet['key'] ?? $planet['name']; $isExtra = !empty($planet['is_extra']) || in_array($pKey, $extraObjectsList); // Extra ise gizleme sınıfını ekle $extraClass = ($isExtra || !empty($planet['is_asteroid'])) ? 'extra-item extra-hidden' : ''; $asteroidClass = !empty($planet['is_asteroid']) ? 'asteroid-item' : ''; $isFixedPoint = in_array($planet['line_1_planet'], ['ASC', 'MC']); // ✅ Yıldızlar eklendiğinde kullanılacak pozisyon bilgileri $posWithExtras = $planet['text_pos_with_extras'] ?? $planet['text_pos']; $rotWithExtras = ($posWithExtras['rotate'] ?? $planet['text_pos']['rotate']) + 90; // ✅ Hangi extra objelerle çakışıyor? $conflictingExtras = $planet['conflicting_extras'] ?? []; @endphp {{-- Tooltip: tüm bilgiler (dış halka) — harita adı tek kez (chartLineOuter veya ownerName) --}} @php $tipName = trim($planet['name'] ?? ($planet['key'] ?? '')); $tipDeg = trim((string) ($planet['line_2_degree'] ?? '')); $ownerName = $planet['owner_name'] ?? 'Partner'; $tipMin = trim((string) ($planet['line_4_min'] ?? "00'")); $tipSign = trim((string) ($planet['sign_name'] ?? '')); $tipRetro = !empty($planet['is_retro']) ? 'Retro' : ''; $tipHouse = $planet['house'] ?? null; $chartLineOuter = $tooltipChartLineTransit ?: $tooltipChartLine; // Harita adını tek satırda göster (chartLineOuter ile ownerName aynı şeyi veriyordu, tekrara düşmemek için) $chartNameLine = $chartLineOuter ?: ($ownerName ?: ''); $tipText = $tipName . "\n" . ($tipDeg ? "{$tipDeg} {$tipMin}" : '') . ($tipSign ? "\n{$tipSign}" : '') . ($tipRetro ? "\n{$tipRetro}" : '') . ($tipHouse ? "\n{$tipHouse}. Ev" : '') . ($chartNameLine ? "\n{$chartNameLine}" : ''); @endphp {{ $tipText }} {{-- 1. SATIR (ÜST): SEMBOL --}} {{-- dy="-0.5em" ile hafif yukarı alarak ilk satır yapıyoruz --}} {!! $planet['line_1_planet'] !!} @if (isset($planet['is_retro']) && $planet['is_retro']) R ​ @endif {{-- 2. SATIR (ALT): DERECE --}} {{-- dy="1.1em" ile sembolün altına indiriyoruz --}} @if (!$isFixedPoint) {{-- 2. SATIR: DERECE --}} {{ intval($planet['line_2_degree']) }}° @endif @endif @endforeach @else @endif {{-- ========================================================================== --}} {{-- ✅ ÇOKLU HARİTA: 3. ve 4. KİŞİ (C, D) HALKALARI --}} {{-- Bu bloklar SADECE 3-4 kişilik çoklu haritada dolu gelir (relationshipOverlayPlanetDataC/D). 2 kişilik ilişki/çoklu harita bu değişkenleri hiç doldurmaz, dolayısıyla burası o durumda render edilmez ve mevcut görünüm birebir korunur. --}} {{-- ========================================================================== --}} @foreach ([ ['planets' => $relationshipOverlayPlanetDataC ?? [], 'lines' => $relationshipHouseLinesC ?? [], 'nums' => $relationshipHouseNumbersC ?? [], 'axis' => $relationshipAxisLabelsC ?? [], 'ring' => $relationshipRingC ?? null, 'color' => $relationshipOverlayColorC ?? '#16a34a', 'scale' => $relationshipOverlayFontScaleC ?? 1.0], ['planets' => $relationshipOverlayPlanetDataD ?? [], 'lines' => $relationshipHouseLinesD ?? [], 'nums' => $relationshipHouseNumbersD ?? [], 'axis' => $relationshipAxisLabelsD ?? [], 'ring' => $relationshipRingD ?? null, 'color' => $relationshipOverlayColorD ?? '#f59e0b', 'scale' => $relationshipOverlayFontScaleD ?? 1.0], ] as $extraPerson) @if (!empty($extraPerson['planets'])) @php $__fsX = $extraPerson['scale']; $__colorX = $extraPerson['color']; @endphp {{-- Ev çizgileri (kişinin kendi rengi, hafif) --}} @if (!empty($extraPerson['lines'])) @foreach ($extraPerson['lines'] as $line) @endforeach @endif {{-- Ev numaraları (B ile aynı boyut) --}} @if (!empty($extraPerson['nums'])) @foreach ($extraPerson['nums'] as $n) {{ $n['num'] }} @endforeach @endif {{-- ASC/DSC/MC/IC yazıları (B ile aynı boyut) --}} @if (!empty($extraPerson['axis']) && empty($is_time_unknown)) @foreach ($extraPerson['axis'] as $lab) {{ $lab['text'] }} @endforeach @endif {{-- Ayırıcı çember (kişinin kendi rengi, kesikli) --}} @if (!empty($extraPerson['ring'])) @endif {{-- Gezegenler (sadeleştirilmiş görünüm: sembol + derece) --}} @foreach ($extraPerson['planets'] as $planet) @if (isset($planet['text_pos'])) @php $angle = $planet['text_pos']['rotate']; $rot = $angle + 90; $pKey = $planet['key'] ?? $planet['name']; $isExtra = !empty($planet['is_extra']) || in_array($pKey, $extraObjectsList); $extraClass = ($isExtra || !empty($planet['is_asteroid'])) ? 'extra-item extra-hidden' : ''; $asteroidClass = !empty($planet['is_asteroid']) ? 'asteroid-item' : ''; $isFixedPoint = in_array($planet['line_1_planet'], ['ASC', 'MC']); $posWithExtras = $planet['text_pos_with_extras'] ?? $planet['text_pos']; $rotWithExtras = ($posWithExtras['rotate'] ?? $planet['text_pos']['rotate']) + 90; $conflictingExtras = $planet['conflicting_extras'] ?? []; $tipName = trim($planet['name'] ?? ($planet['key'] ?? '')); $tipDeg = trim((string) ($planet['line_2_degree'] ?? '')); $ownerName = $planet['owner_name'] ?? ''; $tipMin = trim((string) ($planet['line_4_min'] ?? "00'")); $tipSign = trim((string) ($planet['sign_name'] ?? '')); $tipRetro = !empty($planet['is_retro']) ? 'Retro' : ''; $tipHouse = $planet['house'] ?? null; $tipText = $tipName . "\n" . ($tipDeg ? "{$tipDeg} {$tipMin}" : '') . ($tipSign ? "\n{$tipSign}" : '') . ($tipRetro ? "\n{$tipRetro}" : '') . ($tipHouse ? "\n{$tipHouse}. Ev" : '') . ($ownerName ? "\n{$ownerName}" : ''); @endphp {{ $tipText }} {!! $planet['line_1_planet'] !!} @if (isset($planet['is_retro']) && $planet['is_retro']) R ​ @endif @if (!$isFixedPoint) {{ intval($planet['line_2_degree']) }}° @endif @endif @endforeach @endif @endforeach @if (!empty($transitOverlayPlanetData)) @php // ✅ ÇOKLU HARİTA: Bu turuncu arkaplan halkası eskiden r=368/kalınlık=60 // olarak SABİTLENMİŞTİ (klasik 2 kişilik 330-398 aralığına göre). C/D // bantları haritayı dışa büyüttüğünde gerçek transit halkası (outerRing.r) // artık çok daha dışarıda oluyor ama bu turuncu bant eski yerinde kalıp // B/C/D bantlarının ÜSTÜNE bindiriliyordu. Artık gerçek transit halkasının // (outerRing.r) konumundan TÜRETİLİYOR — 2 kişilik akışta outerRing.r // her zaman 398 kaldığı için bu, eski r=368/kalınlık=60 ile BİREBİR AYNI // sonucu üretir. $__transitBgOuterR = !empty($outerRing['r']) ? (float) $outerRing['r'] : 398.0; $__transitBgThickness = 60.0; // 398 - 338 (eski sabit kalınlık) $__transitBgMidR = $__transitBgOuterR - ($__transitBgThickness / 2); // 2 kişilikte: 398-30=368, eskisiyle birebir aynı @endphp @endif {{-- ✅ TRANSIT OVERLAY (dış bant) --}} @if (!empty($transitOverlayPlanetData)) {{-- ✅ TRANSIT HOUSE LINES (dış bant ev çizgileri) - SADECE 1 KEZ ÇİZ --}} {{-- Heliocentric'te ev çizgileri gösterilmez --}} @if (!empty($transitHouseLines) && empty($isHeliocentric)) @foreach ($transitHouseLines as $l) @endforeach @endif {{-- ✅ Transit dış bant ev numaraları --}} {{-- Heliocentric'te ev numaraları gösterilmez --}} @if (!empty($transitHouseNumbers) && empty($isHeliocentric)) @foreach ($transitHouseNumbers as $n) {{ $n['num'] }} @endforeach @endif {{-- ✅ Transit ASC/MC yazıları --}} {{-- ✅ Doğum saati bilinmiyorsa ASC/DSC/MC/IC yazıları gösterilmez --}} @if (!empty($transitAxisLabels) && empty($is_time_unknown)) @foreach ($transitAxisLabels as $lab) {{ $lab['text'] }} @endforeach @endif @foreach ($transitOverlayPlanetData as $planet) {{-- ✅ transit tick (iç çizgi - transit bantının içinde, astroid gibi) --}} @if (isset($planet['degree_tick_transit'])) @php $pKey = $planet['key'] ?? ($planet['name'] ?? ''); $isToggleExtra = !empty($planet['is_extra']) || !empty($planet['is_asteroid']) || in_array($pKey, $extraObjectsList, true); $tickClass = $isToggleExtra ? 'extra-item extra-hidden' : ''; @endphp @endif {{-- transit text --}} @if (isset($planet['text_pos'])) {{-- @php $angle = $planet['text_pos']['rotate']; $rot = $angle + 90; @endphp --}} @php $angle = $planet['text_pos']['rotate']; // Kişi A içeride olduğu için rotasyon standardı korunur $rot = $angle + 90; // Sabit noktalar (ASC/DSC/MC/IC) için özel ayar $isFixedPoint = in_array($planet['line_1_planet'], ['ASC', 'DSC', 'MC', 'IC']); $dyLine1 = '-2em'; if ($isFixedPoint) { $rot = 0; $dyLine1 = '0'; } // ✅ EKLE: Yıldız Kontrolü (Transit İçin - sunucudan gelen is_extra flag'ini kullan) $pKey = $planet['key'] ?? $planet['name']; // ✅ asteroid de extra gibi toggle edilecek $isToggleExtra = !empty($planet['is_extra']) || !empty($planet['is_asteroid']) || in_array($pKey, $extraObjectsList, true); $extraClass = $isToggleExtra ? 'extra-item extra-hidden' : ''; $asteroidClass = !empty($planet['is_asteroid']) ? 'asteroid-item' : ''; // ✅ Yıldızlar eklendiğinde kullanılacak pozisyon bilgileri $posWithExtras = $planet['text_pos_with_extras'] ?? $planet['text_pos']; $rotWithExtras = ($posWithExtras['rotate'] ?? $planet['text_pos']['rotate']) + 90; // ✅ Hangi extra objelerle çakışıyor? $conflictingExtras = $planet['conflicting_extras'] ?? []; @endphp @php $tipName = trim($planet['name'] ?? ($planet['key'] ?? '')); $tipDeg = trim((string) ($planet['line_2_degree'] ?? '')); $tipMin = trim((string) ($planet['line_4_min'] ?? "00'")); $tipSign = trim((string) ($planet['sign_name'] ?? '')); $tipRetro = !empty($planet['is_retro']) ? 'Retro' : ''; $tipHouse = $planet['house'] ?? null; $chartLineTransit = $tooltipChartLineTransit ?: $tooltipChartLine; $tipText = $tipName . "\n" . ($tipDeg ? "{$tipDeg} {$tipMin}" : '') . ($tipSign ? "\n{$tipSign}" : '') . ($tipRetro ? "\n{$tipRetro}" : '') . ($tipHouse ? "\n{$tipHouse}. Ev" : '') . ($tipHouse && $chartLineTransit ? "\n{$chartLineTransit}" : ($chartLineTransit ? "\n{$chartLineTransit}" : '')); @endphp {{ $tipText }} {{-- ✅ 1) ÜSTTE: Derece + dakika --}} {{ intval($planet['line_2_degree']) }}° {{-- {{ $planet['line_4_min'] ?? "00'" }} --}} {{-- ✅ 2) ALTTA: Gezegen sembolü --}} {!! $planet['line_1_planet'] !!} @if (!empty($planet['is_retro'])) R ​ @endif {{-- {!! $planet['line_3_sign'] !!} --}} {{-- {{ $planet['line_4_min'] ?? "00'" }} --}} @endif @endforeach @endif {{-- ✅ PROFECTION + TRANSIT MODE: Dodecatemoria (Mikro-Zodyak) Ring --}} {{-- Transit modu varsa, dodecatemoria dış kenara taşınır ve transit içeriğinin ÜSTÜNDE render edilir --}} {{-- Sidereal ve Heliocentric haritada Dodecatemoria gösterilmez --}} @if (!empty($dodecatemoriaRing) && !empty($transitOverlayPlanetData) && empty($relationshipOverlayPlanetData) && empty($isSidereal) && empty($isHeliocentric)) @php $dodecData = $dodecatemoriaRing; @endphp {{-- Hafif arka plan bandı (opsiyonel - görsel ayrım için) --}} {{-- Halka sınır çizgileri --}} {{-- Bölücü Çizgiler ve Burç Sembolleri --}} @foreach ($dodecData['segments'] as $segment) {{-- Bölücü Çizgi (Transit modunda daha belirgin) --}} {{-- Mikro-Zodyak Burç Sembolü (Transit modunda biraz daha küçük font) --}} {{ $segment['sym'] }} @endforeach @endif {{-- --}} @endif {{-- ✅ MARKA FİLİGRANI: sol alt köşede logo + www.astrobilge.com. Çoklu haritada (3-4 kişi, multiPersonBandsActive) dış bantlar köşeye taştığı için gösterilmez. Logo base64 gömülür — PNG indirme akışı SVG'yi data URL üzerinden canvas'a çizdiğinden harici href yüklenmez (taint/boş görüntü sorunu), gömülü veri her iki yolda da çalışır. --}} @if (empty($multiPersonBandsActive)) @php // Site logosunun gif olmayan hali (header'daki logo.webp, şeffaf zemin) $__brandLogoFile = public_path('frontend/images/logo/logo.webp'); $__brandLogoData = is_file($__brandLogoFile) ? 'data:image/webp;base64,' . base64_encode(file_get_contents($__brandLogoFile)) : null; $__brandX = round($__svgMinX + 4, 1); $__brandBottomY = round($__svgCy + $__svgRDis - 2, 1); @endphp @if ($__brandLogoData) @endif www.astrobilge.com @endif