{"id":5209,"date":"2025-10-06T16:57:02","date_gmt":"2025-10-06T15:57:02","guid":{"rendered":"https:\/\/paragliding-in-madeira.com\/weather\/?p=5209"},"modified":"2025-10-15T14:13:14","modified_gmt":"2025-10-15T13:13:14","slug":"from-vision-to-reality-a-small-moment-of-magic","status":"publish","type":"post","link":"https:\/\/paragliding-in-madeira.com\/weather\/2025\/10\/06\/from-vision-to-reality-a-small-moment-of-magic\/","title":{"rendered":"From Vision to Reality: A Small Moment of Magic"},"content":{"rendered":"\n<p>There are moments in life when <strong>everything quietly lines up<\/strong>, the outer world and the inner world, the dreams we\u2019ve carried for years and the reality that slowly, almost invisibly, forms around them.<\/p>\n\n\n\n<p>Today, I lived one of those moments.<\/p>\n\n\n\n<p>When I first launched the weather page on this site, I wrote on the homepage that \u201c<em>this will become an <strong>app<\/strong> \u2014 a way to simplify weather checking and make flights more relaxed.<\/em>\u201d<\/p>\n\n\n\n<p>At the time, it felt like a <strong>seed<\/strong> I planted into the universe. <\/p>\n\n\n\n<p>I had no idea how it would happen. <\/p>\n\n\n\n<p><em><strong>I imagined it would take a team of developers, or years of me learning to code.<\/strong><\/em><\/p>\n\n\n\n<p>But I wrote it anyway, because<strong> I believed in the vision<\/strong>.<\/p>\n\n\n\n<p>Fast forward to now. <\/p>\n\n\n\n<p>Through patience, curiosity, and the quiet support of tools and people who appeared at the right time, that seed has sprouted. <\/p>\n\n\n\n<p>The site is now a <strong>Progressive Web App (PWA)<\/strong>, meaning you can install it on your phone with a single tap and experience it like a clean, beautiful <strong>app<\/strong>. <\/p>\n\n\n\n<p>No app store. No coding marathon. Just <strong>intention<\/strong> and flow turning into reality.<\/p>\n\n\n\n<p>And as I was polishing the last details, the button color, the styling, the final touches, something happened. <\/p>\n\n\n\n<p>I was listening to music on discover mode on Audiomack, and a song began to play. <\/p>\n\n\n\n<p>The artist: <strong>Novo Amor<\/strong> (\u201cNew Love\u201d). The title of the song: <strong>Weather<\/strong>.<\/p>\n\n\n\n<p>I just sat there with tears in my eyes. Goosebumps. Gratitude. <\/p>\n\n\n\n<p>Because at that moment, it felt like life was whispering back: <\/p>\n\n\n\n<p>&#8211; <em>yes, I see you. And what you are doing, matters.<\/em><\/p>\n\n\n\n<p>I don\u2019t know if anyone else will feel this moment the way I did. <\/p>\n\n\n\n<p><strong><em>But I know it will stay with me.<\/em><\/strong><\/p>\n\n\n\n<p>A vision that once felt far away is now a living, breathing thing in people\u2019s hands.<\/p>\n\n\n\n<p>Sometimes, you don\u2019t need a grand announcement. <\/p>\n\n\n\n<p><strong><em>Sometimes, the deepest celebration is just pausing, breathing, and feeling the beauty of what has unfolded.<\/em><\/strong><\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>To everyone who has supported me along the way, to friends, to tools, to life itself, thank you.<\/p>\n\n\n\n<p><strong>The Weather App is here. <\/strong><\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n\n    <div class=\"pwa-install-wrapper\" style=\"width: fit-content; margin: 0 auto;\">\n       \n        <style>\n            \/* Button styling and initial state (hidden) *\/\n            .pwa-install-button-custom {\n                \/* HIDDEN BY DEFAULT (IMPORTANT!) *\/\n                display: none; \n                opacity: 0;\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0transition: opacity 1.5s ease-in;\n                \/* Your custom styling *\/\n                background-color: #37505d;\n                color: white;\n                padding: 10px 20px;\n                border-radius: 5px;\n                border: none;\n                font-weight: bold;\n                cursor: pointer;\n                font-size: 16px;\n                \/* Ensure it sits above other content if needed, but not fixed *\/\n                z-index: 10;\n                margin: 10px 0; \/* Add some margin for content flow *\/\n            }\n\n            \/* Show helper class - controlled by JavaScript *\/\n            .pwa-install-button-custom.show {\n                display: inline-block;\n                opacity: 1;\n            }\n        <\/style>\n\n        <button class=\"installAppButton pwa-install-button-custom\">\n            \ud83d\udcf2 Install the Weather App\n        <\/button>\n        \n        <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            function isMobileDevice() {\n                \/\/ Detects Android, iPhone, iPad, iPod\n                \/\/ NOTE: iOS does not support beforeinstallprompt. It will still skip.\n                return \/android|iphone|ipad|ipod\/i.test(navigator.userAgent); \n            }\n        \n            \/\/ Only proceed on mobile devices that are NOT iOS\n            if (!isMobileDevice() || \/iphone|ipad|ipod\/i.test(navigator.userAgent)) {\n                return;\n            }\n            \n            let deferredPrompt;\n            \/\/ Use the generic class defined in the original code\n            const installButtons = document.querySelectorAll('.installAppButton'); \n            \n            if (installButtons.length === 0) return;\n        \n            \/\/ Detect when PWA can be installed\n            window.addEventListener('beforeinstallprompt', (e) => {\n                e.preventDefault();\n                deferredPrompt = e;\n        \n                \/\/ Show all buttons with fade-in using the \"show\" class\n                installButtons.forEach(btn => btn.classList.add('show'));\n            });\n        \n            \/\/ Handle button clicks\n            installButtons.forEach(btn => btn.addEventListener('click', async () => {\n                if (!deferredPrompt) return;\n        \n                btn.classList.remove('show'); \/\/ hide button immediately\n                deferredPrompt.prompt();       \/\/ trigger install\n        \n                const { outcome } = await deferredPrompt.userChoice;\n                console.log(`User ${outcome === 'accepted' ? 'accepted' : 'dismissed'} the install prompt`);\n        \n                deferredPrompt = null;\n            }));\n        \n            \/\/ Hide buttons if app is already installed\n            window.addEventListener('appinstalled', () => {\n                installButtons.forEach(btn => btn.classList.remove('show'));\n                console.log('App installed successfully');\n            });\n        });\n        <\/script>\n    <\/div>\n    \n\n\n\n<p>It\u2019s simple. It\u2019s clean. It&#8217;s alive. It\u2019s a <strong><em>magic window into the sky<\/em><\/strong>.<\/p>\n\n\n\n<p>And it\u2019s only the beginning.<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-left\">R\u00faben GT<\/p>\n\n\n\n<div style=\"height:49px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"position:relative; width:100%; padding-top:56.25%; margin:0 auto;\">\n    <iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/Z8cYIvxtr88?si=9mtZT9Fe45AnSLc9&#038;rel=0\"\n            style=\"position:absolute; top:0; left:0; width:100%; height:100%;\"\n            frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen>\n    <\/iframe>\n  <\/div>\n\n\n\n<div style=\"height:49px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>There are moments in life when everything quietly lines up, the outer world and the inner world, the dreams we\u2019ve carried for years and the reality that slowly, almost invisibly, forms around them. Today, I lived one of those moments. When I first launched the weather page on this site, I wrote on the homepage [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5215,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"slim_seo":{"title":"From Vision to Reality: A Small Moment of Magic","description":"There are moments in life when everything quietly lines up, the outer world and the inner world, the dreams carried with intention slowly become reality."},"footnotes":""},"categories":[1,15],"tags":[20,21,19,13,16,17,18,14],"class_list":["post-5209","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-project","category-weather-app","tag-forecast","tag-live-weather","tag-madeira-island","tag-madeira-island-weather","tag-origens","tag-ruben-gt","tag-weather-app","tag-weather-stations"],"_links":{"self":[{"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/posts\/5209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/types\/post"}],"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=5209"}],"version-history":[{"count":6,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/posts\/5209\/revisions"}],"predecessor-version":[{"id":5424,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/posts\/5209\/revisions\/5424"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/media\/5215"}],"wp:attachment":[{"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/media?parent=5209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/categories?post=5209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/paragliding-in-madeira.com\/weather\/wp-json\/wp\/v2\/tags?post=5209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}