1 2<!DOCTYPE HTML> 3<html lang="en"> 4<head> 5 <meta charset="utf-8"> 6 <title id="title">PTMSC - Portimão Surf Clube</title> <meta name="description" content="Discover inclusive surf lessons in Portimão, Algarve with national champion Francisco Canelas. Surf, skate, bodyboard & SUP experiences. Join the community today!" /> 7 <meta property="og:url" content="https://www.portimaosurfclube.pt/" /> 8 <meta property="og:type" content="website" /> 9 <meta property="og:title" content="PTMSC - Portimão Surf Clube" /> 10 <meta property="og:description" content="Discover inclusive surf lessons in Portimão, Algarve with national champion Francisco Canelas. Surf, skate, bodyboard & SUP experiences. Join the community today!" /> 11 <meta property="fb:app_id" content="1885501691506569"> 12 <meta property="fb:admins" content="682149650"> 13 14 <link rel="preconnect" href="https://use.typekit.net" crossorigin> 15 <link rel="preconnect" href="https://cloudflarestream.com" crossorigin> 16 17 <meta property="og:image" content="https://www.portimaosurfclube.pt/_design/PTMSC-open-graph.jpg" /> 18<meta name="twitter:card" content="summary_large_image"> 19<meta name="twitter:site" content="@portimaosurfclube"> 20<meta name="twitter:creator" content="@codeshore"> 21<meta name="twitter:title" content="PTMSC - Portimão Surf Clube"> 22<meta name="twitter:description" content="Discover inclusive surf lessons in Portimão, Algarve with national champion Francisco Canelas. Surf, skate, bodyboard & SUP experiences. Join the community today!"> 23<meta name="twitter:image" content="https://www.portimaosurfclube.pt/_design/PTMSC-open-graph.jpg"> 24 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no"> 25 26
26<script src="https://www.portimaosurfclube.pt/_jquery/jquery-3.5.1.min.js"></script>
26 27 28
28<script src="https://algarve.media/_scroll-reveal/scroll-reveal.js"></script>
28 29 <link href="https://algarve.media/_scroll-reveal/scroll-reveal.css" rel="stylesheet"> 30 31 <link href="//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet"> 32 <link href="https://www.portimaosurfclube.pt/_font-awesome/css/all.css" rel="stylesheet"> 33 <!-- 34 <link href="https://www.portimaosurfclube.pt/_bootstrap/bootstrap.min.css" rel="stylesheet"> 35
35<script src="https://www.portimaosurfclube.pt/_bootstrap/bootstrap.bundle.min.js"></script>
35 36 --> 37 <link 38 href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" 39 rel="stylesheet" 40 integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" 41 crossorigin="anonymous"> 42
42<script 43 src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" 44 integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" 45 crossorigin="anonymous"></script>
45 46 47 <meta name="apple-mobile-web-app-title" content="PTMSC - Portimão Surf Clube" /> 48 <link rel="shortcut icon" href="https://www.portimaosurfclube.pt/_design/favicon/favicon.ico" /> 49 <link rel="icon" href="https://www.portimaosurfclube.pt/_design/favicon/majak.svg" type="image/svg+xml" /> 50 <link rel="apple-touch-icon" sizes="57x57" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-57x57.png"> 51 <link rel="apple-touch-icon" sizes="60x60" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-60x60.png"> 52 <link rel="apple-touch-icon" sizes="72x72" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-72x72.png"> 53 <link rel="apple-touch-icon" sizes="76x76" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-76x76.png"> 54 <link rel="apple-touch-icon" sizes="114x114" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-114x114.png"> 55 <link rel="apple-touch-icon" sizes="120x120" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-120x120.png"> 56 <link rel="apple-touch-icon" sizes="144x144" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-144x144.png"> 57 <link rel="apple-touch-icon" sizes="152x152" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-152x152.png"> 58 <link rel="apple-touch-icon" sizes="180x180" href="https://www.portimaosurfclube.pt/_design/favicon/apple-icon-180x180.png"> 59 <link rel="icon" type="image/png" sizes="192x192" href="https://www.portimaosurfclube.pt/_design/favicon/android-icon-192x192.png"> 60 <link rel="icon" type="image/png" sizes="32x32" href="https://www.portimaosurfclube.pt/_design/favicon/favicon-32x32.png"> 61 <link rel="icon" type="image/png" sizes="96x96" href="https://www.portimaosurfclube.pt/_design/favicon/favicon-96x96.png"> 62 <link rel="icon" type="image/png" sizes="16x16" href="https://www.portimaosurfclube.pt/_design/favicon/favicon-16x16.png"> 63 <link rel="manifest" href="https://www.portimaosurfclube.pt/_design/favicon/manifest.json"> 64 <meta name="msapplication-TileColor" content="#ffffff"> 65 <meta name="msapplication-TileImage" content="https://www.portimaosurfclube.pt/_design/favicon/ms-icon-144x144.png"> 66 <meta name="theme-color" content="#ffffff"> 67 68 <style> 69 </style> 70 71 72
72<script type="text/javascript"> 73 var waitForFinalEvent = (function () { 74 var timers = {}; 75 return function (callback, ms, uniqueId) { 76 if (!uniqueId) { 77 uniqueId = "rockandroll_179145064716677289"; 78 } 79 if (timers[uniqueId]) { 80 clearTimeout (timers[uniqueId]); 81 } 82 timers[uniqueId] = setTimeout(callback, ms); 83 }; 84 })(); 85 86 87 var isMobile = false; 88 $(function () { 89 isMobile = /iPhone|iPad|iPod|Android|BlackBerry|IEMobile|Opera Mini/i 90 .test(navigator.userAgent); 91 92 if (isMobile || $(window).width() < 992) { 93 $("body").addClass("mobile"); 94 } else { 95 $("body").addClass("desktop"); 96 } 97 }); 98 99 //alert("Device Type Detected: " + navigator.maxTouchPoints); 100 101 102 103 // device detection 104 /* 105 if() { 106 isMobile = true; 107 $("body").addClass("mobile"); 108 } else { 109 $("body").addClass("desktop"); 110 } 111 */ 112 113 114 $(function(){ 115 116 $('[data-remove-class]').each(function(){ 117 118 //$(this).parents('div').removeClass($(this).data("remove-class")); 119 //$(this).removeClass($(this).data("remove-class")); 120 121 }); 122 123 124 $('[data-parent-href]').each(function(){ 125 126 $(this).parent('div').mouseover(function(){ 127 $(this).css("cursor","pointer"); 128 }); 129 130 $(this).click(function(){ 131 window.location=$(this).data("parent-href"); 132 }); 133 134 }); 135 136 $('[data-href]').each(function(){ 137 138 $(this).mouseover(function(){ 139 $(this).css("cursor","pointer"); 140 }); 141 142 $(this).click(function(){ 143 window.location=$(this).data("href"); 144 }); 145 146 }); 147 148 // Every time a modal is shown, if it has an autofocus element, focus on it. 149 $('.modal').on('shown.bs.modal', function() { 150 $(this).find('[autofocus]').focus(); 151 }); 152 }); 153 </script>
153 154
154<script type="text/javascript"> 155 var Latinise={};Latinise.latin_map={"Ã":"A","Ä":"A","Ắ":"A","Ặ":"A","Ằ":"A","Ẳ":"A","Ẵ":"A","Ç":"A","Ã":"A","Ấ":"A","Ậ":"A","Ầ":"A","Ẩ":"A","Ẫ":"A","Ã":"A","Ç":"A","Ȧ":"A","Ç ":"A","Ạ":"A","È":"A","Ã":"A","Ả":"A","È":"A","Ä":"A","Ä":"A","à ":"A","Ǻ":"A","á¸":"A","Ⱥ":"A","Ã":"A","ê²":"AA","Ã":"AE","Ǽ":"AE","Ç¢":"AE","ê´":"AO","ê¶":"AU","ê¸":"AV","êº":"AV","ê¼":"AY","á¸":"B","á¸":"B","Æ":"B","á¸":"B","É":"B","Æ":"B","Ä":"C","Ä":"C","Ã":"C","á¸":"C","Ä":"C","Ä":"C","Æ":"C","È»":"C","Ä":"D","á¸":"D","á¸":"D","á¸":"D","á¸":"D","Æ":"D","á¸":"D","Dz":"D","Ç ":"D","Ä":"D","Æ":"D","DZ":"DZ","Ç":"DZ","Ã":"E","Ä":"E","Ä":"E","Ȩ":"E","á¸":"E","Ã":"E","Ế":"E","á»":"E","á»":"E","á»":"E","á»":"E","á¸":"E","Ã":"E","Ä":"E","Ẹ":"E","È":"E","Ã":"E","Ẻ":"E","È":"E","Ä":"E","á¸":"E","á¸":"E","Ä":"E","É":"E","Ẽ":"E","á¸":"E","êª":"ET","á¸":"F","Æ":"F","Ç´":"G","Ä":"G","Ǧ":"G","Ä¢":"G","Ä":"G","Ä ":"G","Æ":"G","Ḡ":"G","Ǥ":"G","Ḫ":"H","È":"H","Ḩ":"H","Ĥ":"H","â±§":"H","Ḧ":"H","Ḣ":"H","Ḥ":"H","Ħ":"H","Ã":"I","Ĭ":"I","Ç":"I","Ã":"I","Ã":"I","Ḯ":"I","İ":"I","á»":"I","È":"I","Ã":"I","á»":"I","È":"I","Ī":"I","Ä®":"I","Æ":"I","Ĩ":"I","Ḭ":"I","ê¹":"D","ê»":"F","ê½":"G","ê":"R","ê":"S","ê":"T","ê¬":"IS","Ä´":"J","É":"J","Ḱ":"K","Ǩ":"K","Ķ":"K","Ⱪ":"K","ê":"K","Ḳ":"K","Æ":"K","Ḵ":"K","ê":"K","ê":"K","Ĺ":"L","Ƚ":"L","Ľ":"L","Ä»":"L","Ḽ":"L","Ḷ":"L","Ḹ":"L","â± ":"L","ê":"L","Ḻ":"L","Ä¿":"L","â±¢":"L","Ç":"L","Å":"L","Ç":"LJ","Ḿ":"M","á¹":"M","á¹":"M","â±®":"M","Å":"N","Å":"N","Å ":"N","á¹":"N","á¹":"N","á¹":"N","Ǹ":"N","Æ":"N","á¹":"N","È ":"N","Ç":"N","Ã":"N","Ç":"NJ","Ã":"O","Å":"O","Ç":"O","Ã":"O","á»":"O","á»":"O","á»":"O","á»":"O","á»":"O","Ã":"O","Ȫ":"O","È®":"O","Ȱ":"O","á»":"O","Å":"O","È":"O","Ã":"O","á»":"O","Æ ":"O","á»":"O","Ợ":"O","á»":"O","á»":"O","á» ":"O","È":"O","ê":"O","ê":"O","Å":"O","á¹":"O","á¹":"O","Æ":"O","Ǫ":"O","Ǭ":"O","Ã":"O","Ǿ":"O","Ã":"O","á¹":"O","á¹":"O","Ȭ":"O","Æ¢":"OI","ê":"OO","Æ":"E","Æ":"O","È¢":"OU","á¹":"P","á¹":"P","ê":"P","Ƥ":"P","ê":"P","â±£":"P","ê":"P","ê":"Q","ê":"Q","Å":"R","Å":"R","Å":"R","á¹":"R","á¹":"R","á¹":"R","È":"R","È":"R","á¹":"R","É":"R","Ɽ":"R","ê¾":"C","Æ":"E","Å":"S","Ṥ":"S","Å ":"S","Ṧ":"S","Å":"S","Å":"S","È":"S","á¹ ":"S","á¹¢":"S","Ṩ":"S","Ť":"T","Å¢":"T","á¹°":"T","È":"T","Ⱦ":"T","Ṫ":"T","Ṭ":"T","Ƭ":"T","á¹®":"T","Æ®":"T","Ŧ":"T","Ɐ":"A","ê":"L","Æ":"M","É ":"V","ê¨":"TZ","Ã":"U","Ŭ":"U","Ç":"U","Ã":"U","á¹¶":"U","Ã":"U","Ç":"U","Ç":"U","Ç":"U","Ç":"U","á¹²":"U","Ụ":"U","Ű":"U","È":"U","Ã":"U","Ủ":"U","Ư":"U","Ứ":"U","á»°":"U","Ừ":"U","Ử":"U","á»®":"U","È":"U","Ū":"U","Ṻ":"U","Ų":"U","Å®":"U","Ũ":"U","Ṹ":"U","á¹´":"U","ê":"V","á¹¾":"V","Ʋ":"V","á¹¼":"V","ê ":"VY","áº":"W","Å´":"W","áº":"W","áº":"W","áº":"W","áº":"W","â±²":"W","áº":"X","áº":"X","Ã":"Y","Ŷ":"Y","Ÿ":"Y","áº":"Y","á»´":"Y","Ỳ":"Y","Ƴ":"Y","á»¶":"Y","Ỿ":"Y","Ȳ":"Y","É":"Y","Ỹ":"Y","Ź":"Z","Ž":"Z","áº":"Z","Ⱬ":"Z","Å»":"Z","áº":"Z","Ȥ":"Z","áº":"Z","Ƶ":"Z","IJ":"IJ","Å":"OE","á´":"A","á´":"AE","Ê":"B","á´":"B","á´":"C","á´ ":"D","á´":"E","ê°":"F","É¢":"G","Ê":"G","Ê":"H","ɪ":"I","Ê":"R","á´":"J","á´":"K","Ê":"L","á´":"L","á´":"M","É´":"N","á´":"O","ɶ":"OE","á´":"O","á´":"OU","á´":"P","Ê":"R","á´":"N","á´":"R","ê±":"S","á´":"T","â±»":"E","á´":"R","á´":"U","á´ ":"V","á´¡":"W","Ê":"Y","á´¢":"Z","á":"a","Ä":"a","ắ":"a","ặ":"a","ằ":"a","ẳ":"a","ẵ":"a","Ç":"a","â":"a","ấ":"a","áº":"a","ầ":"a","ẩ":"a","ẫ":"a","ä":"a","Ç":"a","ȧ":"a","Ç¡":"a","ạ":"a","È":"a","à ":"a","ả":"a","È":"a","Ä":"a","Ä ":"a","á¶":"a","áº":"a","Ã¥":"a","Ç»":"a","á¸":"a","â±¥":"a","ã":"a","ê³":"aa","æ":"ae","ǽ":"ae","Ç£":"ae","êµ":"ao","ê·":"au","ê¹":"av","ê»":"av","ê½":"ay","á¸":"b","Ḡ":"b","É":"b","á¸":"b","ᵬ":"b","á¶":"b","Æ":"b","Æ":"b","ɵ":"o","Ä":"
155c","Ä":"c","ç":"c","á¸":"c","Ä":"c","É":"c","Ä":"c","Æ":"c","ȼ":"c","Ä":"d","á¸":"d","á¸":"d","È¡":"d","á¸":"d","á¸":"d","É":"d","á¶":"d","á¸":"d","áµ":"d","á¶":"d","Ä":"d","É":"d","Æ":"d","ı":"i","È·":"j","É":"j","Ê":"j","dz":"dz","Ç":"dz","é":"e","Ä":"e","Ä":"e","È©":"e","á¸":"e","ê":"e","ế":"e","á»":"e","á»":"e","á»":"e","á» ":"e","á¸":"e","ë":"e","Ä":"e","ẹ":"e","È ":"e","è":"e","ẻ":"e","È":"e","Ä":"e","á¸":"e","á¸":"e","ⱸ":"e","Ä":"e","á¶":"e","É":"e","ẽ":"e","á¸":"e","ê«":"et","á¸":"f","Æ":"f","áµ®":"f","á¶":"f","ǵ":"g","Ä":"g","ǧ":"g","Ä£":"g","Ä":"g","Ä¡":"g","É ":"g","ḡ":"g","á¶":"g","Ç¥":"g","ḫ":"h","È":"h","ḩ":"h","Ä¥":"h","ⱨ":"h","ḧ":"h","ḣ":"h","ḥ":"h","ɦ":"h","áº":"h","ħ":"h","Æ":"hv","Ã":"i","Ä":"i","Ç":"i","î":"i","ï":"i","ḯ":"i","á»":"i","È":"i","ì":"i","á»":"i","È":"i","Ä«":"i","į":"i","á¶":"i","ɨ":"i","Ä©":"i","á¸":"i","êº":"d","ê¼":"f","áµ¹":"g","ê":"r","ê ":"s","ê":"t","ê":"is","ǰ":"j","ĵ":"j","Ê":"j","É":"j","ḱ":"k","Ç©":"k","Ä·":"k","ⱪ":"k","ê":"k","ḳ":"k","Æ":"k","ḵ":"k","á¶":"k","ê":"k","ê ":"k","ĺ":"l","Æ":"l","ɬ":"l","ľ":"l","ļ":"l","ḽ":"l","È´":"l","ḷ":"l","ḹ":"l","ⱡ":"l","ê":"l","ḻ":"l","Å":"l","É«":"l","á¶ ":"l","É":"l","Å":"l","Ç":"lj","Å¿":"s","áº":"s","áº":"s","áº":"s","ḿ":"m","á¹":"m","á¹":"m","ɱ":"m","ᵯ":"m","á¶":"m","Å":"n","Å":"n","Å":"n","á¹":"n","ȵ":"n","á¹ ":"n","á¹":"n","ǹ":"n","ɲ":"n","á¹":"n","Æ":"n","áµ°":"n","á¶":"n","ɳ":"n","ñ":"n","Ç":"nj","ó":"o","Å":"o","Ç":"o","ô":"o","á»":"o","á»":"o","á»":"o","á»":"o","á»":"o","ö":"o","È«":"o","ȯ":"o","ȱ":"o","á»":"o","Å":"o","È":"o","ò":"o","á»":"o","Æ¡":"o","á»":"o","ợ":"o","á»":"o","á»":"o","ỡ":"o","È":"o","ê":"o","ê":"o","ⱺ":"o","Å":"o","á¹":"o","á¹":"o","Ç«":"o","Ç":"o","ø":"o","Ç¿":"o","õ":"o","á¹":"o","á¹":"o","È":"o","Æ£":"oi","ê":"oo","É":"e","á¶":"e","É":"o","á¶":"o","È£":"ou","á¹":"p","á¹":"p","ê":"p","Æ¥":"p","áµ±":"p","á¶":"p","ê":"p","áµ½":"p","ê":"p","ê":"q","Ê ":"q","É":"q","ê":"q","Å":"r","Å":"r","Å":"r","á¹":"r","á¹":"r","á¹":"r","È":"r","ɾ":"r","áµ³":"r","È":"r","á¹":"r","ɼ":"r","áµ²":"r","á¶":"r","É":"r","ɽ":"r","â":"c","ê¿":"c","É":"e","É¿":"r","Å":"s","á¹¥":"s","Å¡":"s","á¹§":"s","Å":"s","Å":"s","È":"s","ṡ":"s","á¹£":"s","ṩ":"s","Ê":"s","áµ´":"s","á¶":"s","È¿":"s","É¡":"g","á´":"o","á´":"o","á´":"u","Å¥":"t","Å£":"t","á¹±":"t","È":"t","ȶ":"t","áº":"t","ⱦ":"t","ṫ":"t","á¹":"t","Æ":"t","ṯ":"t","áµµ":"t","Æ«":"t","Ê":"t","ŧ":"t","ᵺ":"th","É":"a","á´":"ae","Ç":"e","áµ·":"g","É¥":"h","Ê®":"h","ʯ":"h","á´":"i","Ê":"k","ê":"l","ɯ":"m","ɰ":"m","á´":"oe","ɹ":"r","É»":"r","ɺ":"r","â±¹":"r","Ê":"t","Ê":"v","Ê":"w","Ê":"y","ê©":"tz","ú":"u","Å":"u","Ç":"u","û":"u","á¹·":"u","ü":"u","Ç":"u","Ç":"u","Ç":"u","Ç":"u","á¹³":"u","ụ":"u","ű":"u","È":"u","ù":"u","á»§":"u","ư":"u","ứ":"u","á»±":"u","ừ":"u","á»":"u","ữ":"u","È":"u","Å«":"u","á¹»":"u","ų":"u","á¶":"u","ů":"u","Å©":"u","á¹¹":"u","á¹µ":"u","ᵫ":"ue","ê¸":"um","â±´":"v","ê":"v","ṿ":"v","Ê":"v","á¶":"v","â±±":"v","á¹½":"v","ê¡":"vy","áº":"w","ŵ":"w","Ạ":"w","áº":"w","áº":"w","áº":"w","â±³":"w","áº":"w","áº":"x","áº":"x","á¶":"x","ý":"y","Å·":"y","ÿ":"y","áº":"y","ỵ":"y","ỳ":"y","Æ´":"y","á»·":"y","ỿ":"y","ȳ":"y","áº":"y","É":"y","ỹ":"y","ź":"z","ž":"z","áº":"z","Ê":"z","ⱬ":"z","ż":"z","áº":"z","È¥":"z","áº":"z","áµ¶":"z","á¶":"z","Ê":"z","ƶ":"z","É":"z","ï¬":"ff","ï¬":"ffi","ï¬":"ffl","ï¬":"fi","ï¬":"fl","ij":"ij","Å":"oe","ï¬":"st","â":"a","â":"e","áµ¢":"i","â±¼":"j","â":"o","áµ£":"r","ᵤ":"u","áµ¥":"v","â":"x"}; 156 157String.prototype.latinise=function(){return this.replace(/[^A-Za-z0-9\[\] ]/g,function(a){return Latinise.latin_map[a]||a})}; 158String.prototype.latinize=String.prototype.latinise; 159String.prototype.isLatin=function(){return this==this.latinise()} 160 161</script>
161<link href="https://www.portimaosurfclube.pt/_css/style.css?v=1.0.1.3.4.1791450647" rel="stylesheet"><link href="https://www.portimaosurfclube.pt/_css/custom.css?v=1.0.4" rel="stylesheet"> 162
162<script type="text/javascript"> 163 164 function darken_screen(yesno){ 165 if( yesno == true ){ 166 document.querySelector('.screen-darken').classList.add('active'); 167 } 168 else if(yesno == false){ 169 document.querySelector('.screen-darken').classList.remove('active'); 170 } 171 } 172 173 function close_offcanvas(){ 174 darken_screen(false); 175 document.querySelector('.mobile-offcanvas.show').classList.remove('show'); 176 document.body.classList.remove('offcanvas-active'); 177 } 178 179 function show_offcanvas(offcanvas_id){ 180 darken_screen(true); 181 document.getElementById(offcanvas_id).classList.add('show'); 182 document.body.classList.add('offcanvas-active'); 183 } 184 185 document.addEventListener("DOMContentLoaded", function(){ 186 document.querySelectorAll('[data-trigger]').forEach(function(everyelement){ 187 188 let offcanvas_id = everyelement.getAttribute('data-trigger'); 189 190 everyelement.addEventListener('click', function (e) { 191 e.preventDefault(); 192 show_offcanvas(offcanvas_id); 193 $('#whatsapp-chat-widget').fadeOut(); 194 }); 195 }); 196 197 document.querySelectorAll('.btn-close').forEach(function(everybutton){ 198 199 everybutton.addEventListener('click', function (e) { 200 e.preventDefault(); 201 close_offcanvas(); 202 $('#whatsapp-chat-widget').fadeIn(); 203 }); 204 }); 205 206 document.querySelector('.screen-darken').addEventListener('click', function(event){ 207 close_offcanvas(); 208 }); 209 210 }); 211 // DOMContentLoaded end 212 213 $(document).ready(function(){ 214 $('[data-bs-toggle="tooltip"]').tooltip(); 215 }); 216 217 function blinkValidation(input_selector,alert_value) { 218 var input_selector = $(input_selector); 219 var input_selector_label = $(input_selector).next("label"); 220 221 clearInterval(blinkInterval); 222 input_selector_label.removeClass("text-danger"); 223 224 alert(alert_value); 225 226 input_selector.focus(); 227 228 var blinkInterval = setInterval(function(){ 229 input_selector_label.toggleClass("text-danger"); 230 },500); 231 232 input_selector.on("keyup change",function() { 233 clearInterval(blinkInterval); 234 input_selector_label.removeClass("text-danger"); 235 }); 236 } 237 238 239 </script>
239 240
240<script src="https://www.portimaosurfclube.pt/_jquery/modernizr-custom.js"></script>
240 241 242
242<script> 243 244 $(function(){ 245 246 $('footer a').addClass('thing'); 247 //$('.btn').addClass('fade_in_zoom'); 248 //$('.btn').addClass('fade_in_zoom'); 249 $('.btn').addClass('thing'); 250 251 252 $('footer .fade_in a').removeClass('thing'); 253 $('footer .fade_in').addClass('thing-madmax'); 254 255 }); 256 257 258 function getRandomAB() { 259 const array = new Uint8Array(1); 260 window.crypto.getRandomValues(array); 261 return (array[0] % 2 === 0) ? "_plus" : "_minus"; 262 //return Math.random() < 0.5 ? "_plus" : "_minus"; 263 } 264 265 function isInViewport(elem) { 266 const rect = elem.get(0).getBoundingClientRect(); 267 return ( 268 rect.top >= 0 && 269 rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) 270 ); 271 } 272 273 $(window).on('scroll resize', function () { 274 275 $('.anime').each(function () { 276 const $el = $(this); 277 278 // If no class_postfix stored yet, assign one randomly 279 if (!$el.data('classPostfix')) { 280 const class_postfix = getRandomAB(); 281 $el.data('classPostfix', class_postfix); 282 } 283 284 const postfix = $el.data('classPostfix'); 285 const fullClass = 'in-view' + postfix; 286 287 if (isInViewport($el)) { 288 $el.addClass(fullClass); 289 } else { 290 $el.removeClass(fullClass); 291 } 292 }); 293 294 }); 295 296 // Trigger once on page load 297 $(window).trigger('scroll'); 298 299 300 $(window).resize(function() { 301 console.log($(window).width() + ' x ' + $(window).height()); 302 }); 303 304 $(document).ready(function() { 305 306 console.log($(window).width() + ' x ' + $(window).height()); 307 308 var scrollHere = ''; 309 310 function scrollToClass(scrollHere) { 311 //alert($("#navbar_main").height()); 312 313 314 var bleed = $("#navbar_main").height(); 315 //if (Modernizr.touchevents) { 316 if(isMobile == true){ 317 // supported 318 bleed = 70; 319 } else { 320 // not-supported 321 if(bleed >= 120) bleed = 70; 322 } 323 324 325 var stop = $(scrollHere).offset().top - bleed; 326 var delay = 600; 327 $('body,html').animate({scrollTop: stop}, delay); 328 return false; 329 } 330 331 $("a.start").on("click", function(){ 332 scrollToClass(".section-content"); 333 }); 334 335 $("*[data-scrollto]").each(function(){ 336 $(this).click(function(){ 337 //alert($(this).attr('data-scrollto')); 338 scrollToClass($(this).attr('data-scrollto')); 339 }); 340 //return false; 341 }); 342 343 $("[data-copy]").on("click", function () { 344 let value = $(this).data("copy"); 345 navigator.clipboard.writeText(value).then(() => { 346 showQueuedAlert('<i class="fal fa-check fa-3x"></i><br><strong>Copied.</strong>','info',4000); 347 }); 348 return true; 349 }); 350 351 $("[data-copy-calendar]").on("click", function () { 352 let value = $(this).data("copy-calendar"); 353 navigator.clipboard.writeText(value).then(() => { 354 showQueuedAlert('<i class="fal fa-check fa-3x"></i><br><strong>Copied.</strong><br><br>Ready to paste into your favorite calendar app.<br><br><em>Note:</em> For automatic updates, <strong>subscribe to this calendar</strong> instead of <strong>importing the file</strong>.','info',4000); 355 }); 356 return true; 357 }); 358 359 360 }); 361 362 $(document).ready(function() { 363 364 function fadeOnAppear(element) { 365 var indx = $(element).index(); 366 $(element).animate({ 367 opacity: 1 368 }, 500); 369 370 } 371 372 let observer_fade = new IntersectionObserver((entries) => {
373 entries.forEach(entry => { 374 if (entry.isIntersecting) { 375 fadeOnAppear(entry.target); 376 observer_fade.unobserve(entry.target); 377 } 378 }); 379 }, { 380 threshold: 0.1 381 }); 382 383 var delayator_fade = 0; 384 $('.fade_in').each(function() { 385 delayator_fade += 100; 386 var target = this; 387 setTimeout( function() { 388 observer_fade.observe(target); 389 }, delayator_fade); 390 }); 391 392 var delayator_fade = 0; 393 $('.fade_in_nav').each(function() { 394 delayator_fade += 100; 395 var target = this; 396 setTimeout( function() { 397 observer_fade.observe(target); 398 }, delayator_fade); 399 }); 400 401 }); 402 403 404 // progress_circle START 405 $(function () { 406 const observer = new IntersectionObserver( 407 function (entries) { 408 entries.forEach(entry => { 409 if (entry.isIntersecting) { 410 // trigger animation when in view 411 animateCircle($(entry.target)); 412 } else { 413 // reset when out of view 414 resetCircle($(entry.target)); 415 } 416 }); 417 }, 418 { threshold: 0.5 } // 50% visible 419 ); 420 421 $(".circle").each(function () { 422 observer.observe(this); 423 }); 424 425 function animateCircle($circle) { 426 var $progress = $circle.find(".progress"); 427 var $number = $circle.find(".number"); 428 var percent = +$circle.data("percent"); 429 var circumference = 2 * Math.PI * 105; // r=105 430 var duration = 1500; 431 432 // Animate stroke 433 $progress.stop(true).animate({ dash: percent }, { 434 step: function (now) { 435 var offset = circumference - (circumference * now / 100); 436 $progress.css("stroke-dasharray", circumference) 437 .css("stroke-dashoffset", offset); 438 }, 439 duration: duration 440 }); 441 442 // Animate number 443 $({ val: 0 }).stop(true).animate({ val: percent }, { 444 duration: duration, 445 step: function (now) { 446 $number.text(Math.floor(now) + "%"); 447 }, 448 complete: function () { 449 $number.text(percent + "%"); 450 } 451 }); 452 } 453 454 function resetCircle($circle) { 455 var $progress = $circle.find(".progress"); 456 var $number = $circle.find(".number"); 457 var circumference = 2 * Math.PI * 105; 458 459 // Reset stroke and number 460 $progress.css("stroke-dasharray", circumference) 461 .css("stroke-dashoffset", circumference); 462 $number.text("0%"); 463 } 464 }); 465 // progress_circle END 466 467 </script>
467 468 469
469<script> 470 $(function () { 471 const STORAGE_KEY = 'bootstrap-tabs-state'; 472 const ONE_HOUR = 60 * 60 * 1000; // â 1 hour in milliseconds 473 474 // ==================== SAVE (with 1-hour expiration) ==================== 475 $(document).on('shown.bs.tab', '[data-bs-toggle="tab"], [data-bs-toggle="pill"]', function () { 476 let tabsState = localStorage.getItem(STORAGE_KEY); 477 let json = tabsState ? JSON.parse(tabsState) : {}; 478 479 // Support both old and new stored format 480 const currentTabs = (json && json.tabs) ? json.tabs : json; 481 482 const navId = $(this).closest('[role="tablist"]').attr('id'); 483 const target = $(this).attr('data-bs-target') || $(this).attr('href'); 484 485 if (navId && target) { 486 currentTabs[navId] = target; 487 488 // Save with fresh timestamp (resets the 1-hour timer on every change) 489 localStorage.setItem(STORAGE_KEY, JSON.stringify({ 490 tabs: currentTabs, 491 timestamp: Date.now() 492 })); 493 } 494 }); 495 496 // ==================== RESTORE on page load (with expiration check) ==================== 497 let tabsState = localStorage.getItem(STORAGE_KEY); 498 let json = {}; // final tabs to restore 499 let timestamp = 0; 500 501 if (tabsState) { 502 try { 503 const parsed = JSON.parse(tabsState); 504 505 if (parsed && parsed.tabs !== undefined) { 506 // New format (with timestamp) 507 json = parsed.tabs || {}; 508 timestamp = parsed.timestamp || 0; 509 } else { 510 // Old format (backward compatibility) â give it 1 hour from now 511 json = parsed || {}; 512 timestamp = Date.now(); 513 } 514 515 // Check if expired 516 if (Date.now() - timestamp > ONE_HOUR) { 517 localStorage.removeItem(STORAGE_KEY); // clear expired cache 518 json = {}; // reset to defaults 519 } 520 } catch (e) { 521 localStorage.removeItem(STORAGE_KEY); 522 json = {}; 523 } 524 } 525 526 // Restore saved tabs (works for any depth) 527 Object.keys(json).forEach(navId => { 528 const target = json[navId]; 529 const tabEl = document.querySelector( 530 `#${navId} button[data-bs-target="${target}"], #${navId} a[href="${target}"]` 531 ); 532 533 if (tabEl) { 534 const tab = new bootstrap.Tab(tabEl); 535 tab.show(); 536 } 537 }); 538 539 // Fallback: activate first button if nothing valid is saved 540 $('[role="tablist"]').each(function () { 541 const $nav = $(this); 542 const navId = $nav.attr('id'); 543 if (navId && !json[navId]) { 544 const firstBtn = $nav.find('[data-bs-toggle="tab"], [data-bs-toggle="pill"]').first()[0]; 545 if (firstBtn) { 546 new bootstrap.Tab(firstBtn).show(); 547 } 548 } 549 }); 550 }); 551 </script>
551 552 553 <!-- Matomo --> 554
554<script> 555 var _paq = window._paq = window._paq || []; 556 _paq.push(['trackPageView']); 557 _paq.push(['enableLinkTracking']); 558 (function() { 559 var u = "https://matomo.ptmsc.link/"; 560 _paq.push(['setTrackerUrl', u + 'matomo.php']); 561 _paq.push(['setSiteId', '1']); 562 var d = document, 563 g = d.createElement('script'), 564 s = d.getElementsByTagName('script')[0]; 565 g.async = true; 566 g.src = u + 'matomo.js'; 567 s.parentNode.insertBefore(g, s); 568 })(); 569 </script>
569 570 <!-- End Matomo Code --> 571 572 <link rel="alternate" hreflang="en" href="https://www.portimaosurfclube.pt/"> 573<link rel="alternate" hreflang="pt-PT" href="https://www.portimaosurfclube.pt/pt"> 574<link rel="alternate" hreflang="x-default" href="https://www.portimaosurfclube.pt/"> 575
576<script type="application/ld+json"> 577{"@context":"https://schema.org","@graph":[{"@type":["SportsOrganization","EducationalOrganization"],"@id":"https://www.portimaosurfclube.pt/#organization","name":"PTMSC - Portim\u00e3o Surf Clube","alternateName":["Portim\u00e3o Surf Clube","PTMSC"],"legalName":"PTMSC - Portim\u00e3o Surf Clube","url":"https://www.portimaosurfclube.pt/","logo":{"@id":"https://www.portimaosurfclube.pt/#logo"},"image":{"@id":"https://www.portimaosurfclube.pt/#logo"},"description":"Surf, bodyboard, skateboarding and stand up paddle club and academy in Portim\u00e3o, Algarve, founded in 2014 by national surfing champion Francisco Canelas. Inclusive coaching for all ages and abilities, including a Para Surfing programme.","foundingDate":"2014","foundingLocation":{"@id":"https://www.portimaosurfclube.pt/#place"},"founder":{"@id":"https://www.portimaosurfclube.pt/#person-francisco-canelas"},"sport":["Surfing","Bodyboarding","Skateboarding","Stand up paddleboarding","Para surfing"],"location":{"@id":"https://www.portimaosurfclube.pt/#place"},"address":{"@type":"PostalAddress","streetAddress":"Estrada Marina 280","addressLocality":"Portim\u00e3o","addressRegion":"Faro","postalCode":"8500-311","addressCountry":"PT"},"telephone":"+351966559739","email":"[email protected]","sameAs":["https://www.instagram.com/portimaosurfclube/","https://www.facebook.com/portimaosurfclube/","https://www.tripadvisor.com/Attraction_Review-g652081-d19327882-Reviews-Portimao_Surf_Clube-Praia_da_Rocha_Portimao_Faro_District_Algarve.html","https://g.page/r/CeqaZZxMKqUKEBM/"],"knowsAbout":["Surfing","Surf coaching","Bodyboarding","Skateboarding","Stand up paddleboarding","Adaptive surfing","Para surfing","Ocean safety","Surf forecasting"],"knowsLanguage":[{"@type":"Language","name":"English","alternateName":"en"},{"@type":"Language","name":"Portuguese","alternateName":"pt"}],"areaServed":[{"@type":"City","name":"Portim\u00e3o"},{"@type":"Place","name":"Praia da Rocha"},{"@type":"Place","name":"Alvor"},{"@type":"Place","name":"Costa Vicentina"},{"@type":"AdministrativeArea","name":"Algarve"}],"employee":[{"@id":"https://www.portimaosurfclube.pt/#person-francisco-canelas"},{"@id":"https://www.portimaosurfclube.pt/#person-filipe-costa"},{"@id":"https://www.portimaosurfclube.pt/#person-sandro-nobrega"},{"@id":"https://www.portimaosurfclube.pt/#person-emanuel-silva"}],"contactPoint":[{"@type":"ContactPoint","@id":"https://www.portimaosurfclube.pt/#contact-office","contactType":"customer service","telephone":"+351966559739","email":"[email protected]","areaServed":["PT","GB","DE","NL","FR","ES"],"availableLanguage":["English","Portuguese"],"url":"https://www.portimaosurfclube.pt/contacts"},{"@type":"ContactPoint","@id":"https://www.portimaosurfclube.pt/#contact-bookings","contactType":"reservations","telephone":"+351966559739","email":"[email protected]","availableLanguage":["English","Portuguese"],"url":"https://www.portimaosurfclube.pt/book-now"}],"identifier":[{"@type":"PropertyValue","name":"RNAAT - Registo Nacional dos Agentes de Anima\u00e7\u00e3o Tur\u00edstica","value":"158/2021","description":"Tourist activity operator licence issued by Turismo de Portugal."}]},{"@type":["SportsActivityLocation","TouristAttraction"],"@id":"https://www.portimaosurfclube.pt/#place","name":"PTMSC - Portim\u00e3o Surf Clube","url":"https://www.portimaosurfclube.pt/","description":"Surf club and academy at Praia da Rocha, Portim\u00e3o. Club secretariat inside the Santa Catarina fortress on the road to Portim\u00e3o Marina; clubhouse, changing rooms and deck beside the jetty in the Praia da Rocha sports area.","parentOrganization":{"@id":"https://www.portimaosurfclube.pt/#organization"},"image":{"@id":"https://www.portimaosurfclube.pt/#logo"},"address":{"@type":"PostalAddress","streetAddress":"Estrada Marina 280","addressLocality":"Portim\u00e3o","addressRegion":"Faro","postalCode":"8500-311","addressCountry":"PT"},"geo":{"@type":"GeoCoordinates","latitude":37.11663220006592,"longitude":-8.529049578956748},"hasMap":"https://g.page/r/CeqaZZxMKqUKEBM/","telephone":"+351966559739","currenciesAccepted":"EUR","priceRange":"\u20ac20-\u20ac800","openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["https://schema.org/Tuesday","https://schema.org/Wednesday","https://schema.org/Thursday","https://schema.org/Friday","https://schema.org/Saturday","https://schema.org/Sunday"],"opens":"09:00","closes":"17:00"}],"isAccessibleForFree":false,"publicAccess":true,"availableLanguage":["English","Portuguese"],"amenityFeature":[{"@type":"LocationFeatureSpecification","name":"Changing rooms","value":true},{"@type":"LocationFeatureSpecification","name":"Equipment storage","value":true},{"@type":"LocationFeatureSpecification","name":"Beach deck","value":true},{"@type":"LocationFeatureSpecification","name":"Adaptive surfing equipment","value":true}],"potentialAction":{"@type":"ReserveAction","name":"Book a lesson","target":{"@type":"EntryPoint","urlTemplate":"https://www.portimaosurfclube.pt/book-now","actionPlatform":["https://schema.org/DesktopWebPlatform","https://schema.org/MobileWebPlatform","https://schema.org/IOSPlatform","https://schema.org/AndroidPlatform"]},"result":{"@type":"Reservation","name":"Lesson booking"}}},{"@type":"WebSite","@id":"https://www.portimaosurfclube.pt/#website","url":"https://www.portimaosurfclube.pt/","name":"PTMSC - Portim\u00e3o Surf Clube","publisher":{"@id":"https://www.portimaosurfclube.pt/#organization"},"inLanguage":["en","pt-PT"]},{"@type":"ImageObject","@id":"https://www.portimaosurfclube.pt/#logo","url":"https://www.portimaosurfclube.pt/img/ptmsc-logo.png","contentUrl":"https://www.portimaosurfclube.pt/img/ptmsc-logo.png","width":512,"height":512},{"@type":"Person","@id":"https://www.portimaosurfclube.pt/#person-francisco-canelas","name":"Francisco Canelas","jobTitle":["Founder","Sports Director","Surf Coach"],"description":"Multi-title Portuguese national surfing champion; founder and sports director of PTMSC - Portim\u00e3o Surf Clube.","worksFor":{"@id":"https://www.portimaosurfclube.pt/#organization"},"affiliation":{"@id":"https://www.portimaosurfclube.pt/#organization"},"knowsAbout":["Surfing","Surf coaching","Competitive surfing"]},{"@type":"Person","@id":"https://www.portimaosurfclube.pt/#person-filipe-costa","name":"Filipe Costa","jobTitle":["Physiotherapist","Bodyboard Coach"],"description":"Physiotherapist behind FisioRider, providing body mechanics, balance, injury prevention and functional training to PTMSC athletes; co-leads the Bodyboard Academy.","worksFor":{"@id":"https://www.portimaosurfclube.pt/#organization"},"affiliation":{"@id":"https://www.portimaosurfclube.pt/#organization"},"knowsAbout":["Sports physiotherapy","Bodyboarding","Adaptive surfing"]},{"@type":"Person","@id":"https://www.portimaosurfclube.pt/#person-sandro-nobrega","name":"Sandro N\u00f3brega","jobTitle":["Bodyboard Coach"],"description":"Coach of the PTMSC Bodyboard Academy.","worksFor":{"@id":"https://www.portimaosurfclube.pt/#organization"},"affiliation":{"@id":"https://www.portimaosurfclube.pt/#organization"},"knowsAbout":["Bodyboarding"]},{"@type":"Person","@id":"https://www.portimaosurfclube.pt/#person-emanuel-silva","name":"Emanuel Silva","jobTitle":["Skateboarding Coach"],"description":"Coach of the PTMSC skateboarding classes, open to students aged 5 and up.","worksFor":{"@id":"https://www.portimaosurfclube.pt/#organization"},"affiliation":{"@id":"https://www.portimaosurfclube.pt/#organization"},"knowsAbout":["Skateboarding"]},{"@type":["WebPage","CollectionPage"],"@id":"https://www.portimaosurfclube.pt/#webpage","url":"https://www.portimaosurfclube.pt/","name":"PTMSC - Inclusive Surf Lessons Algarve | Portimao Surf Clube","isPartOf":{"@id":"https://www.portimaosurfclube.pt/#website"},"about":{"@id":"https://www.portimaosurfclube.pt/#organization"}
577,"inLanguage":"en","description":"Surf, bodyboard, skate and SUP club in Portimao, Algarve. Founded by national champion Francisco Canelas. Lessons for all ages and abilities, including Para Surfing.","breadcrumb":{"@id":"https://www.portimaosurfclube.pt/#breadcrumb"},"translationOfWork":{"@id":"https://www.portimaosurfclube.pt/pt#webpage"}},{"@type":"BreadcrumbList","@id":"https://www.portimaosurfclube.pt/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.portimaosurfclube.pt/"}]}]} 578</script>
578 579 580</head> 581 582 583<body class="home cms_off "> 584 585<span class="screen-darken"></span> 586<header class="section-header mobile-header d-lg-none hide_in_gallery"> 587 588 <button data-trigger="navbar_main" class="btn btn-cta text-white p-3 pt-2 pb-2 m-3 float-end shadow" type="button"> <i class="fas fa-bars"></i> </button> 589 590 <a class="mobile-logo" href="https://www.portimaosurfclube.pt"> 591 <img src="https://www.portimaosurfclube.pt/_design/PTMSC_rgb.svg" class="logo_rgb m-3 mt-3 mb-0" width="250" alt="PTMSC - Portimao Surf Clube" fetchpriority="high" decoding="async" loading="eager" /> 592 </a> 593</header><!-- section-header.// --> 594 595 <div class="section-intro"> 596 597 598<div class=""> 599 <a href="#" id="" class="start animate__animated animate__bounceInDown animate__delay-1s" style="display:table;text-align:center; font-size: 46px; width: 50px; position:absolute; top: 0px; left:50%; margin-left: -25px; z-index: 1000; color:#fff; cursor:pointer;"><i class="fal fa-chevron-down"></i></a> 600</div> 601<div class="video-background"> 602 <div class="video-foreground"> 603 604 <!-- You can use styles and CSS on this iframe element where the video player will appear --> 605 <iframe 606 id="stream-player" 607 title="Video Stream Player" 608 src="https://customer-0tzx6lvms3lhg1mn.cloudflarestream.com/0899c4338d462ec662f1264b5bf5dc43/iframe?muted=true&loop=true&autoplay=true&poster=https%3A%2F%2Fcustomer-0tzx6lvms3lhg1mn.cloudflarestream.com%2F0899c4338d462ec662f1264b5bf5dc43%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600&controls=false" 609 style="border: none; position: absolute; top: 0; left: 0; height: 100%; width: 100%;" 610 allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;" 611 allowfullscreen="true" 612 loading="eager" 613 ></iframe> 614 615
615<script src="https://embed.cloudflarestream.com/embed/sdk.latest.js"></script>
615 616 617 <!-- Your JavaScript code below--> 618
618<script> 619 620 var waitForFinalEvent = (function () { 621 var timers = {}; 622 return function (callback, ms, uniqueId) { 623 if (!uniqueId) { 624 uniqueId = "XaLotOfFunStartsHereMaybe_17914506471367245448"; 625 } 626 if (timers[uniqueId]) { 627 clearTimeout (timers[uniqueId]); 628 } 629 timers[uniqueId] = setTimeout(callback, ms); 630 }; 631 })(); 632 633 634 635 $(function(){ 636 637 var height = $(window).height(); 638 $(".start").css({top:0,position:"absolute"}).animate({top:(height - 200)}, 300, function() { 639 //callback 640 }); 641 642 }); 643 644 645 646 const player = Stream(document.getElementById("stream-player")); 647 player.currentTime = 0; 648 649 player.addEventListener("play", () => { 650 console.log("playing!"); 651 }); 652 653 player.play().catch(() => { 654 console.log("playback failed, muting to try again"); 655 player.muted = true; 656 player.play(); 657 }); 658 659 660 661 662 $(window).scroll(function(){ 663 if($(window).width() > 1024) { 664 665 waitForFinalEvent(function(){ 666 667 //console.log(player); 668 669 //player.play(); 670 var halfViewportHeight = $(window).height() / 4; 671 if($(document).scrollTop() > halfViewportHeight) { 672 player.pause(); 673 //player.currentTime = 0; 674 } else { 675 676 player.play().catch(() => { 677 console.log("playback failed, muting to try again"); 678 player.muted = true; 679 player.play(); 680 }); 681 682 } 683 }, 300, "17914506471296031639d9eb35c18efddd26e6f9a2ae75c2383c ~ * ~ * ~ ~ * ~ * ~"); 684 } 685 }); 686 687 688 </script>
688 689
689<script> 690 691 692 var pausemark = 0; 693 document.addEventListener("DOMContentLoaded", function () { 694 695 const video = Stream(document.getElementById("stream-player")); 696 let interval; // Store the interval ID 697 698 // Function to handle marking every 3 seconds 699 function startMarking() { 700 interval = setInterval(() => { 701 const currentTime = Math.floor(video.currentTime); // Get current time in seconds 702 703 if (currentTime > 0 && currentTime % 1000000000 === 0) { // Check if divisible 105s 704 //console.log(`Mark at ${currentTime} seconds`); 705 video.pause(); 706 video.currentTime = 0; 707 video.play(); 708 } 709 710 if (currentTime > 0 && currentTime % 1 === 0) { 711 //$("#navbar_main").css("opacity",1); 712 } 713 714 }, 1000); // Check every second 715 } 716 717 // Start marking when the video starts playing 718 video.addEventListener("play", startMarking); 719 720 // Clear the interval when the video is paused or ends 721 video.addEventListener("pause", () => clearInterval(interval)); 722 video.addEventListener("ended", () => clearInterval(interval)); 723 724 725 726 }); 727 </script>
727 728 729 </div> 730</div> 731<style> 732* { 733 box-sizing: border-box; 734 margin: 0; 735 padding: 0; 736} 737 738.video-background { 739 position: fixed; 740 top: 0; left: 0; 741 width: 100vw; 742 height: 100vh; 743 overflow: hidden; 744 z-index: -1; 745} 746 747.video-foreground, 748.video-background iframe { 749 position: absolute; 750 top: 0; left: 0; 751 width: 100%; 752 height: 100%; 753 border: 0; 754 pointer-events: none; 755} 756 757/* Handle wide screens (landscape) */ 758@media (min-aspect-ratio: 16/9) { 759 .video-foreground { 760 width: 100%; 761 height: 300%; 762 top: -100%; 763 left: 0; 764 } 765} 766 767/* Handle tall screens (portrait) */ 768@media (max-aspect-ratio: 16/9) { 769 .video-foreground { 770 height: 100%; 771 width: 300%; 772 left: -100%; 773 top: 0; 774 } 775} 776 777@media (max-width: 991px) { 778 .video-foreground {transform: scaleY(1.2);} 779} 780 781XXX#navbar_main {opacity:0;} 782</style>
783<script type="text/javascript"> 784 785 $(function(){ 786 $(".book_now_mobile").addClass("d-none"); 787 }); 788 $(window).scroll(function(){ 789 790 //$("#navbar_main").css("opacity",1); 791 792 if($(window).scrollTop() > 50) { 793 $(".book_now_mobile").removeClass("d-none"); 794 } else { 795 $(".book_now_mobile").addClass("d-none"); 796 } 797 798 }); 799 800</script>
800 801 802<div class="container typewrite-wrap"> 803 <p class="typewrite" data-period="2000" data-type='["Welcome to PTMSC ð¤","Do you have a question before booking? ð","Use our virtual assistant ð¤","Eat, Sleep, SURF, Repeat","Eat, Sleep, BODYBOARD, Repeat","Eat, Sleep, SKATE, Repeat","SUP - Stand Up Paddle","Join Our PTMSC Family","Letâs Surf! ð¤","Letâs Skate! ð¤","Letâs Bodyboard! ð¤","Letâs SUP! ð¤","Portimão Surf Clube"]'> 804 <span class="wrap"></span> 805 </p> 806</div> 807 808<style> 809.typewrite-wrap { 810 position: absolute; 811 top:50%; 812 left:50%; 813 width: 60%; 814 height: 300px; 815 margin-top: -150px; 816 margin-left: -30%; 817 text-align:center; 818 font-size: 100px; 819 line-height: 90px; 820 color:#FFF; 821 font-weight:700; 822 823 font-family: "lithos-pro", sans-serif; 824 font-weight: 700; 825 font-style: normal; 826 827} 828.wrap { 829 border-right: 0.5px solid rgba(255,255,255,1); 830} 831@media all and (max-width: 991px) { 832 .typewrite-wrap { 833 width: 90%; 834 height: 200px; 835 margin-top: -100px; 836 margin-left: -45%; 837 font-size: 46px; 838 line-height: 55px; 839 } 840} 841</style> 842
843<script> 844class TxtType { 845 constructor(el, toRotate, period) { 846 this.toRotate = toRotate; 847 this.el = el; 848 this.loopNum = 0; 849 this.period = parseInt(period, 10) || 2000; 850 this.txt = ""; 851 this.isDeleting = false; 852 853 // Pre-split EVERY string into graphemes (handles emojis + skin tones correctly) 854 this.graphemesArray = this.toRotate.map(str => [...str]); 855 856 // Start typing 857 this.tick(); 858 } 859 860 tick() { 861 let i = this.loopNum % this.toRotate.length; 862 let fullGraphemes = this.graphemesArray[i]; 863 let targetLength = this.isDeleting 864 ? fullGraphemes.length - (this.txt.length || 0) - 1 // how many graphemes remain when deleting 865 : this.txt.length + 1; // next grapheme count 866 867 // Build displayed text by taking the right number of graphemes 868 this.txt = fullGraphemes.slice(0, Math.max(0, targetLength)).join(""); 869 870 this.el.innerHTML = '<span class="wrap">' + this.txt + '</span>'; 871 872 let that = this; 873 let delta = 80 - Math.random() * 40; // slower typing = less visible flicker if any edge case 874 875 if (this.isDeleting) { 876 delta /= 1.5; // delete a bit faster 877 } 878 879 if (!this.isDeleting && this.txt === this.toRotate[i]) { 880 // Pause at full text 881 delta = this.period; 882 this.isDeleting = true; 883 } else if (this.isDeleting && this.txt === "") { 884 // Switch to next phrase 885 this.isDeleting = false; 886 this.loopNum++; 887 delta = 400; // longer pause before new string starts (helps visibility) 888 } 889 890 setTimeout(function() { 891 that.tick(); 892 }, delta); 893 } 894} 895 896window.onload = function() { 897 let elements = document.getElementsByClassName("typewrite"); 898 for (let i = 0; i < elements.length; i++) { 899 let toRotate = elements[i].getAttribute("data-type"); 900 let period = elements[i].getAttribute("data-period"); 901 if (toRotate) { 902 new TxtType(elements[i], JSON.parse(toRotate), period); 903 } 904 } 905}; 906</script>
906 907 </div> 908 909<!-- ============= COMPONENT ============== --> 910<nav id="navbar_main" class="mobile-offcanvas navbar navbar_ navbar-expand-lg navbar-dark fixed-top animate__animated animate__fadeIn "> 911 <div class="container-fluid"> 912 <div class="offcanvas-header"> 913 <button class="btn btn-close mt-3 text-danger float-end"></button> 914 </div> 915 <a class="fade_in_nav navbar-brand ms-lg-5" href="https://www.portimaosurfclube.pt"> 916 <img src="https://www.portimaosurfclube.pt/_design/PTMSC_white.svg" class="logo_white" alt="Portimão Surf Clube" fetchpriority="high" decoding="async" loading="eager" /> 917 <img src="https://www.portimaosurfclube.pt/_design/PTMSC_rgb.svg" class="logo_rgb" alt="Portimão Surf Clube" fetchpriority="high" decoding="async" loading="eager" /> 918 </a> 919 920 <ul class="navbar-nav ms-auto"> 921 <li class=" nav-item fade_in_nav item_id_964 dropdown "><a data-bs-toggle="dropdown" class="thing nav-link item_id_964 dropdown-toggle dropdown-toggle-main-nav " href="https://www.portimaosurfclube.pt/about-ptmsc"><span>About</span></a><ul class="dropdown-menu"><li class="d-md-none item_id_1028"><a class="thing dropdown-item item_id_1028 " href="https://www.portimaosurfclube.pt/about-ptmsc/about-ptmsc">About PTMSC</a></li><li class=" item_id_995"><a class="thing dropdown-item item_id_995 " href="https://www.portimaosurfclube.pt/about-ptmsc/where-are-we">Where are we?</a></li><li class=" item_id_996"><a class="thing dropdown-item item_id_996 " href="https://www.portimaosurfclube.pt/about-ptmsc/documents">Documents</a></li><li class=" item_id_1026"><a class="thing dropdown-item item_id_1026 " href="https://www.portimaosurfclube.pt/about-ptmsc/member-registration">Member Registration</a></li><li class=" item_id_1058"><a class="thing dropdown-item item_id_1058 " href="https://www.portimaosurfclube.pt/about-ptmsc/prices-2026">Prices 2026</a></li></ul></li><li class=" nav-item fade_in_nav item_id_1015 "><a class="thing nav-link item_id_1015 " href="https://www.portimaosurfclube.pt/news-and-events"><span>News</span></a></li><li class=" nav-item fade_in_nav item_id_982 "><a class="thing nav-link item_id_982 " href="https://www.portimaosurfclube.pt/surf"><span>Surf</span></a></li><li class=" nav-item fade_in_nav item_id_984 "><a class="thing nav-link item_id_984 " href="https://www.portimaosurfclube.pt/bodyboard"><span>Bodyboard</span></a></li><li class=" nav-item fade_in_nav item_id_985 "><a class="thing nav-link item_id_985 " href="https://www.portimaosurfclube.pt/skate"><span>Skate</span></a></li><li class=" nav-item fade_in_nav item_id_983 "><a class="thing nav-link item_id_983 " href="https://www.portimaosurfclube.pt/paddle"><span>SUP</span></a></li><li class=" nav-item fade_in_nav item_id_1112 dropdown "><a data-bs-toggle="dropdown" class="thing nav-link item_id_1112 dropdown-toggle dropdown-toggle-main-nav " href="https://www.portimaosurfclube.pt/book-now"><span>BOOK NOW</span></a><ul class="dropdown-menu"><li class=" item_id_1113"><a class="thing dropdown-item item_id_1113 " href="https://www.portimaosurfclube.pt/book-now/surf">SURF</a></li><li class=" item_id_1114"><a class="thing dropdown-item item_id_1114 " href="https://www.portimaosurfclube.pt/book-now/sup-stand-up-paddle">SUP - Stand up Paddle</a></li><li class=" item_id_1115"><a class="thing dropdown-item item_id_1115 " href="https://www.portimaosurfclube.pt/book-now/rentals">Rentals</a></li></ul></li><li class="nav-item front_only" ><a href="#" class="fh-trigger book_now rounded-5 nav-link bg-cta ms-md-2 text-center shadow fade_in_nav ps-3 pe-3 pt-4 pb-4 pt-md-2 pb-md-1 btn-chatbot" data-size="half" style="font-size:14px; line-height: 15px; color: #fff !important; font-weight: 600;">BOOK NOW<span style="font-size:8px; letter-spacing: 0.5px; font-weight:300; display:block;">Virtual Assistant</span></a></li><li class="nav-item mt-3 d-table d-md-none"><a class=" rounded-5 nav-link bg-light ms-md-3 text-center shadow fade_in_nav pt-4 pb-4 pt-md-2 pb-md-2" href="https://www.portimaosurfclube.pt/my-account"><i class="fad fa-user-circle me-2"></i>My Account</a></li> 922 <li class="nav-item dropdown fade_in_nav ps-2 pe-2"> 923 <a class="nav-link dropdown-toggle" href="#" id="navbarLang" role="button" data-bs-toggle="dropdown" aria-expanded="false"><i class="fal fa-globe"></i></a> 924 <ul class="dropdown-menu" aria-labelledby="navbarLang"> 925 <li><a class="dropdown-item" href="https://www.portimaosurfclube.pt" style="background: none; "><img src="https://www.portimaosurfclube.pt/_design/flag_uk.png" alt="English" class="flag me-2" /><small>English</small></a></li> 926 <li><a class="dropdown-item" href="https://www.portimaosurfclube.pt/pt" style="background: none; filter: grayscale(90%); opacity:.5;"><img src="https://www.portimaosurfclube.pt/_design/flag_pt.png" alt="Português" class="flag me-2" /><small>Português</small></a></li> 927 </ul> 928 </li> 929 <!-- 930 <li class="d-table d-lg-none w-100"> 931 <div class="mt-3 social_links_mobile_nav"> 932 <span class="row text-center">
933 <a href="https://www.facebook.com/..." target="_blank" class="col"><i class="fab fa-facebook fa-2x"></i></a> 934 <a href="https://www.instagram.com/..." target="_blank" class=" col"><i class="fab fa-instagram fa-2x"></i></a> 935 </span> 936 937 </div> 938 </li> 939 --> 940 </ul> 941 942 <div class="btn-group flex-wrap" role="group" aria-label="Button group"><a class="d-none d-md-table btn p-4 mt-2 ms-4 me-1 fade_in_nav text-white" href="https://www.portimaosurfclube.pt/my-account"><i class="fal fa-user-circle fa-2x"></i><span class="d-block" style="font-size:10px;">MY ACCOUNT</span></a></div> 943 </div> <!-- container-fluid.// --> 944</nav> 945<style> 946/* ============ desktop view ============ */ 947@media all and (min-width: 992px) { 948 .navbar .nav-item .dropdown-menu { display: none; } 949 .navbar .nav-item:hover .nav-link{ } 950 .navbar .nav-item:hover .dropdown-menu{ display: block; } 951 .navbar .nav-item .dropdown-menu{ margin-top:0; } 952} 953/* ============ desktop view .end// ============ */ 954 @media (min-width: 992px) { 955 .flag {margin: 3px; margin-top: -3px;} 956 } 957</style> 958<!-- ============= COMPONENT END// ============== -->
959<script> 960 $(function(){ 961 962 //alert('mobile: ' + isMobile); 963 964 if(isMobile !== true) { 965 $('#navbar_main').addClass('navbar-desktop'); 966 } 967 968 if(isMobile == true){ 969 //$page->navbar_style = 'light'; 970 //$page->logo_style = 'white'; 971 $('#navbar_main .navbar-brand img').css('display','none'); 972 $('#navbar_main .navbar-brand img.logo_rgb').css('display','table'); 973 974 //$('.logo_white').css('display','none'); 975 //$('.logo_black').css('display','none'); 976 //$('.logo_rgb').css('display','table'); 977 //alert('mobile: ' + isMobile); 978 } 979 980 $(function(){ 981 $('.dropdown-toggle-main-nav').click(function(){ 982 983 if (Modernizr.touchevents) { 984 // supported 985 var that = this; 986 //setTimeout(function() { 987 // 988 //}, 2000); 989 } else { 990 // not-supported 991 window.location=$(this).attr("href"); 992 } 993 994 995 }); 996 }); 997 }); 998</script>
vendor: 1 bytes, line 998
998
999<script> 1000 $(window).scroll(function(){ 1001 //$('.scroll_padding_fix').css('padding-top','0px'); 1002 1003 1004 //rotate: -2.5deg; 1005 1006 1007 if($(window).width() > 991) { 1008 1009 if($(document).scrollTop() > 5) { 1010 $("body").addClass("scrolled"); 1011 $('body.home .fade_in_nav').removeClass("text-white"); 1012 } else { 1013 $("body").removeClass("scrolled"); 1014 $('body.home .fade_in_nav').addClass("text-white"); 1015 } 1016 1017 if($(document).scrollTop() > 5) { 1018 1019 $("#navbar_main").addClass("liquid-glass"); 1020 $("#navbar_main").addClass("m-md-3"); 1021 $("#navbar_main").addClass("m-lg-4"); 1022 $("#navbar_main").addClass("m-xxl-5"); 1023 $("#navbar_main").addClass("rounded-5"); 1024 } else { 1025 $("#navbar_main").removeClass("liquid-glass"); 1026 $("#navbar_main").removeClass("m-md-3"); 1027 $("#navbar_main").removeClass("m-lg-4"); 1028 $("#navbar_main").removeClass("m-xxl-5"); 1029 $("#navbar_main").removeClass("rounded-5"); 1030 } 1031 1032 1033 1034 } else { 1035 1036 if($(document).scrollTop() > 5) { 1037 $("body").addClass("scrolled"); 1038 $("body.page .mobile-logo").fadeOut(); 1039 } else { 1040 $("body").removeClass("scrolled"); 1041 $("body.page .mobile-logo").fadeIn(); 1042 } 1043 1044 if($(document).scrollTop() > 50) { 1045 $("body.home .mobile-header").addClass('bg-white'); 1046 } else { 1047 $("body.home .mobile-header").removeClass('bg-white'); 1048 } 1049 1050 1051 1052 } 1053 1054 1055 1056 }); 1057</script>
1057 1058 1059 <section class="section-content"> 1060 1061 <div class="row g-0 justify-content-center"> </div><div class="container-fluid px-0"><div class="row g-0 justify-content-center"><div class="object_parent wireframe "><div id="objectID_1772" class="" style=""><div id="editorID_1772" data-label="CTA container" data-encoded="4d5455334e6a637a4f4463354f55422b5147466b5a476c3061573975595778666157357764585241666b41784e7a51324d6a55774e444579514835414d5463334d673d3d" class="" ><div class="container-fluid"> 1062<div class="ps-lg-4 pe-lg-4 pb-lg-4"> 1063<div class="row g-lg-5 mt-1 mb-5"> 1064<div class="col-md-10 offset-md-1 col-xl-8 offset-xl-2 pt-3 pt-lg-5 fade_in_top"> 1065<h1 style="text-align: center;">Welcome to PTMSC<br /><strong>Portimão Surf Clube</strong></h1> 1066</div> 1067</div> 1068</div> 1069<div class="bg-dirty"> 1070<div class="container"> 1071<div class="row g-0 mb-5"> 1072<div class=" col-xl-8 offset-xl-2 pt-3 pt-lg-4 pb-3 pb-lg-4"> 1073<!-- load_objects --><div class="container"><div class="row g-0 justify-content-center"><div style="" class="object_parent load_objects BOX "><div id="objectID_2043" class="cms-non-editable" style=""><div id="editorID_2043" data-label="Advert" data-encoded="4d5467774d4441794d4441354d45422b5147466b5a476c3061573975595778666157357764585241666b41334e4459304d6a597a4f545241666b41794d44517a" class="" ><div class="Xcard Xrounded-5 Xp-4 pt-3 pb-3 Xshadow-lg fade_in"> 1074<div class="sitemap m-md-4"> 1075<div class="row g-0"> 1076<div class="col-md-6 order-2 order-md-1"> 1077<div class="pt-5"> 1078<h5>Book without a membership</h5> 1079<h2><a href="../../book-now">BOOK NOW</a></h2> 1080<ul id="SITEMAP_1_menuitem_1112_ul" class="fade_in"><li id="SITEMAP_1_menuitem_1113_li" class="fade_in_bottom"><a id="SITEMAP_1_menuitem_1113" class=" " href="https://www.portimaosurfclube.pt/book-now/surf" title="SURF">SURF</a> <ul id="main_menuitem_1113_ul" class=""><li id="main_menuitem_1116_li" class=""><a id="main_menuitem_1116" class=" " href="https://www.portimaosurfclube.pt/book-now/surf/praia-da-rocha-surfing" title="Praia da Rocha Surfing">Praia da Rocha Surfing</a> </li> <li id="main_menuitem_1117_li" class=""><a id="main_menuitem_1117" class=" " href="https://www.portimaosurfclube.pt/book-now/surf/west-coast-safari" title="West Coast Safari">West Coast Safari</a> </li> </ul></li> <li id="SITEMAP_1_menuitem_1114_li" class="fade_in_bottom"><a id="SITEMAP_1_menuitem_1114" class=" " href="https://www.portimaosurfclube.pt/book-now/sup-stand-up-paddle" title="SUP - Stand up Paddle">SUP - Stand up Paddle</a> <ul id="main_menuitem_1114_ul" class=""><li id="main_menuitem_1118_li" class=""><a id="main_menuitem_1118" class=" " href="https://www.portimaosurfclube.pt/book-now/sup-stand-up-paddle/paddle-tour-rocha-beach" title="Paddle Tour Rocha Beach">Paddle Tour Rocha Beach</a> </li> <li id="main_menuitem_1119_li" class=""><a id="main_menuitem_1119" class=" " href="https://www.portimaosurfclube.pt/book-now/sup-stand-up-paddle/paddle-tour-joao-d-arens" title="Paddle Tour - João D`Arens">Paddle Tour - João D`Arens</a> </li> <li id="main_menuitem_1120_li" class=""><a id="main_menuitem_1120" class=" " href="https://www.portimaosurfclube.pt/book-now/sup-stand-up-paddle/paddle-tour-alvor-tour" title="Paddle Tour - Alvor Tour">Paddle Tour - Alvor Tour</a> </li> <li id="main_menuitem_1193_li" class=""><a id="main_menuitem_1193" class=" " href="https://www.portimaosurfclube.pt/book-now/sup-stand-up-paddle/sunrise-paddle" title="Sunrise Paddle">Sunrise Paddle</a> </li> </ul></li> <li id="SITEMAP_1_menuitem_1115_li" class="fade_in_bottom"><a id="SITEMAP_1_menuitem_1115" class=" " href="https://www.portimaosurfclube.pt/book-now/rentals" title="Rentals">Rentals</a> <ul id="main_menuitem_1115_ul" class=""><li id="main_menuitem_1121_li" class=""><a id="main_menuitem_1121" class=" " href="https://www.portimaosurfclube.pt/book-now/rentals/rentals-1-hour" title="Rentals 1 Hour">Rentals 1 Hour</a> </li> <li id="main_menuitem_1122_li" class=""><a id="main_menuitem_1122" class=" " href="https://www.portimaosurfclube.pt/book-now/rentals/rentals-half-day" title="Rentals Half-Day">Rentals Half-Day</a> </li> <li id="main_menuitem_1123_li" class=""><a id="main_menuitem_1123" class=" " href="https://www.portimaosurfclube.pt/book-now/rentals/rentals-1-day" title="Rentals 1 Day">Rentals 1 Day</a> </li> <li id="main_menuitem_1124_li" class=""><a id="main_menuitem_1124" class=" " href="https://www.portimaosurfclube.pt/book-now/rentals/rentals-3-days" title="Rentals 3 Days">Rentals 3 Days</a> </li> </ul></li> </ul> 1081</div> 1082</div> 1083<div class="col-md-6 order-1 order-md-2"> 1084<div class="rounded-5 shadow-lg fade_in_zoom">
1085<div class="card rounded-5 p-5 shadow-lg bg-dirty fade_in text-center"> 1086<a href="https://www.portimaosurfclube.pt/fatumator" class="btn-chatbot"><h2 style="font-size:18px; text-transform: uppercase; font-weight: 700;" class="text-cta">From "I want to surf" to "I'm booked" in 60 seconds</h2><p class="strap small"><em>Just ask our chat â it does the rest.</em></p></a> 1087<a href="#" class="d-table btn-chatbot w-100" data-size="half"> 1088<img src="https://www.portimaosurfclube.pt/_chatbot/_fatumatortobe.png" class="w-100 fade_in_zoom"> 1089<h5 class="text-center fade_in_top"><strong>Do you have a question before booking?</strong></h5> 1090</a> 1091</div> 1092</div> 1093</div> 1094</div> 1095</div> 1096</div></div></div></div></div></div> 1097<div class="fade_in_zoom"> 1098<div class="weather"><div class="row g-3 mb-3"><div class="col-md"><div class="pt-4"><div class="w_day"><img src="https://www.portimaosurfclube.pt/_design/majak.svg" height="25" class="d-table-inline mb-2 me-3" />Thursday</div><div class="date">October 8, 2026</div></div></div><div class="col-md"><div class=""><div class="row g-0"><div class="col-md-3"><div class="pt-md-3"><img src="//cdn.weatherapi.com/weather/64x64/day/113.png" style="display:table; max-width:150px; margin: 0 auto;" alt="Sunny" /></div></div><div class="col-md-9"><div class="pt-4"><div class="temperature">22.7°C</div><div class="condition">Sunny</div></div></div></div></div></div><div class="col-md"><div class="pt-4 details"><i class="fal fa-wind"></i> 13kph NNE<br><i class="fal fa-humidity"></i> 46 · <i class="fal fa-eye"></i> 10km · UV 1.2<br></div></div></div></div><style> 1099 .weather {color:#011945; text-align:center;} 1100 .weather .w_day {font-size: 33px; line-height: 33px; font-family: stevie-sans, serif; text-transform: uppercase;} 1101 .weather .date {font-size: 16px; line-height: 30px; text-transform: uppercase;} 1102 .weather .temperature {font-size: 33px;line-height: 33px; font-weight: 500; } 1103 .weather .details {font-size: 14px;line-height: 20px; } 1104 .weather .condition {font-size: 14px;line-height: 16px; } 1105 .weather sup {text-transform:none;} 1106 1107 .weather.mini .date {font-size: 14px; line-height: 20px; text-transform: uppercase;} 1108 1109</style> 1110</div> 1111</div> 1112</div> 1113</div> 1114</div> 1115<div class="container-fluid"> 1116<div class="row"> 1117<div class="col-md-6 col-xl-4"> 1118<div class="p-3 fade_in_bottom"> 1119<!-- load_objects --><div class="container"><div class="row g-0 justify-content-center"><div style="" class="object_parent load_objects BOX "><div id="objectID_1773" class="cms-non-editable" style=""><div id="editorID_1773" data-label="SURF" data-encoded="4e4449354e544d324d445133514835415957526b615852706232356862463970626e42316445422b51444d354e7a55334f5463784e45422b514445334e7a4d3d" class="" ><p class="mb-3 mt-3 mt-lg-5" style="text-align: center;"><img src="../_design/PTMSC_rgb.svg" alt="" height="100" /></p> 1120<p style="text-align: justify;">At Portimão Surf Clube, our mission is to provide top-quality surf education, guided by our founder and national champion, <strong>Francisco Canelas</strong>. Over the past years, our athletes have achieved regional, national, and international success, proving that our methodology works.</p> 1121<p style="text-align: center;"><strong><a href="../member-registration">Join us</a></strong> for surf, skate or bodyboard lessons in Portimão and Costa Vicentina, especially during the summer!</p></div></div></div></div></div> 1122</div> 1123</div> 1124<div class="col-md-6 col-xl-4"> 1125<div class="p-3 fade_in_bottom"> 1126<!-- load_objects --><div class="container"><div class="row g-0 justify-content-center"><div style="" class="object_parent load_objects BOX "><div id="objectID_1774" class="cms-non-editable" style=""><div id="editorID_1774" data-label="BODYBOARD" data-encoded="4d54497a4d6a49354f446b344d6b422b5147466b5a476c3061573975595778666157357764585241666b41784e6a49304e546b344d546331514835414d5463334e413d3d" class="" ><p class="mb-3 mt-3 mt-lg-5" style="text-align: center;"><img src="../_design/PTMSC_bodyboard.svg" alt="" height="90" /></p> 1127<p style="text-align: justify;">The <strong>PTMSC Bodyboard Academy</strong> is led by two passionate bodyboarders. <strong>Filipe Costa</strong>, a champion athlete and physiotherapist at <strong>FisioRider</strong>, combines functional training for board riders with specialized physiotherapy treatments. Alongside him is <strong>Sandro Nóbrega</strong>, with more than 20 years of experience in bodyboarding and co-organizer of the legendary Vau BB Vau Challenge. Both are honorary members of PTMSC and have been key to the growth of bodyboarding in our region.</p></div></div></div></div></div> 1128</div> 1129</div> 1130<div class="col-md-6 col-xl-4"> 1131<div class="p-3 fade_in_bottom"> 1132<!-- load_objects --><div class="container"><div class="row g-0 justify-content-center"><div style="" class="object_parent load_objects BOX "><div id="objectID_1775" class="cms-non-editable" style=""><div id="editorID_1775" data-label="SKATE" data-encoded="4d5467354f444d314d4455324e45422b5147466b5a476c3061573975595778666157357764585241666b41324d7a51354d6a59334f546c4
11321666b41784e7a6331" class="" ><p class="mb-3 mt-3 mt-lg-5" style="text-align: center;"><img src="../_design/PTMSC_skate.svg" alt="" height="100" /></p> 1133<p style="text-align: justify;">Our main mission is to promote and develop skateboarding through both training and competition. We offer regular classes for athletes from the age of five, providing a structured and motivating environment for young skaters. <strong>Emanuel Silva</strong> is now the primary coach guiding the new generation, helping them build skills and confidence on the board.</p></div></div></div></div></div> 1134</div> 1135</div> 1136</div> 1137</div> 1138<div class="row g-0 border-top"> 1139<div class="col-lg-12"> 1140<div class="p-3 p-lg-5 fade_in"> 1141<h3 style="text-align: center;">Google Reviews</h3> 1142 <style> 1143 #gr-wrap{max-width:760px;margin:0 auto;text-align:center;color:#011945;} 1144 #gr-wrap .gr-summary{display:flex;align-items:center;justify-content:center;gap:.6rem; 1145 margin-bottom:1.75rem;font-size:1rem;} 1146 #gr-wrap .gr-summary .gr-score{font-size:1.4rem;font-weight:700;line-height:1;} 1147 #gr-wrap .gr-summary .gr-stars{color:#fbbc04;letter-spacing:2px;font-size:1.05rem;} 1148 #gr-wrap .gr-summary .gr-count{color:#8a93a6;font-size:.9rem;} 1149 1150 #google-reviews{position:relative;padding:0 3rem;} 1151 #google-reviews .carousel-inner{min-height:230px;} 1152 #google-reviews .carousel-item{transition:opacity .6s ease;} 1153 #google-reviews .review{padding:.5rem 1rem;} 1154 #google-reviews .review-stars{color:#fbbc04;font-size:1.25rem;letter-spacing:3px;margin-bottom:1.1rem;} 1155 #google-reviews .review-text{font-size:1.0rem;line-height:1.35;font-style:italic; 1156 color:#011945;margin-bottom:1.5rem;} 1157 #google-reviews .review-author{display:flex;align-items:center;justify-content:center; 1158 gap:.65rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;font-size:.95rem;} 1159 #google-reviews .review-author img{width:40px;height:40px;border-radius:50%;object-fit:cover;} 1160 #google-reviews .review-author .meta{text-align:left;} 1161 #google-reviews .review-date{display:block;font-weight:400;text-transform:none; 1162 letter-spacing:0;color:#8a93a6;font-size:.82rem;} 1163 1164 #google-reviews .carousel-control-prev, 1165 #google-reviews .carousel-control-next{width:2.5rem;opacity:.85;color:#011945;} 1166 #google-reviews .carousel-control-prev{left:-.5rem;} 1167 #google-reviews .carousel-control-next{right:-.5rem;} 1168 #google-reviews .carousel-control-prev:hover, 1169 #google-reviews .carousel-control-next:hover{opacity:1;} 1170 #google-reviews .carousel-control-prev i, 1171 #google-reviews .carousel-control-next i{font-size:1.4rem;} 1172 1173 @media (max-width:575px){ 1174 #google-reviews{padding:0 1.25rem;} 1175 #google-reviews .carousel-control-prev, 1176 #google-reviews .carousel-control-next{display:none;} 1177 } 1178 </style> 1179 1180 <div id="gr-wrap"> 1181 <div class="gr-summary"> 1182 <span class="gr-score">4.8</span> 1183 <span class="gr-stars">★★★★★</span> 1184 <span class="gr-count">(112 Google reviews)</span> 1185 </div> 1186 <hr> 1187 1188 <div id="google-reviews" class="carousel slide carousel-fade" data-bs-ride="carousel"> 1189 <div class="carousel-inner"> 1190 <div class="carousel-item active "> 1191 <div class="review"> 1192 <p class="review-text fade_in">We booked a surf lesson for the afternoon 1st Oct - wet suit and surf board included. Really good instruction, I had some surf experience, partner had non. We both had a fun time and got just about stood up on the boards. 1193Booked in for the next day 2nd October. Different instructor who was also really good. Huge swell/surf and I managed to get stood up on the board - had I just hired a board and gone out myself I likely wouldnât have. Our instructor were really good. 1194All the staff were friendly and helpful. There is space to leave valuables, and a hot shower for afterwards.<
1194/p> 1195 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1196 ★★★★★ </div> 1197 <div class="review-author fade_in_zoom"> 1198 <img src="https://lh3.googleusercontent.com/a/ACg8ocJjbCfEDwO8gJq-aSoQTyvSXvgLqb4eGJVfyYIHRm3fY8X7VQ=s120-c-rp-mo-br100" alt="" loading="lazy"> 1199 <span class="meta"> 1200 Paul Eastwood <span class="review-date">4 days ago</span> 1201 </span> 1202 </div> 1203 </div> 1204 </div> 1205 <div class="carousel-item "> 1206 <div class="review"> 1207 <p class="review-text fade_in">Very good experience with Alexander ! Thank you, it was our first time and we want to do surf again ! ð</p> 1208 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1209 ★★★★★ </div> 1210 <div class="review-author fade_in_zoom"> 1211 <img src="https://lh3.googleusercontent.com/a-/ALV-UjUpTokpyEdpNbMdH6i-zWlqjGq5Ni96BeNdMRC5pKkNQCFz5wo=s120-c-rp-mo-br100" alt="" loading="lazy"> 1212 <span class="meta"> 1213 Gregoire Baudat <span class="review-date">2 days ago</span> 1214 </span> 1215 </div> 1216 </div> 1217 </div> 1218 <div class="carousel-item "> 1219 <div class="review"> 1220 <p class="review-text fade_in">We drove approx 40min to anothet beach where the waves were perfect for beginners and had over 2h water time. The teachers were really helpful! However, we were quite a large group for the small part of the beach, but teacher to student ratio was fine. But for the next time please emphasize for first time surfers not to get too close to the others to avoid collidions. Still had a great time, thanks!</p> 1221 <div class="review-stars fade_in_bottom" aria-label="4 out of 5"> 1222 ★★★★☆ </div> 1223 <div class="review-author fade_in_zoom"> 1224 <img src="https://lh3.googleusercontent.com/a/ACg8ocJ4V-MNwnyGigelNlDVmlA6-NNbujgUhyHy9r4uUVMKgXtyoQ=s120-c-rp-mo-br100" alt="" loading="lazy"> 1225 <span class="meta"> 1226 Luca <span class="review-date">3 days ago</span> 1227 </span> 1228 </div> 1229 </div> 1230 </div> 1231 <div class="carousel-item "> 1232 <div class="review"> 1233 <p class="review-text fade_in">I love surfing with this school. They are so friendly and such good instructors. I have been surfing a few years but still always learning. I had lessons with Alexandre and he is great. Such a good teacher. I got rid of old bad habits and got better and better. I really had such a fun time too. I will definitely book with them again when I am back in Portugal ð¤ð</p> 1234 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1235 ★★★★★ </div> 1236 <div class="review-author fade_in_zoom"> 1237 <img src="https://lh3.googleusercontent.com/a-/ALV-UjX9yIrCKH_5PJdEA02e0pas0qfV3OZQtKWCTzzNp3fPgss2J1I=s120-c-rp-mo-br100" alt="" loading="lazy"> 1238 <span class="meta"> 1239 Chelle Meaks <span class="review-date">3 days ago</span> 1240 </span> 1241 </div> 1242 </div> 1243 </div> 1244 <div class="carousel-item "> 1245 <div class="review"> 1246 <p class="review-text fade_in">Perfect!!! Such an amazing experience</p> 1247 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1248 ★★★★★ </div> 1249 <div class="review-author fade_in_zoom"> 1250 <img src="https://lh3.googleusercontent.com/a/ACg8ocKjkoREtE0hV1gfZTdc4MmnZNPK3cxS9BgO2v00TDBeuvDinw=s120-c-rp-mo-ba12-br100" alt="" loading="lazy">
1251 <span class="meta"> 1252 Aizhan Dautova <span class="review-date">2 weeks ago</span> 1253 </span> 1254 </div> 1255 </div> 1256 </div> 1257 <div class="carousel-item "> 1258 <div class="review"> 1259 <p class="review-text fade_in">Really good lesson with an amazing instructor. For first timers it is perfect, we all manged to stand up and ride some waves ð¤ 1260Good for advanced people aswell with great reccomandations to progress</p> 1261 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1262 ★★★★★ </div> 1263 <div class="review-author fade_in_zoom"> 1264 <img src="https://lh3.googleusercontent.com/a-/ALV-UjWuv50Cc35hCXTrB0GbVFiDaYRX84Vnw2WaOD5nT0PQMVl0vfAZ=s120-c-rp-mo-br100" alt="" loading="lazy"> 1265 <span class="meta"> 1266 Corentin <span class="review-date">2 weeks ago</span> 1267 </span> 1268 </div> 1269 </div> 1270 </div> 1271 <div class="carousel-item "> 1272 <div class="review"> 1273 <p class="review-text fade_in">(Translated by Google) We booked the surf course for our three children. Everything was very straightforward and professional, from registration to the course itself. The staff and surf instructors were cool and easygoing! 1274 1275(Original) 1276Wir haben den Surfkurs für unsere drei Kinder gebucht. Es war alles sehr unkompliziert und kompetent. Von der Anmeldung bis zur Durchführung. Coole und lässige Mitarbeiter und Surflehrer!!</p> 1277 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1278 ★★★★★ </div> 1279 <div class="review-author fade_in_zoom"> 1280 <img src="https://lh3.googleusercontent.com/a/ACg8ocLKZfi6DcVv2eYbcETet2nw4l-3x3q6JQsNAJBA_4Zgd2LvEg=s120-c-rp-mo-br100" alt="" loading="lazy"> 1281 <span class="meta"> 1282 Eva Gruber <span class="review-date">2 weeks ago</span> 1283 </span> 1284 </div> 1285 </div> 1286 </div> 1287 <div class="carousel-item "> 1288 <div class="review"> 1289 <p class="review-text fade_in">Francisco, my coach, was amazing. He is ultra qualified (championships in pro surf on his belt) but more importantly he has the biggest, hugest, warmest heart. Riding back and forth to the beach we went to from Lagos was half the fun! Everyone at the beach knew him and several were young adults he coached and who also were winning big in competitions. As for the learning process, Iâm sixty five and have only had two lessons before, one of which was 25 years ago. He was so patient and encouraging - I really just love the man. I canât recommend Francisco and his club enough. Go for it!</p> 1290 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1291 ★★★★★ </div> 1292 <div class="review-author fade_in_zoom"> 1293 <img src="https://lh3.googleusercontent.com/a-/ALV-UjUy3OdBKSnroXcqjjfjJ_q3vAO7HoHaBXbpPO9gLf_rmdffEzrH=s120-c-rp-mo-ba12-br100" alt="" loading="lazy"> 1294 <span class="meta"> 1295 Sarah Kerrigan <span class="review-date">2 weeks ago</span> 1296 </span> 1297 </div> 1298 </div> 1299 </div> 1300 <div class="carousel-item "> 1301 <div class="review"> 1302 <p class="review-text fade_in">Had a great time last year. Hamil and Alexander are great teachers. They made sure i understood correctly. Really loved the 5 days cours I did with them. 1303 1304May the waves treat you well, 1305Vlad</p> 1306 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1307 ★★★★★ </div> 1308 <div class="review-author fade_in_zoom"> 1309 <img src="https://lh3.googleusercontent.com/a-/ALV-UjU4ZreeWVV1GcY1_iRJHbyADywz9NpwnYhoFmLztwk2McLUqsQn=s120-c-rp-mo-br100" alt="" loading="lazy">
1310 <span class="meta"> 1311 Vlad Morariu <span class="review-date">3 weeks ago</span> 1312 </span> 1313 </div> 1314 </div> 1315 </div> 1316 <div class="carousel-item "> 1317 <div class="review"> 1318 <p class="review-text fade_in">I had an absolutely amazing experience with Surf Clube Portimão and couldnât have wished for a better surf lesson! 1319 1320My instructor was fantastic â incredibly kind, patient and encouraging. He explained everything really well, helped me whenever I needed it, and made me feel comfortable and confident in the water from the very beginning. Thanks to his great guidance, I managed to catch many waves and had an absolutely unforgettable time. I had SO much fun! ððââï¸ 1321 1322A special thank you also goes to his colleague, who took amazing photos and videos during the lesson. They turned out beautifully and will always remind me of this wonderful day and an unforgettable holiday in Portugal. â¤ï¸ 1323 1324Iâm truly grateful for this experience and would 100% recommend Surf Clube Portimão to anyone who wants to learn surfing, have fun and create some amazing memories. I would definitely come back! ðâï¸ 1325 1326Thank you so much for an unforgettable day!</p> 1327 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1328 ★★★★★ </div> 1329 <div class="review-author fade_in_zoom"> 1330 <img src="https://lh3.googleusercontent.com/a/ACg8ocJaHxHyl1-1eWKn7nZzWiuoReQ93BLppV2uxXJNtvzFNBo6XQ=s120-c-rp-mo-br100" alt="" loading="lazy"> 1331 <span class="meta"> 1332 Janina Graf <span class="review-date">4 weeks ago</span> 1333 </span> 1334 </div> 1335 </div> 1336 </div> 1337 <div class="carousel-item "> 1338 <div class="review"> 1339 <p class="review-text fade_in">Our instructor Alexandre and the communication were amazing! 1340 1341My girlfriend and I had planned a group lesson, but in the end it was just the two of us. So Alex gave us a private lesson, but we still paid the same price. 1342 1343Great surf club, we couldnât have asked for a better first surfing experience!</p> 1344 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1345 ★★★★★ </div> 1346 <div class="review-author fade_in_zoom"> 1347 <img src="https://lh3.googleusercontent.com/a/ACg8ocKIijpSIsqQzz8LXjMUFp6wAzQCmOpUQDZ2Y-PlacqFaKCN59I=s120-c-rp-mo-br100" alt="" loading="lazy"> 1348 <span class="meta"> 1349 renzoseys 2502 <span class="review-date">1 month ago</span> 1350 </span> 1351 </div> 1352 </div> 1353 </div> 1354 <div class="carousel-item "> 1355 <div class="review"> 1356 <p class="review-text fade_in">Unfortunately, we had to cancel our surf lesson due to sickness. Portimão was incredibly flexible with rescheduling and, ultimately, processing our refund! I would highly recommend them for their kindness, excellent customer service, and professional watersports skills.</p> 1357 <div class="review-stars fade_in_bottom" aria-label="5 out of 5"> 1358 ★★★★★ </div> 1359 <div class="review-author fade_in_zoom"> 1360 <img src="https://lh3.googleusercontent.com/a-/ALV-UjUB1jq_l32RxaDpc_3agUFo-MtqmS8Vb6CmEemmptl1l6jdVf7r=s120-c-rp-mo-br100" alt="" loading="lazy"> 1361 <span class="meta"> 1362 Brend Seinen <span class="review-date">1 month ago</span> 1363 </span> 1364 </div> 1365 </div> 1366 </div> 1367 </div> 1368 <button class="carousel-control-prev" type="button" data-bs-target="#google-reviews" data-bs-slide="prev"> 1369 <i class="fal fa-arrow-left"></i><span class="visually-hidden">Previous</span> 1370 </button> 1371 <button class="carousel-control-next" type="button" data-bs-target="#google-reviews" data-bs-slide="next"> 1372 <i class="fal fa-arrow-right"></i><span class="visually-hidden">Next</span> 1373 </button> 1374 </div> 1375 </div> 1376 1377<p class="text-center mt-5"><a class="btn btn-cta rounded-5 p-5 pt-3 pb-3 shadow-lg fade_in_zoom" href="https://g.page/r/CeqaZZxMKqUKEBM/review" target="_blank" rel="noopener"><i class="fab fa-google me-2 "></i>Share Your Experience</a></p> 1378</div> 1379</div> 1380</div> 1381</div></div></div></div><div class="object_parent wireframe "><div id="objectID_1853" class="" style=""><div id="editorID_1853" data-label="Join" data-encoded="4d5449784f544d354e7a4d784e6b422b5147466b5a476c3061573975595778666157357764585241666b41784e44677a4e7a6b344d6a5577514835414d5467314d773d3d" class="" >
1381<div class=" bg-dirty"> 1382<div class="row g-0"> 1383<div class="col-lg-6 order-2 order-lg-1"> 1384<div class="p-3 pt-5 pb-5 p-lg-5 fade_in_top"> 1385<h5><strong>PTMSC</strong> - Portimão Surf Clube <strong>Membership</strong></h5> 1386<h2>Want to join the club?</h2> 1387<p style="text-align: justify;">Joining <strong>PTMSC - Portimão Surf Clube</strong> offers fantastic value for surf enthusiasts, locals, and visitors to the Algarve. As a member, you gain unlimited access to the club's excellent facilities <strong>7 days a week from 9 AM to 5 PM</strong>, providing the perfect base for planning sessions, storing gear, or connecting with the community at their welcoming headquarters near <strong>Praia da Rocha</strong>. Monthly lesson subscribers can enjoy a generous 50% discount on equipment rentals—including surfboards, bodyboards, SUPs, and more—making it easier and more affordable to hit the waves regularly without breaking the bank. Plus, you'll receive <strong>exclusive access</strong> to special club events, competitions, workshops, promotions, and member-only gatherings that foster a vibrant surf lifestyle and help you level up your skills. Whether you're a beginner or a seasoned rider, becoming a PTMSC member unlocks these key perks to enhance your time on the water in Portimão and along the stunning west coast!</p> 1388<p style="text-align: center;"><a class="btn btn-cta p-4 ps-5 pe-5 shadow rounded-pill mt-3 fade_in_zoom" href="https://www.portimaosurfclube.pt/member-registration"><strong class="text-white">Join PTMSC today!</strong></a></p> 1389</div> 1390</div> 1391<div class="col-lg-6 order1 order-lg-2 fade_in_top"> 1392<div><a href="https://www.portimaosurfclube.pt/member-registration"><img class="w-100" src="https://www.portimaosurfclube.pt/_files/content/1Y5A5414-canelas.jpg" alt="Join PTMSC - Portimao Surf Clube TODAY! - Francisco Canelas" /></a></div> 1393</div> 1394</div> 1395</div> 1396</div></div></div></div><div class="object_parent wireframe "><div id="objectID_1777" class="" style=""><div id="editorID_1777" data-label="APT" data-encoded="4e6a59784e5459334d545241666b42685a47527064476c76626d467358326c7563485630514835414d6a41324d5449794e4463304e55422b514445334e7a633d" class="" ><div class="row g-0"> 1397<div class="col-lg-6"> 1398<div class="fade_in_top"> 1399 1400 <div style="position: relative; padding-top: 56.25%;" class=""> 1401 <iframe 1402 src="https://customer-0tzx6lvms3lhg1mn.cloudflarestream.com/05c09dea1c88fee4e1b6c807937eeb30/iframe?muted=true&preload=true&loop=true&poster=https%3A%2F%2Fcustomer-0tzx6lvms3lhg1mn.cloudflarestream.com%2F05c09dea1c88fee4e1b6c807937eeb30%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600" 1403 loading="lazy" 1404 style="border: none; position: absolute; top: 0; left: 0; height: 100%; width: 100%;" 1405 allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;" 1406 allowfullscreen="true" 1407 class="" 1408 ></iframe> 1409 </div> 1410 1411</div> 1412</div> 1413<div class="col-lg-6"> 1414<div class="p-3 pt-5 p-lg-5 fade_in_top"> 1415<!-- load_objects --><div class="container"><div class="row g-0 justify-content-center"><div style="" class="object_parent load_objects BOX "><div id="objectID_1776" class="cms-non-editable" style=""><div id="editorID_1776" data-label="PADDLE" data-encoded="4d5463324d44637a4f5463314e6b422b5147466b5a476c3061573975595778666157357764585241666b41784d446b794e7a45334d6a5131514835414d5463334e673d3d" class="" ><h5><strong>Stand Up Paddle</strong> (SUP)</h5> 1416<p><a title="Book Now" href="https://fareharbor.com/embeds/book/portimaosurfclube/?full-items=yes&flow=529431" data-fareharbor="book_tour_button_desktop"><img style="display: table-inline; margin-left: auto; margin-right: auto;" src="https://www.portimaosurfclube.pt/_files/content/logo_landscape.svg" width="50%" /></a><a class="" title="Book Now" href="https://fareharbor.com/embeds/book/portimaosurfclube/?full-items=yes&flow=529431" data-fareharbor="book_tour_button_desktop"><img class="" style="float: right; margin-top: -50px;" src="https://www.portimaosurfclube.pt/_files/content/BOOK_NOW_EN.svg" alt="" width="100" height="100" /></a></p> 1417<p style="text-align: justify;">The PTMSC, in partnership with Alvor Paddle Tours, offers unforgettable Stand Up Paddle (SUP) tours in Portimão and Alvor, two of the most beautiful destinations in the Algarve. Guided by an experienced local instructor, you will paddle along the stunning coastline, discover hidden caves, and pass through the famous rock arches. The tour also includes relaxing stops at secluded beaches, where you can enjoy yoga and connect with nature. This Stand Up Paddle experience in Portimão and Alvor is the ideal activity for travelers seeking adventure, wellness, and breathtaking views of the Algarve coast.</p></div></div></div></div></div> 1418</div> 1419</div> 1420</div></div></div></div>
1420<div class="object_parent wireframe bg-dirty"><div id="objectID_1865" class="" style=""><div id="editorID_1865" data-label="PARA" data-encoded="4d5467334e44557a4e6a45774e6b422b5147466b5a476c3061573975595778666157357764585241666b41784e7a6b7a4d7a4d794e544579514835414d5467324e513d3d" class="" ><div class="row g-0"> 1421<div class="col-lg-6 order-2 order-lg-1"> 1422<div class="p-3 pt-5 pb-5 p-lg-5 fade_in_top"> 1423<!-- load_objects --><div class="container"><div class="row g-0 justify-content-center"><div style="" class="object_parent load_objects BOX "><div id="objectID_1866" class="cms-non-editable" style=""><div id="editorID_1866" data-label="PARA" data-encoded="4d5467794d6a59784f5459324e45422b5147466b5a476c3061573975595778666157357764585241666b417a4e6a59774d4459314e544641666b41784f445932" class="" ><h5><strong>Para Surfing</strong> in Portimão</h5> 1424<h2>Núcleo Para Surfing at Portimão Surf Clube</h2> 1425<p style="text-align: justify;">Para Surfing in Portimão is the ultimate destination for adaptive surfing and inclusive wave riding in the Algarve, Portugal. At <strong>PTMSC</strong>, we proudly champion para surfing — a dynamic form of adaptive surfing that empowers athletes with physical challenges to experience the thrill of riding waves at <strong>Praia da Rocha</strong> and beyond. Our para surfing program combines passion, community, and professional support to make surfing truly accessible for all, whether you are an experienced adaptive surfer or trying the sport for the first time. With expert guidance from <strong>FisioRider</strong>, athletes receive tailored physiotherapy, strength and balance training, and surfâspecific preparation — helping to enhance performance, reduce injury risk, and build confidence in the water.</p> 1426<p>Discover the excitement of inclusive surfing in Portugal, connect with a welcoming surf community, and explore why Portimão is fast becoming a leading hub for para surfing and adaptive water sports in Europe.</p> 1427<p><a href="https://www.portimaosurfclube.pt/nucleo-para-surfing">Find out more</a></p></div></div></div></div></div> 1428</div> 1429</div> 1430<div class="col-lg-6 order1 order-lg-2 fade_in_top"> 1431<div><img class="w-100" src="https://www.portimaosurfclube.pt/_files/content/nucleodeparasurf.jpg" alt="Para Surfing Portugal, Algarve, Portimao" /></div> 1432</div> 1433</div></div></div></div></div></div> 1434 </section> 1435 1436<footer class="pt-5"> 1437 1438<div class="container-fluid"> 1439 <div class="row"> 1440 <div class="col-12"> 1441 <style> 1442 1443 .item-59 img {height: 46px !important;} 1444 1445 .logo-scroller { 1446 overflow: hidden; 1447 width: 100%; 1448 } 1449 1450 .logo-track { 1451 display: flex; 1452 align-items: center; 1453 flex-wrap: nowrap; 1454 width: max-content; 1455 animation: scroll 30s linear infinite; 1456 } 1457 1458 .logo-item { 1459 flex: 0 0 auto; 1460 display: flex; 1461 align-items: center; 1462 justify-content: center; 1463 padding: 0 1.5rem; 1464 } 1465 1466 /* Base logo size (desktop) */ 1467 .logo-item img { 1468 height: 150px; 1469 width: auto; 1470 object-fit: contain; 1471 } 1472 1473 /* Tablet */ 1474 @media (max-width: 991px) { 1475 .logo-item img { 1476 height: 55px; 1477 } 1478 } 1479 1480 /* Mobile â max 2 logos visible */ 1481 @media (max-width: 575px) { 1482 .logo-item { 1483 padding: 0 1rem; 1484 } 1485 1486 .logo-item img { 1487 height: 40px; 1488 } 1489 } 1490 1491 /* Extra small â effectively 1 logo */ 1492 @media (max-width: 400px) { 1493 .logo-item { 1494 padding: 0 0.75rem; 1495 } 1496 1497 .logo-item img { 1498 height: 200px; 1499 } 1500 } 1501 1502 @keyframes scroll { 1503 0% { transform: translateX(0); } 1504 100% { transform: translateX(-50%); } 1505 } 1506 1507 /* Accessibility */ 1508 @media (prefers-reduced-motion: reduce) { 1509 .logo-track { 1510 animation: none; 1511 } 1512 } 1513 1514 @media (hover: hover) { 1515 .logo-scroller:hover .logo-track { 1516 animation-play-state: paused; 1517 } 1518 } 1519 1520 @media (max-width: 575px) { 1521 .logo-track { 1522 animation-duration: 45s; 1523 } 1524 } 1525 1526 </style> 1527 1528 1529 <!-- Seamless Infinite Logo Slider --> 1530 <div class="logo-scroller"> 1531 <div class="logo-track"> 1532 <div class="logo-item fade_in item-1"><a href="http://alvorpaddletours.com/" target="_blank"><img src="https://www.portimaosurfclube.pt/_files/menu/993/1-logos-apt-white.png" alt="Alvor Paddle Tours" class="" /></a></div><div class="logo-item fade_in item-2"><img src="https://www.portimaosurfclube.pt/_files/menu/993/2-logos-clube-02-1.png" alt="" class="" /></div><div class="logo-item fade_in item-3"><img src="https://www.portimaosurfclube.pt/_files/menu/993/3-logos-clube-02-3.png" alt="" class="" /></div><div class="logo-item fade_in item-4"><img src="https://www.portimaosurfclube.pt/_files/menu/993/4-logos-clube-11-02.png" alt="" class="" /></div><div class="logo-item fade_in item-5"><img src="https://www.portimaosurfclube.pt/_files/menu/993/5-logos-clube1-02.png" alt="" class="" /></div><div class="logo-item fade_in item-6"><a href="https://www.secretspot98.com" target="_blank"><img src="https://www.portimaosurfclube.pt/_files/menu/993/6-logos-clube52424-02.png" alt="Secret Spot 98" class="" /></a></div><div class="logo-item fade_in item-7"><a href="https://www.kayak.es/" target="_blank"><img src="https://www.portimaosurfclube.pt/_files/menu/993/7-logos-kayak-white.png" alt="KAYAK" class="" /></a></div><div class="logo-item fade_in item-59"><a href="https://algarve.pro/" target="_blank"><img src="https://www.portimaosurfclube.pt/_files/menu/993/59-ap-natural.png" alt="ALGARVE PRO" class="" /></a></div><div class="logo-item fade_in item-1"><a href="http://alvorpaddletours.com/" target="_blank"><img src="https://www.portimaosurfclube.pt/_files/menu/993/1-logos-apt-white.png" alt="Alvor Paddle Tours" class="" /></a></div><div class="logo-item fade_in item-2"><img src="https://www.portimaosurfclube.pt/_files/menu/993/2-logos-clube-02-1.png" alt="" class="" /></div><div class="logo-item fade_in item-3"><img src="https://www.portimaosurfclube.pt/_files/menu/993/3-logos-clube-02-3.png" alt="" class="" /></div><div class="logo-item fade_in item-4"><img src="https://www.portimaosurfclube.pt/_files/menu/993/4-logos-clube-11-02.png" alt="" class="" /></div><div class="logo-item fade_in item-5"><img src="https://www.portimaosurfclube.pt/_files/menu/993/5-logos-clube1-02.png" alt="" class="" /></div><div class="logo-item fade_in item-6"><a href="https://www.secretspot98.com" target="_blank"><img src="https://www.portimaosurfclube.pt/_files/menu/993/6-logos-clube52424-02.png" alt="Secret Spot 98" class="" /></a></div><div class="logo-item fade_in item-7"><a href="https://www.kayak.es/" target="_blank"><img src="https://www.portimaosurfclube.pt/_files/menu/993/7-logos-kayak-white.png" alt="KAYAK" class="" /></a></div><div class="logo-item fade_in item-59"><a href="https://algarve.pro/" target="_blank"><img src="https://www.portimaosurfclube.pt/_files/menu/993/59-ap-natural.png" alt="ALGARVE PRO" class="" /></a></div> 1533 </div> 1534 </div> 1535 1536</div> 1537 </div> 1538</div> 1539<hr /> 1540<div class="container"> 1541 1542 <div class="row"> 1543 1544 <div class="col-xl-6"> 1545 1546 <div class="row"> 1547 <div class="col-md"> 1548 <div class="p-5 p-md-1 pt-3"> 1549 <div class="m-5 m-md-3 ps-3 pe-3"><img src="https://www.portimaosurfclube.pt/_design/portimao-surf-clube-light.svg?x" class="w-100" alt="Portimao Surf Clube" /></div> 1550 </div> 1551 </div> 1552 1553 <div class="col-12 col-md"> 1554 <div class="p-3 text-center mb-5"> 1555 <p><strong>
1555PARTNERSHIP</strong><br><em>EM PARCERIA</em></p> 1556 <p class="ps-5 pe-5 ms-5 me-5 ms-md-0 me-md-0"><a href="https://www.alvorpaddletours.com" target="_blank"><img src="https://www.portimaosurfclube.pt/_design/logo_square.svg" class="w-100" alt="Alvor Paddle Tours (SUP Portimao/Alvor)" /></a></p> 1557 </div> 1558 </div> 1559 1560 <div class="col-12 col-md"> 1561 <div class="text-center"> 1562 <p class="d-none d-md-table p-3"><a href="https://www.portimaosurfclube.pt/contacts/vcard" download><img src="https://ptmsc.link/qrcodes/SIcvEB.svg" class="w-100" /></a></p> 1563 </div> 1564 </div> 1565 1566 </div> 1567 1568 <div class="ps-5 pe-5 ps-md-0 pe-md-0"> 1569 <div class="row g-0"> 1570 <div class="col-12 col-md"> 1571 <div class="p-3"> 1572 <a class="" href="https://apps.apple.com/us/app/ptmsc/id6771550266" target="_blank" rel="noopener"><img class="w-100" src="../_design/app_icon_apple.svg" alt="" /></a> 1573 </div> 1574 </div> 1575 <div class="col-12 col-md"> 1576 <div class="p-3"> 1577 <a href="https://play.google.com/store/apps/details?id=pt.portimaosurfclube.ptmsc" target="_blank" rel="noopener"><img class="w-100" src="../_design/app_icon_google.svg" alt="" /></a> 1578 </div> 1579 </div> 1580 <div class="col-12 col-md"> 1581 <div class="p-3 d-none"> 1582 <a class="" href="https://www.portimaosurfclube.pt/_app_ptmsc/index.php" target="_blank" rel="noopener"><img class="w-100" src="../_design/app_icon_pwa.png" alt="" /></a> 1583 </div> 1584 </div> 1585 </div> 1586 </div> 1587 1588 </div> 1589 1590 <div class="col-xl-6"> 1591 1592 <div class="row"> 1593 1594 <div class="col-md"> 1595 <div class="pt-3 text-center text-md-start ps-md-5 mb-5"> 1596 <h5><strong>Information</strong><br><em>Informação</em></h5> 1597 <ul id="KOOmenuitem_406_ul" class=""><li id="KOOmenuitem_1194_li" class="fade_in_left"><a id="KOOmenuitem_1194" class=" " href="https://www.portimaosurfclube.pt/contacts" title="Contacts">Contacts</a> </li> <li id="KOOmenuitem_818_li" class="fade_in_left"><a id="KOOmenuitem_818" class=" " href="https://www.portimaosurfclube.pt/faq" title="FAQ">FAQ</a> </li> <li id="KOOmenuitem_542_li" class="fade_in_left"><a id="KOOmenuitem_542" class=" " href="https://www.portimaosurfclube.pt/sitemap" title="Sitemap">Sitemap</a> </li> <li id="KOOmenuitem_578_li" class="fade_in_left"><a id="KOOmenuitem_578" class=" " href="https://www.portimaosurfclube.pt/privacy-policy" title="Privacy Policy">Privacy Policy</a> </li> <li id="KOOmenuitem_971_li" class="fade_in_left"><a id="KOOmenuitem_971" class=" " href="https://www.portimaosurfclube.pt/terms-and-conditions" title="Terms & Conditions">Terms & Conditions</a> </li> <li id="KOOmenuitem_972_li" class="fade_in_left"><a id="KOOmenuitem_972" class=" " href="https://www.portimaosurfclube.pt/complaints-book" title="Complaints book">Complaints book</a> </li> <li id="KOOmenuitem_1110_li" class="fade_in_left"><a id="KOOmenuitem_1110" class=" " href="https://www.portimaosurfclube.pt/ptmsc-app-installation" title="PTMSC Mobile APP">PTMSC Mobile APP</a> </li> </ul> 1598 </div> 1599 </div> 1600 1601 <div class="col-md"> 1602 <div class="pt-3 text-center text-md-start"> 1603 <h5><strong>CONTACTS</strong><br><em>CONTACTOS</em></h5> 1604 <p class="lead"><i class="fab fa-whatsapp me-1"></i><a href="https://wa.me/15558734337?text="><strong>Virtual Assistant</strong><br>+1 (555) 873-4337<br><small>Get Instant Answer</small></a></p> 1605 <p><i class="fab fa-whatsapp me-1"></i><a href="tel:+351966559739"><strong>Office</strong>+351 966 559 739<br><small>Usually reply within an hour</small></a></p> 1606 <!--<p>
1606 <a href="imessage:[email protected]">[email protected]</a></p>--> 1607 <p><i class="fa fa-envelope me-1"></i><a href="/cdn-cgi/l/email-protection#0a63646c654a7a65787e63676b65797f786c69667f686f247a7e"><span class="__cf_email__" data-cfemail="5c35323a331c2c332e2835313d332f292e3a3f30293e39722c28">[email protected]</span></a></p> 1608 <p><a href="https://maps.app.goo.gl/a6mUXcwsPU2tvyX36" target="_blank" rel="noopener"><i class="fal fa-map-marker-alt me-2"></i>PTMSC<br>Portimão Surf Clube<br>Estrada Marina 280,<br>8500-311 Portimão</a></p> 1609 <p> 1610 <a href="https://wa.me/15558734337?text=" target="_blank" class="m-2" title="WhatsApp"><i class="fab fa-whatsapp fa-3x"></i></a> 1611 <!--<a href="https://wa.me/351966559739?text=" target="_blank" class="m-2" title="WhatsApp"><i class="fab fa-whatsapp fa-3x"></i></a>--> 1612 <a href="https://www.instagram.com/portimaosurfclube/" target="_blank" class="m-2" title="Instagram"><i class="fab fa-instagram fa-3x"></i></a> 1613 <a href="https://www.facebook.com/portimaosurfclube/" target="_blank" class="m-2" title="Facebook"><i class="fab fa-facebook fa-3x"></i></a> 1614 <a href="https://www.tripadvisor.com/Attraction_Review-g652081-d19327882-Reviews-Portimao_Surf_Clube-Praia_da_Rocha_Portimao_Faro_District_Algarve.html" target="_blank" class="m-2" title="Tripadvisor"><i class="fab fa-tripadvisor fa-3x"></i></a> 1615 </p> 1616 </div> 1617 </div> 1618 1619 </div> 1620 1621 </div> 1622 1623 1624 </div> 1625</div> 1626<hr> 1627<div class="container p-md-5"> 1628 <div class="row g-0"> 1629 <div class="col-md-3 text-center text-md-start pb-5"> 1630 <p>© 2026 PTMSC<br>Portimão Surf Clube</p> 1631 </div> 1632 <div class="col-md-6 text-center pb-5"> 1633 <p><a href="https://www.visitportugal.com/en/node/435605" target="_blank"><img src="https://www.portimaosurfclube.pt/_design/Turismo_de_portugal_light.svg" width="120" alt="Turismo de PORTUGAL" /></a></p> 1634 <p>RNAAT 158 / 2021</p> 1635 </div> 1636 <div class="col-md-3 pb-5 text-center text-md-end"> 1637 <small><a href="https://algarve.pro" target="_blank" style="font-size:10px;"><img src="https://www.portimaosurfclube.pt/_design/AP-natural.png" width="53" alt="ALGARVE PRO" /><br>Powered by <strong class="d-none">ALGARVE.PRO</strong></a></small> 1638 </div> 1639 </div> 1640 <hr> 1641 <p style="font-size:11px;" class="text-center">Developed by <strong>ALGARVE.PRO</strong> All images on this website are protected by copyright. Unauthorized use is prohibited.</p> 1642</div> 1643</footer> 1644 1645 <link rel="stylesheet" href="https://www.portimaosurfclube.pt/_chatbot/chatbot.css?1791450647">
vendor: 113 bytes, lines 1645-1646
1645 1646 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1646<script src="https://www.portimaosurfclube.pt/_chatbot/chatbot.js?1791450647"></script>
1646 1647 1648<!-- WhatsApp Widget --> 1649<div id="whatsapp-chat-widget"> 1650 <div class="whatsapp-button" onclick="toggleWhatsAppChat()"> 1651 <i class="fab fa-whatsapp"></i> 1652 </div> 1653 1654 <div class="whatsapp-chat-box" id="whatsapp-chat-box"> 1655 <div class="chat-header"> 1656 <img src="https://www.portimaosurfclube.pt/_design/PTMSC_rgb.svg" class="agent" alt="Agent"> 1657 <div> 1658 <strong>Portimao Surf Clube</strong><br> 1659 <span>Typically replies in a few minutes</span> 1660 </div> 1661 <div class="close-chat" onclick="toggleWhatsAppChat()">Ã</div> 1662 </div> 1663 1664 <div class="chat-body"> 1665 <p>Hello ð<br>How can we help you today?</p> 1666 </div> 1667 1668 <div class="chat-footer"> 1669 <input type="text" id="whatsapp-msg" placeholder="Type your message..." /> 1670 <button onclick="sendWhatsAppMessage()">Send</button> 1671 </div> 1672 </div> 1673</div> 1674<style> 1675 1676#whatsapp-chat-widget { 1677 position: fixed; 1678 bottom: 23px; 1679 right: 100px; 1680 font-family: stevie-sans, sans-serif; 1681 z-index: 10000; 1682} 1683 1684.agent { 1685 background: #fff; border-radius: 50%; padding: 5px; 1686} 1687 1688.whatsapp-button { 1689 display: block; 1690 color: #fff; 1691 background: #EF4529; 1692 border-radius: 10px; 1693 width: 60px; 1694 height: 60px; 1695 line-height: 60px; 1696 font-size:40px; 1697 text-align: center; 1698} 1699 1700.whatsapp-chat-box { 1701 display: none; 1702 width: 300px; 1703 background: white; 1704 border-radius: 10px; 1705 box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2) !important; 1706 overflow: hidden; 1707 flex-direction: column; 1708 animation: slideUp 0.3s ease; 1709} 1710 1711.chat-header { 1712 display: flex; 1713 align-items: center; 1714 gap: 10px; 1715 background: #EF4529; 1716 color: white; 1717 padding: 10px; 1718 position: relative; 1719} 1720 1721.chat-header img { 1722 width: 40px; 1723 height: 40px; 1724 border-radius: 10px; 1725} 1726 1727.close-chat { 1728 position: absolute; 1729 right: 10px; 1730 top: 10px; 1731 cursor: pointer; 1732 font-size: 20px; 1733} 1734 1735.chat-body { 1736 padding: 15px; 1737 background: #f0f0f0; 1738 font-size: 16px; 1739 color: #333; 1740} 1741 1742.chat-footer { 1743 display: flex; 1744 border-top: 1px solid #ddd; 1745 padding: 10px; 1746 background: white; 1747} 1748 1749.chat-footer input { 1750 flex: 1; 1751 border: none; 1752 padding: 8px; 1753 font-size: 14px; 1754 border: 1px solid #ccc; 1755 border-radius: 4px; 1756} 1757 1758.chat-footer button { 1759 margin-left: 8px; 1760 background: #EF4529; 1761 color: white; 1762 border: none; 1763 padding: 8px 12px; 1764 border-radius: 4px; 1765 cursor: pointer; 1766} 1767 1768@media (max-width: 480px) { 1769 #whatsapp-chat-widget { 1770 bottom: 15px; 1771 } 1772 .whatsapp-chat-box { 1773 width: 100% !important; 1774 bottom: 0; 1775 right: 0; 1776 left: 0; 1777 flex-direction: column; 1778 } 1779 1780 .chat-header, .chat-body, .chat-footer { 1781 padding: 15px; 1782 } 1783 1784 .whatsapp-button { 1785 bottom: 20px; 1786 right: 20px; 1787 } 1788 1789 .chat-footer input { 1790 flex: 1; 1791 border: none; 1792 padding: 8px; 1793 font-size: 16px; 1794 border: 1px solid #ccc; 1795 border-radius: 4px; 1796 } 1797 1798} 1799 1800 1801@keyframes slideUp { 1802 from { 1803 transform: translateY(100px); 1804 opacity: 0; 1805 } 1806 to { 1807 transform: translateY(0); 1808 opacity: 1; 1809 } 1810} 1811</style>
1812<script> 1813 function toggleWhatsAppChat() { 1814 const box = document.getElementById("whatsapp-chat-box"); 1815 const button = document.querySelector(".whatsapp-button"); 1816 1817 const isOpen = box.style.display === "flex"; 1818 1819 if (isOpen) { 1820 box.style.display = "none"; 1821 button.style.display = "block"; 1822 } else { 1823 box.style.display = "flex"; 1824 button.style.display = "none"; 1825 } 1826 } 1827 1828 function sendWhatsAppMessage() { 1829 const phone = "351966559739"; // Replace with your WhatsApp number 1830 const message = document.getElementById("whatsapp-msg").value.trim(); 1831 if (message) { 1832 const encodedMsg = encodeURIComponent(message); 1833 const url = `https://wa.me/${phone}?text=${encodedMsg}`; 1834 window.open(url, "_blank"); 1835 } 1836 } 1837</script>
vendor: 1 bytes, line 1837
1837
1838<script type="text/javascript" charset="UTF-8" src="//cdn.cookie-script.com/s/3569319e2ca2a3c0fef84ec85ae628d6.js"></script>
1838<!-- FareHarbor Lightframe API - do not remove - see: https://fareharbor.com/help/website/resources/lightframe-api/ -->
1838<script src="https://fareharbor.com/embeds/api/v1/?autolightframe=yes" async></script>
1838 1839
1839<script> 1840 /* ------------------------------------------------- 1841 CONFIGURATION â put your own code inside these 1842 functions. They will be called exactly once per 1843 modal open/close. 1844 ------------------------------------------------- */ 1845 function onBeforeModalOpen($link) { 1846 // ------------------------------------------------------------------ 1847 // Example: show a spinner, log an analytics event, pause a video⦠1848 // ------------------------------------------------------------------ 1849 //alert('User clicked the FareHarbor link â preparing modal...'); 1850 $('.book_now').html('Please wait<span style="font-size:8px; letter-spacing: 0.5px; font-weight:300; display:block;">FAREHARBOR is opening</span>'); 1851 1852 setTimeout(function() { 1853 $('.book_now').html('BOOK NOW<span style="font-size:8px; letter-spacing: 0.5px; font-weight:300; display:block;">without Membership</span>'); 1854 }, 2000); 1855 1856 1857 // Example: pause a background video 1858 const video = document.getElementById('heroVideo'); 1859 if (video) video.pause(); 1860 1861 // Example: add a CSS class that shows a spinner overlay 1862 $link.addClass('loading'); // you can style .loading in CSS 1863 } 1864 1865 function onModalOpened() { 1866 // ------------------------------------------------------------------ 1867 // This runs **after** the Lightframe reports that the modal is visible 1868 // ------------------------------------------------------------------ 1869 //alert('FareHarbor modal is now open â run postâopen actions'); 1870 // Remove the spinner / loading indicator 1871 $('.book_now').removeClass('loading'); 1872 1873 // Example: send an analytics event 1874 if (window.ga) ga('send', 'event', 'FareHarbor', 'modal_open'); 1875 } 1876 1877 function onModalClosed() { 1878 // ------------------------------------------------------------------ 1879 // Runs when the user dismisses the modal 1880 // ------------------------------------------------------------------ 1881 //alert('FareHarbor modal closed'); 1882 // Example: resume the background video 1883 const video = document.getElementById('heroVideo'); 1884 if (video) video.play(); 1885 } 1886 1887 /* ------------------------------------------------- 1888 3ï¸â£ Intercept the click (or pointerdown) on the link 1889 ------------------------------------------------- */ 1890 $(document).on('pointerdown', '.fh-trigger', function (e) { 1891 const $link = $(this); 1892 1893 // Run any preâopen logic you need 1894 onBeforeModalOpen($link); 1895 1896 // Prevent the default navigation for a splitâsecond. 1897 // Weâll reâtrigger the click after a tiny timeout so the UI 1898 // can repaint (spinner, video pause, etc.). 1899 e.preventDefault(); 1900 1901 // Small delay â 120â¯ms is usually enough for the UI change. 1902 // Adjust if you need a longer âplease waitâ visual. 1903 setTimeout(() => { 1904 // Dispatch a synthetic click that the Lightframe script will catch. 1905 const clickEvt = new MouseEvent('click', { 1906 view: window, 1907 bubbles: true, 1908 cancelable: true 1909 }); 1910 $link[0].dispatchEvent(clickEvt); 1911 }, 120); 1912 }); 1913 1914 /* ------------------------------------------------- 1915 4ï¸â£ Listen for messages from the Lightframe (postMessage) 1916 ------------------------------------------------- */ 1917 window.addEventListener('message', function (evt) { 1918 // SECURITY: only accept messages from the genuine FareHarbor domain 1919 if (evt.origin !== 'https://fareharbor.com') return; 1920 1921 const data = evt.data; 1922 if (!data || typeof data.type !== 'string') return; 1923 1924 // The Lightframe sends these two message types (per their docs) 1925 if (data.type === 'lightframeOpened') { 1926 onModalOpened(); 1927 } else if (data.type === 'lightframeClosed') { 1928 onModalClosed(); 1929 } 1930 }); 1931 1932 /* ------------------------------------------------- 1933 5ï¸â£ (Optional) Fallback â if FareHarbor creates the 1934 global object, we can also hook into it. 1935 ------------------------------------------------- */ 1936 if (window.FareHarborLightframe) { 1937 // Overwrite the callbacks â they will be called in addition 1938 // to the postMessage events, so you wonât miss anything. 1939 window.FareHarborLightframe.onOpen = function () { 1940 onModalOpened(); 1941 }; 1942 window.FareHarborLightframe.onClose = function () { 1943 onModalClosed(); 1944 }; 1945 } 1946 </script>
1946 1947
1948<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"e0ed61a429c6488c903496ad8f0e49e4","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 1948
1948
1949<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a47403a69eb6d7f1',t:'MTc5MTQ1MDY0NQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
1949</body> 1950</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.