
{"id":642,"date":"2022-02-22T10:44:56","date_gmt":"2022-02-22T10:44:56","guid":{"rendered":"https:\/\/www.bspacy.com\/homepage\/"},"modified":"2026-07-03T09:31:21","modified_gmt":"2026-07-03T09:31:21","slug":"homepage","status":"publish","type":"page","link":"https:\/\/www.bspacy.com\/pt-pt\/","title":{"rendered":"Homepage"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;block-home1&#8243;][vc_column][esfera]<div class=\"linha linha--1\"><svg width=\"1100\" height=\"43\" viewBox=\"0 0 1100 43\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\"><path id=\"path_esfera_6aabc4fec8f69\" d=\"M48.2059 0.498047C12.2059 3.66471 -38.1941 13.298 48.2059 26.498C160.706 35.498 761.206 59.998 1061.21 20.498C1092.71 16.3505 1126.71 9.49805 1061.21 0.49804\" stroke=\"transparent\" fill=\"none\"\/><image href=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Group-143.svg\" width=\"56\" height=\"56\" x=\"-28\" y=\"-28\" opacity=\"0\"><animateMotion dur=\"10s\" repeatCount=\"indefinite\" keyTimes=\"0;1\" calcMode=\"linear\" begin=\"2s\"><mpath href=\"#path_esfera_6aabc4fec8f69\"\/><\/animateMotion><animate attributeName=\"opacity\" dur=\"10s\" repeatCount=\"indefinite\" values=\"0;1;1;0\" keyTimes=\"0;0.2;0.8;1\" calcMode=\"linear\" begin=\"2s\"\/><animateTransform\n      attributeName=\"transform\"\n      attributeType=\"XML\"\n      type=\"rotate\"\n      values=\"40;20;40\"\n      dur=\"3s\"\n      repeatCount=\"indefinite\"\n      additive=\"sum\"\n      origin=\"17.5 17.5\"\n    \/>\n<\/image><\/svg><\/div>[bola width=&#8221;42&#8243; height=&#8221;42&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#F58123&#8243; animation_time=&#8221;15&#8243; rotate=&#8221;yes&#8221; rotation_time=&#8221;5&#8243; line=&#8221;5&#8243; reverse=&#8221;yes&#8221; color_end=&#8221;#F5812300&#8243;][bola width=&#8221;22&#8243; height=&#8221;22&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#FDB621&#8243; animation_time=&#8221;8&#8243; line=&#8221;4&#8243; color_end=&#8221;#FFD611&#8243;][bola width=&#8221;25&#8243; height=&#8221;25&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#EABDD8&#8243; animation_time=&#8221;20&#8243; rotate=&#8221;yes&#8221; rotation_time=&#8221;2&#8243; line=&#8221;2&#8243; delay=&#8221;2&#8243; color_end=&#8221;#FBDDEA&#8221;][bola width=&#8221;36&#8243; height=&#8221;36&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#9DCFFC&#8221; animation_time=&#8221;25&#8243; line=&#8221;-1&#8243; delay=&#8221;&#8221; color_end=&#8221;#73C4EE&#8221;][bola width=&#8221;25&#8243; height=&#8221;25&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#FDB621&#8243; animation_time=&#8221;10&#8243; line=&#8221;-2&#8243; reverse=&#8221;yes&#8221; color_end=&#8221;#FFD611&#8243;][bola width=&#8221;18&#8243; height=&#8221;18&#8243; fill_type=&#8221;gradient&#8221; gradient_type=&#8221;radial&#8221; color_start=&#8221;#D6E6F6&#8243; animation_time=&#8221;12&#8243; line=&#8221;-4&#8243; color_end=&#8221;#CBC8F8&#8243;][\/esfera][vc_row_inner el_class=&#8221;elipse-info&#8221;][vc_column_inner][vc_single_image image=&#8221;627&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; css=&#8221;&#8221; el_class=&#8221;gsap-scale-in&#8221;][vc_custom_heading text=&#8221;A maneira mais inteligente de&#8221; font_container=&#8221;tag:h4|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;gsap-text-random&#8221;][vc_custom_heading text=&#8221;Superar os seus desafios digitais&#8221; font_container=&#8221;tag:h1|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;small gsap-text-random&#8221;][\/vc_column_inner][\/vc_row_inner][vc_row_inner el_class=&#8221;home-videos&#8221;][vc_column_inner]\n        <div class=\"container-video gsap-scale-in\" data-title=\"Web Design, Development &amp; UX\/UI\">\n            <video autoplay playsinline preload=\"auto\" muted loop>\n                <source src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Ux-Ui-Development-1.mp4\" type=\"video\/mp4\">\n                O teu navegador n\u00e3o suporta v\u00eddeo HTML5.\n            <\/video>\n        <\/div>\n    \n        <div class=\"container-video gsap-scale-in\" data-title=\"Design &amp; Branding\">\n            <video autoplay playsinline preload=\"auto\" muted loop>\n                <source src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Design-and-Branding-1.mp4\" type=\"video\/mp4\">\n                O teu navegador n\u00e3o suporta v\u00eddeo HTML5.\n            <\/video>\n        <\/div>\n    \n        <div class=\"container-video gsap-scale-in\" data-title=\"Digital Marketing\">\n            <video autoplay playsinline preload=\"auto\" muted loop>\n                <source src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Digital-Marketing-1.mp4\" type=\"video\/mp4\">\n                O teu navegador n\u00e3o suporta v\u00eddeo HTML5.\n            <\/video>\n        <\/div>\n    \n        <div class=\"container-video gsap-scale-in\" data-title=\"Social Media &amp; Content\">\n            <video autoplay playsinline preload=\"auto\" muted loop>\n                <source src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Social-Media-Content-1.mp4\" type=\"video\/mp4\">\n                O teu navegador n\u00e3o suporta v\u00eddeo HTML5.\n            <\/video>\n        <\/div>\n    [\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row el_class=&#8221;block-home2 gsap-parallax-y&#8221;][vc_column][vc_custom_heading text=&#8221;Os Nossos Servi\u00e7os&#8221; font_container=&#8221;tag:h2|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;small circle-yellow&#8221;][vc_custom_heading text=&#8221;Descubra como podemos ajudar a sua empresa a crescer.&#8221; font_container=&#8221;tag:h3|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;small&#8221;][vc_row_inner][vc_column_inner width=&#8221;1\/4&#8243;][vc_custom_heading text=&#8221;Web Design, Desenvolvimento &amp; UX\/UI&#8221; font_container=&#8221;tag:h5|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_custom_heading text=&#8221;Criar sites que atraiam e fidelizem clientes.&#8221; font_container=&#8221;tag:p|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_btn title=&#8221;Saber mais&#8221; css=&#8221;&#8221; link=&#8221;url:%2Fpt-pt%2Fos-nossos-servicos%23web-design-development-ux-ui&#8221;][vc_single_image image=&#8221;628&#8243; img_size=&#8221;full&#8221; css=&#8221;&#8221;][\/vc_column_inner][vc_column_inner width=&#8221;1\/4&#8243;][vc_custom_heading text=&#8221;Design\u2028&amp; Branding&#8221; font_container=&#8221;tag:h5|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_custom_heading text=&#8221;Criar identidades visuais fortes e consistentes.&#8221; font_container=&#8221;tag:p|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_btn title=&#8221;Saber mais&#8221; css=&#8221;&#8221; link=&#8221;url:%2Fpt-pt%2Fos-nossos-servicos%23design-branding&#8221;][vc_single_image image=&#8221;629&#8243; img_size=&#8221;full&#8221; css=&#8221;&#8221;][\/vc_column_inner][vc_column_inner width=&#8221;1\/4&#8243;][vc_custom_heading text=&#8221;Marketing Digital&#8221; font_container=&#8221;tag:h5|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_custom_heading text=&#8221;Aumente sua presen\u00e7a online e transforme aten\u00e7\u00e3o em resultados.&#8221; font_container=&#8221;tag:p|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_btn title=&#8221;Saber mais&#8221; css=&#8221;&#8221; link=&#8221;url:%2Fpt-pt%2Fos-nossos-servicos%23digital-marketing&#8221;][vc_single_image image=&#8221;630&#8243; img_size=&#8221;full&#8221; css=&#8221;&#8221;][\/vc_column_inner][vc_column_inner width=&#8221;1\/4&#8243;][vc_custom_heading text=&#8221;Social Media &amp; Content&#8221; font_container=&#8221;tag:h5|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_custom_heading text=&#8221;Desenvolver estrat\u00e9gias envolventes para se conectar com seu p\u00fablico.&#8221; font_container=&#8221;tag:p|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_btn title=&#8221;Saber mais&#8221; css=&#8221;&#8221; link=&#8221;url:%2Fpt-pt%2Fos-nossos-servicos%23social-media-content&#8221;][vc_single_image image=&#8221;631&#8243; img_size=&#8221;full&#8221; css=&#8221;&#8221;][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row el_class=&#8221;block-home3&#8243;][vc_column el_class=&#8221;gsap-parallax-y&#8221;][vc_custom_heading text=&#8221;Os Nossos Clientes&#8221; font_container=&#8221;tag:h2|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;small circle-pink&#8221;][vc_column_text css=&#8221;&#8221;]<\/p>\n<h3>Temos orgulho de trabalhar com empresas incr\u00edveis. <strong>Junte-se a eles!<\/strong><\/h3>\n<p>[\/vc_column_text][vc_gallery type=&#8221;image_grid&#8221; images=&#8221;744,745,634,746,636,747,637,638,639,640,641&#8243; img_size=&#8221;full&#8221; onclick=&#8221;&#8221; css=&#8221;&#8221;][\/vc_column][\/vc_row][vc_row disable_element=&#8221;yes&#8221; el_class=&#8221;block-home4 gsap-parallax-y&#8221;][vc_column][vc_custom_heading text=&#8221;Explore o Nosso Universo&#8221; font_container=&#8221;tag:h2|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;big circle-yellow&#8221;][vc_custom_heading text=&#8221;Confira nossos projetos mais recentes e veja como podemos transformar sua marca.&#8221; font_container=&#8221;tag:h3|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;small&#8221;]<div class=\"wrapper-portfolio\"><div><h2 class=\"small circle-orange\">Portfolio<\/h2><ul class=\"portfolio-categorias\"><li \n                class=\"portfolio-categoria ativo\" \n                data-slug=\"web-design-development-ux-ui\"\n            >Web Design, Desenvolvimento &amp; UX\/UI<\/li><li \n                class=\"portfolio-categoria\" \n                data-slug=\"design-branding\"\n            >Design &amp; Branding<\/li><li \n                class=\"portfolio-categoria\" \n                data-slug=\"digital-marketing\"\n            >Marketing Digital<\/li><li \n                class=\"portfolio-categoria\" \n                data-slug=\"social-media-content\"\n            >Social Media &amp; Content<\/li><\/ul><a href=\"\/portfolio\" alt=\"Learn More\">Learn More<\/a><\/div><div class=\"circles\"><div class=\"big\"><\/div><div class=\"medium\"><\/div><div class=\"small\"><\/div>            <svg width=\"472\" height=\"472\" viewBox=\"0 0 472 472\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"svg1\">\n              <defs>\n                <radialGradient id=\"ballGradient\" cx=\"30%\" cy=\"30%\" r=\"70%\">\n                  <stop offset=\"0%\" stop-color=\"#FFA053\" \/>\n                  <stop offset=\"100%\" stop-color=\"#F58123\" \/>\n                <\/radialGradient>\n              <\/defs>\n              <path id=\"circlePath\" d=\"M236 0.5C366.063 0.5 471.5 105.937 471.5 236C471.5 366.063 366.063 471.5 236 471.5C105.937 471.5 0.5 366.063 0.5 236C0.5 105.937 105.937 0.5 236 0.5Z\" stroke=\"transparent\" fill=\"none\"\/>\n              <circle r=\"7.5\" fill=\"url(#ballGradient)\">\n                <animateMotion dur=\"30s\" repeatCount=\"indefinite\" rotate=\"auto\">\n                  <mpath href=\"#circlePath\" \/>\n                <\/animateMotion>\n              <\/circle>\n            <\/svg>\n\n            <svg width=\"270\" height=\"270\" viewBox=\"0 0 270 270\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"svg2\">\n              <defs>\n                <linearGradient id=\"ballGradientBlue\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n                  <stop offset=\"0%\" stop-color=\"#9DCFFC\" \/>\n                  <stop offset=\"100%\" stop-color=\"#73C4EE\" \/>\n                <\/linearGradient>\n              <\/defs>\n              <path id=\"circlePathSmall\" d=\"M135 0.5C209.282 0.5 269.5 60.7177 269.5 135C269.5 209.282 209.282 269.5 135 269.5C60.7177 269.5 0.5 209.282 0.5 135C0.5 60.7177 60.7177 0.5 135 0.5Z\" stroke=\"transparent\" fill=\"none\"\/>\n              <circle r=\"21.5\" fill=\"url(#ballGradientBlue)\">\n                <animateMotion dur=\"15s\" repeatCount=\"indefinite\" rotate=\"auto\" keyTimes=\"0;1\" keyPoints=\"1;0\" calcMode=\"linear\">\n                  <mpath href=\"#circlePathSmall\" \/>\n                <\/animateMotion>\n              <\/circle>\n            <\/svg>\n            <div class=\"bola1 gsap-float\"><\/div><div class=\"bola2 gsap-float\"><\/div><div class=\"bola3 gsap-float\"><\/div><div class=\"bola4 gsap-float\"><\/div><div class=\"bola5 gsap-float\"><\/div><div class=\"circle1 circle-portfolio gsap-circle-scale\" data-circle=\"C\u00edrculo 1\"><div class=\"decorativo\"><\/div><div class=\"img\"><\/div><\/div><div class=\"circle2 circle-portfolio gsap-circle-scale\" data-circle=\"C\u00edrculo 2\"><div class=\"decorativo\"><\/div><div class=\"img\"><\/div><\/div><div class=\"circle3 circle-portfolio gsap-circle-scale\" data-circle=\"C\u00edrculo 3\"><div class=\"decorativo\"><\/div><div class=\"img\"><\/div><\/div><div class=\"circle4 circle-portfolio gsap-circle-scale\" data-circle=\"C\u00edrculo 4\"><div class=\"decorativo\"><\/div><div class=\"img\"><\/div><\/div><div class=\"circle5 circle-portfolio gsap-circle-scale\" data-circle=\"C\u00edrculo 5\"><div class=\"decorativo\"><\/div><div class=\"img\"><\/div><\/div><div class=\"circle6 circle-portfolio gsap-circle-scale\" data-circle=\"C\u00edrculo 6\"><div class=\"decorativo\"><\/div><div class=\"img\"><\/div><\/div><\/div><div class=\"info-portfolio\" style=\"display: none\"><div \n                        data-title=\"More Five Please\"\n                        data-empresa=\"Pizza Hut\"\n                        data-img-destaque=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/pizza1.webp\"\n                        data-img-hover=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/pizza2.webp\"\n                        data-logo=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Vector-6.svg\"\n                        data-url=\"https:\/\/www.bspacy.com\/pt-pt\/projeto\/pizza-hut\/\"\n                        data-cat=\"web-design-development-ux-ui\"\n                        data-circle=\"C\u00edrculo 2\"\n                    ><\/div><div \n                        data-title=\"Teixeira Duarte\"\n                        data-empresa=\"\"\n                        data-img-destaque=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/td.webp\"\n                        data-img-hover=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/td.webp\"\n                        data-logo=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Group-118-1.svg\"\n                        data-url=\"https:\/\/www.bspacy.com\/pt-pt\/projeto\/teixeira-duarte\/\"\n                        data-cat=\"web-design-development-ux-ui\"\n                        data-circle=\"C\u00edrculo 4\"\n                    ><\/div><div \n                        data-title=\"Chevrelot\"\n                        data-empresa=\"\"\n                        data-img-destaque=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/chevrolet.webp\"\n                        data-img-hover=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/chevrolet.webp\"\n                        data-logo=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Group-126-1.svg\"\n                        data-url=\"https:\/\/www.bspacy.com\/pt-pt\/projeto\/chevrelot\/\"\n                        data-cat=\"web-design-development-ux-ui\"\n                        data-circle=\"C\u00edrculo 3\"\n                    ><\/div><div \n                        data-title=\"More Five Please 2\"\n                        data-empresa=\"Pizza Hut\"\n                        data-img-destaque=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/pizza1.webp\"\n                        data-img-hover=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/pizza2.webp\"\n                        data-logo=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Vector-6.svg\"\n                        data-url=\"https:\/\/www.bspacy.com\/pt-pt\/projeto\/more-five-please-2\/\"\n                        data-cat=\"design-branding\"\n                        data-circle=\"C\u00edrculo 1\"\n                    ><\/div><div \n                        data-title=\"JTI\"\n                        data-empresa=\"\"\n                        data-img-destaque=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/projetox.webp\"\n                        data-img-hover=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/projetox.webp\"\n                        data-logo=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Group-115.svg\"\n                        data-url=\"https:\/\/www.bspacy.com\/pt-pt\/projeto\/jti\/\"\n                        data-cat=\"web-design-development-ux-ui\"\n                        data-circle=\"C\u00edrculo 5\"\n                    ><\/div><div \n                        data-title=\"Nespresso\"\n                        data-empresa=\"\"\n                        data-img-destaque=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/nespresso.webp\"\n                        data-img-hover=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/nespresso.webp\"\n                        data-logo=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Group-121.svg\"\n                        data-url=\"https:\/\/www.bspacy.com\/pt-pt\/projeto\/nespresso\/\"\n                        data-cat=\"web-design-development-ux-ui\"\n                        data-circle=\"C\u00edrculo 6\"\n                    ><\/div><div \n                        data-title=\"Peugeot\"\n                        data-empresa=\"\"\n                        data-img-destaque=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/peugeot.webp\"\n                        data-img-hover=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/peugeot.webp\"\n                        data-logo=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Group-123.svg\"\n                        data-url=\"https:\/\/www.bspacy.com\/pt-pt\/projeto\/peugeot\/\"\n                        data-cat=\"web-design-development-ux-ui\"\n                        data-circle=\"C\u00edrculo 1\"\n                    ><\/div><\/div><div class=\"overlay-projeto\"><div style=\"background-image: url(https:\/\/bspacy.bspacydev.com\/wp-content\/uploads\/pizza2.webp)\"><div class=\"logo-projeto\"><img decoding=\"async\" src=\"https:\/\/bspacy.bspacydev.com\/wp-content\/uploads\/Vector-6.svg\" alt=\"\" title=\"\"><\/div><div class=\"empresa-projeto\">Pizza Hut<\/div><div class=\"title-projeto\">More Five Please<\/div><a href=\"\" alt=\"\"><\/a><\/div>        <svg width=\"630\" height=\"630\" viewBox=\"0 0 630 630\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n            <defs>\n                <path id=\"circlePathText\" d=\"M315 0.5C488.694 0.5 629.5 141.306 629.5 315C629.5 488.694 488.694 629.5 315 629.5C141.306 629.5 0.5 488.694 0.5 315C0.5 141.306 141.306 0.5 315 0.5Z\"\/>\n            <\/defs>\n            <text fill=\"#FFF\">\n                <textPath href=\"#circlePathText\" startOffset=\"0%\" text-anchor=\"start\">Web Design, Development & UX\/UI<\/textPath>\n            <\/text>\n        <\/svg>\n        <\/div><\/div>[\/vc_column][\/vc_row][vc_row el_class=&#8221;block-home5 gsap-parallax-y&#8221;][vc_column][vc_custom_heading text=&#8221;A nossa forma de abordar os seus desafios&#8221; font_container=&#8221;tag:h2|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;big circle-blue&#8221;][vc_custom_heading text=&#8221;3 etapas que guiam a nossa proposta de valor \u00fanica.&#8221; font_container=&#8221;tag:h3|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;small&#8221;][vc_row_inner][vc_column_inner width=&#8221;1\/3&#8243;][vc_raw_html css=&#8221;&#8221;]JTNDaDMlM0VERVNDT0xBUiUzQyUyRmgzJTNFJTBBJTNDZGl2JTIwY2xhc3MlM0QlMjJiYWNrLWNpcmNsZSUyMiUzRSUzQyUyRmRpdiUzRSUwQSUzQ2RpdiUyMGNsYXNzJTNEJTIyZGVjbzElMjBnc2FwLWZsb2F0LXNvZnQlMjIlM0UlMEElMjAlMjAlMjAlMjAlM0NpbWclMjBzcmMlM0QlMjIlMkZ3cC1jb250ZW50JTJGdXBsb2FkcyUyRkdyb3VwLTE0My5zdmclMjIlMjBhbHQlM0QlMjJMaWZ0JTIwT2ZmJTIyJTNFJTBBJTNDJTJGZGl2JTNFJTBBJTBB[\/vc_raw_html][vc_column_text css=&#8221;&#8221;]<strong>Entendemos <\/strong>os principais desafios do seu neg\u00f3cio, como a baixa visibilidade online.<br \/>\n<strong>Implementamos estrat\u00e9gias inovadoras<\/strong>, personalizadas para lidar com essas quest\u00f5es espec\u00edficas.[\/vc_column_text][\/vc_column_inner][vc_column_inner width=&#8221;1\/3&#8243;][vc_raw_html css=&#8221;&#8221;]JTNDaDMlM0VFTSUzQ2JyJTNFTUlTUyVDMyU4M08lM0MlMkZoMyUzRSUwQSUzQ2RpdiUyMGNsYXNzJTNEJTIyYmFjay1jaXJjbGUlMjIlM0UlM0MlMkZkaXYlM0UlMEElM0NkaXYlMjBjbGFzcyUzRCUyMmRlY28xJTIwZ3NhcC1mbG9hdC1zb2Z0JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDc3ZnJTIwd2lkdGglM0QlMjIyNjUlMjIlMjBoZWlnaHQlM0QlMjIzNTIlMjIlMjB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNjUlMjAzNTIlMjIlMjBmaWxsJTNEJTIybm9uZSUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDcGF0aCUyMGQlM0QlMjJNMTcyLjc2OCUyMDAuMjVMMC40MzMxMDUlMjAyOTguNzQzTTE3OC44NTYlMjAzLjc2NDQ1TDYuNTIwOTIlMjAzMDIuMjU3TTE4NC45NDQlMjA3LjI3OTMxTDEyLjYwODklMjAzMDUuNzcyTTE5MS4wMzIlMjAxMC43OTQ3TDE4LjY5NzUlMjAzMDkuMjg4TTE5Ny4xMiUyMDE0LjMwOTRMMjQuNzg1NCUyMDMxMi44MDJNMjAzLjIwOSUyMDE3LjgyNDdMMzAuODc0JTIwMzE2LjMxOE0yMDkuMjk3JTIwMjEuMzM5NkwzNi45NjIlMjAzMTkuODMyTTIxNS4zODUlMjAyNC44NTQ3TDQzLjA1MDIlMjAzMjMuMzQ4TTIyMS40NzQlMjAyOC4zNjk4TDQ5LjEzODglMjAzMjYuODYzTTIyNy41NjElMjAzMS44ODQ3TDU1LjIyNjUlMjAzMzAuMzc4TTIzMy42NSUyMDM1LjM5OTdMNjEuMzE1NSUyMDMzMy44OTNNMjM5LjczOCUyMDM4LjkxNDZMNjcuNDAzNSUyMDMzNy40MDdNMjQ1LjgyNiUyMDQyLjQzTDczLjQ5MTIlMjAzNDAuOTIzTTI1MS45MTUlMjA0NS45NDQ5TDc5LjU3OTglMjAzNDQuNDM4TTI1OC4wMDMlMjA0OS40NTk4TDg1LjY2NzYlMjAzNDcuOTUzTTI2NC4wOTElMjA1Mi45NzQ4TDkxLjc1NjIlMjAzNTEuNDY4JTIyJTIwc3Ryb2tlJTNEJTIydXJsJTI4JTIzcGFpbnQwX2xpbmVhcl8zMThfMjElMjklMjIlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NkZWZzJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbGluZWFyR3JhZGllbnQlMjBpZCUzRCUyMnBhaW50MF9saW5lYXJfMzE4XzIxJTIyJTIweDElM0QlMjIyMjUuNDkzJTIyJTIweTElM0QlMjI1MS43MDExJTIyJTIweDIlM0QlMjItMTIuOTgzMyUyMiUyMHkyJTNEJTIyMjMwLjcyNSUyMiUyMGdyYWRpZW50VW5pdHMlM0QlMjJ1c2VyU3BhY2VPblVzZSUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ3N0b3AlMjBvZmZzZXQlM0QlMjIwLjE3JTIyJTIwc3RvcC1jb2xvciUzRCUyMiUyM0ZEQjYyMSUyMiUyRiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ3N0b3AlMjBvZmZzZXQlM0QlMjIwLjc2JTIyJTIwc3RvcC1jb2xvciUzRCUyMiUyM0ZGRDYxMSUyMiUyRiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQyUyRmxpbmVhckdyYWRpZW50JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGZGVmcyUzRSUwQSUyMCUyMCUyMCUyMCUzQyUyRnN2ZyUzRSUwQSUwQSUzQyUyRmRpdiUzRSUwQSUzQ2RpdiUyMGNsYXNzJTNEJTIyZGVjbzIlMjBnc2FwLWZsb2F0LXNvZnQlMjIlM0UlMEElMjAlMjAlMjAlMjAlM0NpbWclMjBzcmMlM0QlMjIlMkZ3cC1jb250ZW50JTJGdXBsb2FkcyUyRkFzdG9uYXV0LTEtMS5zdmclMjIlM0UlMEElM0MlMkZkaXYlM0UlMEElM0NkaXYlMjBjbGFzcyUzRCUyMmRlY28zJTIwZ3NhcC1mbG9hdC1zb2Z0JTIyJTNFJTNDJTJGZGl2JTNFJTBBJTNDZGl2JTIwY2xhc3MlM0QlMjJkZWNvNCUyMGdzYXAtZmxvYXQtc29mdCUyMiUzRSUzQyUyRmRpdiUzRSUwQSUwQQ==[\/vc_raw_html][vc_column_text css=&#8221;&#8221;]Embarcamos numa jornada com voc\u00ea, <strong>implementando t\u00e1ticas<\/strong> que resolvem seus principais desafios. Por exemplo, ajudamos a aumentar seu tr\u00e1fego e engajamento online por meio de solu\u00e7\u00f5es direcionadas.[\/vc_column_text][\/vc_column_inner][vc_column_inner width=&#8221;1\/3&#8243;][vc_raw_html css=&#8221;&#8221;]JTNDaDMlM0VFTSUyMCVDMyU5M1JCSVRBJTNDJTJGaDMlM0UlMEElM0NkaXYlMjBjbGFzcyUzRCUyMmJhY2stY2lyY2xlJTIyJTNFJTNDJTJGZGl2JTNFJTBBJTNDZGl2JTIwY2xhc3MlM0QlMjJkZWNvMSUyMGdzYXAtZmxvYXQtc29mdCUyMiUzRSUwQSUyMCUyMCUyMCUyMCUzQ2ltZyUyMHNyYyUzRCUyMiUyRndwLWNvbnRlbnQlMkZ1cGxvYWRzJTJGR3JvdXAtMTE3MTI3NTkyMS5zdmclMjIlM0UlMEElM0MlMkZkaXYlM0UlMEElM0NkaXYlMjBjbGFzcyUzRCUyMmRlY28yJTIwZ3NhcC1mbG9hdC1zb2Z0JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDaW1nJTIwc3JjJTNEJTIyJTJGd3AtY29udGVudCUyRnVwbG9hZHMlMkZTYXRlbGl0ZS0xLnN2ZyUyMiUzRSUwQSUzQyUyRmRpdiUzRSUwQSUzQ2RpdiUyMGNsYXNzJTNEJTIyZGVjbzMlMjBnc2FwLWZsb2F0LXNvZnQlMjIlM0UlM0MlMkZkaXYlM0UlMEElM0NkaXYlMjBjbGFzcyUzRCUyMmRlY280JTIwZ3NhcC1mbG9hdC1zb2Z0JTIyJTNFJTNDJTJGZGl2JTNFJTBBJTNDZGl2JTIwY2xhc3MlM0QlMjJkZWNvNSUyMGdzYXAtZmxvYXQtc29mdCUyMiUzRSUzQyUyRmRpdiUzRQ==[\/vc_raw_html][vc_column_text css=&#8221;&#8221;]<strong>Aprimoramos e otimizamos continuamente<\/strong> para garantir a melhoria constante e o sucesso sustent\u00e1vel do seu neg\u00f3cio, <strong>mantendo alto desempenho<\/strong> e crescimento ao longo do tempo.[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row disable_element=&#8221;yes&#8221; el_class=&#8221;block-artigos gsap-parallax-y&#8221;][vc_column]<h2 class=\"small circle-blue\">Os Nossos Artigos Mais Recentes<\/h2><div class=\"listagem-artigos\"><article><a href=\"https:\/\/www.bspacy.com\/pt-pt\/company-culture\/choosing-the-right-startup-team-2\/\"><div class=\"container-img\"><img decoding=\"async\" src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/equipa2.webp\" alt=\"Choosing the Right Startup Team 2\" title=\"Choosing the Right Startup Team 2\" class=\"capa\"><\/div><\/a><div class=\"content\"><div class=\"top\"><div class=\"categoria\">Company Culture<\/div><h3 class=\"title\">Choosing the Right Startup Team 2<\/h3><\/div><div class=\"bottom\"><a href=\"https:\/\/www.bspacy.com\/pt-pt\/company-culture\/choosing-the-right-startup-team-2\/\" class=\"learn-more\">Saber mais<\/a><div class=\"data\">Janeiro 15, 2026<\/div><\/div><\/div><\/article><article><a href=\"https:\/\/www.bspacy.com\/pt-pt\/company-culture\/choosing-the-right-startup-team\/\"><div class=\"container-img\"><img decoding=\"async\" src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/equipa2.webp\" alt=\"Choosing the Right Startup Team.\" title=\"Choosing the Right Startup Team.\" class=\"capa\"><\/div><\/a><div class=\"content\"><div class=\"top\"><div class=\"categoria\">Company Culture<\/div><h3 class=\"title\">Choosing the Right Startup Team.<\/h3><\/div><div class=\"bottom\"><a href=\"https:\/\/www.bspacy.com\/pt-pt\/company-culture\/choosing-the-right-startup-team\/\" class=\"learn-more\">Saber mais<\/a><div class=\"data\">Janeiro 8, 2026<\/div><\/div><\/div><\/article><article><a href=\"https:\/\/www.bspacy.com\/pt-pt\/blog-post\/how-premium-services-transformed-a-real-estate-business\/\"><div class=\"container-img\"><img decoding=\"async\" src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/real-estate.webp\" alt=\"How premium services transformed a real estate business.\" title=\"How premium services transformed a real estate business.\" class=\"capa\"><\/div><\/a><div class=\"content\"><div class=\"top\"><div class=\"categoria\">Blog Post<\/div><h3 class=\"title\">How premium services transformed a real estate business.<\/h3><\/div><div class=\"bottom\"><a href=\"https:\/\/www.bspacy.com\/pt-pt\/blog-post\/how-premium-services-transformed-a-real-estate-business\/\" class=\"learn-more\">Saber mais<\/a><div class=\"data\">Janeiro 8, 2026<\/div><\/div><\/div><\/article><article><a href=\"https:\/\/www.bspacy.com\/pt-pt\/case-study\/the-culture-behind-the-brand-how-we-did-it\/\"><div class=\"container-img\"><img decoding=\"async\" src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/50-anos-td.webp\" alt=\"The culture behind the brand. How we did it.\" title=\"The culture behind the brand. How we did it.\" class=\"capa\"><img decoding=\"async\" src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/Layer_1-1.svg\" alt=\"Logo Case Study\" title=\"Logo Case Study\" class=\"logo-empresa\"><\/div><\/a><div class=\"content\"><div class=\"top\"><div class=\"categoria\">Case Study<\/div><h3 class=\"title\">The culture behind the brand. How we did it.<\/h3><\/div><div class=\"bottom\"><a href=\"https:\/\/www.bspacy.com\/pt-pt\/case-study\/the-culture-behind-the-brand-how-we-did-it\/\" class=\"learn-more\">Saber mais<\/a><div class=\"data\">Janeiro 8, 2026<\/div><\/div><\/div><\/article><article><a href=\"https:\/\/www.bspacy.com\/pt-pt\/company-culture\/team-breakfast\/\"><div class=\"container-img\"><img decoding=\"async\" src=\"https:\/\/www.bspacy.com\/wp-content\/uploads\/equipa.webp\" alt=\"Team breakfast\" title=\"Team breakfast\" class=\"capa\"><\/div><\/a><div class=\"content\"><div class=\"top\"><div class=\"categoria\">Company Culture<\/div><h3 class=\"title\">Team breakfast<\/h3><\/div><div class=\"bottom\"><a href=\"https:\/\/www.bspacy.com\/pt-pt\/company-culture\/team-breakfast\/\" class=\"learn-more\">Saber mais<\/a><div class=\"data\">Janeiro 8, 2026<\/div><\/div><\/div><\/article><\/div>[\/vc_column][\/vc_row][vc_row el_class=&#8221;lets-talk gsap-parallax-y&#8221;][vc_column][vc_custom_heading text=&#8221;Qual o&#8221; font_container=&#8221;tag:p|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221;][vc_custom_heading text=&#8221;Teu maior desafio?&#8221; font_container=&#8221;tag:h2|text_align:center&#8221; use_theme_fonts=&#8221;yes&#8221; css=&#8221;&#8221; el_class=&#8221;small circle-blue&#8221;][vc_column_text css=&#8221;&#8221;]Cada empresa enfrenta desafios \u00fanicos no espa\u00e7o digital.<br \/>\nSeja para impulsionar a sua presen\u00e7a online, envolver o seu p\u00fablico ou aumentar as vendas, estamos aqui para ajudar.<\/p>\n<p><strong>Partilhe o seu desafio connosco e juntos encontraremos a melhor solu\u00e7\u00e3o.<\/strong>[\/vc_column_text][vc_btn title=&#8221;Aceitar o Desafio&#8221; css=&#8221;&#8221; link=&#8221;url:%23|&#8221; el_class=&#8221;animation-blob&#8221;][vc_column_text css=&#8221;&#8221; el_class=&#8221;game&#8221;]<div id=\"janela\">\n  <div class=\"jogo\">\n    <div class=\"fila\" id=\"fila\"><\/div>\n  <\/div>\n  <div id=\"nave\">\n    <svg id=\"nave-svg\" width=\"45\" height=\"50\" viewBox=\"0 0 45 50\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n      <path d=\"M4.35511 33.4321H0L22.1925 0L44.348 33.4321H40.0207L22.1833 6.58355L4.34585 33.4321H4.35511Z\" fill=\"#102D4F\"\/>\n      <path d=\"M18.1786 40.1008H16.2983V46.276H18.1786V40.1008Z\" fill=\"#F58123\"\/>\n      <path d=\"M27.872 40.1008H25.9917V46.276H27.872V40.1008Z\" fill=\"#F58123\"\/>\n      <path d=\"M23.1141 40.1008H21.2339V49.8156H23.1141V40.1008Z\" fill=\"#F58123\"\/>\n    <\/svg>\n  <\/div>\n\n  <div id=\"touch-start\">start<\/div>\n\n  <div id=\"popup\" class=\"popup-game\" style=\"display: none;\">\n    <h2>Game Over<\/h2>\n    <p>Click on the spaceship to try again.<\/p>\n  <\/div>\n\n  <div id=\"popup-ganhou\" class=\"popup-game\" style=\"display: none;\">\n    <h2>Great Job<\/h2>\n    <p id=\"reward\">Receive my reward.<\/p>\n  <\/div>\n<\/div>\n\n<div id=\"hint-esc\">\n  <div class=\"hint-esc-text\">Press <kbd style=\"background:#f0f0f0; border:1px solid #ccc; border-radius:3px; padding:1px 5px; font-size:10px;\">ESC<\/kbd> to pause the game<\/div>\n  <button type=\"button\" id=\"reset-jogo-btn\">Reset<\/button>\n<\/div>\n\n<div id=\"cursor-start\">start<\/div>\n\n<script>\n  \/\/ \u2500\u2500\u2500 Gradientes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const GRADIENTS = [\n    { type: 'linear', colors: ['#FDB621', '#FFD611'] },\n    { type: 'linear', colors: ['#FFEAF3', '#FCA9DB'] },\n    { type: 'linear', colors: ['#9DCFFC', '#73C4EE'] },\n    { type: 'radial',  colors: ['#D6E6F6', '#CBC8F8'] },\n    { type: 'solid',   colors: ['#19CCCC'] },\n    { type: 'linear', colors: ['#FFA053', '#F58123'] },\n  ];\n\n  function shuffle(arr) { return [...arr].sort(() => Math.random() - 0.5); }\n\n  \/\/ \u2500\u2500\u2500 Dados dos aliens \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const alienTypes = [\n    {\n      frames: [\n        [\n          [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0],\n          [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,1,1,1,0,0,1,0,0,1,1,1,0,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0],\n          [0,1,1,1,1,1,0,0,0,1,1,1,1,1,0],\n          [0,0,1,0,0,0,0,0,0,0,0,0,1,0,0],\n          [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n        ],\n        [\n          [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n          [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0],\n          [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,1,1,1,0,0,1,0,0,1,1,1,0,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0],\n          [0,1,1,1,1,1,0,0,0,1,1,1,1,1,0],\n          [0,0,1,0,0,0,0,0,0,0,0,0,1,0,0],\n          [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n        ],\n      ],\n      olhos: [\n        new Set(['2-5','2-6','2-8','2-9','3-5','3-6','3-8','3-9']),\n        new Set(['3-5','3-6','3-8','3-9','4-5','4-6','4-8','4-9']),\n      ],\n    },\n    {\n      frames: [\n        [\n          [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0],\n          [0,0,0,1,1,1,1,1,1,1,1,1,0,0,0],\n          [0,0,1,1,0,0,0,1,0,0,0,1,1,0,0],\n          [0,0,1,1,0,0,0,1,0,0,0,1,1,0,0],\n          [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],\n          [0,1,1,1,1,1,1,1,1,1,1,1,1,1,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,0,1,0,1,0,1,0,1,0,1,0,0,0],\n          [0,0,0,1,0,1,0,1,0,1,0,1,0,0,0],\n          [0,0,1,1,0,0,0,0,0,0,0,1,1,0,0],\n        ],\n        [\n          [0,0,1,0,0,0,0,0,0,0,0,0,1,0,0],\n          [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0],\n          [0,0,0,1,1,1,1,1,1,1,1,1,0,0,0],\n          [0,0,1,1,0,0,0,1,0,0,0,1,1,0,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0],\n          [0,0,0,1,0,1,0,1,0,1,0,1,0,0,0],\n          [0,0,0,1,0,1,0,1,0,1,0,1,0,0,0],\n          [0,0,1,1,0,0,0,0,0,0,0,1,1,0,0],\n        ],\n      ],\n      olhos: [\n        new Set(['2-4','2-5','2-6','2-8','2-9','2-10','3-4','3-5','3-6','3-8','3-9','3-10']),\n        new Set(['3-4','3-5','3-6','3-8','3-9','3-10']),\n      ],\n    },\n  ];\n\n  \/\/ \u2500\u2500\u2500 Renderiza\u00e7\u00e3o \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const PIXEL = 3;\n\n  function criaGradienteDef(svg, gradId, gradDef, SVG_W, SVG_H) {\n    const defs = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"defs\");\n    if (gradDef.type === 'linear') {\n      const grad = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"linearGradient\");\n      grad.setAttribute(\"id\", gradId);\n      grad.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\n      grad.setAttribute(\"x1\", SVG_W); grad.setAttribute(\"y1\", \"0\");\n      grad.setAttribute(\"x2\", \"0\");   grad.setAttribute(\"y2\", SVG_H);\n      const s1 = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"stop\");\n      s1.setAttribute(\"offset\", \"0%\"); s1.setAttribute(\"stop-color\", gradDef.colors[0]);\n      const s2 = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"stop\");\n      s2.setAttribute(\"offset\", \"100%\"); s2.setAttribute(\"stop-color\", gradDef.colors[1]);\n      grad.appendChild(s1); grad.appendChild(s2); defs.appendChild(grad);\n    } else if (gradDef.type === 'radial') {\n      const grad = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"radialGradient\");\n      grad.setAttribute(\"id\", gradId);\n      grad.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\n      grad.setAttribute(\"cx\", SVG_W \/ 2); grad.setAttribute(\"cy\", SVG_H \/ 2);\n      grad.setAttribute(\"r\", Math.max(SVG_W, SVG_H) \/ 2);\n      const s1 = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"stop\");\n      s1.setAttribute(\"offset\", \"0%\"); s1.setAttribute(\"stop-color\", gradDef.colors[0]);\n      const s2 = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"stop\");\n      s2.setAttribute(\"offset\", \"100%\"); s2.setAttribute(\"stop-color\", gradDef.colors[1]);\n      grad.appendChild(s1); grad.appendChild(s2); defs.appendChild(grad);\n    } else {\n      const grad = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"linearGradient\");\n      grad.setAttribute(\"id\", gradId);\n      const s1 = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"stop\");\n      s1.setAttribute(\"offset\", \"0%\"); s1.setAttribute(\"stop-color\", gradDef.colors[0]);\n      grad.appendChild(s1); defs.appendChild(grad);\n    }\n    svg.appendChild(defs);\n  }\n\n  function desenhaAlien(svg, gradId, type, frameIdx) {\n    const grid = type.frames[frameIdx];\n    const ols  = type.olhos[frameIdx];\n    const rows = grid.length;\n    const cols = grid[0].length;\n    while (svg.children.length > 1) svg.removeChild(svg.lastChild);\n    for (let row = 0; row < rows; row++) {\n      for (let col = 0; col < cols; col++) {\n        const key = `${row}-${col}`;\n        if (grid[row][col] === 1) {\n          const rect = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"rect\");\n          rect.setAttribute(\"x\", col * PIXEL); rect.setAttribute(\"y\", row * PIXEL);\n          rect.setAttribute(\"width\", PIXEL);    rect.setAttribute(\"height\", PIXEL);\n          rect.setAttribute(\"fill\", `url(#${gradId})`);\n          svg.appendChild(rect);\n        } else if (ols.has(key)) {\n          const rect = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"rect\");\n          rect.setAttribute(\"x\", col * PIXEL); rect.setAttribute(\"y\", row * PIXEL);\n          rect.setAttribute(\"width\", PIXEL);    rect.setAttribute(\"height\", PIXEL);\n          rect.setAttribute(\"fill\", \"white\");\n          svg.appendChild(rect);\n        }\n      }\n    }\n  }\n\n  function criaAlien(gradId, gradDef, type) {\n    const rows = type.frames[0].length;\n    const cols = type.frames[0][0].length;\n    const SVG_W = cols * PIXEL;\n    const SVG_H = rows * PIXEL;\n    const svg = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"svg\");\n    svg.setAttribute(\"width\", SVG_W); svg.setAttribute(\"height\", SVG_H);\n    svg.setAttribute(\"shape-rendering\", \"crispEdges\");\n    criaGradienteDef(svg, gradId, gradDef, SVG_W, SVG_H);\n    desenhaAlien(svg, gradId, type, 0);\n    return svg;\n  }\n\n  \/\/ \u2500\u2500\u2500 Cria filas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const svgs = [];\n  const fila = document.getElementById(\"fila\");\n  const linhas = [];\n  const movimento = [];\n\n  function criaFilas() {\n    \/\/ Limpa tudo\n    linhas.forEach(l => l.remove());\n    linhas.length = 0;\n    svgs.length = 0;\n    movimento.length = 0;\n    fila.innerHTML = '';\n\n    if (window.innerWidth <= 991) {\n      \/\/ Mobile: 4 filas de 6 aliens alternando tipo\n      for (let f = 0; f < 4; f++) {\n        const type = alienTypes[f % alienTypes.length];\n        const linha = document.createElement(\"div\");\n        linha.className = \"linha-aliens\";\n        fila.appendChild(linha);\n        linhas.push(linha);\n        movimento.push({ posX: 0, direcao: 1 });\n        const gradShuffled = shuffle(GRADIENTS);\n        for (let i = 0; i < 6; i++) {\n          const gradDef = gradShuffled[i % gradShuffled.length];\n          const gradId = `grad-${f}-${i}`;\n          const svg = criaAlien(gradId, gradDef, type);\n          linha.appendChild(svg);\n          svgs.push({ el: svg, svg, gradId, gradDef, type });\n        }\n      }\n    } else {\n      \/\/ Desktop: 2 filas de 14 aliens\n      alienTypes.forEach((type, typeIdx) => {\n        const linha = document.createElement(\"div\");\n        linha.className = \"linha-aliens\";\n        fila.appendChild(linha);\n        linhas.push(linha);\n        movimento.push({ posX: 0, direcao: 1 });\n        const gradShuffled = shuffle(GRADIENTS);\n        const gradList = Array.from({ length: 14 }, (_, i) => gradShuffled[i % gradShuffled.length]);\n        gradList.forEach((gradDef, i) => {\n          const gradId = `grad-${typeIdx}-${i}`;\n          const svg = criaAlien(gradId, gradDef, type);\n          linha.appendChild(svg);\n          svgs.push({ el: svg, svg, gradId, gradDef, type });\n        });\n      });\n    }\n  }\n\n  criaFilas();\n\n  \/\/ \u2500\u2500\u2500 Anima\u00e7\u00e3o dos frames \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let frame = 0;\n  let frameInterval = null;\n\n  function iniciaFrames() {\n    if (frameInterval) return;\n    frameInterval = setInterval(() => {\n      frame = 1 - frame;\n      svgs.forEach(({ svg, gradId, type }) => {\n        if (svg && svg.isConnected) desenhaAlien(svg, gradId, type, frame);\n      });\n    }, 500);\n  }\n\n  function paraFrames() {\n    clearInterval(frameInterval);\n    frameInterval = null;\n  }\n\n  \/\/ \u2500\u2500\u2500 Estado \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let jogoIniciado = false;\n  let jogoPausado  = false;\n  const janelaEl    = document.getElementById('janela');\n  const naveEl      = document.getElementById('nave');\n  const naveSvg     = document.getElementById('nave-svg');\n  const cursorStart = document.getElementById('cursor-start');\n  document.body.appendChild(cursorStart);\n  const popupEl       = document.getElementById('popup');\n  const popupGanhouEl = document.getElementById('popup-ganhou');\n\n  \/\/ \u2500\u2500\u2500 Cursor personalizado \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \/\/ position:fixed dentro de um ancestral com transform fica relativo a esse\n  \/\/ ancestral (n\u00e3o ao viewport). Para compensar: posiciona em 0,0, l\u00ea onde\n  \/\/ est\u00e1 em coordenadas de viewport, e calcula o offset correto.\n  document.addEventListener('mousemove', (e) => {\n    cursorStart.style.left = e.clientX + 'px';\n    cursorStart.style.top  = e.clientY + 'px';\n  });\n\n  naveEl.addEventListener('mouseenter', () => {\n    if (jogoIniciado && !jogoPausado) return;\n    cursorStart.textContent = (jogoPausado || popupGanhouEl.style.display === 'block') ? 'play' : 'start';\n    cursorStart.classList.add('visivel');\n    document.body.classList.add('hover-nave');\n  });\n\n  naveEl.addEventListener('mouseleave', () => {\n    cursorStart.classList.remove('visivel');\n    document.body.classList.remove('hover-nave');\n  });\n\n  \/\/ \u2500\u2500\u2500 Click na nave para iniciar ou continuar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  naveEl.addEventListener('click', (e) => {\n    if (isMobile()) {\n      e.stopPropagation();\n      return;\n    }\n    if (jogoIniciado && !jogoPausado) return;\n    jogoIniciado = true;\n    jogoPausado  = false;\n    cursorStart.classList.remove('visivel');\n    document.body.classList.remove('hover-nave');\n    document.querySelector('.lets-talk .game')?.classList.add('start');\n    pararPulso();\n    document.getElementById('hint-esc').style.opacity = '1';\n    popupEl.style.opacity = '0';\n    setTimeout(() => { popupEl.style.display = 'none'; }, 600);\n    popupGanhouEl.style.opacity = '0';\n    setTimeout(() => { popupGanhouEl.style.display = 'none'; }, 600);\n    \/\/ s\u00f3 arranca loops se n\u00e3o estiverem j\u00e1 activos\n    if (!tirosAtivo) {\n      tirosAtivo = true;\n      requestAnimationFrame(moverTiros);\n    }\n    if (!linhasAtivo) {\n      linhasAtivo = true;\n      requestAnimationFrame(moverLinhas);\n    }\n    if (!tirosAliensAtivo) {\n      tirosAliensAtivo = true;\n      requestAnimationFrame(moverTirosAliens);\n    }\n    if (!particulasAtivo) {\n      particulasAtivo = true;\n      requestAnimationFrame(tickParticulas);\n    }\n    iniciaFrames();\n    iniciaAlienDispara();\n  });\n\n  \/\/ \u2500\u2500\u2500 ESC para pausar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  document.addEventListener('keydown', (e) => {\n    if (e.key === 'Escape' && jogoIniciado && !jogoPausado) {\n      jogoPausado = true;\n      tirosAtivo = false;\n      tirosAliensAtivo = false;\n      linhasAtivo = false;\n      particulasAtivo = false;\n      paraFrames();\n      paraAlienDispara();\n      paraAutoTiro();\n    }\n  });\n\n  \/\/ \u2500\u2500\u2500 Movimento da nave com o rato \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  document.addEventListener('mousemove', (e) => {\n    if (!jogoIniciado || jogoPausado) return;\n    const jRect  = janelaEl.getBoundingClientRect();\n    const metade = naveSvg.getBoundingClientRect().width \/ 2;\n    const relX   = e.clientX - jRect.left;\n    const x      = Math.max(metade, Math.min(jRect.width - metade, relX));\n    naveEl.style.left = x + 'px';\n    naveEl.style.transform = 'translateX(-50%)';\n  });\n\n  \/\/ \u2500\u2500\u2500 Movimento lateral dos aliens \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const VELOCIDADE = window.innerWidth <= 500 ? 0.7 : 1.5;\n\n  const DESCIDA = 15; \/\/ px que os aliens descem a cada batida\n\n  function moverLinhas() {\n    if (!linhasAtivo || !jogoIniciado || jogoPausado) return;\n    const jRect = janelaEl.getBoundingClientRect();\n\n    linhas.forEach((linha, i) => {\n      const m     = movimento[i];\n      const lRect = linha.getBoundingClientRect();\n      const limite = Math.max(0, (jRect.width - lRect.width) \/ 2);\n      m.posX += m.direcao * VELOCIDADE;\n\n      \/\/ Bateu na parede \u2014 inverte e desce\n      if (m.posX >= limite || m.posX <= -limite) {\n        m.direcao *= -1;\n        m.posY = (m.posY || 0) + DESCIDA;\n        linha.style.top = m.posY + 'px';\n      }\n\n      linha.style.transform = `translateX(${m.posX}px) translateY(${m.posY || 0}px)`;\n    });\n\n    \/\/ Verifica se algum alien vis\u00edvel chegou perto da nave (30px acima)\n    const nRect   = naveSvg.getBoundingClientRect();\n    const limiteY = nRect.top - 30;\n    const chegou  = svgs.some(s => {\n      if (!s.el || s.el.style.visibility === 'hidden') return false;\n      return s.el.getBoundingClientRect().bottom >= limiteY;\n    });\n    if (chegou) { aliensChegaram(); return; }\n\n    if (linhasAtivo) requestAnimationFrame(moverLinhas);\n  }\n\n  \/\/ \u2500\u2500\u2500 Colis\u00e3o \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function colide(a, b) {\n    return !(a.left > b.right || a.right < b.left || a.top > b.bottom || a.bottom < b.top);\n  }\n\n  \/\/ \u2500\u2500\u2500 Explos\u00e3o de pixeis \u2014 loop \u00fanico partilhado \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const particulas = [];\n\n  function explode(rect, cor1, cor2) {\n    const cx = rect.left + rect.width \/ 2;\n    const cy = rect.top  + rect.height \/ 2;\n    const cores = [cor1, cor2 || cor1];\n    for (let i = 0; i < 12; i++) {\n      const p    = document.createElement('div');\n      const size = Math.random() * 5 + 3;\n      p.style.cssText = `position:fixed;width:${size}px;height:${size}px;background:${cores[i%2]};left:${cx}px;top:${cy}px;pointer-events:none;z-index:999;border-radius:${Math.random()>0.5?'0':'50%'}`;\n      document.body.appendChild(p);\n      const angle = (i \/ 12) * Math.PI * 2 + Math.random() * 0.5;\n      const speed = Math.random() * 4 + 2;\n      p.style.left = '0px';\n      p.style.top  = '0px';\n      particulas.push({\n        el: p,\n        x: cx, y: cy,\n        vx: Math.cos(angle) * speed,\n        vy: Math.sin(angle) * speed,\n        life: 1.0\n      });\n    }\n  }\n\n  function tickParticulas() {\n    for (let i = particulas.length - 1; i >= 0; i--) {\n      const p = particulas[i];\n      p.life -= 0.05;\n      if (p.life <= 0) {\n        p.el.remove();\n        particulas.splice(i, 1);\n        continue;\n      }\n      p.x  += p.vx;\n      p.y  += p.vy;\n      p.vy += 0.15;\n      p.el.style.transform = `translate(${p.x}px, ${p.y}px)`;\n      p.el.style.opacity = p.life;\n    }\n    if (particulasAtivo) requestAnimationFrame(tickParticulas);\n  }\n\n  \/\/ \u2500\u2500\u2500 Tiros dos aliens \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const tirosAliens = [];\n\n  \/\/ Escurece uma cor hex para os tiros\n  function escureceCor(hex) {\n    const map = {\n      '#FFEAF3': '#d4567a', \/\/ rosa claro \u2192 rosa escuro\n      '#FCA9DB': '#c2177a', \/\/ rosa\n      '#9DCFFC': '#1a6bbf', \/\/ azul claro \u2192 azul escuro\n      '#73C4EE': '#1a6bbf', \/\/ azul\n      '#D6E6F6': '#4a7fad', \/\/ azul muito claro\n      '#CBC8F8': '#5c46e8', \/\/ roxo claro \u2192 roxo escuro\n      '#FDB621': '#b37200', \/\/ amarelo\n      '#FFD611': '#b37200',\n      '#FFA053': '#c45a00', \/\/ laranja\n      '#F58123': '#c45a00',\n      '#19CCCC': '#0a8080', \/\/ ciano\n    };\n    return map[hex.toUpperCase()] || map[hex] || hex;\n  }\n\n  function alienDispara() {\n    if (!jogoIniciado || jogoPausado) return;\n\n    \/\/ Escolhe alien vis\u00edvel aleat\u00f3rio\n    const visiveis = svgs.filter(s => s.el && s.el.style.visibility !== 'hidden');\n    if (visiveis.length === 0) return;\n\n    const s = visiveis[Math.floor(Math.random() * visiveis.length)];\n    const jRect    = janelaEl.getBoundingClientRect();\n    const alienRect = s.el.getBoundingClientRect();\n\n    const x = alienRect.left + alienRect.width \/ 2 - jRect.left;\n    const y = alienRect.bottom - jRect.top;\n\n    const cor = s.gradDef ? escureceCor(s.gradDef.colors[1] || s.gradDef.colors[0]) : '#555';\n\n    const tiro = document.createElement('div');\n    tiro.style.cssText = `\n      position: absolute;\n      width: 3px; height: 10px;\n      background: ${cor};\n      border-radius: 2px;\n      pointer-events: none;\n      left: ${x - 1.5}px;\n      top: ${y}px;\n    `;\n    janelaEl.appendChild(tiro);\n    tirosAliens.push({ el: tiro, y, cor });\n  }\n\n  \/\/ Dispara a cada 800ms \u2014 arrancado no start\n  let alienDisparaInterval = null;\n\n  function iniciaAlienDispara() {\n    if (alienDisparaInterval) return;\n    alienDisparaInterval = setInterval(alienDispara, 800);\n  }\n\n  function paraAlienDispara() {\n    clearInterval(alienDisparaInterval);\n    alienDisparaInterval = null;\n  }\n\n  let tirosAliensAtivo = false;\n  let tirosAtivo = false;\n  let linhasAtivo = false;\n  let particulasAtivo = false;\n\n  function moverTirosAliens() {\n    if (!tirosAliensAtivo) return;\n    const jRect   = janelaEl.getBoundingClientRect();\n    const nRect   = naveSvg.getBoundingClientRect();\n    const naveRect = {\n      left:   nRect.left,\n      right:  nRect.right,\n      top:    nRect.top,\n      bottom: nRect.bottom,\n    };\n\n    for (let i = tirosAliens.length - 1; i >= 0; i--) {\n      const t = tirosAliens[i];\n      t.y += 5;\n      t.el.style.top = t.y + 'px';\n\n      const tRect = t.el.getBoundingClientRect();\n\n      if (colide(tRect, naveRect)) {\n        t.el.remove();\n        tirosAliens.splice(i, 1);\n        naveAtingida();\n        return;\n      }\n\n      if (t.y > jRect.height + 20) {\n        t.el.remove();\n        tirosAliens.splice(i, 1);\n      }\n    }\n    if (tirosAliensAtivo) requestAnimationFrame(moverTirosAliens);\n  }\n  \/\/ moverTirosAliens arranca no start\n\n  \/\/ Fun\u00e7\u00e3o partilhada: pisca elementos a vermelho N vezes e depois chama callback\n  function piscaVermelho(elements, getCor, setCor, callback) {\n    let piscadas = 0;\n    function pisca() {\n      if (piscadas >= 6) { callback(); return; }\n      const vermelho = piscadas % 2 === 0;\n      elements.forEach((el, i) => setCor(el, i, vermelho));\n      piscadas++;\n      setTimeout(pisca, 200);\n    }\n    \/\/ come\u00e7a vermelho\n    elements.forEach((el, i) => setCor(el, i, true));\n    setTimeout(pisca, 200);\n  }\n\n  function aliensChegaram() {\n    jogoIniciado = false;\n    jogoPausado  = false;\n    tirosAliensAtivo = false;\n    paraFrames(); \/\/ para o setInterval que poderia sobrescrever\n\n    const visiveis = svgs.filter(s => s.el && s.el.style.visibility !== 'hidden');\n    let piscadas = 0;\n\n    function pisca() {\n      if (piscadas >= 6) {\n        \/\/ Restaura todos com desenhaAlien (inclui olhos brancos) antes do reset\n        visiveis.forEach(s => desenhaAlien(s.svg, s.gradId, s.type, 0));\n        setTimeout(() => resetJogo(visiveis), 50);\n        return;\n      }\n      const vermelho = piscadas % 2 === 0;\n      visiveis.forEach(s => {\n        if (vermelho) {\n          s.el.querySelectorAll('rect').forEach(r => r.setAttribute('fill', '#ff0000'));\n        } else {\n          desenhaAlien(s.svg, s.gradId, s.type, 0);\n        }\n      });\n      piscadas++;\n      setTimeout(pisca, 200);\n    }\n\n    \/\/ come\u00e7a vermelho\n    visiveis.forEach(s => s.el.querySelectorAll('rect').forEach(r => r.setAttribute('fill', '#ff0000')));\n    setTimeout(pisca, 200);\n  }\n\n  function naveAtingida() {\n    jogoIniciado = false;\n    jogoPausado  = false;\n    tirosAliensAtivo = false;\n\n    const paths = Array.from(naveSvg.querySelectorAll('path'));\n    const coresOriginais = paths.map(p => p.getAttribute('fill'));\n\n    piscaVermelho(\n      paths,\n      (p, i) => coresOriginais[i],\n      (p, i, vermelho) => p.setAttribute('fill', vermelho ? '#ff0000' : 'transparent'),\n      () => {\n        paths.forEach((p, i) => p.setAttribute('fill', coresOriginais[i]));\n        \/\/ Restaura olhos dos aliens restantes\n        svgs.filter(s => s.el && s.el.style.visibility !== 'hidden')\n            .forEach(s => desenhaAlien(s.svg, s.gradId, s.type, 0));\n        setTimeout(() => resetJogo(svgs.filter(s => s.el && s.el.style.visibility !== 'hidden')), 50);\n      }\n    );\n  }\n\n  function ganhou() {\n    jogoIniciado = false;\n    tirosAtivo = false;\n    linhasAtivo = false;\n    tirosAliensAtivo = false;\n    paraFrames();\n    paraAlienDispara();\n\n    tiros.forEach(t => t.el.remove());\n    tiros.length = 0;\n    tirosAliens.forEach(t => t.el.remove());\n    tirosAliens.length = 0;\n\n    \/\/ Mostra popup ganhou\n    popupGanhouEl.style.display = 'block';\n    popupGanhouEl.style.opacity = '0';\n    requestAnimationFrame(() => requestAnimationFrame(() => {\n      popupGanhouEl.style.opacity = '1';\n    }));\n    iniciarPulso();\n\n    \/\/ Reset posi\u00e7\u00f5es para pr\u00f3ximo jogo\n    setTimeout(() => {\n      movimento.forEach(m => { m.posX = 0; m.direcao = 1; m.posY = 0; });\n      linhas.forEach(l => { l.style.transform = 'translateX(0px) translateY(0px)'; });\n      svgs.forEach(s => {\n        if (s.el) {\n          s.el.style.visibility = 'visible';\n          s.el.querySelectorAll('rect').forEach(r => r.setAttribute('fill', `url(#${s.gradId})`));\n        }\n      });\n      naveEl.style.left = '50%';\n      naveEl.style.transform = 'translateX(-50%)';\n    }, 500);\n  }\n\n  function iniciarPulso() { naveEl.classList.add('pulsar'); }\n  function pararPulso()   { naveEl.classList.remove('pulsar'); }\n\n  function resetJogo(visiveis) {\n    document.getElementById('hint-esc').style.opacity = '0';\n    paraAutoTiro();\n    mostrarTouchStart();\n    tirosAliensAtivo = false;\n    tirosAtivo = false;\n    linhasAtivo = false;\n    particulasAtivo = true; \/\/ continua durante anima\u00e7\u00e3o de reset\n    paraFrames();\n    paraAlienDispara();\n\n    \/\/ Remove tiros\n    tirosAliens.forEach(t => t.el.remove());\n    tirosAliens.length = 0;\n    tiros.forEach(t => t.el.remove());\n    tiros.length = 0;\n\n    \/\/ Volta nave ao centro\n    naveEl.style.left = '50%';\n    naveEl.style.transform = 'translateX(-50%)';\n\n    \/\/ Desmaterializa aliens vis\u00edveis\n    const alvos = visiveis || svgs.filter(s => s.el && s.el.style.visibility !== 'hidden');\n    alvos.forEach(s => {\n      const rect = s.el.getBoundingClientRect();\n      const cores = s.gradDef ? s.gradDef.colors : ['#aaa'];\n      explode(rect, cores[0], cores[1] || cores[0]);\n      s.el.style.visibility = 'hidden';\n    });\n\n    \/\/ Popup com fade in\n    setTimeout(() => {\n      popupEl.style.display = 'block';\n      popupEl.style.opacity = '0';\n      requestAnimationFrame(() => requestAnimationFrame(() => {\n        popupEl.style.opacity = '1';\n      }));\n      iniciarPulso();\n\n      \/\/ Materializa aliens de volta com fade\n      setTimeout(() => {\n        movimento.forEach(m => { m.posX = 0; m.direcao = 1; m.posY = 0; });\n        linhas.forEach(l => { l.style.transform = 'translateX(0px) translateY(0px)'; });\n\n        svgs.forEach(s => {\n          if (s.el) {\n            s.el.style.opacity = '0';\n            s.el.style.visibility = 'visible';\n            s.el.style.transition = 'opacity 0.6s ease';\n            desenhaAlien(s.svg, s.gradId, s.type, 0); \/\/ restaura corpo + olhos\n            requestAnimationFrame(() => requestAnimationFrame(() => {\n              s.el.style.opacity = '1';\n            }));\n          }\n        });\n        setTimeout(() => {\n          svgs.forEach(s => { if (s.el) s.el.style.transition = ''; });\n          \/\/ loops e flags s\u00f3 arrancam quando o utilizador clicar start\n        }, 700);\n\n      }, 500);\n    }, 300);\n  }\n\n  \/\/ \u2500\u2500\u2500 Tiros \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const tiros = [];\n\n  document.addEventListener('click', (e) => {\n    if (!jogoIniciado || jogoPausado) return;\n    if (isMobile()) return; \/\/ mobile usa auto-tiro\n    disparaTiro();\n  });\n\n  function moverTiros() {\n    if (!tirosAtivo) return;\n    for (let i = tiros.length - 1; i >= 0; i--) {\n      const t = tiros[i];\n      t.y -= 8;\n      t.el.style.top = t.y + 'px';\n\n      const tiroRect = t.el.getBoundingClientRect();\n      let acertou = false;\n\n      for (let j = svgs.length - 1; j >= 0; j--) {\n        const s = svgs[j];\n        if (!s.el || s.el.style.visibility === 'hidden') continue;\n        const alienRect = s.el.getBoundingClientRect();\n        if (colide(tiroRect, alienRect)) {\n          const cores = s.gradDef ? s.gradDef.colors : ['#aaa'];\n          explode(alienRect, cores[0], cores[1]);\n          s.el.style.visibility = 'hidden';\n          acertou = true;\n\n          \/\/ Verifica se ganhou\n          const restantes = svgs.filter(s => s.el && s.el.style.visibility !== 'hidden');\n          if (restantes.length === 0) { ganhou(); return; }\n\n          break;\n        }\n      }\n\n      if (acertou || t.y < -20) {\n        t.el.remove();\n        tiros.splice(i, 1);\n      }\n    }\n    if (tirosAtivo) requestAnimationFrame(moverTiros);\n  }\n  \/\/ moverTiros arranca no start\n\n\n  \/\/ \u2500\u2500\u2500 Mobile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const isMobile = () => window.innerWidth <= 991;\n\n  function iniciaMobile() { criaFilas(); }\n\n  \/\/ Touch start button\n  const touchStartBtn = document.getElementById('touch-start');\n\n  if (touchStartBtn) {\n    touchStartBtn.addEventListener('click', () => {\n      if (jogoIniciado && !jogoPausado) return;\n\n      if (isMobile()) iniciaMobile();\n\n      jogoIniciado = true;\n      jogoPausado  = false;\n\n      pararPulso();\n\n      touchStartBtn.style.display = 'none';\n\n      popupEl.style.opacity = '0';\n      setTimeout(() => { popupEl.style.display = 'none'; }, 600);\n\n      popupGanhouEl.style.opacity = '0';\n      setTimeout(() => { popupGanhouEl.style.display = 'none'; }, 600);\n\n      \/\/ \ud83d\udd25 ISTO \u00c9 O QUE FALTAVA\n      document.querySelector('.game')?.classList.add('start');\n\n      if (!tirosAtivo) { tirosAtivo = true; requestAnimationFrame(moverTiros); }\n      if (!linhasAtivo) { linhasAtivo = true; requestAnimationFrame(moverLinhas); }\n      if (!tirosAliensAtivo) { tirosAliensAtivo = true; requestAnimationFrame(moverTirosAliens); }\n      if (!particulasAtivo) { particulasAtivo = true; requestAnimationFrame(tickParticulas); }\n\n      iniciaFrames();\n      iniciaAlienDispara();\n\n      \/\/ Tiro autom\u00e1tico em mobile\n      if (isMobile()) iniciaAutoTiro();\n    });\n  }\n\n  \/\/ Auto-tiro mobile\n  let autoTiroInterval = null;\n  function iniciaAutoTiro() {\n    if (autoTiroInterval) return;\n    autoTiroInterval = setInterval(() => {\n      if (!jogoIniciado || jogoPausado) return;\n      disparaTiro();\n    }, 600);\n  }\n  function paraAutoTiro() {\n    clearInterval(autoTiroInterval);\n    autoTiroInterval = null;\n  }\n\n  function disparaTiro() {\n    const jRect = janelaEl.getBoundingClientRect();\n    const rect  = naveSvg.getBoundingClientRect();\n    const x = rect.left + rect.width \/ 2 - jRect.left;\n    const y = rect.top - jRect.top;\n    const tiro = document.createElement('div');\n    tiro.className = 'tiro';\n    tiro.style.left = (x - 1.5) + 'px';\n    tiro.style.top  = y + 'px';\n    janelaEl.appendChild(tiro);\n    tiros.push({ el: tiro, y });\n  }\n\n  \/\/ Touch move \u2014 arrastar nave horizontalmente\n  let touchStartX = null;\n  janelaEl.addEventListener('touchstart', (e) => {\n    touchStartX = e.touches[0].clientX;\n  }, { passive: true });\n\n  janelaEl.addEventListener('touchmove', (e) => {\n    if (!jogoIniciado || jogoPausado || !isMobile()) return;\n    const dx = e.touches[0].clientX - touchStartX;\n    touchStartX = e.touches[0].clientX;\n    const jRect  = janelaEl.getBoundingClientRect();\n    const metade = naveSvg.getBoundingClientRect().width \/ 2;\n    const curLeft = parseFloat(naveEl.style.left) || jRect.width \/ 2;\n    const newX = Math.max(metade, Math.min(jRect.width - metade, curLeft + dx));\n    naveEl.style.left = newX + 'px';\n    naveEl.style.transform = 'translateX(-50%)';\n  }, { passive: true });\n\n  \/\/ Show touch-start button on mobile when game over\n  function mostrarTouchStart() {\n    if (isMobile()) {\n      touchStartBtn.textContent = 'play';\n      touchStartBtn.style.display = 'flex';\n    }\n  }\n\n  \/\/ Patch resetJogo to show touch start on mobile\n  const _resetJogoOrig = resetJogo;\n\n  function initRewardPopup() {\n    const reward = document.getElementById('reward');\n    const form   = document.getElementById('form-lets-talk');\n    const close  = form?.querySelector('.cruz');\n    const game   = document.querySelector('.wpb_text_column.game');\n\n    \/\/ \ud83d\udc49 NOVO: bot\u00e3o dentro do .lets-talk\n    const btn = document.querySelector('.lets-talk .vc_btn3-container');\n\n    if (!form || !close) return;\n\n    \/\/ Estado inicial\n    form.style.display = 'none';\n    form.style.opacity = '0';\n\n    \/\/ CLICK NO REWARD \u2192 FADE IN\n    reward?.addEventListener('click', () => {\n      form.style.display = 'block';\n\n      requestAnimationFrame(() => {\n        form.style.opacity = '1';\n      });\n    });\n\n    \/\/ CLICK NA CRUZ \u2192 FADE OUT + ESCONDE GAME\n    close.addEventListener('click', () => {\n      form.style.opacity = '0';\n\n      setTimeout(() => {\n        form.style.display = 'none';\n\n        if (game) {\n          game.style.display = 'none';\n        }\n\n        \/\/ \ud83d\udc49 Se existir .game dentro de .lets-talk \u2192 adiciona .reward\n        if (document.querySelector('.lets-talk .game') && btn) {\n          btn.classList.add('close-game');\n        }\n      }, 300);\n    });\n  }\n\n  initRewardPopup();\n\n  \/\/ \u2500\u2500\u2500 Bot\u00e3o \"Accept the Challenge\" tamb\u00e9m inicia o jogo \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \/\/ Reaproveita exatamente o mesmo arranque que clicar na nave (desktop)\n  \/\/ ou no bot\u00e3o \"start\" (mobile), disparando o click programaticamente.\n  const acceptChallengeBtn = document.querySelector('.lets-talk .vc_btn3-container a');\n  if (acceptChallengeBtn) {\n    acceptChallengeBtn.addEventListener('click', (e) => {\n      e.preventDefault();\n      if (jogoIniciado && !jogoPausado) return;\n      if (isMobile()) {\n        touchStartBtn?.click();\n      } else {\n        naveEl.click();\n      }\n    });\n  }\n\n  \/\/ \u2500\u2500\u2500 Bot\u00e3o de reset junto ao hint do ESC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const resetJogoBtn = document.getElementById('reset-jogo-btn');\n  if (resetJogoBtn) {\n    resetJogoBtn.addEventListener('click', (e) => {\n      e.stopPropagation();\n      if (!jogoIniciado && !jogoPausado) return; \/\/ nada para reiniciar\n      jogoIniciado = false;\n      jogoPausado  = false;\n      resetJogo();\n    });\n  }\n\n<\/script>\n    [\/vc_column_text][vc_raw_html css=&#8221;&#8221;]JTNDZGl2JTIwY2xhc3MlM0QlMjJib2xhMSUyMGdzYXAtZmxvYXQlMjIlM0UlM0MlMkZkaXYlM0UlMEElM0NkaXYlMjBjbGFzcyUzRCUyMmJvbGEyJTIwZ3NhcC1mbG9hdCUyMiUzRSUzQyUyRmRpdiUzRSUwQSUzQ2RpdiUyMGNsYXNzJTNEJTIyYm9sYTMlMjBnc2FwLWZsb2F0JTIyJTNFJTNDJTJGZGl2JTNFJTBBJTNDZGl2JTIwY2xhc3MlM0QlMjJib2xhNCUyMGdzYXAtZmxvYXQlMjIlM0UlM0MlMkZkaXYlM0UlMEElM0NkaXYlMjBjbGFzcyUzRCUyMmJvbGE1JTIwZ3NhcC1mbG9hdCUyMiUzRSUzQyUyRmRpdiUzRQ==[\/vc_raw_html][\/vc_column][\/vc_row][vc_row el_class=&#8221;final-block gsap-parallax-y&#8221;][vc_column][vc_single_image image=&#8221;632&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; css=&#8221;&#8221; el_class=&#8221;logo&#8221;][vc_single_image image=&#8221;633&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; css=&#8221;&#8221; el_class=&#8221;back&#8221;][vc_column_text css=&#8221;&#8221;]<strong>Somos o seu parceiro estrat\u00e9gico para navegar no universo digital.<\/strong><br \/>\nNa <strong>BSpacy<\/strong>, dedicamo-nos a impulsionar a sua marca al\u00e9m dos limites, tornando-a uma estrela-guia no vasto cen\u00e1rio digital.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[vc_row el_class=&#8221;block-home1&#8243;][vc_column][esfera][bola width=&#8221;42&#8243; height=&#8221;42&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#F58123&#8243; animation_time=&#8221;15&#8243; rotate=&#8221;yes&#8221; rotation_time=&#8221;5&#8243; line=&#8221;5&#8243; reverse=&#8221;yes&#8221; color_end=&#8221;#F5812300&#8243;][bola width=&#8221;22&#8243; height=&#8221;22&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#FDB621&#8243; animation_time=&#8221;8&#8243; line=&#8221;4&#8243; color_end=&#8221;#FFD611&#8243;][bola width=&#8221;25&#8243; height=&#8221;25&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#EABDD8&#8243; animation_time=&#8221;20&#8243; rotate=&#8221;yes&#8221; rotation_time=&#8221;2&#8243; line=&#8221;2&#8243; delay=&#8221;2&#8243; color_end=&#8221;#FBDDEA&#8221;][bola width=&#8221;36&#8243; height=&#8221;36&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#9DCFFC&#8221; animation_time=&#8221;25&#8243; line=&#8221;-1&#8243; delay=&#8221;&#8221; color_end=&#8221;#73C4EE&#8221;][bola width=&#8221;25&#8243; height=&#8221;25&#8243; fill_type=&#8221;gradient&#8221; color_start=&#8221;#FDB621&#8243; animation_time=&#8221;10&#8243; line=&#8221;-2&#8243; reverse=&#8221;yes&#8221; color_end=&#8221;#FFD611&#8243;][bola width=&#8221;18&#8243; height=&#8221;18&#8243; fill_type=&#8221;gradient&#8221; gradient_type=&#8221;radial&#8221; color_start=&#8221;#D6E6F6&#8243; animation_time=&#8221;12&#8243; line=&#8221;-4&#8243; color_end=&#8221;#CBC8F8&#8243;][\/esfera][vc_row_inner el_class=&#8221;elipse-info&#8221;][vc_column_inner][vc_single_image image=&#8221;627&#8243; [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-642","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.bspacy.com\/pt-pt\/wp-json\/wp\/v2\/pages\/642","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bspacy.com\/pt-pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.bspacy.com\/pt-pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.bspacy.com\/pt-pt\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bspacy.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=642"}],"version-history":[{"count":12,"href":"https:\/\/www.bspacy.com\/pt-pt\/wp-json\/wp\/v2\/pages\/642\/revisions"}],"predecessor-version":[{"id":931,"href":"https:\/\/www.bspacy.com\/pt-pt\/wp-json\/wp\/v2\/pages\/642\/revisions\/931"}],"wp:attachment":[{"href":"https:\/\/www.bspacy.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}