1 2<!DOCTYPE html> 3<html lang="en"> 4 <!--begin::Head--> 5 <head><base href="../../../"/> 6 <meta charset="utf-8"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 9 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0"/> 10 <meta name="description" content="Thingle - Usado. Ã o novo novo."> 11 <meta name="author" content="thingle"> 12 <meta name="appleid-signin-client-id" content="io.thingle.login"> 13 <meta name="appleid-signin-scope" content="[SCOPES]"> 14 <meta name="appleid-signin-redirect-uri" content="https://thingle.io/admin/includes/applelogin.php"> 15 <meta name="appleid-signin-state" content="[STATE]"> 16 <meta name="appleid-signin-nonce" content="[NONCE]"> 17 <meta name="appleid-signin-use-popup" content="false"> 18 <title>thingle - Entrar</title> 19 <!-- Favicons--> 20 <link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon"> 21 <link rel="thingle-icon" type="image/x-icon" href="img/thingle-57x57.png"> 22 <link rel="thingle-icon" type="image/x-icon" sizes="72x72" href="img/thingle-72x72.png"> 23 <link rel="thingle-icon" type="image/x-icon" sizes="114x114" href="img/thingle-114x114.png"> 24 <link rel="thingle-icon" type="image/x-icon" sizes="144x144" href="img/thingle-144x144.png"> 25 <!--begin::Fonts(mandatory for all pages)--> 26 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,400,500,600,700" /> 27 <!--end::Fonts--> 28 <!--begin::Global Stylesheets Bundle(mandatory for all pages)--> 29 30 <link href="css/style.css" rel="stylesheet"> 31 <link href="assets/plugins/global/plugins.bundle.css" rel="stylesheet" type="text/css" /> 32 <link href="assets/css/style.bundle.css" rel="stylesheet" type="text/css" /> 33 <link rel="stylesheet" href="about/heros/overview.built.css" type="text/css"> 34 35 <!--end::Global Stylesheets Bundle--> 36 </head> 37 38 <!--end::Head--> 39 <!--begin::Body--> 40 <body id="kt_body" class="auth-bg bgi-size-cover bgi-attachment-fixed bgi-position-center bgi-no-repeat"> 41 <!--begin::Theme mode setup on page load--> 42
42<script> 43 var defaultThemeMode = "light"; var themeMode; if ( document.documentElement ) { if ( document.documentElement.hasAttribute("data-bs-theme-mode")) { themeMode = document.documentElement.getAttribute("data-bs-theme-mode"); } else { if ( localStorage.getItem("data-bs-theme") !== null ) { themeMode = localStorage.getItem("data-bs-theme"); } else { themeMode = defaultThemeMode; } } if (themeMode === "system") { themeMode = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } document.documentElement.setAttribute("data-bs-theme", themeMode); } 44 </script>
44 45 <!--end::Theme mode setup on page load--> 46 <!--begin::Main--> 47 <!--begin::Root--> 48 <div id="preloader"> 49 <div data-loader="circle-side"> 50 </div> 51 </div> 52 <div class="d-flex flex-column flex-root"> 53 <!--begin::Page bg image--> 54 55 <!--end::Page bg image--> 56 <!--begin::Authentication - sign_in --> 57 <div class="d-flex flex-column flex-column-fluid flex-lg-row"> 58 <!--begin::Aside--> 59 <div class="d-flex flex-center w-lg-50 pt-15 pt-lg-0 px-10"> 60 <!--begin::Aside--> 61 <div class="d-flex flex-center flex-lg-start flex-column"> 62 <!--begin::Logo--> 63 <a href="feed" class="mb-4"> 64 <img alt="Logo" src="img/thingle-b.png" class="h-45px" /> 65 </a> 66 <!--end::Logo--> 67 <!--begin::Title--> 68 <div class="title m-0 d-none d-sm-block" style="font-size:36px"> 69 Usado. à o novo <em class="underlined-text">novo.<svg data-draw-path="" class="underline-illustration animate" viewBox="0 0 305 15" preserveAspectRatio="none"> <g> <clipPath id="underline-clip-path"> <path d="M146.18,1c8.46,0,16.91,0,25.37,0,4.91,0,9.78.09,14.69.37,5.44.3,11,.13,16.5.16,3.73,0,7.44.15,11.16.34,5.07.25,10.21.18,15.32.23,3.53,0,7,.19,10.56.31,6.05.22,12.12.48,18.22.31a42.08,42.08,0,0,1,5.28.1c3.7.37,7.43.32,11.16.35,3.93,0,7.85,0,11.74.4,1.7.18,3.53.07,5.29.13s3.53.11,5.27.23c4.32.3,6.39,1.62,7.14,3.5.67,1.66-1.61,3.44-5.11,3.8a49.34,49.34,0,0,1-8.73.29c-3.66-.27-7.45-.19-11.18-.23-3.93-.05-7.83-.11-11.75-.36-4.07-.25-8.24-.17-12.36-.2-3.74,0-7.46,0-11.16-.37-1.52-.15-3.13-.1-4.7-.13-8-.13-16.11.14-24.13-.48-2.3-.18-4.71-.07-7.06-.1-7-.1-14.1-.09-21.14-.45-3.3-.17-6.68-.08-10-.08q-33,0-66.07,0c-3.93,0-7.85.18-11.78.23q-15.3.18-30.6.32a100.14,100.14,0,0,0-10.56.38,16.47,16.47,0,0,1-2.34.1c-7.3-.18-14.49.48-21.74.63-3.52.07-7,.36-10.5.64a15.69,15.69,0,0,0-3.13.71c-1.17.34-2.27.72-3.35,1.11a16.45,16.45,0,0,1-6.72.68C4.61,13.59.63,11.26,1,8.89c.13-.76.81-1.38,1.8-2,3.25-2,7.91-2.71,12.81-3s9.78-.51,14.6-.85c7.61-.53,15.34-.13,22.89-.88C55,2,57.05,2.08,59,2.06c4.91,0,9.83.06,14.69-.41,1.33-.12,2.75-.07,4.12-.08,6.29,0,12.59,0,18.88-.08,4.51,0,9,.08,13.51-.38C111.72,1,113.34,1,114.92,1h31.26Z"></path> </clipPath> <path class="underline-path" pathLength="1" d="M6.57,8.17c107.81-3.26,287-.74,291.81-.74"></path> </g> </svg> </em> 70 </div> 71 </div> 72 <!--begin::Aside--> 73 </div> 74 <!--begin::Aside--> 75 <!--begin::Body--> 76 <div class="d-flex flex-column-fluid flex-lg-row-auto justify-content-center justify-content-lg-end p-5 p-lg-20"> 77 <!--begin::Card--> 78 <div class="bg-body d-flex flex-column align-items-stretch flex-center rounded-4 w-md-600px p-10 p-md-20"> 79 <!--begin::Wrapper--> 80 <div class="d-flex flex-center flex-column flex-column-fluid px-lg-10 pb-15 pb-lg-20"> 81 <!--begin::Form--> 82 <div class="form w-300px" id="form-login"> 83 84 85 <!--begin::Heading--> 86 <div class="text-center mb-11"> 87 <!--begin::Title--> 88 <h1 class="text-dark fw-bolder mb-3">Iniciar sessão</h1> 89 <!--end::Title--> 90 <!--begin::Title--> 91 92 <!--end::Title--> 93 94 </div> 95 <!--begin::Heading--> 96 <!--begin::Login options--> 97 <div class="row g-3 mb-9"> 98 <!--begin::Col--> 99 <div class="col-md-12"> 100 <!--begin::Google link=--> 101 <a id="apple-login-btn" class="btn btn-flex btn-dark bg-state-light flex-center text-nowrap w-100" style="height: 40px;"> 102 <img alt="Logo" src="/assets/media/svg/brand-logos/apple-black-dark.svg" class="theme-light-show h-20px me-3"> 103 <img alt="Logo" src="/assets/media/svg/brand-logos/apple-black-dark.svg" class="theme-dark-show h-20px me-3"> 104 Iniciar sessão com a Apple</a> 105 106 </div> 107 <!--end::Col--> 108 <!--begin::Col--> 109 <div class="col-md-12"> 110 <!--begin::Google link=--> 111 112 113 114 <div id="g_id_onload" 115 data-client_id="976850577819-mg79dn3v41fgt1op6q02ebb7d2ao1av3.apps.googleusercontent.com" 116 data-context="signin" 117 data-ux_mode="redirect" 118 data-login_uri="https://thingle.io/admin/includes/glogin.php" 119 data-itp_support="true"> 120 121 122</div> 123 124 <div class="g_id_signin " 125 data-type="standard" 126 data-shape="rectangular" 127 data-theme="outline" 128 data-text="signin_with" 129 data-size="large" 130 data-logo_alignment="center" 131 data-width="290"> 132 </div> 133 134 135 136 <!--end::Google link=--> 137 </div> 138 139 140 </div> 141 <!--end::Login options--> 142 <!--begin::Separator--> 143 <div class="separator separator-content my-14">
144 <span class="w-200px text-gray-500 fw-semibold fs-7">ou com Thingle ID</span> 145 </div> 146 <!--end::Separator--> 147 <form class="form w-100" novalidate="novalidate" id="kt_sign_in_form" data-kt-redirect-url="feed"> 148 <!--begin::Input group=--> 149 <div class="fv-row mb-4 mb-md-8"> 150 <!--begin::Email--> 151 152 <input id="email1" type="text" name="username" placeholder="E-mail" class="form-control form-control-solid fs-4" name="email" value=""/> 153 154 155 156 157 <!--end::Email--> 158 </div> 159 <!--end::Input group=--> 160 <div class="fv-row mb-3"> 161 <!--begin::Password--> 162 163 <input id="password1" type="password" class="form-control form-control-solid fs-4" name="password" placeholder="Palavra passe" value=""/> 164 165 <!--end::Password--> 166 </div> 167 168 <!--begin::Wrapper--> 169 <div class="d-flex flex-stack flex-wrap gap-3 fs-base fw-semibold mb-4 mb-md-8"> 170 <div></div> 171 <!--begin::Link--> 172 <a href="recover" id="link-reset" class="link-primary">Recuperar palavra passe?</a> 173 <!--end::Link--> 174 </div> 175 <!--end::Wrapper--> 176 <!--begin::Submit button--> 177 <div class="d-grid mb-10"> 178 <input type="hidden" name="form_submission" value="login"> 179 <button type="submit" id="kt_sign_in_submit" class="btn btn-light-primary"> 180 <!--begin::Indicator label--> 181 <span class="indicator-label">Iniciar sessão</span> 182 <!--end::Indicator label--> 183 <!--begin::Indicator progress--> 184 <span class="indicator-progress">Aguardar... 185 <span class="spinner-border spinner-border-sm align-middle ms-2"></span></span> 186 <!--end::Indicator progress--> 187 </button> 188 </div> 189 <!--end::Submit button--> 190 <!--begin::Sign up--> 191 192 <div class="text-gray-500 text-center fw-semibold fs-6">Novo na thingle? <a href="sign-up" class="link-primary">Registar!</a></div> 193 <!--end::Sign up--> 194 </form> 195 <!--end::Form--> 196 </div> 197 198 </div> 199 <!--end::Wrapper--> 200 201 202 203 204 <!--begin::Footer--> 205 <div class="d-flex flex-center text-center"> 206 207 <!--begin::Links--> 208 <div class="d-flex fw-semibold text-primary fs-base gap-5"> 209 <a href="support-center/termsandconditions" target="_blank">Termos e condições</a> 210 <a href="support-center/privacyandcookies" target="_blank">Privacidade & Cookies</a> 211 <a ><span> thingle.io © 2026</span></a> 212 </div> 213 <!--end::Links--> 214 </div> 215 <!--end::Footer--> 216 </div> 217 <!--end::Card--> 218 </div> 219 <!--end::Body--> 220 </div> 221 <!--end::Authentication - sign_in--> 222 </div> 223 <!--end::Root--> 224 <!--end::Main--> 225 <!--begin::Javascript--> 226
226<script>var hostUrl = "assets/";</script>
226 227 <!--begin::Global Javascript Bundle(mandatory for all pages)--> 228
228<script src="assets/plugins/global/plugins.bundle.js"></script>
228 229
229<script src="assets/js/scripts.bundle.js"></script>
229 230
230<script type="text/javascript" src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
230 231
231<script src="https://apis.google.com/js/platform.js" async defer></script>
231 232
232<script src="https://accounts.google.com/gsi/client" async></script>
232 233 <!--end::Global Javascript Bundle--> 234 <!--begin::Custom Javascript(used for this page only)--> 235
235<script> 236 "use strict"; 237 238 // Class definition 239 var KTSigninGeneral = function() { 240 // Elements 241 var form; 242 var submitButton; 243 var validator; 244 245 // Handle form 246 var handleValidation = function(e) { 247 // Init form validation rules. For more info check the FormValidation plugin's official documentation:https://formvalidation.io/ 248 validator = FormValidation.formValidation( 249 form, 250 { 251 fields: { 252 'username': { 253 validators: { 254 regexp: { 255 regexp: /^[^\s@]+@[^\s@]+\.[^\s@]+$/, 256 message: 'O valor não é um endereço de e-mail válido', 257 }, 258 notEmpty: { 259 message: 'à necessário endereço de e-mail' 260 } 261 } 262 }, 263 'password': { 264 validators: { 265 notEmpty: { 266 message: 'à necessário palavra passe' 267 } 268 } 269 } 270 }, 271 plugins: { 272 trigger: new FormValidation.plugins.Trigger(), 273 bootstrap: new FormValidation.plugins.Bootstrap5({ 274 rowSelector: '.fv-row', 275 eleInvalidClass: '', // comment to enable invalid state icons 276 eleValidClass: '' // comment to enable valid state icons 277 }) 278 } 279 } 280 ); 281 } 282 283 284 285 var handleSubmitAjax = function(e) { 286 // Handle form submit 287 submitButton.addEventListener('click', function (e) { 288 // Prevent button default action 289 e.preventDefault(); 290 handleValidation(); 291 // Validate form 292 validator.validate().then(function (status) { 293 if (status == 'Valid') { 294 295 // Show loading indication 296 submitButton.setAttribute('data-kt-indicator', 'on'); 297 298 // Disable button to avoid multiple click 299 submitButton.disabled = true; 300 301 302 303 304 $.ajax 305 ({ 306 type:'post', 307 url:'admin/includes/process.php', 308 dataType: 'json', 309 data:{ 310 username: form.querySelector('[name="username"]').value, 311 password: form.querySelector('[name="password"]').value, 312 form_submission: "login", 313 314 }, 315 success:function(response) 316 { 317 if (response.loginStatus == 1) { 318 form.querySelector('[name="username"]').value= ""; 319 form.querySelector('[name="password"]').value= ""; 320 321 const redirectUrl = form.getAttribute('data-kt-redirect-url'); 322 323 if (redirectUrl) { 324 location.href = redirectUrl; 325 } 326 } else { 327 // Hide loading indication 328 submitButton.removeAttribute('data-kt-indicator'); 329 330 // Enable button 331 submitButton.disabled = false;
332 // Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/ 333 Swal.fire({ 334 text: "Parece que alguns erros foram detectados, tenta novamente.", 335 icon: "error", 336 buttonsStyling: false, 337 confirmButtonText: "Ok", 338 customClass: { 339 confirmButton: "btn btn-primary" 340 } 341 }); 342 } 343 344 345 } 346 }); 347 348 349 } else { 350 // Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/ 351 Swal.fire({ 352 text: "Parece que alguns erros foram detectados, tenta novamente.", 353 icon: "error", 354 buttonsStyling: false, 355 confirmButtonText: "Ok", 356 customClass: { 357 confirmButton: "btn btn-primary" 358 } 359 }); 360 } 361 }); 362 }); 363 } 364 365 366 367 368 369 370 // Call the function to initialize Google Sign-In 371 372 373 // Public functions 374 return { 375 // Initialization 376 init: function() { 377 form = document.querySelector('#kt_sign_in_form'); 378 submitButton = document.querySelector('#kt_sign_in_submit'); 379 380 handleSubmitAjax(); // use for ajax submit 381 $('[data-loader="circle-side"]').fadeOut(); // will first fade out the loading animation 382 $('#preloader').delay(350).fadeOut('slow'); // will fade out the white DIV that covers the website. 383 } 384 }; 385 }(); 386 387 // On document ready 388 KTUtil.onDOMContentLoaded(function() { 389 KTSigninGeneral.init(); 390 }); 391 392 $("#google-login-button").click(function() { 393 $('.g_id_signin div[role=button]').click(); 394 var button = document.querySelector("#google-login-button"); 395 // Activate indicator 396 button.setAttribute("data-kt-indicator", "on"); 397 398 }); 399 400 function handleCredentialResponse(response) { 401 402 $.ajax 403 ({ 404 type:'post', 405 url:'admin/includes/glogin.php', 406 dataType: 'json', 407 data:{ 408 credential: response.credential, 409 410 }, 411 success:function(response) 412 { 413 if (response.loginStatus == 1) { 414 415 416 location.href = "feed"; 417 418 }else if (response.loginStatus == 2) { 419 420 // Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/ 421 Swal.fire({ 422 text: response.message, 423 icon: "success", 424 buttonsStyling: false, 425 confirmButtonText: "Ok", 426 customClass: { 427 confirmButton: "btn btn-primary" 428 } 429 }); 430 location.href = "welcome"; 431 432 } else { 433 434 // Show error popup. For more info check the plugin's official documentation: https://sweetalert2.github.io/ 435 Swal.fire({ 436 text: response.message, 437 icon: "warning", 438 buttonsStyling: false, 439 confirmButtonText: "Ok", 440 customClass: { 441 confirmButton: "btn btn-primary" 442 } 443 }); 444 var button = document.querySelector("#google-login-button"); 445 button.removeAttribute("data-kt-indicator"); 446 } 447 448 449 } 450 }); 451 452 } 453 454 455 456 </script>
456 457
457<script type="text/javascript"> 458 document.getElementById('apple-login-btn').addEventListener('click', function() { 459 // Initialize Apple authentication 460 AppleID.auth.init({ 461 clientId : 'io.thingle.login', 462 scope : 'name email', 463 redirectURI: 'https://thingle.io/admin/includes/applelogin.php', 464 state : '4a5050c44c', 465 nonce : 'nonce_value' 466 }); 467 468 // Trigger Apple sign-in window 469 AppleID.auth.signIn({ 470 success: function(authorization) { 471 // Handle successful sign-in 472 console.log(authorization); 473 // Optionally, you can redirect or perform other actions here 474 }, 475 failure: function(error) { 476 // Handle error 477 console.error(error); 478 } 479 }); 480 }); 481</script>
481 482 483 <!--end::Custom Javascript--> 484 <!--end::Javascript--> 485 <style> 486 .g_id_signin { 487 // display: none; 488 489} 490 </style> 491 492 </body> 493 <!--end::Body--> 494<style> 495@media screen and (max-width: 767px) { 496 body { 497 background-color: #fff; /* Set the background color to white */ 498 } 499 500} 501 502</style> 503</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.