{"id":403,"date":"2024-10-10T23:36:49","date_gmt":"2024-10-10T23:36:49","guid":{"rendered":"https:\/\/paragliding-in-madeira.com\/weather\/?page_id=403"},"modified":"2026-05-01T23:46:37","modified_gmt":"2026-05-01T22:46:37","slug":"sun-and-moon","status":"publish","type":"page","link":"https:\/\/paragliding-in-madeira.com\/weather\/sun-and-moon\/","title":{"rendered":"Sun and Sea"},"content":{"rendered":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1222\" height=\"709\" src=\"https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2025\/06\/Sun-moon-sea-flow.png\" alt=\"\" class=\"wp-image-4143\" style=\"width:316px;height:auto\" srcset=\"https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2025\/06\/Sun-moon-sea-flow.png 1222w, https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2025\/06\/Sun-moon-sea-flow-300x174.png 300w, https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2025\/06\/Sun-moon-sea-flow-1024x594.png 1024w, https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2025\/06\/Sun-moon-sea-flow-768x446.png 768w\" sizes=\"auto, (max-width: 1222px) 100vw, 1222px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-a89b3969 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.paragliding-in-madeira.com\/weather\">Home<\/a><\/div>\n\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/paragliding-in-madeira.com\/weather\/weather-info\/\">Weather info<\/a><\/div>\n<\/div>\n\n\n\n<div style=\"text-align: center;\"><p><a href=\"#tides\">Tides<\/a> | <a href=\"#waves\">Waves<\/a> | <a href=\"#ship\">Ships<\/a> | <a href=\"#solunar\">Sun\/Moon<\/a><\/p><\/div>\n\n\n\n<div style=\"height:3px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-align-center\">Sun and moon times and cycles and real time position above the Earth.<br>Tides evolution and waves forecast.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><sup><a style=\"text-decoration:none\" href=\"https:\/\/theskylive.com\/planetarium#ra|20.84713947453458|dec|64.71224202770965|fov|80\" target=\"_blank\" rel=\"noreferrer noopener\">You can also find what&#8217;s in the sky<\/a> <a style=\"text-decoration:none\" href=\"https:\/\/astronomiamadeira.pt\/allsky\/\" target=\"_blank\" rel=\"noreferrer noopener\">tonight<\/a><\/sup><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:4px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!-- Golden hour live -->\n<style>\n  .slideshow-wrapper {\n    width: 100%;\n    overflow: hidden;\n    display: none; \/* Hidden by default, will show during golden hour *\/\nflex-direction: column; \/* <- This stacks title and container vertically *\/\n    justify-content: center;\n    align-items: center;\n    padding: 10px 0;\n    box-sizing: border-box;\n  }\n\n  .slideshow-container {\n    width: 100vw;\n    max-width: 100%;\n    height: 244px;\n    min-height: 14vh;\n    overflow: hidden;\n    position: relative;\n  }\n\n  .slideshow-container iframe,\n  .slideshow-container img {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 244px;\n    border: none;\n    opacity: 0;\n    transition: opacity 1s ease-in-out;\n  }\n\n  .slideshow-container iframe.zoomed {\n    transform: scale(1.6);\n    transform-origin: top center;\n    margin-top: -1px;\n  }\n\n  .slideshow-container iframe.active,\n  .slideshow-container img.active {\n    opacity: 1;\n    z-index: 1;\n  }\n<\/style>\n\n<div class=\"slideshow-wrapper\" id=\"sunsetSlideshow\">\n<h2 style=\"\n  text-align: center;\n  margin-bottom: 10px;\n  font-size: 1.2em;\n  font-weight: 222;\n  color: #333;\n\">Golden Hour Live<\/h2>\n  <div class=\"slideshow-container\">\n    <iframe class=\"active zoomed\" src=\"https:\/\/www.netmadeira.com\/webcams\/show\/netmadeira\/pico-do-arieiro\" scrolling=\"no\"><\/iframe>\n    <iframe class=\"zoomed\" src=\"https:\/\/www.netmadeira.com\/webcams\/show\/netmadeira\/ribeira-brava\" scrolling=\"no\"><\/iframe>\n    <iframe class=\"zoomed\" src=\"https:\/\/www.netmadeira.com\/webcams\/show\/netmadeira\/ponta-do-sol\" scrolling=\"no\"><\/iframe>\n    <iframe class=\"zoomed\" src=\"https:\/\/www.netmadeira.com\/webcams\/show\/netmadeira\/ponta-delgada\" scrolling=\"no\"><\/iframe>\n  <\/div>\n<\/div>\n\n<script>\n  const slides = document.querySelectorAll('.slideshow-container iframe, .slideshow-container img');\n  let current = 0;\n\n  function rotateSlides() {\n    slides[current].classList.remove('active');\n    current = (current + 1) % slides.length;\n    slides[current].classList.add('active');\n  }\n\n  setInterval(rotateSlides, 5555);\n\n    async function checkGoldenHour() {\n    try {\n      const response = await fetch(`https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/moon-time\/solunar-data.json`);\n      const data = await response.json();\n\n      \/\/ Get current local time in Madeira\n      const nowInMadeira = new Date(new Date().toLocaleString(\"en-US\", { timeZone: \"Atlantic\/Madeira\" }));\n\n      \/\/ Parse \"HH:mm\" from the JSON and apply it to today's date\n      const [hours, mins] = data.today.sunset.split(':');\n      const sunsetLocal = new Date(nowInMadeira);\n      sunsetLocal.setHours(hours, mins, 0, 0);\n\n      const goldenStart = new Date(sunsetLocal.getTime() - 65 * 60000);\n      const goldenEnd = new Date(sunsetLocal.getTime() + 55 * 60000);\n\n      if (nowInMadeira >= goldenStart && nowInMadeira <= goldenEnd) {\n        document.getElementById('sunsetSlideshow').style.display = 'flex';\n      } else {\n        document.getElementById('sunsetSlideshow').style.display = 'none';\n      }\n    } catch (err) {\n      console.error(\"Failed to fetch or process sunset time:\", err);\n    }\n  }\n\n  checkGoldenHour();\n  setInterval(checkGoldenHour, 10 * 60 * 1000); \/\/ check every 10 minutes\n<\/script>\n\n\n\n<!-- Areeiro night Sky live -->\n<style>\n  #allSkyNightContainer {\n    display: none; \/* Controlled by JS *\/\n    width: 100%;\n    flex-direction: column;\n    align-items: center;\n    padding: 10px 0;\n  }\n\n  \/* The animation logic *\/\n  @keyframes nightFadeIn {\n    from { opacity: 0; }\n    to { opacity: 1; }\n  }\n\n  .fade-trigger {\n    animation: nightFadeIn 1.5s ease-out forwards;\n  }\n\n  \/* Container for the live image *\/\n  .night-view-box {\n    width: 100%;\n    max-width: 600px; \/* Adjust based on your layout *\/\n    background: #000;\n    border: 1px solid #444;\n    line-height: 0; \/* Removes tiny gap under image *\/\n    overflow: hidden;\n  }\n\n  .night-view-box img {\n    width: 100%;\n    height: auto;\n    display: block;\n  }\n\n  .camera-controls {\n    margin-top: 8px;\n    font-size: 0.8em;\n    color: #666;\n  }\n  \n  .camera-controls a {\n    text-decoration: none;\n    color: #0073aa;\n    cursor: pointer;\n  }\n\n  #allSkyNightContainer p {\n    margin-top: 5px;\n    margin-bottom: 0;\n  }\n<\/style>\n\n<div id=\"allSkyNightContainer\">\n  <h2 style=\"text-align: center; margin-bottom: 10px; font-size: 1.2em; font-weight: 222; color: #333;\">\n    Areeiro night sky\n  <\/h2>\n  \n  <div class=\"night-view-box\">\n    <img decoding=\"async\" id=\"allSkyLiveImage\" \n         src=\"https:\/\/astronomiamadeira.pt\/allsky\/image.jpg\" \n         alt=\"Areeiro Night Sky Live\">\n  <\/div>\n\n  <div class=\"camera-controls\">\n    <a onclick=\"resetAllSky()\">\u21ba Refresh Live View<\/a>\n  <\/div>\n\n  <p class=\"has-text-align-center\">\n    <sup><em><sub>Live image by the Astronomy Association: <a href=\"https:\/\/astronomiamadeira.pt\/\" target=\"_blank\" rel=\"noopener\">Sandro Correia<\/a><\/sub><\/em><\/sup>\n  <\/p>\n<\/div>\n\n<script>\n\/\/ Function to refresh on click\n  function resetAllSky() {\n    const img = document.getElementById('allSkyLiveImage');\n \n\/\/ Cache-buster ensures the browser fetches latest image\n    img.src = \"https:\/\/astronomiamadeira.pt\/allsky\/image.jpg?t=\" + new Date().getTime();\n  }\n\n  async function checkNightVisibility() {\n    try {\n      const response = await fetch(`https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/moon-time\/solunar-data.json`);\n      const data = await response.json();\n\n\/\/ Get current time in Madeira\n      const nowInMadeira = new Date(new Date().toLocaleString(\"en-US\", { timeZone: \"Atlantic\/Madeira\" }));\n\n\/\/ Parse Sunset\n  const [sSetH, sSetM] = data.today.sunset.split(':');\n  const sunsetTime = new Date(nowInMadeira);\n  sunsetTime.setHours(sSetH, sSetM, 0, 0);\n\n\/\/ Parse Sunrise\n      const [sRiseH, sRiseM] = data.today.sunrise.split(':');\n      const sunriseTime = new Date(nowInMadeira);\n      sunriseTime.setHours(sRiseH, sRiseM, 0, 0);\n\n\/\/ Start: Match the Golden Hour fade out (Sunset +55 mins)\n      const nightStart = new Date(sunsetTime.getTime() + 55 * 60000);\n\n\/\/ End: 30 mins before Sunrise\n      const nightEnd = new Date(sunriseTime.getTime() - 30 * 60000);\n      \n      const nightContainer = document.getElementById('allSkyNightContainer');\n\n\/\/ Logic: Visible 55m after sunset until 30m before sunrise\n      if (nowInMadeira >= nightStart || nowInMadeira <= nightEnd) {\n        if (nightContainer.style.display !== 'flex') {\n          nightContainer.style.display = 'flex';\n\n \/\/ Trigger the gentle fade-in\n          setTimeout(() => {\n            nightContainer.classList.add('fade-trigger');\n          }, 10);\n          \/\/ Initial load of the image when container appears\n          resetAllSky();\n        }\n      } else {\n        nightContainer.style.display = 'none';\n        nightContainer.classList.remove('fade-trigger');\n      }\n    } catch (err) {\n      console.error(\"Visibility check error:\", err);\n    }\n  }\n\n\/\/ Run immediately then update every min\n  checkNightVisibility();\n  setInterval(checkNightVisibility, 60000);\n  \n\/\/ Auto-refresh image every 2 minutes while the page is open\n  setInterval(() => {\n    if (document.getElementById('allSkyNightContainer').style.display === 'flex') {\n      resetAllSky();\n    }\n  }, 120000);\n<\/script>\n\n\n\n<div style=\"height:3px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<!-- Sun special tracker -->\n<div id=\"madeira-clock-v2\" style=\"width: 290px; background: linear-gradient(to bottom, #001d3d, #003566); padding: 25px; border-radius: 20px; color: white; font-family: 'Segoe UI', Tahoma, sans-serif; text-align: center; box-shadow: 0 10px 30px rgba(0,0,0,0.5); transition: all 3s ease-in-out;\">\n    <h2 id=\"widgetTitle\" style=\"margin: 0 0 5px 0; color: black; font-size: 1.4em; font-weight: 300; transition: color 3s;\">Madeira Solar Tracker<\/h2>\n    <div id=\"date-display\" style=\"font-size: 0.8em; opacity: 0.7; margin-bottom: 15px;\">Loading date...<\/div>\n\n    <svg viewBox=\"0 0 500 300\" style=\"width: 100%; height: auto; overflow: visible;\">\n        <path id=\"pathTop\" fill=\"none\" stroke=\"rgba(255, 215, 0, 0.25)\" stroke-width=\"2\" stroke-dasharray=\"4\" \/>\n        <path id=\"pathBottom\" fill=\"none\" stroke=\"rgba(255, 215, 0, 0.08)\" stroke-width=\"2\" stroke-dasharray=\"4\" \/>\n        \n        <line x1=\"50\" y1=\"185\" x2=\"450\" y2=\"185\" stroke=\"rgba(255,255,255,0.05)\" stroke-width=\"1\" stroke-linecap=\"round\" \/>\n\/\/ Horizon line visual details\n\n        <image \n            href=\"https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2026\/01\/madeira-map-3D.webp\" \n            x=\"100\" y=\"110\" width=\"300\" height=\"150\" \n            preserveAspectRatio=\"xMidYMid meet\"\n            style=\"filter: drop-shadow(0px 5px 10px rgba(0,0,0,0.5));\"\n        \/>\n\n        <g id=\"sunGroup\" style=\"opacity: 0; transition: opacity 1s ease-in-out;\">\n            <circle id=\"sunGlow\" r=\"15\" fill=\"rgba(255, 215, 0, 0.4)\" style=\"transition: opacity 2s;\">\n                <animate id=\"glowAnim\" attributeName=\"r\" values=\"14;20;14\" dur=\"3s\" repeatCount=\"indefinite\" \/>\n            <\/circle>\n            <circle id=\"actualSun\" r=\"8\" fill=\"#ffcc00\" style=\"transition: opacity 2s, fill 2s;\" \/>\n        <\/g>\n    <\/svg>\n\n    <div style=\"display: flex; justify-content: space-between; margin-top: 15px; font-size: 0.85em;\">\n        <div>&#x1f305; <span id=\"riseTime\">--:--<\/span><\/div>\n        <div id=\"statusText\" style=\"color: #ffd700; font-weight: bold;\">Updating...<\/div>\n        <div>&#x1F304; <span id=\"setTime\">--:--<\/span><\/div>\n    <\/div>\n<\/div>\n\n<script>\n(async function initSolar() {\n    \/\/ Variable names and project structure preserved\n    const widget = document.getElementById('madeira-clock-v2');\n    const title = document.getElementById('widgetTitle');\n    const actualSun = document.getElementById('actualSun');\n    const glow = document.getElementById('sunGlow');\n    const sunGroup = document.getElementById('sunGroup');\n    \n    let sunData = null;\n\n    \/\/ Helper to turn \"08:05\" into a real Date object for your math\n    function parseTime(timeStr) {\n        const [hours, minutes] = timeStr.split(':');\n        const d = new Date();\n        d.setHours(parseInt(hours), parseInt(minutes), 0, 0);\n        return d;\n    }\n\n    async function getTimes() {\n        try {\n            \/\/ Using your local solunar data\n            const res = await fetch(`https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/moon-time\/solunar-data.json`);\n            const json = await res.json();\n            \n            if(json.today) {\n                sunData = {\n                    rise: parseTime(json.today.sunrise),\n                    set: parseTime(json.today.sunset)\n                };\n            }\n        } catch (e) { console.log(\"Local data check failed...\"); }\n    }\n\n    function update() {\n        if (!sunData) return;\n\n        const now = new Date();\n        const minsNow = now.getHours() * 60 + now.getMinutes() + (now.getSeconds() \/ 60);\n        const minsRise = sunData.rise.getHours() * 60 + sunData.rise.getMinutes();\n        const minsSet = sunData.set.getHours() * 60 + sunData.set.getMinutes();\n\n        document.getElementById('riseTime').innerText = sunData.rise.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false});\n        document.getElementById('setTime').innerText = sunData.set.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit', hour12: false});\n        document.getElementById('date-display').innerText = now.toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' });\n\n        const start = new Date(now.getFullYear(), 0, 0);\n        const dayOfYear = Math.floor((now - start) \/ 86400000);\n        const seasonalFactor = Math.cos((dayOfYear - 172) * 2 * Math.PI \/ 365);\n        const currentRy = 95 + (seasonalFactor * 25); \n\n        let angle;\n        const dayLen = minsSet - minsRise;\n        const nightLen = 1440 - dayLen;\n\n        if (minsNow >= minsRise && minsNow <= minsSet) {\n            const t = (minsNow - minsRise) \/ dayLen;\n            angle = Math.PI - (t * Math.PI);\n            document.getElementById('statusText').innerText = \"DAYLIGHT\";\n            \n            glow.style.opacity = \"1\";\n            actualSun.style.opacity = \"1\";\n            actualSun.style.fill = \"#ffcc00\";\n            title.style.color = \"#001d3d\"; \n\n            \/\/ --- PRECISION GOLDEN HOUR LOGIC (in minutes) ---\n            const goldenHourMins = 60; \n            const minsSinceRise = minsNow - minsRise;\n            const minsUntilSet = minsSet - minsNow;\n\n            if (minsSinceRise < goldenHourMins || minsUntilSet < goldenHourMins) {\n                widget.style.background = \"linear-gradient(to bottom, #ffb347, #003566)\";\n            } else {\n                widget.style.background = \"linear-gradient(to bottom, #3a7bd5, #003566)\";\n            }\n        } else {\n            let nightT;\n            if (minsNow > minsSet) { nightT = (minsNow - minsSet) \/ nightLen; }\n            else { nightT = (minsNow + (1440 - minsSet)) \/ nightLen; }\n            \n            angle = -(nightT * Math.PI);\n            document.getElementById('statusText').innerText = \"NIGHT\";\n\n               \/\/ --- DAWN & DUSK TWILIGHT ART LAYERS ---\n     const twilightMins = 15; \/\/ Soft glow duration for both after sunset and before sunrise\n\n            const minsSinceSet = (minsNow >= minsSet) ? (minsNow - minsSet) : (minsNow + (1440 - minsSet));\n            const minsUntilRise = (minsNow < minsRise) ? (minsRise - minsNow) : (minsRise + (1440 - minsNow));\n\n            if (minsSinceSet < twilightMins) {\n                \/\/ DUSK: soft orange to midnight blue\n                widget.style.background = \"linear-gradient(to bottom, #8c7332, #001d3d)\";\n            } else if (minsUntilRise < twilightMins) {\n                \/\/ DAWN: Gold hint of morning\n                widget.style.background = \"linear-gradient(to bottom, #857428, #000814)\";\n            } else {\n                \/\/ FULL deep NIGHT\n                widget.style.background = \"linear-gradient(to bottom, #000814, #001d3d)\";\n            }\n            \n            title.style.color = \"#888888\"; \n            glow.style.opacity = \"0\";\n            actualSun.style.opacity = \"0.5\"; \n            actualSun.style.fill = \"#91a3b0\"; \n        }\n\n        const cx = 250, cy = 185, rx = 160;\n        const x = cx + Math.cos(angle) * rx;\n        const y = cy - Math.sin(angle) * currentRy;\n\n\/\/ Apply position to the sun\n        sunGroup.setAttribute('transform', `translate(${x},${y})`);\n        \n\/\/ Show the sun group once it's in the right place\n        if (sunGroup.style.opacity === \"0\") {\n            sunGroup.style.opacity = \"1\";\n        }\n\n        \/\/ SEASONAL PATH LOGIC \n  \/\/ Update the two-part path to match the current seasonal Ry\n        document.getElementById('pathTop').setAttribute('d', `M ${cx-rx},${cy} A ${rx},${currentRy} 0 0,1 ${cx+rx},${cy}`);\n        document.getElementById('pathBottom').setAttribute('d', `M ${cx+rx},${cy} A ${rx},${currentRy} 0 0,1 ${cx-rx},${cy}`);\n    }\n\n    await getTimes();\n    update(); \n    setInterval(update, 1000); \n    setInterval(getTimes, 3600000); \n})();\n<\/script>\n\n\n\n<p class=\"has-text-align-center\"><sup><em><sub>Aerial view from the North. 3D map source: <a href=\"https:\/\/sketchfab.com\/3d-models\/madeira-island-terrain-map-1175000-scale-308e37a8ae0a4d2ca397f2934b9d3e69\" target=\"_blank\" rel=\"noopener\" title=\"\">Ian Grasshoff<\/a><\/sub><\/em><\/sup><\/p>\n<\/div>\n\n\n\n<!-- Sacred moon experience -->\n<div id=\"madeira-moon-parallax\" style=\"position: relative; width: 290px; background: linear-gradient(to bottom, #000814, #051630); padding: 25px; border-radius: 20px; color: grey; font-family: 'Segoe UI', Tahoma, sans-serif; text-align: center; box-shadow: 0 10px 30px rgba(0,0,0,0.8); transition: background 3.3s ease-in-out; overflow: hidden;\">\n\n    <style>\n        @keyframes moonTitleFade {\n            from { opacity: 0; color: black; }\n            to { opacity: 1; color: #91a3b0; }\n        }\n    <\/style>\n\n    <h2 style=\"margin: 0 0 5px 0; color: #91a3b0; font-size: 1.4em; font-weight: 300; animation: moonTitleFade 1.2s ease-in-out forwards;\">\n        Madeira Moon Tracker\n    <\/h2>\n\n    <div id=\"moonStatusText\" style=\"font-size: 0.70em; opacity: 0.6; margin-bottom: 15px; color: grey; font-weight: bold; letter-spacing: 1px; animation: moonTitleFade 1.4s ease-in-out forwards;\">\n        TOPOCENTRIC SYNC\n    <\/div>\n\n    <div id=\"moon-stage\" style=\"position: relative; width: 100%; aspect-ratio: 500 \/ 300; margin-top: 10px;\">\n        <div id=\"moonEmoji\" style=\"\n    position: absolute; \n    width: 32px; \n    height: 32px; \n    pointer-events: none; \n    z-index: 10; \n    transform: translate(-50%, -50%); \n    left: 0; \n    top: 0; \n    opacity: 0; \n    transition: opacity 2.8s ease-in-out;\n    background-image: url('https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2026\/03\/28-Moon-phases-v4.png');\n    background-size: auto 100%; \/* Changed from 896px *\/\n    background-repeat: no-repeat;\n    \/* mix-blend-mode removed: not needed for transparent assets *\/\nimage-rendering: -webkit-optimize-contrast; \/* For Chrome\/Safari *\/\nimage-rendering: crisp-edges;               \/* For Firefox\/Standard *\/\n\"><\/div>\n\n        <svg viewBox=\"0 0 500 300\" overflow=\"visible\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width: 100%; height: 100%; display: block;\">\n            <line x1=\"50\" y1=\"185\" x2=\"450\" y2=\"185\" stroke=\"rgba(145, 163, 176, 0.10)\" stroke-width=\"1\" \/>\n            \n            <g id=\"stars\" fill=\"white\" opacity=\"0.45\">\n                <circle cx=\"100\" cy=\"60\" r=\"1.1\"><animate attributeName=\"opacity\" values=\"0.3;0.8;0.2\" dur=\"3s\" repeatCount=\"indefinite\" \/><\/circle>\n                <circle cx=\"400\" cy=\"80\" r=\"1\"><animate attributeName=\"opacity\" values=\"1;0.2;0.7\" dur=\"4s\" repeatCount=\"indefinite\" \/><\/circle>\n                <circle cx=\"250\" cy=\"40\" r=\"1.4\"><animate attributeName=\"opacity\" values=\"0.2;0.9;0.1\" dur=\"5s\" repeatCount=\"indefinite\" \/><\/circle>\n            <\/g>\n\n            <path d=\"M 60,185 A 190,95 0 1,1 440,185\" fill=\"none\" stroke=\"rgba(200, 200, 255, 0.2)\" stroke-width=\"1\" stroke-dasharray=\"2\" \/>\n            <path d=\"M 440,185 A 190,95 0 1,1 60,185\" fill=\"none\" stroke=\"rgba(200, 200, 255, 0.06)\" stroke-width=\"1\" stroke-dasharray=\"2\" \/>\n\n            <image href=\"https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2026\/01\/madeira-map-3D.webp\" x=\"100\" y=\"110\" width=\"300\" height=\"150\" style=\"filter: brightness(0.5) contrast(1.1) hue-rotate(200deg);\" \/>\n        <\/svg>\n    <\/div>\n\n    <div style=\"display: flex; justify-content: space-between; margin-top: 15px; font-size: 0.85em; border-bottom: 1px solid rgba(255,255,255,0.1); padding-bottom: 10px; animation: moonTitleFade 1.4s ease-in-out forwards;\">\n        <div>Illumination: <span id=\"moonIllum\" style=\"color: #ffd700;\">--<\/span><\/div>\n        <div>Altitude: <span id=\"moonAltDisplay\" style=\"color: #ffd700;\">--<\/span><\/div>\n    <\/div>\n\n    <div style=\"display: flex; justify-content: space-between; padding: 0 8px; margin-top: 10px; font-size: 0.9em; opacity: 0.9; color: white; animation: moonTitleFade 1.8s ease-in-out forwards;\">\n        <div><span style=\"color:#ffd700;\">\u2191<\/span> <span id=\"mRise\">--:--<\/span><\/div>\n        <div style=\"width: 1px; background: rgba(255,255,255,0.1); margin: 0 5px;\"><\/div>\n        <div><span style=\"color:#ffd700;\">\u2193<\/span> <span id=\"mSet\">--:--<\/span><\/div>\n    <\/div>\n\n    <div style=\"margin-top: 12px; font-size: 0.75em; color: #91a3b0; line-height: 1.8; animation: moonTitleFade 1.6s ease-in-out forwards;\">\n        Currently: <span id=\"currPhaseName\" style=\"color: white;\">--<\/span><br>\n        Next: <span id=\"nextPhaseInfo\" style=\"color: white;\">--<\/span>\n    <\/div>\n<\/div>\n\n\n<script>\n(function() {\n    \/\/ 1. CONFIGURATION: Location for Madeira area\n    const LAT = 32.6667, LON = -16.9167;\n\n\/\/ Create date to Madeira timezone\nfunction getMadeiraDate() {\n    return new Date(new Date().toLocaleString(\"en-US\", {timeZone: \"Atlantic\/Madeira\"}));\n}\n \n \/\/ 2. FETCH DATA: Independent & Fast (Local JSON)\nasync function fetchMoonTimes() {\n    try {\n        \/\/ Path to the LIVE Json file on the server for Madeira Moon Rise and Set times\n        const response = await fetch('https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/moon-time\/solunar-data.json');\n const data = await response.json();\n const now = getMadeiraDate();\n\n\/\/ VALIDATION: 24-hour fresh check\n        const lastUpdate = new Date(data.updated);\n        const isStale = (now - lastUpdate) > (24 * 60 * 60 * 1000);\n\n\/\/ If data is stale, STOP here\n\/\/ remains \"--:--\" (or empty), which is the honest truth.\n        if (isStale) {\n            console.warn(\"Data is stale. Displaying nothing to maintain integrity.\");\n            document.getElementById('moonStatusText').innerText = \"SYNC PENDING...\";\n            return; \/\/ Exit the function immediately\n        }\n\n\/\/ --- DATA IS FRESH: Proceed with display ---\n        let mRise = data.today.rise || \"--:--\";\n        let mSet = data.today.set || \"--:--\";\n\n\/\/ Global storage for the background comparison in update()\n        window.sunRise = data.today.sunrise; \n        window.sunSet = data.today.sunset;\n\n\n \/\/ THE HONEST CYCLE: Using a 6-hour \"Memory Buffer\" to prevent the rise and set times to change immediately after they happened \n    \/\/ We only show Tomorrow's time if the current time is more than 6 hours past Today's event.\n\n  \/\/ Handle SET time logic\n        if (data.today.set && data.today.set !== \"--:--\") {\n            const [h, m] = data.today.set.split(':');\n\/\/ Clone 'now' madeira time and just update the hours\/minutes\nconst setTimeToday = new Date(now); \nsetTimeToday.setHours(h, m, 0, 0);\n           \n\/\/ Calculate the \"Switch Point\" (6 hours after the event)\n            const switchPointSet = new Date(setTimeToday.getTime() + (6 * 60 * 60 * 1000));\n            \n\/\/ Only show tomorrow's set if we're past 6-hour memory window\n            if (now > switchPointSet) {\n                mSet = data.tomorrow.set || \"--:--\";\n            }\n        }\n\n \/\/ Handle RISE time logic\n        if (data.today.rise && data.today.rise !== \"--:--\") {\n            const [rh, rm] = data.today.rise.split(':');\n\/\/ Clone 'now' madeira time and just update the hours\/minutes\nconst riseTimeToday = new Date(now); \nriseTimeToday.setHours(rh, rm, 0, 0);\n            \n\/\/ Calculate the \"Switch Point\" (6 hours after the event)\n            const switchPointRise = new Date(riseTimeToday.getTime() + (6 * 60 * 60 * 1000));\n\n\/\/ Only show tomorrow's rise if we are past the 6-hour memory window\n            if (now > switchPointRise) {\n                mRise = data.tomorrow.rise || \"--:--\";\n            }\n        }\n      document.getElementById('mRise').innerText = mRise;\n        document.getElementById('mSet').innerText = mSet;\n\n\/\/ call to update to apply background logic\n        update();\n\n    } catch (e) { \n        console.log(\"Local sync failed:\", e); \n    }\n}\n    \/\/ 3. ASTRONOMICAL ENGINE: Calculates Phase, Altitude, and Azimuth\n    function computeMoon(date) {\n        const jd = (Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()) \/ 86400000) + 2440587.5;\n        const T = (jd - 2451545.0) \/ 36525;\n        const L0 = 218.316 + 481267.881 * T;\n        const M = 134.963 + 477198.867 * T;\n        const F = 93.272 + 483202.018 * T;\n        const lon = (L0 + 6.289 * Math.sin(M * Math.PI \/ 180)) % 360;\n        const lat = 5.128 * Math.sin(F * Math.PI \/ 180);\n        const Lsun = (280.460 + 36000.771 * T) % 360;\n        let elong = (lon - Lsun + 360) % 360;\n        const phaseValue = elong \/ 360;\n        const e = 23.439 - 0.013 * T;\n        const ra = Math.atan2(Math.sin(lon * Math.PI \/ 180) * Math.cos(e * Math.PI \/ 180), Math.cos(lon * Math.PI \/ 180)) * 180 \/ Math.PI;\n        const dec = Math.asin(Math.sin(lat * Math.PI \/ 180) * Math.cos(e * Math.PI \/ 180) + Math.cos(lat * Math.PI \/ 180) * Math.sin(e * Math.PI \/ 180) * Math.sin(lon * Math.PI \/ 180)) * 180 \/ Math.PI;\n        let lst = (100.46 + 0.985647 * (jd - 2451545.0) + LON + (date.getUTCHours() + date.getUTCMinutes() \/ 60) * 15) % 360;\n        const ha = (lst - ra + 360) % 360;\n        let alt = Math.asin(Math.sin(LAT * Math.PI \/ 180) * Math.sin(dec * Math.PI \/ 180) + Math.cos(LAT * Math.PI \/ 180) * Math.cos(dec * Math.PI \/ 180) * Math.cos(ha * Math.PI \/ 180)) * 180 \/ Math.PI;\n\n\/\/ To adjust for real time Madeira visual moon rise\n \n        return { alt: alt + 1.99 - (0.95 * Math.cos(alt * Math.PI \/ 180)), az: ha, phaseValue, lst, Lsun };\n    }\n\n\/\/ 4. MAIN UPDATE: Handles visuals, positions, and UI logic\n    function update() {\n const now = getMadeiraDate();\n const moon = computeMoon(now);\n        const widget = document.getElementById('madeira-moon-parallax');\n        const illum = ((1 - Math.cos(2 * Math.PI * moon.phaseValue)) \/ 2 * 100).toFixed(1);\n        \n        const names = [\"New Moon\", \"Waxing Crescent\", \"First Quarter\", \"Waxing Gibbous\", \"Full Moon\", \"Waning Gibbous\", \"Last Quarter\", \"Waning Crescent\"];\n        const emojis = [\"&#x1f311;\", \"&#x1f312;\", \"&#x1f313;\", \"&#x1f314;\", \"&#x1f315;\", \"&#x1f316;\", \"&#x1f317;\", \"&#x1f318;\"];\n  \n\n\/\/ Intuitive Phase Indexing - Based on Illumination %\n\/\/ --- INDEPENDENT PHASE INDEXING ---\nconst p = moon.phaseValue;\nconst isWaxing = p < 0.5;\n\n\/\/ 1. TECHNICAL NAME INDEX (Strict Thresholds)\nlet nameIdx;\nif (illum <= 0.2) nameIdx = 0; \/\/ Strict New Moon\n\nelse if (isWaxing) {\n    if (illum <= 49.5) nameIdx = 1;      \/\/ Waxing Crescent\n\n    else if (illum <= 50.5) nameIdx = 2; \/\/ First Quarter (Precise 50%)\n\n    else nameIdx = 3;                  \/\/ Waxing Gibbous\n\n} else {\n    if (illum > 50.5) nameIdx = 5;       \/\/ Waning Gibbous\n\n    else if (illum > 49.5) nameIdx = 6;  \/\/ Last Quarter (Precise 50%)\n\n    else if (illum > 0.2) nameIdx = 7;   \/\/ Waning Crescent\n\n    else nameIdx = 0;\n}\nif (illum >= 99.6) nameIdx = 4;          \/\/ Strict Full Moon label\n\n\/\/ 2. VISUAL EMOJI INDEX \"Human Eye\" Thresholds (Daily Frame Shift)\nconst emojiEl = document.getElementById('moonEmoji');\n\n\/\/ Calculate exactly which of your 28 images to show\nconst totalFrames = 28;\nconst frameIdx = Math.floor(moon.phaseValue * totalFrames) % totalFrames;\n\n\/\/ Drift-proof calculation: (Current Frame \/ (Total Frames - 1)) * 100\nconst percentX = (frameIdx \/ (totalFrames - 1)) * 100;\n\n\/\/ Apply the percent shift instead of pixels\nemojiEl.style.backgroundPosition = `${percentX}% 0%`;\n\ndocument.getElementById('currPhaseName').innerText = names[nameIdx]; \/\/ The technical truth\n\n\/\/ UI Text Updates\ndocument.getElementById('moonIllum').innerText = illum + \"%\";\n        document.getElementById('moonAltDisplay').innerText = moon.alt.toFixed(1) + \"\u00b0\";\n   \n\n\/\/ --- DYNAMIC PHASE PREDICTION ENGINE ---\n\/\/ Identifies the next major milestone: 0.25 (1st Qtr), 0.5 (Full), 0.75 (Last Qtr), or 1 (New Moon)\nconst milestones = [0.25, 0.5, 0.75, 1];\nlet nextQ = milestones.find(q => q > (moon.phaseValue + 0.00)) || 0.25;\n\n\/\/ VALIDATION: If the predicted milestone shares the same name as 'Currently', jump to the next quarter\nif (names[Math.floor(nextQ * 8) % 8] === names[nameIdx]) {\n    const nextIdx = (milestones.indexOf(nextQ) + 1) % 4;\n    nextQ = milestones[nextIdx];\n}\n\n\/\/ Calculate the timeframe and update the UI\nconst predictedValue = (nextQ <= moon.phaseValue) ? (nextQ + 1) : nextQ;\nconst nextDate = new Date(now.getTime() + (predictedValue - moon.phaseValue) * 29.53059 * 86400000);\n\ndocument.getElementById('nextPhaseInfo').innerText = \n    names[Math.floor(nextQ * 8) % 8] + \" on \" + \n    nextDate.toLocaleDateString('en-US', { month: 'short', day: 'numeric', timeZone: 'Atlantic\/Madeira' });\n\n\/\/ DYNAMIC POSITIONING (Smart Dynamic Radius)\n        const cx = 250, cy = 185, rx = 190;\n        const dynamicRy = (moon.alt > 0) ? 135 : 95; \/\/ Moon rises higher above Madeira\n        const x = cx + rx * Math.cos((moon.az - 90) * Math.PI \/ 180);\n        const y = cy - (Math.sin(moon.alt * Math.PI \/ 180) * dynamicRy);\n\n\/\/ Map SVG coordinates to HTML % for the Div overlay\n\/\/ Calculate the actual size of the stage in pixels\nconst stage = document.getElementById('moon-stage');\nconst stageW = stage.clientWidth;\nconst stageH = stage.clientHeight;\n\n\/\/ Map the 500x300 astronomical coordinates directly to pixels\nconst realX = (x \/ 500) * stageW;\nconst realY = (y \/ 300) * stageH;\n\nemojiEl.style.left = realX + \"px\";\nemojiEl.style.top = realY + \"px\";\n\n\/\/ RELIABLE DAYLIGHT\/NIGHT LOGIC: Simple string comparison for bg color & stars\n        if (window.sunRise && window.sunSet) {\n            const nowTimeStr = now.getHours().toString().padStart(2, '0') + \":\" + now.getMinutes().toString().padStart(2, '0');\n            \n            if (nowTimeStr >= window.sunRise && nowTimeStr < window.sunSet) {\n                widget.style.background = \"linear-gradient(to bottom, #1a2a44, #051630)\"; \/\/ Daylight\n                document.getElementById('stars').style.opacity = \"0\";\n            } else {\n                widget.style.background = \"linear-gradient(to bottom, #000814, #051630)\";  \/\/ Night\n                document.getElementById('stars').style.opacity = \"0.45\";\n            } \n        }\n        \n\/\/ VISIBILITY LOGIC: Handle moon presence above\/below horizon\n        const statusEl = document.getElementById('moonStatusText');\n        if (moon.alt > 0) {\n            statusEl.innerText = \"OBSERVABLE ABOVE MADEIRA\";\n            statusEl.style.color = \"White\";\n            emojiEl.style.opacity = \"1\";\n            emojiEl.style.filter = \"brightness(0.69) contrast(2.7) drop-shadow(0 0 11px rgba(255,255,255,0.8)) drop-shadow(0 0 2px rgba(255,255,255,0.4))\"; \/\/ Active Glow\n        } else {\n            statusEl.innerText = \"BELOW HORIZON\";\n            statusEl.style.color = \"grey\";\n            emojiEl.style.opacity = \"0.3\"; \/\/ Faded below horizon\n            emojiEl.style.filter = \"brightness(0.5) contrast(1.2)\"; \/\/ Dimmed\n        }\n\n\/\/ -INTRO Moon FADE-IN REVEAL-\n        if (emojiEl.style.opacity === \"0\") {\n            emojiEl.style.opacity = moon.alt > 0 ? \"1\" : \"0.3\";\n        }\n    }\n\n    \/\/ Initialize\n    fetchMoonTimes();\n    update();\n    setInterval(update, 60000); \/\/ One minute refresh\n})();\n<\/script>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:17px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Solar system in full motion<\/strong><\/p>\n\n\n\n<div style=\"text-align: center;\">\n<iframe loading=\"lazy\" src=\"https:\/\/www.tutiempo.net\/astronomia\/sistema-solar.html?_ga=2.137240368.165604718.1730288881-1517684628.1730288881\" width=\"100%\" height=\"333\" frameBorder=\"0\" style=\"border: 0;\"><\/iframe><div align=\"left\" style=\"margin-top:-10px;margin-left:0px\"><sup><small><i><a href=\"https:\/\/www.tutiempo.net\/astronomia\/sistema-solar.html?_ga=2.126170637.165604718.1730288881-1517684628.1730288881\" target=\"_blank\" rel=\"noopener\">source<\/a><\/i><\/small><\/sup><\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:21px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center\" id=\"tides\"><a style=\"font-weight: bold; text-decoration: none;\" href=\"https:\/\/tabuademares.com\/pt\/madeira\/funchal\" target=\"blank\" rel=\"noopener\">Ocean Tides evolution<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"999\" height=\"999\" src=\"https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2024\/11\/Surfer-Waves.png\" alt=\"\" class=\"wp-image-1633\" style=\"width:122px\" srcset=\"https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2024\/11\/Surfer-Waves.png 999w, https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2024\/11\/Surfer-Waves-300x300.png 300w, https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2024\/11\/Surfer-Waves-150x150.png 150w, https:\/\/paragliding-in-madeira.com\/weather\/wp-content\/uploads\/2024\/11\/Surfer-Waves-768x768.png 768w\" sizes=\"auto, (max-width: 999px) 100vw, 999px\" \/><\/figure>\n<\/div>\n\n\n\n<div style=\"text-align: center; margin-top:-1px;\">\n<iframe loading=\"lazy\" style=\"margin-top:-2px; margin-left:-30px;\" src=\"https:\/\/marea.ooo\/en\/widget\/32.6496497\/-16.9086783?padding=s&#038;components=chart&#038;background=transparent&#038;theme=light\"\n        style=\"background-color: transparent\"\n        width=\"100%\"\n        height=\"344px\"><\/iframe><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-align-center\" id=\"waves\"><strong>Waves forecast<\/strong><\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n\n\n<style>\n  \/* Gentle pulse animation - reused from wind widget *\/\n  @keyframes gentlePulse {\n    0%   { transform: scale(1); opacity: 0.5; }\n    44%  { transform: scale(1.05); opacity: 1; }\n    100% { transform: scale(1); opacity: 0.5; }\n  }\n\n  \/* Apply pulse to the emoji only *\/\n  #windguru2-loading .pulse {\n    display: inline-block;\n    animation: gentlePulse 2.8s ease-in-out infinite;\n  }\n  \n  \/* NEW: Use a transition for smooth growing when height constraint is removed *\/\n  #windguru2-wrapper {\n      transition: height 0.6s ease;\n  }\n\n#windguru2-container {\n  position: relative; \n  min-height: 200px;\n  \/* Add this line: *\/\n  touch-action: pan-x pan-y; \n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n<\/style>\n<div id=\"windguru2-wrapper\" style=\"height: 200px; margin-top:-1px; text-align:center; transform: translateX(-15px);\">\n  <div id=\"windguru2-container\" style=\"position:relative; height: 100%;\">\n\n    <div id=\"windguru2-loading\" style=\"\n  position: absolute; top: 0; left: 0; \n  width: 100%; height: 100%; z-index: 10;\n  display: flex; flex-direction: column; justify-content: center;\n  text-align:center; color:gray; opacity:1;\n  background-color: #EBEBEF;\nfont-size: 16px; \n\">\n      <span class=\"pulse\">&#127754; Reading the waves...<br>(Porto Santo Ocean) <\/span>\n    <\/div>\n\n    <div id=\"windguru2-error\" style=\"\n      position: absolute; top: 0; left: 0; \n      width: 100%; height: 100%; z-index: 10;\n      display: none; flex-direction: column; justify-content: center;\n      text-align:center; color:black;\n      background-color: #EBEBEF;\n    \">\n      Didn't load Windguru Wave Forecast\n      <button onclick=\"reloadWindguru2()\">Try Again<\/button>\n    <\/div>\n\n    <div id=\"windguru2-widget\" style=\"opacity: 0; transition: opacity 0.6s ease;\"><\/div>\n  <\/div>\n\n  <script>\n    \/* -------------------------------------------------------------\n      Configuration (Specific to Waves Widget)\n    ------------------------------------------------------------- *\/\n    const W2_TIMEOUT = 8000;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n    const W2_MAX_ATTEMPTS = 3;\u00a0\u00a0\u00a0\u00a0\n    const W2_MIN_LOAD_TIME = 500;\u00a0\n    const W2_SMOOTH_DELAY = 400;\u00a0\u00a0\n\n\n    \/* -------------------------------------------------------------\n      Smooth fade-out for loader, and fade-in for widget\n    ------------------------------------------------------------- *\/\n    function fadeOutAndSwap2(loadingEl, widgetEl) {\n      const wrapperEl = document.getElementById('windguru2-wrapper');\n\n      \/\/ 1. Fade out the loader\n      loadingEl.style.transition = \"opacity 0.6s ease\";\n      loadingEl.style.opacity = \"0\";\n\n      \/\/ 2. Fade in the widget\n      widgetEl.style.opacity = \"1\";\n\n      \/\/ 3. Hide loader after transition AND REMOVE HEIGHT CONSTRAINT\n      setTimeout(() => { \n          loadingEl.style.display = \"none\"; \n          \n          \/\/ *** THE KEY CHANGE ***\n          \/\/ Remove the inline height style, allowing the wrapper to expand \n          \/\/ based on the iframe's natural height.\n          wrapperEl.style.height = 'auto'; \n          \n      }, 600); \n    }\n\n\n    \/* -------------------------------------------------------------\n      Detect iframe \u2192 wait for iframe load \u2192 then smoothing delay\n    ------------------------------------------------------------- *\/\n    function observeWindguruIframeFullyLoaded2(widgetEl, onReady) {\n      const observer = new MutationObserver(() => {\n        const iframe = widgetEl.querySelector(\"iframe\");\n        if (!iframe) return;\n\n        observer.disconnect();\n\n        \/\/ Wait for Windguru iframe internal load\n        iframe.addEventListener(\"load\", () => {\n          \/\/ Extra smoothing to prevent loader flashing\n          setTimeout(onReady, W2_SMOOTH_DELAY);\n        });\n      });\n\n      \/\/ Observe the widget container for children (the iframe) being added\n      observer.observe(widgetEl, { childList: true });\n    }\n\n\n    \/* -------------------------------------------------------------\n      Main loader\n    ------------------------------------------------------------- *\/\n    function loadWindguru2(attempt = 1) {\n      const widgetEl = document.getElementById(\"windguru2-widget\");\n      const loadingEl = document.getElementById(\"windguru2-loading\");\n      const errorEl = document.getElementById(\"windguru2-error\");\n      const wrapperEl = document.getElementById('windguru2-wrapper');\n\n      \/\/ Reset UI\n      widgetEl.innerHTML = \"\";\n      widgetEl.style.opacity = \"0\";\n      loadingEl.style.display = \"flex\";\n      loadingEl.style.opacity = \"1\";\n      errorEl.style.display = \"none\";\n      \n      \/\/ Set wrapper height \n      \/\/ while the loader is visible to prevent initial jumping.\n      wrapperEl.style.height = '150px'; \n      \n\n      let loadComplete = false;\n      const startTime = Date.now();\n\n      \/\/ Setup the observation to handle the successful load\n      observeWindguruIframeFullyLoaded2(widgetEl, () => {\n        if (loadComplete) return;\n        loadComplete = true;\n\n        const remaining = Math.max(0, W2_MIN_LOAD_TIME - (Date.now() - startTime));\n\n        setTimeout(() => fadeOutAndSwap2(loadingEl, widgetEl), remaining);\n\n        console.log(`Windguru 2 (Waves) fully loaded on attempt ${attempt}`);\n      });\n      \/\/ Inject WG script (with a slight delay to ensure the container is ready)\n      setTimeout(() => {\n        const script = document.createElement(\"script\");\n        script.id = \"wg_fwdg_237_84_\" + Date.now(); \n\n        const args = [\n          \"s=237\", \"m=84\", \"uid=\" + script.id, \"wj=kmh\", \"tj=c\", \"ts=1\", \"waj=m\", \"tij=cm\",\n          \"odh=0\", \"doh=24\", \"fhours=111\", \"hrsm=3\", \"vt=forecasts\", \"lng=en\",\n          \"p=PERPW,HTSGW,DIRPW\" \n        ];\n\n        script.src = \"https:\/\/www.windguru.cz\/js\/widget.php?\" + args.join(\"&\");\n\n        script.onload = () => {\n          console.log(\"Windguru 2 script loaded \u2014 waiting for iframe\u2026\");\n        };\n\n        widgetEl.appendChild(script);\n\n        \/\/ Fail-safe timeout\n        setTimeout(() => {\n          if (!loadComplete) {\n            console.warn(`Windguru 2 (Waves) timed out on attempt ${attempt}`);\n\n            if (attempt < W2_MAX_ATTEMPTS) {\n              loadWindguru2(attempt + 1);\n            } else {\n              loadingEl.style.display = \"none\";\n              errorEl.style.display = \"flex\";\n              \/\/ On error, revert to max height for error message visibility\n              wrapperEl.style.height = '200px'; \n            }\n          }\n        }, W2_TIMEOUT);\n\n      }, 50); \n    }\n\n\n    \/* -------------------------------------------------------------\n      User click reload\n    ------------------------------------------------------------- *\/\n    function reloadWindguru2() {\n      loadWindguru2(1);\n    }\n\n    \/\/ Auto-load\n    document.addEventListener(\"DOMContentLoaded\", () => loadWindguru2(1));\n  <\/script>\n<\/div>\n<\/div>\n\n\n\n<style>\n  \/* Gentle pulse animation - reused from previous widgets *\/\n  @keyframes gentlePulse {\n    0%   { transform: scale(1); opacity: 0.5; }\n    44%  { transform: scale(1.05); opacity: 1; }\n    100% { transform: scale(1); opacity: 0.5; }\n  }\n\n  \/* Apply pulse to the emoji only *\/\n  #windguru3-loading .pulse {\n    display: inline-block;\n    animation: gentlePulse 2.8s ease-in-out infinite;\n  }\n\n#windguru3-container {\n  position: relative; \n  min-height: 200px;\n  \/* Add this line: *\/\n  touch-action: pan-x pan-y; \n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n<\/style>\n<div style=\"height: 150px; margin-top:-1px; text-align:center; transform: translateX(-15px);\">\n  <div id=\"windguru3-container\" style=\"position:relative; height: 100%;\">\n\n    <div id=\"windguru3-loading\" style=\"\n  position: absolute; top: 0; left: 0; \n  width: 100%; height: 100%; z-index: 10;\n  display: flex; flex-direction: column; justify-content: center;\n  text-align:center; color:gray; opacity:1;\n  background-color: #EBEBEF;\nfont-size: 16px; \n\">\n      <span class=\"pulse\">&#x1F30A; Reading Madeira Ocean...<br>(loading Wave Forecast) <\/span>\n    <\/div>\n\n    <div id=\"windguru3-error\" style=\"\n      position: absolute; top: 0; left: 0; \n      width: 100%; height: 100%; z-index: 10;\n      display: none; flex-direction: column; justify-content: center;\n      text-align:center; color:black;\n      background-color: #EBEBEF;\n    \">\n      Didn't load Windguru Wave Forecast\n      <button onclick=\"reloadWindguru3()\">Try Again<\/button>\n    <\/div>\n\n    <div id=\"windguru3-widget\" style=\"opacity: 0; transition: opacity 0.6s ease;\"><\/div>\n  <\/div>\n\n  <script>\n    \/* -------------------------------------------------------------\n      Configuration (Specific to Madeira Waves Widget)\n    ------------------------------------------------------------- *\/\n    const W3_TIMEOUT = 8000;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Max wait time per attempt\n    const W3_MAX_ATTEMPTS = 3;\u00a0\u00a0\u00a0\u00a0 \/\/ Retry limit\n    const W3_MIN_LOAD_TIME = 500;\u00a0 \/\/ Minimum loader visible time\n    const W3_SMOOTH_DELAY = 400;\u00a0\u00a0 \/\/ Prevent fast-load flashing\n\n\n    \/* -------------------------------------------------------------\n      Smooth fade-out for loader, and fade-in for widget\n    ------------------------------------------------------------- *\/\n    function fadeOutAndSwap3(loadingEl, widgetEl) {\n      \/\/ 1. Fade out the loader\n      loadingEl.style.transition = \"opacity 0.6s ease\";\n      loadingEl.style.opacity = \"0\";\n\n      \/\/ 2. Fade in the widget\n      widgetEl.style.opacity = \"1\";\n\n      \/\/ 3. Hide loader after transition\n      setTimeout(() => { loadingEl.style.display = \"none\"; }, 600);\n    }\n\n\n    \/* -------------------------------------------------------------\n      Detect iframe \u2192 wait for iframe load \u2192 then smoothing delay\n    ------------------------------------------------------------- *\/\n    function observeWindguruIframeFullyLoaded3(widgetEl, onReady) {\n      const observer = new MutationObserver(() => {\n        const iframe = widgetEl.querySelector(\"iframe\");\n        if (!iframe) return;\n\n        observer.disconnect();\n\n        \/\/ Wait for Windguru iframe internal load\n        iframe.addEventListener(\"load\", () => {\n          \/\/ Extra smoothing to prevent loader flashing\n          setTimeout(onReady, W3_SMOOTH_DELAY);\n        });\n      });\n\n      \/\/ Observe the widget container for children (the iframe) being added\n      observer.observe(widgetEl, { childList: true });\n    }\n\n\n    \/* -------------------------------------------------------------\n      Main loader\n    ------------------------------------------------------------- *\/\n    function loadWindguru3(attempt = 1) {\n      const widgetEl = document.getElementById(\"windguru3-widget\");\n      const loadingEl = document.getElementById(\"windguru3-loading\");\n      const errorEl = document.getElementById(\"windguru3-error\");\n\n      \/\/ Reset UI\n      widgetEl.innerHTML = \"\";\n      widgetEl.style.opacity = \"0\";\n      loadingEl.style.display = \"flex\";\n      loadingEl.style.opacity = \"1\";\n      errorEl.style.display = \"none\";\n\n      let loadComplete = false;\n      const startTime = Date.now();\n\n      \/\/ Setup the observation to handle the successful load\n      observeWindguruIframeFullyLoaded3(widgetEl, () => {\n        if (loadComplete) return;\n        loadComplete = true;\n\n        const remaining = Math.max(0, W3_MIN_LOAD_TIME - (Date.now() - startTime));\n\n        setTimeout(() => fadeOutAndSwap3(loadingEl, widgetEl), remaining);\n\n        console.log(`Windguru 3 (Madeira Waves) fully loaded on attempt ${attempt}`);\n      });\n\n      \/\/ Inject WG script (with a slight delay to ensure the container is ready)\n      setTimeout(() => {\n        const script = document.createElement(\"script\");\n        script.id = \"wg_fwdg_54_84_\" + Date.now(); \/\/ Note the 's=54' (Madeira) and 'm=84' (Waves)\n\n        const args = [\n          \/\/ SITE: 54 (Madeira), MODEL: 84 (Waves)\n          \"s=54\", \"m=84\", \"uid=\" + script.id, \"wj=kmh\", \"tj=c\", \"ts=1\", \"waj=m\", \"tij=cm\",\n          \"odh=0\", \"doh=24\", \"fhours=111\", \"hrsm=3\", \"vt=forecasts\", \"lng=en\",\n          \/\/ Wave parameters from your request\n          \"p=HTSGW,DIRPW\" \n        ];\n\n        script.src = \"https:\/\/www.windguru.cz\/js\/widget.php?\" + args.join(\"&\");\n\n        script.onload = () => {\n          console.log(\"Windguru 3 script loaded \u2014 waiting for iframe\u2026\");\n        };\n\n        widgetEl.appendChild(script);\n\n        \/\/ Fail-safe timeout\n        setTimeout(() => {\n          if (!loadComplete) {\n            console.warn(`Windguru 3 (Madeira Waves) timed out on attempt ${attempt}`);\n\n            if (attempt < W3_MAX_ATTEMPTS) {\n              loadWindguru3(attempt + 1);\n            } else {\n              loadingEl.style.display = \"none\";\n              errorEl.style.display = \"flex\";\n            }\n          }\n        }, W3_TIMEOUT);\n\n      }, 50); \/\/ Small initial delay\n    }\n\n\n    \/* -------------------------------------------------------------\n      User click reload\n    ------------------------------------------------------------- *\/\n    function reloadWindguru3() {\n      loadWindguru3(1);\n    }\n\n    \/\/ Auto-load\n    document.addEventListener(\"DOMContentLoaded\", () => loadWindguru3(1));\n  <\/script>\n<\/div>\n\n\n\n<div style=\"height:4px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!-- Previous ventusky waves map\n<div style=\"margin-top:0px; max-width: 100vh; transform: translateX(-15px);\">\n<div style=\"padding: 0 0 120%; position: relative\">\n<iframe src=\"https:\/\/embed.ventusky.com\/?p=32.69;-16.90;8&l=wave\" style=\"border: 0; position: absolute; left: 0; top: 0; width: 100%; height: 422px\" loading=\"lazy\"><\/iframe>\n<\/div>\n<\/div>\n-->\n\n\n\n<div style=\"height:2px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!-- Previous legend\n<div style=\"text-align: center; margin-top:0px; transform: translateX(-15px)\"><small><i>Waves height & direction forecast animation<br>white wave - wind formed; black - swell<\/i><br>touch map legend to choose imperial\/metric<\/small><\/div>\n-->\n\n\n\n<!--on test below\n<style>\n  \/* This is your first <div> (The Outer Wrapper) *\/\n  .v-wrapper {\n    margin-top: 0px; \n    max-width: 100vh; \n    transform: translateX(-15px);\n    position: relative;\n  }\n\n  \/* This is your second <div> (The Padding\/Ratio) *\/\n  .v-inner {\n    position: relative;\n    padding-bottom: 125%; \/* Mobile Height *\/\n  }\n\n  \/* Desktop Override: Changes 120% to 80% *\/\n  @media (min-width: 768px) {\n    .v-inner {\n      height: 100%;  \/* on desktop, does not shows the map legend *\/\n      padding-bottom: 65%;\n     max-width: 100vh;\n}\n  .v-inner iframe {\nposition: absolute;\nleft: 0; \ntop: 0;\nwidth: 100%; \nheight: 344px;\n    }\n  }\n\n  \/* This is your <iframe> *\/\n  .v-inner iframe {\n    border: 0; \n    position: absolute; \n    left: 0; \n    top: 0; \n    width: 100%; \n    height: 400px; \/* Changed from 100% so that it shows map on mobile *\/\n  }\n\n  \/* Your Caption *\/\n  .v-caption {\n    text-align: center; \n   padding-top: 0px;\n    margin-top: 0px; \n    transform: translateX(-15px);\n  }\n<\/style>\n\n<div class=\"v-wrapper\">\n  <div class=\"v-inner\">\n    <iframe src=\"https:\/\/embed.ventusky.com\/?p=32.69;-16.90;8&l=wave\" loading=\"lazy\"><\/iframe>\n  <\/div>\n<\/div>\n\n<div class=\"v-caption\">\n  <small><i>Waves height & direction forecast animation<br>white wave - wind formed; black - swell<\/i><br>touch map legend to choose imperial\/metric<\/small>\n<\/div>\n-->\n\n\n\n<!-- ventusky direct map url\n<style>\n  \/* Outer Wrapper *\/\n  .v-wrapper {\n    margin-top: 0px; \n    max-width: 100vh; \n    transform: translateX(-15px);\n    position: relative;\n  }\n\n  \/* Container handling the \"Aspect Ratio\" *\/\n  .v-inner {\n    position: relative;\n    width: 100%;\n    padding-bottom: 125%; \/* Mobile: Tall enough for legend *\/\n  }\n\n  \/* Desktop Override *\/\n  @media (min-width: 768px) {\n    .v-inner {\n      \/* Adjust this % specifically to show\/hide the legend on desktop *\/\n      padding-bottom: 80%; \n    }\n  }\n\n  \/* The Iframe: MUST be 100% height to follow the v-inner ratio *\/\n  .v-inner iframe {\n    border: 0; \n    position: absolute; \n    left: 0; \n    top: 0; \n    width: 100%; \n    height: 100% !important; \n  }\n\n  \/* Your Caption *\/\n  .v-caption {\n    text-align: center; \n    margin-top: 10px; \n    transform: translateX(-15px);\n  }\n<\/style>\n\n<div class=\"v-wrapper\">\n  <div class=\"v-inner\">\n    <iframe src=\"https:\/\/www.ventusky.com\/sea-map\/significant-wave-height#p=32.69;-16.88;8\" loading=\"lazy\"><\/iframe>\n  <\/div>\n<\/div>\n\n\n<div class=\"v-caption\">\n  <small>\n    <i>Waves height & direction forecast animation<br>white wave - wind formed; black - swell<\/i><br>\n    touch map legend to choose imperial\/metric\n  <\/small>\n<\/div>\n-->\n\n\n\n<style>\n  \/* Outer Wrapper *\/\n  .v-wrapper {\n    margin-top: 0px; \n    max-width: 100vh; \n    transform: translateX(-15px);\n    position: relative;\n  }\n\n  \/* Container handling the \"Aspect Ratio\" *\/\n  .v-inner {\n    position: relative;\n    width: 100%;\n    padding-bottom: 125%; \/* Mobile: Tall enough for legend *\/\n  }\n\n  \/* Desktop Override *\/\n  @media (min-width: 768px) {\n    .v-inner {\n      \/* Adjust this % specifically to show\/hide the legend on desktop *\/\n      padding-bottom: 80%; \n    }\n  }\n\n  \/* The Iframe: MUST be 100% height to follow the v-inner ratio *\/\n  .v-inner iframe {\n    border: 0; \n    position: absolute; \n    left: 0; \n    top: 0; \n    width: 100%; \n    height: 100% !important; \n  }\n\n  \/* Your Caption *\/\n  .v-caption {\n    text-align: center; \n    margin-top: 10px; \n    transform: translateX(-15px);\n  }\n<\/style>\n\n<div class=\"v-wrapper\">\n  <div class=\"v-inner\">\n    <iframe src=\"https:\/\/embed.ventusky.com\/?p=32.69;-16.90;8&#038;l=wave\" loading=\"lazy\"><\/iframe>\n  <\/div>\n<\/div>\n\n<div class=\"v-caption\">\n  <small>\n    <i>Waves height & direction forecast animation<br>white wave - wind formed; black - swell<\/i><br>\n    touch map legend to choose imperial\/metric\n  <\/small>\n<\/div>\n\n\n\n<div style=\"height:22px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-align-center\" id=\"ship\"><strong>Ships live tracking<\/strong><\/p>\n\n\n\n<div style=\"text-align: center;\">\n\n  <iframe loading=\"lazy\" style=\"margin-top:-2px;margin-left:-25px\" name=\"marinetraffic\" id=\"marinetraffic\"\n          src=\"https:\/\/www.marinetraffic.com\/en\/ais\/embed\/zoom:8\/centery:32.8\/centerx:-16.75\/maptype:2\/shownames:true\/mmsi:0\/shipid:0\/fleet:\/fleet_id:\/vtypes:\/showmenu:\/remember:true\"\n          scrolling=\"no\" frameborder=\"0\"\n          width=\"330\" height=\"555\">\n  <\/iframe>\n<p style=\"margin-left: -25px; font-size: 12px; color: #666; margin-top: 5px;\">\n    <i>You can switch the map to Satellite view in the menu \u29c9\u20df<\/i>\n  <\/p>\n  <button onclick=\"reloadIframe()\" style=\"margin-top: -20px; padding: 5px 15px; cursor: pointer;\">Reload Radar<\/button>\n<\/div>\n\n<script>\n  function reloadIframe() {\n    const iframe = document.getElementById('marinetraffic');\n    \/\/ Save the original src\n    const originalSrc = iframe.src;\n    \/\/ Clear the iframe (optional visual feedback)\n    iframe.src = '';\n    \/\/ Small delay to ensure proper reload\n    setTimeout(() => {\n      \/\/ Restore original source with cache-busting timestamp\n      iframe.src = originalSrc.split('?')[0] + '?timestamp=' + Date.now() + '&' + originalSrc.split('?')[1];\n    }, 50);\n  }\n<\/script>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Vessel Finder widget<\/summary>\n<div style=\"text-align: center;\">\n<iframe loading=\"lazy\" style=\"margin-top:-1px;margin-left:-25px\" src=\"https:\/\/www.vesselfinder.com\/aismap?zoom=9&#038;lat=32.60&#038;lon=-16.91\"\n        width=\"330\" height=\"555\" frameborder=\"0\"><\/iframe>\n<\/div>\n\n\n\n<!-- MarineTraffic Fine tuned position on the live version using the forum link https:\/\/www.marinetraffic.com\/en\/ais\/embed\/zoom:3\/centery:36\/centerx:23\/maptype:4\/shownames:false\/mmsi:0\/shipid:0\/fleet:\/fleet_id:\/vtypes:\/showmenu:\/remember:true\n\n<div style=\"text-align: center;\">\n\n  <iframe loading=\"lazy\" style=\"margin-top:-2px;margin-left:-25px\" name=\"marinetraffic\" id=\"marinetraffic\"\n          src=\"https:\/\/www.marinetraffic.com\/en\/ais\/embed\/widget\/map?lat=32.60&lon=-16.90&zoom=8&maptype=1&shownames=true&remember=true\"\n          scrolling=\"no\" frameborder=\"0\"\n          width=\"330\" height=\"555\">\n  <\/iframe>\n<br>\n  <button onclick=\"reloadIframe()\" style=\"padding: 5px 15px; cursor: pointer;\">Reload Radar<\/button>\n<\/div>\n\n<script>\n  function reloadIframe() {\n    const iframe = document.getElementById('marinetraffic');\n    \/\/ Save the original src\n    const originalSrc = iframe.src;\n    \/\/ Clear the iframe (optional visual feedback)\n    iframe.src = '';\n    \/\/ Small delay to ensure proper reload\n    setTimeout(() => {\n      \/\/ Restore original source with cache-busting timestamp\n      iframe.src = originalSrc.split('?')[0] + '?timestamp=' + Date.now() + '&' + originalSrc.split('?')[1];\n    }, 50);\n  }\n<\/script>\n\n-->\n\n\n\n<!-- MarineTraffic Another test version\n\n<div id=\"marinetraffic_container\" style=\"width:330px; height:555px;\">\n    <script type=\"text\/javascript\">\n        \/\/ Embed Configuration\n        width='330'; \n        height='555'; \n        border='0'; \n        shownames='true'; \n        latitude='33.00';   \/\/ centery\n        longitude='-16.75'; \/\/ centerx\n        zoom='8'; \n        maptype='1';        \/\/ In this specific script, 1 usually triggers Satellite\n        trackvessel='0'; \n        fleet=''; \n    <\/script>\n    <script type=\"text\/javascript\" src=\"https:\/\/www.marinetraffic.com\/js\/embed.js\"><\/script>\n<\/div>\n\n-->\n<\/details>\n<\/div>\n\n\n\n<div style=\"height:9px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-default\"\/>\n\n\n\n<div style=\"height:9px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>Curiosity about tides<\/strong><\/summary>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"epyt-video-wrapper\"><div  style=\"display: block; margin: 0px auto;\"  id=\"_ytid_73627\"  width=\"480\" height=\"270\"  data-origwidth=\"480\" data-origheight=\"270\"  data-relstop=\"1\" data-facadesrc=\"https:\/\/www.youtube.com\/embed\/3RdkXs8BibE?enablejsapi=1&#038;autoplay=0&#038;cc_load_policy=1&#038;cc_lang_pref=en&#038;iv_load_policy=3&#038;loop=0&#038;rel=0&#038;fs=1&#038;playsinline=0&#038;autohide=2&#038;hl=en_US&#038;theme=dark&#038;color=red&#038;controls=1&#038;\" class=\"__youtube_prefs__ epyt-facade epyt-is-override  no-lazyload\" data-vol=\"0\"  data-epautoplay=\"1\" ><img decoding=\"async\" data-spai-excluded=\"true\" class=\"epyt-facade-poster skip-lazy\" loading=\"lazy\"  alt=\"YouTube player\"  src=\"https:\/\/i.ytimg.com\/vi\/3RdkXs8BibE\/hqdefault.jpg\"  \/><button class=\"epyt-facade-play\" aria-label=\"Play\"><svg data-no-lazy=\"1\" height=\"100%\" version=\"1.1\" viewBox=\"0 0 68 48\" width=\"100%\"><path class=\"ytp-large-play-button-bg\" d=\"M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z\" fill=\"#f00\"><\/path><path d=\"M 45,24 27,14 27,34\" fill=\"#fff\"><\/path><\/svg><\/button><\/div><\/div>\n<\/div><\/figure>\n\n\n\n<div style=\"text-align: center;\">\n<a href=\"https:\/\/oceanservice.noaa.gov\/education\/tutorial_tides\/tides06_variations.html\" target=\"blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/cdn.oceanservice.noaa.gov\/oceanserviceprod\/facts\/springtide.gif\" width=\"100%\" height=\"100%\" alt=\"Ocean tides in relation to the sun and moon\"><\/a><\/div>\n<div style=\"margin-top:-1px;margin-left:-2px\" align=\"center\"><sup><small><i><a href=\"https:\/\/oceanservice.noaa.gov\/education\/tutorial_tides\/tides06_variations.html\" target=\"_blank\" rel=\"noopener\">Sun and moon position to the earth influencing tides<\/a><\/i><\/small><\/sup><\/div>\n<\/details>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-default\"\/>\n\n\n\n<div style=\"height:7px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Ocean temperature<\/strong><\/p>\n\n\n\n<div style=\"text-align: center;\">\n<a href=\"https:\/\/seatemperature.info\/funchal-water-temperature.html\" target=\"blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/seatemperature.info\/widget\/17288785907893.png\" alt=\"Sea water temperature\"><\/a><\/div>\n\n\n\n<div style=\"height:7px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator aligncenter has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-align-center\" id=\"solunar\"><strong>Solunar times and cycles<\/strong><\/p>\n\n\n\n<div style=\"height:11px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!--- Source code beginning --->\n\t<!--- Terms of Use: The contained links and texts in the source code\n\tmay not be removed, otherwise the right of use expires. \n\tIn case of desired deviations please contact by mail. \n\tMail address on the homepage.\n\tA free service from https:\/\/www.Der-Mond.de\/ --->\n\t\n<div style=\"text-align: center;\">\n<img decoding=\"async\" border=0 src=\"https:\/\/www.der-mond.de\/feature\/luna.php?version=5&#038;txue=&#038;zeko=1&#038;rand=0&#038;trans=1&#038;julia=0&#038;daem=3&#038;zefu=0&#038;grmo=0&#038;grmoueber=0&#038;txph=0&#038;txmoal=0&#038;txmoph=0&#038;txmobe=0&#038;txmophti=0&#038;txmost=0&#038;txmostau=1&#038;txze=0&#038;zezo=0&#038;zeso=1&#038;format=1&#038;schgr=10&#038;schriftart=OpenSans&#038;schriftschnitt=0&#038;grafikausdehnung=0&#038;grafikpx=200&#038;faan=1&#038;scro=0&#038;scgr=0&#038;scbl=0&#038;hiro=240&#038;higr=240&#038;hibl=240&#038;grsoho=0&#038;grsohoueber=0&#038;soep=0&#038;txsost=0&#038;txsostau=1&#038;geolagr=16&#038;geolami=55&#038;geolase=0&#038;geola=w&#038;geobrgr=32&#038;geobrmi=45&#038;geobrse=0&#038;geobr=n&#038;lang=en\" alt=\"Time detail\" style=\"max-width: 100%\"><\/div>\n\n<!--- End of source code --->\n\n\n\n<!--- Source code beginning --->\n\t<!--- Terms of Use: The contained links and texts in the source code\n\tmay not be removed, otherwise the right of use expires. \n\tIn case of desired deviations please contact by mail. \n\tMail address on the homepage.\n\tA free service from https:\/\/www.Der-Mond.de\/ --->\n\t\n<div style=\"text-align: center;\">\n<img decoding=\"async\" border=0 src=\"https:\/\/www.der-mond.de\/feature\/luna.php?version=5&#038;txue=&#038;zeko=0&#038;rand=0&#038;trans=1&#038;julia=0&#038;daem=3&#038;zefu=0&#038;grmo=0&#038;grmoueber=0&#038;txph=0&#038;txmoal=0&#038;txmoph=0&#038;txmobe=0&#038;txmophti=0&#038;txmost=0&#038;txmostau=1&#038;txze=0&#038;zezo=0&#038;zeso=1&#038;format=1&#038;schgr=14&#038;schriftart=OpenSans&#038;schriftschnitt=0&#038;grafikausdehnung=0&#038;grafikpx=200&#038;faan=1&#038;scro=0&#038;scgr=0&#038;scbl=0&#038;hiro=240&#038;higr=240&#038;hibl=240&#038;grsoho=1&#038;grsohoueber=1&#038;soep=1&#038;txsost=0&#038;txsostau=1&#038;geolagr=16&#038;geolami=55&#038;geolase=0&#038;geola=w&#038;geobrgr=32&#038;geobrmi=45&#038;geobrse=0&#038;geobr=n&#038;lang=en\" alt=\"Sun\" style=\"max-width: 100%\"><\/div>\n\n<!--- End of source code --->\n\n\n\n<!--- Source code beginning --->\n\t<!--- Terms of Use: The contained a links and texts in the source code\n\tmay not be removed, otherwise the right of use expires. \n\tIn case of desired deviations please contact by mail. \n\tMail address on the homepage.\n\tA free service from https:\/\/www.Der-Mond.de\/ --->\n\n<div style=\"text-align: center;\">\n<img decoding=\"async\" border=0 src=\"https:\/\/www.der-mond.de\/feature\/luna.php?version=5&#038;txue=&#038;zeko=0&#038;rand=0&#038;trans=1&#038;julia=0&#038;daem=3&#038;zefu=0&#038;grmo=1&#038;grmoueber=1&#038;txph=1&#038;txmoal=0&#038;txmoph=1&#038;txmobe=1&#038;txmophti=0&#038;txmost=0&#038;txmostau=1&#038;txze=1&#038;zezo=0&#038;zeso=1&#038;format=0&#038;schgr=14&#038;schriftart=OpenSans&#038;schriftschnitt=0&#038;grafikausdehnung=0&#038;grafikpx=200&#038;faan=1&#038;scro=0&#038;scgr=0&#038;scbl=0&#038;hiro=240&#038;higr=240&#038;hibl=240&#038;grsoho=0&#038;grsohoueber=0&#038;soep=0&#038;txsost=0&#038;txsostau=1&#038;geolagr=16&#038;geolami=55&#038;geolase=0&#038;geola=w&#038;geobrgr=32&#038;geobrmi=45&#038;geobrse=0&#038;geobr=n&#038;lang=en\" alt=\"The moon - mysterious companion of our earth\" style=\"max-width: 100%\"><\/div>\n<div style=\"margin-top:-10px;margin-left:-2px\" align=\"center\"><small><i><a href=\"https:\/\/www.der-mond.de\/\" target=\"_blank\" rel=\"noopener\">source<\/a><\/i><\/small><\/div>\n\n<!--- End of source code --->\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"text-align: center; touch-action: pan-x; \n    -webkit-overflow-scrolling: touch;\">\n  <iframe id=\"sunmap\" \n          width=\"100%\" height=\"303\" frameborder=\"0\" style=\"border:0;\"><\/iframe>\n\n  <div align=\"center\" style=\"margin-top:-10px;margin-left:-1px\">\n    <sup><small><i>\n      <a href=\"https:\/\/www.timeanddate.com\/worldclock\/sunearth.html\" target=\"_blank\" rel=\"noopener\">\n        Sun and moon actual position in UTC - source\n      <\/a>\n    <\/i><\/small><\/sup>\n  <\/div>\n<\/div>\n\n<script>\n  const iframe = document.getElementById('sunmap');\n  const url = \"https:\/\/www.timeanddate.com\/scripts\/sunmap.php?iso=now&earth=0&mobile=1\";\n  iframe.src = url + \"&cachebuster=\" + new Date().getTime();\n<\/script>\n\n\n\n<div style=\"text-align: center;\">\n<iframe loading=\"lazy\" src=\"https:\/\/en.tutiempo.net\/astronomy\/sun-earth-moon-3d.html\" width=\"100%\" height=\"444\" frameBorder=\"0\" style=\"border: 0;\"><\/iframe>\n<div align=\"center\">\n<sup><small><i><a href=\"https:\/\/en.tutiempo.net\/astronomy\/sun-earth-moon-3d.html\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/i><\/small><\/sup><sup><small><i> \/ <\/i><\/small><\/sup>\n<sup><small><i><a href=\"https:\/\/theskylive.com\/planetarium#ra|20.84713947453458|dec|64.71224202770965|fov|80\" target=\"_blank\" rel=\"noopener\">What's in the sky tonight<\/a><\/i><\/small><\/sup>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Tides | Waves | Ships | Sun\/Moon Sun and moon times and cycles and real time position above the Earth.Tides evolution and waves forecast. You can also find what&#8217;s in the sky tonight Golden Hour Live Areeiro night sky \u21ba Refresh Live View Live image by the Astronomy Association: Sandro Correia Madeira Solar Tracker Loading [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"slim_seo":{"title":"Sun and Sea - Madeira Island weather","description":"Sun and moon times and cycles with real time position above the Earth. Tides evolution and waves forecast. You can also find what\u2019s in the sky tonight"},"footnotes":""},"class_list":["post-403","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/pages\/403","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/comments?post=403"}],"version-history":[{"count":596,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/pages\/403\/revisions"}],"predecessor-version":[{"id":10785,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/pages\/403\/revisions\/10785"}],"wp:attachment":[{"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/media?parent=403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}