A conta que você precisa, com os benefícios que você merece.
Leia o QR Code e baixe nosso app agora.
A conta feita para você
Tenha acesso a soluções financeiras completas, crédito facilitado e atendimento personalizado, com benefícios exclusivos de uma cooperativa de crédito.
No Sicoob, cooperamos com você.
Conte com uma instituição financeira cooperativa diferente de tudo que você já viu para cuidar do seu dinheiro
Com uma conta no Sicoob, você tem acesso a soluções financeiras completas, crédito facilitado, atendimento personalizado e benefícios que só uma cooperativa de crédito pode oferecer.
Confira as vantagens de se tornar cooperado:
- Portfólio completo de produtos e serviços
- Tarifas e taxas muito mais atrativas*
- Ampla rede de atendimento em todo país
- Canais digitais que agilizam sua rotina de forma gratuita e segura
Baixe o App Sicoob e abra hoje sua conta no Sicoob.
* Operação sujeita à análise aprovação de crédito. Informe-se sobre as condições e disponibilidade dos produtos na sua cooperativa de crédito ou na Cooperativa Sicoob mais próxima.
Para mais informações, consulte:
- Cláusulas e Condições Gerais de relacionamento, de produtos e serviços e de abertura, manutenção e encerramento de conta de depósito na modalidade CONTA CORRENTE do sistema Sicoob: clique aqui.
- Cláusulas e Condições Gerais de relacionamento e de abertura, manutenção e encerramento de conta de depósito na modalidade CONTA POUPANÇA do sistema Sicoob: clique aqui.
- Contrato de Prestação de Serviços de Crédito de Salário entre a fonte pagadora e cooperativa de crédito do Sistema Sicoob, com base na legislação em vigor. Para saber mais, clique aqui.
The following has evaluated to null or missing:
==> Fieldset67243883 [in template "20102#20128#189538129" at line 811, column 8]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #list Fieldset67243883.getSiblings() ... [in template "20102#20128#189538129" at line 811, column 1]
----
1<style type="text/css">
2/* =========================================================
3 PARCEIROS SIPAG - LAYOUT PRINCIPAL
4========================================================= */
5
6.sipag-parceiros {
7 background-color: #fff;
8 color: #003641;
9 padding: 34px 0 56px;
10}
11
12.sipag-parceiros > .container {
13 max-width: 1440px;
14 padding-left: 24px;
15 padding-right: 24px;
16 width: 100%;
17}
18
19/* =========================================================
20 FILTROS
21========================================================= */
22
23.sipag-parceiros .parceiros-filtros-area {
24 margin-bottom: 34px;
25}
26
27.sipag-parceiros .parceiros-intro {
28 color: #003641;
29 font-size: 17px;
30 line-height: 1.4;
31 margin: 0 0 26px;
32 text-align: center;
33}
34
35.sipag-parceiros .filtros {
36 align-items: center;
37 display: flex;
38 flex-wrap: wrap;
39 gap: 12px;
40 justify-content: center;
41 margin: 0 auto;
42 width: 100%;
43}
44
45.sipag-parceiros .btn-pill {
46 align-items: center;
47 background-color: #fff;
48 border: 1px solid #d9dcdf;
49 border-radius: 10px;
50 box-shadow: none;
51 color: #272833;
52 cursor: pointer;
53 display: inline-flex;
54 flex: 0 0 auto;
55 font-size: 18px;
56 font-weight: 700;
57 justify-content: center;
58 line-height: 1.2;
59 min-height: 64px;
60 min-width: 250px;
61 padding: 14px 22px;
62 text-align: center;
63 text-transform: uppercase;
64 transition:
65 background-color .2s ease,
66 border-color .2s ease,
67 color .2s ease;
68 white-space: nowrap;
69}
70
71.sipag-parceiros .btn-pill:hover {
72 background-color: #f5fffd;
73 border-color: #00ae9d;
74 color: #003641;
75}
76
77.sipag-parceiros .btn-pill.active {
78 background-color: #003641;
79 border-color: #003641;
80 color: #fff;
81}
82
83.sipag-parceiros .btn-pill:focus {
84 box-shadow: 0 0 0 3px rgba(0, 174, 157, .16);
85 outline: none;
86}
87
88/* =========================================================
89 BUSCA
90========================================================= */
91
92.sipag-parceiros .parceiros-busca {
93 margin: 0 auto 56px;
94 max-width: none;
95 position: relative;
96 width: 100%;
97}
98
99.sipag-parceiros .parceiros-busca-icone {
100 color: #00ae9d;
101 height: 28px;
102 left: 21px;
103 pointer-events: none;
104 position: absolute;
105 top: 50%;
106 transform: translateY(-50%);
107 width: 28px;
108}
109
110.sipag-parceiros .parceiros-busca-campo {
111 background-color: #fff;
112 border: 2px solid #00ae9d;
113 border-radius: 7px;
114 color: #003641;
115 font-size: 16px;
116 height: 68px;
117 outline: none;
118 padding: 0 24px 0 62px;
119 transition:
120 border-color .2s ease,
121 box-shadow .2s ease;
122 width: 100%;
123}
124
125.sipag-parceiros .parceiros-busca-campo::placeholder {
126 color: #b1bbc8;
127 opacity: 1;
128}
129
130.sipag-parceiros .parceiros-busca-campo:focus {
131 border-color: #00ae9d;
132 box-shadow: 0 0 0 3px rgba(0, 174, 157, .12);
133}
134
135/* =========================================================
136 GRID
137========================================================= */
138
139.sipag-parceiros #grid-parceiros {
140 align-items: stretch;
141}
142
143.sipag-parceiros .parceiro {
144 display: flex;
145}
146
147/* =========================================================
148 CARD
149========================================================= */
150
151.sipag-parceiros .card-parceiro {
152 background-color: #fff;
153 border: 1px solid #dedede;
154 border-radius: 14px;
155 box-shadow: none;
156 display: flex;
157 flex-direction: column;
158 min-height: 510px;
159 padding: 18px;
160 transition:
161 border-color .2s ease,
162 box-shadow .2s ease;
163 width: 100%;
164}
165
166.sipag-parceiros .card-parceiro:hover {
167 border-color: #d1d8d7;
168 box-shadow: 0 8px 22px rgba(0, 54, 65, .08);
169 transform: none;
170}
171
172/* =========================================================
173 LOGO
174========================================================= */
175
176.sipag-parceiros .parceiro-logo {
177 align-items: center;
178 display: flex;
179 height: 255px;
180 justify-content: center;
181 margin-bottom: 0;
182 overflow: hidden;
183 width: 100%;
184}
185
186.sipag-parceiros .parceiro-logo img {
187 display: block;
188 max-height: 169px;
189 max-width: 230px;
190 object-fit: contain;
191 width: auto;
192}
193
194/* =========================================================
195 TEXTO DO CARD
196========================================================= */
197
198.sipag-parceiros .card-parceiro h6 {
199 color: #00ae9d;
200 font-size: 23px;
201 font-weight: 700;
202 line-height: 1.25;
203 margin: 0 0 10px;
204}
205
206.sipag-parceiros .parceiro-segmento {
207 color: #5b5b5b;
208 font-size: 15px;
209 line-height: 1.55;
210 margin: 0 0 24px;
211}
212
213/* =========================================================
214 AÇÕES DO CARD
215========================================================= */
216
217.sipag-parceiros .parceiro-acoes {
218 display: flex;
219 flex-direction: column;
220 gap: 10px;
221 margin-top: auto;
222 width: 100%;
223}
224
225.sipag-parceiros .btn-parceiro {
226 align-items: center;
227 border-radius: 9px;
228 cursor: pointer;
229 display: inline-flex;
230 flex: none;
231 font-size: 18px;
232 font-weight: 700;
233 justify-content: center;
234 min-height: 62px;
235 padding: 10px 14px;
236 text-align: center;
237 text-decoration: none !important;
238 transition:
239 background-color .2s ease,
240 border-color .2s ease,
241 color .2s ease;
242 width: 100%;
243}
244
245.sipag-parceiros .btn-site {
246 background-color: #fff;
247 border: 1px solid #00ae9d;
248 color: #00ae9d;
249}
250
251.sipag-parceiros .btn-site:hover {
252 background-color: #f3fffd;
253 border-color: #00ae9d;
254 color: #008f83;
255}
256
257.sipag-parceiros .btn-saiba {
258 background-color: #00ae9d;
259 border: 1px solid #00ae9d;
260 color: #fff;
261}
262
263.sipag-parceiros .btn-saiba:hover {
264 background-color: #008f83;
265 border-color: #008f83;
266 color: #fff;
267}
268
269/* =========================================================
270 NENHUM RESULTADO
271========================================================= */
272
273.sipag-parceiros .parceiros-vazio {
274 color: #536463;
275 font-size: 18px;
276 margin: 40px 0;
277 text-align: center;
278}
279
280@media (max-width: 1199.98px) {
281 .sipag-parceiros > .container {
282 max-width: 1140px;
283 }
284
285 .sipag-parceiros .btn-pill {
286 font-size: 16px;
287 min-height: 58px;
288 min-width: 210px;
289 }
290
291 .sipag-parceiros .card-parceiro {
292 min-height: 545px;
293 }
294
295 .sipag-parceiros .parceiro-logo {
296 height: 235px;
297 }
298
299 .sipag-parceiros .parceiro-logo img {
300 max-height: 140px;
301 max-width: 210px;
302 }
303}
304
305/* =========================================================
306 MODAL - FUNDO
307========================================================= */
308
309.modal-parceiro-sipag {
310 align-items: center;
311 background-color: rgba(0, 0, 0, .55);
312 bottom: 0;
313 display: flex;
314 justify-content: center;
315 left: 0;
316 overflow-y: auto;
317 padding: 14px;
318 position: fixed;
319 right: 0;
320 top: 0;
321 z-index: 11000;
322}
323
324.modal-parceiro-sipag[hidden] {
325 display: none !important;
326}
327
328/* =========================================================
329 MODAL - CONTAINER
330========================================================= */
331
332.modal-parceiro-sipag .modal-parceiro-dialog {
333 background-color: #fff;
334 border-radius: 18px;
335 box-shadow: 0 16px 45px rgba(0, 54, 65, .25);
336 margin: auto;
337 max-width: 1265px;
338 overflow: hidden;
339 width: 100%;
340}
341
342/* =========================================================
343 MODAL - CABEÇALHO
344========================================================= */
345
346.modal-parceiro-sipag .modal-parceiro-header {
347 align-items: center;
348 border-bottom: 1px solid #dfe5e4;
349 display: flex;
350 justify-content: space-between;
351 min-height: 68px;
352 padding: 12px 38px;
353}
354
355.modal-parceiro-sipag .modal-parceiro-header h4 {
356 color: #00ae9d;
357 font-size: 34px;
358 font-weight: 700;
359 line-height: 1.2;
360 margin: 0;
361}
362
363/* =========================================================
364 MODAL - FECHAR
365========================================================= */
366
367.modal-parceiro-sipag .close-modal {
368 align-items: center;
369 background-color: #fff;
370 border: 2px solid #005461;
371 border-radius: 50%;
372 color: #005461;
373 cursor: pointer;
374 display: flex;
375 flex: 0 0 38px;
376 font-size: 28px;
377 font-weight: 400;
378 height: 38px;
379 justify-content: center;
380 line-height: 1;
381 padding: 0 0 3px;
382 transition:
383 background-color .2s ease,
384 color .2s ease;
385 width: 38px;
386}
387
388.modal-parceiro-sipag .close-modal:hover {
389 background-color: #005461;
390 color: #fff;
391}
392
393.modal-parceiro-sipag .close-modal:focus {
394 box-shadow: 0 0 0 3px rgba(0, 174, 157, .2);
395 outline: none;
396}
397
398/* =========================================================
399 MODAL - CORPO
400========================================================= */
401
402.modal-parceiro-sipag .modal-parceiro-body {
403 max-height: calc(100vh - 100px);
404 overflow-y: auto;
405 padding: 24px 28px 34px;
406}
407
408/* =========================================================
409 MODAL - BLOCOS
410========================================================= */
411
412.modal-parceiro-sipag .modal-bloco {
413 border: 1px solid #00ae9d;
414 border-radius: 9px;
415 box-sizing: border-box;
416 margin: 0;
417 padding: 22px 24px;
418}
419
420.modal-parceiro-sipag .modal-bloco h6 {
421 color: #00ae9d;
422 font-size: 20px;
423 font-weight: 700;
424 line-height: 1.3;
425 margin: 0 0 20px;
426}
427
428/* =========================================================
429 DESCRIÇÃO
430========================================================= */
431
432.modal-parceiro-sipag #modalBlocoDescricao {
433 margin-bottom: 16px;
434 min-height: 145px;
435}
436
437.modal-parceiro-sipag #modalDescricao,
438.modal-parceiro-sipag #modalDescricao p {
439 color: #004653;
440 font-size: 21px;
441 line-height: 1.7;
442}
443
444.modal-parceiro-sipag #modalDescricao p {
445 margin: 0 0 8px;
446}
447
448.modal-parceiro-sipag #modalDescricao p:last-child {
449 margin-bottom: 0;
450}
451
452/* =========================================================
453 GRID DO MODAL
454========================================================= */
455
456.modal-parceiro-sipag .modal-detalhes-grid {
457 display: grid;
458 gap: 16px 20px;
459 grid-template-columns: repeat(2, minmax(0, 1fr));
460}
461
462.modal-parceiro-sipag #modalBlocoSegmentos,
463.modal-parceiro-sipag #modalBlocoTerminais {
464 min-height: 280px;
465}
466
467.modal-parceiro-sipag #modalBlocoContato,
468.modal-parceiro-sipag #modalBlocoSite {
469 min-height: 170px;
470}
471
472/* =========================================================
473 SEGMENTOS DO MODAL
474========================================================= */
475
476.modal-parceiro-sipag .modal-segmentos {
477 align-items: flex-start;
478 display: flex;
479 flex-wrap: wrap;
480 gap: 12px;
481}
482
483.modal-parceiro-sipag .modal-segmento-tag {
484 background-color: #fafafa;
485 border: 1px solid #cfcfcf;
486 border-radius: 6px;
487 color: #5d6262;
488 display: inline-flex;
489 font-size: 15px;
490 font-weight: 400;
491 line-height: 1.2;
492 padding: 10px 12px;
493 text-transform: uppercase;
494}
495
496/* =========================================================
497 TERMINAIS
498========================================================= */
499
500.modal-parceiro-sipag #modalTerminais,
501.modal-parceiro-sipag #modalTerminais p {
502 color: #004653;
503 font-size: 21px;
504 line-height: 1.8;
505}
506
507.modal-parceiro-sipag #modalTerminais p {
508 margin: 0 0 6px;
509}
510
511.modal-parceiro-sipag #modalTerminais p:last-child {
512 margin-bottom: 0;
513}
514
515/* =========================================================
516 CONTATO
517========================================================= */
518
519.modal-parceiro-sipag #modalContato {
520 color: #004653;
521 font-size: 21px;
522 line-height: 1.8;
523}
524
525.modal-parceiro-sipag #modalContato p {
526 color: #004653;
527 font-size: 21px;
528 line-height: 1.8;
529 margin: 0;
530}
531
532.modal-parceiro-sipag #modalContato strong {
533 color: #004653;
534 font-weight: 400;
535}
536
537.modal-parceiro-sipag #modalContato a {
538 color: #00a99d;
539 text-decoration: none;
540}
541
542.modal-parceiro-sipag #modalContato a:hover {
543 text-decoration: underline;
544}
545
546/* =========================================================
547 WEBSITE
548========================================================= */
549
550.modal-parceiro-sipag #modalSite {
551 font-size: 21px;
552 line-height: 1.7;
553}
554
555.modal-parceiro-sipag #modalSite a {
556 color: #00a99d;
557 overflow-wrap: anywhere;
558 text-decoration: none;
559}
560
561.modal-parceiro-sipag #modalSite a:hover {
562 text-decoration: underline;
563}
564
565/* =========================================================
566 RICH TEXT
567========================================================= */
568
569.modal-parceiro-sipag .modal-bloco ul,
570.modal-parceiro-sipag .modal-bloco ol {
571 color: #004653;
572 margin-bottom: 0;
573 padding-left: 20px;
574}
575
576.modal-parceiro-sipag .modal-bloco li {
577 color: #004653;
578 line-height: 1.7;
579 margin-bottom: 5px;
580}
581
582/* =========================================================
583 MOBILE
584========================================================= */
585
586@media (max-width: 767.98px) {
587 .sipag-parceiros {
588 padding: 28px 0 40px;
589 }
590
591 .sipag-parceiros > .container {
592 padding-left: 15px;
593 padding-right: 15px;
594 }
595
596 .sipag-parceiros .parceiros-filtros-area {
597 margin-bottom: 24px;
598 }
599
600 .sipag-parceiros .parceiros-intro {
601 font-size: 16px;
602 margin-bottom: 18px;
603 }
604
605 .sipag-parceiros .filtros {
606 flex-wrap: nowrap;
607 gap: 10px;
608 justify-content: flex-start;
609 margin-left: -15px;
610 margin-right: -15px;
611 overflow-x: auto;
612 padding: 3px 15px 12px;
613 width: auto;
614 -webkit-overflow-scrolling: touch;
615 }
616
617 .sipag-parceiros .filtros::-webkit-scrollbar {
618 height: 4px;
619 }
620
621 .sipag-parceiros .filtros::-webkit-scrollbar-thumb {
622 background-color: #b5c7c5;
623 border-radius: 10px;
624 }
625
626 .sipag-parceiros .btn-pill {
627 border-radius: 8px;
628 flex: 0 0 auto;
629 font-size: 14px;
630 min-height: 54px;
631 min-width: 205px;
632 padding: 12px 16px;
633 }
634
635 .sipag-parceiros .parceiros-busca {
636 margin-bottom: 34px;
637 }
638
639 .sipag-parceiros .parceiros-busca-campo {
640 font-size: 16px;
641 height: 56px;
642 padding-left: 52px;
643 }
644
645 .sipag-parceiros .parceiros-busca-icone {
646 height: 22px;
647 left: 18px;
648 width: 22px;
649 }
650
651 .sipag-parceiros .card-parceiro {
652 border-radius: 12px;
653 min-height: auto;
654 padding: 20px;
655 }
656
657 .sipag-parceiros .parceiro-logo {
658 height: 200px;
659 }
660
661 .sipag-parceiros .parceiro-logo img {
662 max-height: 130px;
663 max-width: 200px;
664 }
665
666 .sipag-parceiros .card-parceiro h6 {
667 font-size: 21px;
668 }
669
670 .sipag-parceiros .parceiro-segmento {
671 font-size: 14px;
672 }
673
674 .sipag-parceiros .parceiro-acoes {
675 flex-direction: column;
676 }
677
678 .sipag-parceiros .btn-parceiro {
679 font-size: 17px;
680 min-height: 54px;
681 width: 100%;
682 }
683
684 .modal-parceiro-sipag {
685 align-items: flex-end;
686 padding: 0;
687 }
688
689 .modal-parceiro-sipag .modal-parceiro-dialog {
690 border-radius: 16px 16px 0 0;
691 max-height: 95vh;
692 }
693
694 .modal-parceiro-sipag .modal-parceiro-header {
695 min-height: 65px;
696 padding: 14px 20px;
697 }
698
699 .modal-parceiro-sipag .modal-parceiro-header h4 {
700 font-size: 24px;
701 }
702
703 .modal-parceiro-sipag .close-modal {
704 flex: 0 0 36px;
705 height: 36px;
706 width: 36px;
707 }
708
709 .modal-parceiro-sipag .modal-parceiro-body {
710 max-height: calc(95vh - 65px);
711 padding: 18px 15px 25px;
712 }
713
714 .modal-parceiro-sipag .modal-detalhes-grid {
715 grid-template-columns: 1fr;
716 }
717
718 .modal-parceiro-sipag .modal-bloco {
719 min-height: auto !important;
720 padding: 20px;
721 }
722
723 .modal-parceiro-sipag #modalBlocoDescricao {
724 min-height: auto;
725 }
726
727 .modal-parceiro-sipag .modal-bloco h6 {
728 margin-bottom: 15px;
729 }
730}
731</style>
732
733<div class="col-12 px-0">
734 <section class="sipag-parceiros" id="sipag-parceiros">
735
736<div class="container">
737
738 <!-- =====================================================
739 FILTROS
740 ====================================================== -->
741
742 <div
743 class="parceiros-filtros-area"
744 id="parceiros-filtros-area"
745 >
746
747<p class="parceiros-intro">
748 Filtre abaixo os segmentos que deseja visualizar:
749</p>
750
751<div
752 aria-label="Filtrar parceiros por segmento"
753 class="filtros"
754 id="filtros-parceiros"
755 role="group"
756></div>
757
758 </div>
759
760 <!-- =====================================================
761 BUSCA
762 ====================================================== -->
763
764 <div class="parceiros-busca" role="search">
765
766<label
767 class="sr-only"
768 for="busca-parceiros"
769>
770 Pesquisar parceiros por nome ou categoria
771</label>
772
773<svg
774 aria-hidden="true"
775 class="parceiros-busca-icone"
776 fill="none"
777 viewBox="0 0 24 24"
778>
779 <circle
780 cx="11"
781 cy="11"
782 r="7"
783 stroke="currentColor"
784 stroke-width="2"
785 ></circle>
786
787 <path
788 d="M16 16L21 21"
789 stroke="currentColor"
790 stroke-linecap="round"
791 stroke-width="2"
792 ></path>
793</svg>
794
795<input
796 autocomplete="off"
797 class="parceiros-busca-campo"
798 id="busca-parceiros"
799 placeholder="Pesquise por nome do anexo ou categoria"
800 type="search"
801/>
802
803 </div>
804
805 <!-- =====================================================
806 GRID DE PARCEIROS
807 ====================================================== -->
808
809 <div class="row" id="grid-parceiros">
810
811<#list Fieldset67243883.getSiblings() as parceiro>
812
813 <#assign nome = parceiro.Text51037391.getData()!"" />
814 <#assign segmentos = parceiro.CheckboxMultiple15617005.getData()!"" />
815 <#assign site = parceiro.Text51612886.getData()!"" />
816
817 <#assign siteUrl = site />
818
819 <#if site?has_content
820 && !site?starts_with("http://")
821 && !site?starts_with("https://")>
822
823 <#assign siteUrl = "https://" + site />
824
825 </#if>
826
827
828 <div
829 class="col-sm-6 col-lg-4 col-xl-3 mb-4 parceiro"
830 data-category="${segmentos?html}"
831 data-name="${nome?html}"
832 >
833
834 <div class="card-parceiro">
835
836 <!-- LOGO -->
837 <div class="parceiro-logo">
838
839 <#if parceiro.Image82450298.getData()??
840 && parceiro.Image82450298.getData() != "">
841
842 <img
843 alt="${nome?html}"
844 class="img-fluid"
845 loading="lazy"
846 src="${parceiro.Image82450298.getData()}"
847 />
848
849 </#if>
850
851 </div>
852
853
854 <!-- NOME -->
855 <h6>
856 ${nome?html}
857 </h6>
858
859
860 <!-- SEGMENTOS -->
861 <p class="parceiro-segmento js-segmento-card"></p>
862
863
864 <!-- AÇÕES -->
865 <div class="parceiro-acoes">
866
867 <#if site?has_content>
868
869 <a
870 class="btn-parceiro btn-site"
871 href="${siteUrl?html}"
872 rel="noopener noreferrer"
873 target="_blank"
874 >
875 Acessar site
876 </a>
877
878 </#if>
879
880
881 <button
882 class="btn-parceiro btn-saiba btn-modal"
883 type="button"
884 >
885 Saiba mais
886 </button>
887
888 </div>
889
890
891 <!-- =================================================
892 DADOS UTILIZADOS PELO MODAL
893 ================================================== -->
894
895 <div
896 aria-hidden="true"
897 class="parceiro-dados d-none"
898 >
899
900 <span class="js-nome">
901 ${nome?html}
902 </span>
903
904
905 <span class="js-segmentos">
906 ${segmentos?html}
907 </span>
908
909
910 <div class="js-descricao">
911
912<#if (Fieldset67243883.RichText77766022.getData())??>
913${Fieldset67243883.RichText77766022.getData()}
914</#if>
915</div>
916
917 <div class="js-terminais">
918
919<#if (Fieldset67243883.RichText36172897.getData())??>
920${Fieldset67243883.RichText36172897.getData()}
921</#if>
922</div>
923
924 <span class="js-email">
925 <#if parceiro.Text26526715.getData()??>
926 ${parceiro.Text26526715.getData()?html}
927 </#if>
928 </span>
929
930
931 <span class="js-whatsapp">
932 <#if parceiro.Campo12763757.getData()??>
933 ${parceiro.Campo12763757.getData()?html}
934 </#if>
935 </span>
936
937
938 <span class="js-instagram">
939 <#if parceiro.Campo47414182.getData()??>
940 ${parceiro.Campo47414182.getData()?html}
941 </#if>
942 </span>
943
944
945 <span class="js-site">
946 ${site?html}
947 </span>
948
949 </div>
950
951 </div>
952
953 </div>
954
955</#list>
956
957 </div>
958
959 <!-- =====================================================
960 SEM RESULTADO
961 ====================================================== -->
962
963 <p
964 aria-live="polite"
965 class="parceiros-vazio"
966 hidden
967 id="parceiros-vazio"
968 role="status"
969 >
970 Nenhum parceiro encontrado.
971 </p>
972
973</div>
974
975<!-- =====================================================
976 MODAL
977====================================================== -->
978
979<div
980 aria-labelledby="modalParceiroTitulo"
981 aria-modal="true"
982 class="modal-parceiro-sipag"
983 hidden
984 id="modalParceiro"
985 role="dialog"
986>
987
988 <div class="modal-parceiro-dialog">
989
990<!-- CABEÇALHO -->
991<div class="modal-parceiro-header">
992
993 <h4 id="modalParceiroTitulo"></h4>
994
995 <button
996 aria-label="Fechar modal"
997 class="close-modal"
998 type="button"
999 >
1000 ×
1001 </button>
1002
1003</div>
1004
1005
1006<!-- CORPO -->
1007<div class="modal-parceiro-body">
1008
1009 <!-- DESCRIÇÃO -->
1010 <div
1011 class="modal-bloco"
1012 id="modalBlocoDescricao"
1013 >
1014
1015 <h6>Descrição</h6>
1016
1017 <div id="modalDescricao"></div>
1018
1019 </div>
1020
1021
1022 <!-- GRID 2x2 -->
1023 <div class="modal-detalhes-grid">
1024
1025 <!-- SEGMENTOS -->
1026 <div
1027 class="modal-bloco"
1028 id="modalBlocoSegmentos"
1029 >
1030
1031 <h6>Segmentos atendidos</h6>
1032
1033 <div
1034 class="modal-segmentos"
1035 id="modalSegmentos"
1036 ></div>
1037
1038 </div>
1039
1040
1041 <!-- TERMINAIS -->
1042 <div
1043 class="modal-bloco"
1044 id="modalBlocoTerminais"
1045 >
1046
1047 <h6>Terminais habilitados</h6>
1048
1049 <div id="modalTerminais"></div>
1050
1051 </div>
1052
1053
1054 <!-- CONTATO -->
1055 <div
1056 class="modal-bloco"
1057 id="modalBlocoContato"
1058 >
1059
1060 <h6>Informações e contato</h6>
1061
1062 <div id="modalContato"></div>
1063
1064 </div>
1065
1066
1067 <!-- WEBSITE -->
1068 <div
1069 class="modal-bloco"
1070 id="modalBlocoSite"
1071 >
1072
1073 <h6>Website</h6>
1074
1075 <div id="modalSite"></div>
1076
1077 </div>
1078
1079 </div>
1080
1081</div>
1082
1083 </div>
1084
1085</div>
1086
1087 </section>
1088</div>
1089
1090<script>
1091(function () {
1092
1093 var componente = document.getElementById("sipag-parceiros");
1094
1095 if (!componente) {
1096 return;
1097 }
1098
1099
1100 if (
1101 componente.getAttribute(
1102 "data-inicializado"
1103 ) === "true"
1104 ) {
1105 return;
1106 }
1107
1108
1109 componente.setAttribute(
1110 "data-inicializado",
1111 "true"
1112 );
1113
1114
1115 /* =========================================================
1116 ELEMENTOS
1117 ========================================================= */
1118
1119 var busca =
1120 componente.querySelector(
1121 "#busca-parceiros"
1122 );
1123
1124 var filtrosContainer =
1125 componente.querySelector(
1126 "#filtros-parceiros"
1127 );
1128
1129 var filtrosArea =
1130 componente.querySelector(
1131 "#parceiros-filtros-area"
1132 );
1133
1134 var parceiros =
1135 componente.querySelectorAll(
1136 ".parceiro"
1137 );
1138
1139 var mensagemVazia =
1140 componente.querySelector(
1141 "#parceiros-vazio"
1142 );
1143
1144
1145 var filtroAtual = "all";
1146
1147
1148 /* =========================================================
1149 NORMALIZA TEXTO
1150 ========================================================= */
1151
1152 function normalizarTexto(texto) {
1153
1154 var valor =
1155 (texto || "")
1156 .toString()
1157 .toLowerCase();
1158
1159
1160 if (valor.normalize) {
1161
1162 valor = valor
1163 .normalize("NFD")
1164 .replace(
1165 /[\u0300-\u036f]/g,
1166 ""
1167 );
1168
1169 }
1170
1171
1172 return valor
1173 .replace(
1174 /[^a-z0-9]+/g,
1175 " "
1176 )
1177 .trim();
1178
1179 }
1180
1181
1182 /* =========================================================
1183 OBTÉM SEGMENTOS
1184
1185 Suporta:
1186 ["varejo","servicos"]
1187
1188 varejo,servicos
1189
1190 varejo;servicos
1191 ========================================================= */
1192
1193 function obterSegmentos(valor) {
1194
1195 if (!valor) {
1196 return [];
1197 }
1198
1199
1200 var texto =
1201 valor.toString().trim();
1202
1203
1204 if (!texto) {
1205 return [];
1206 }
1207
1208
1209 /*
1210 * Tenta JSON primeiro.
1211 */
1212 try {
1213
1214 var json =
1215 JSON.parse(texto);
1216
1217
1218 if (Array.isArray(json)) {
1219
1220 return json
1221 .map(function (item) {
1222
1223 return item
1224 .toString()
1225 .trim();
1226
1227 })
1228 .filter(Boolean);
1229
1230 }
1231
1232 } catch (erro) {
1233 /* segue normalmente */
1234 }
1235
1236
1237 texto = texto
1238 .replace(/^\[/, "")
1239 .replace(/\]$/, "")
1240 .replace(/"/g, "")
1241 .replace(/'/g, "");
1242
1243
1244 return texto
1245 .split(/[,;|]+/)
1246 .map(function (item) {
1247
1248 return item.trim();
1249
1250 })
1251 .filter(Boolean);
1252
1253 }
1254
1255
1256 /* =========================================================
1257 CHAVE CANÔNICA DO SEGMENTO
1258 ========================================================= */
1259
1260 function obterChaveSegmento(segmento) {
1261
1262 var chave =
1263 normalizarTexto(segmento);
1264
1265
1266 if (
1267 chave.indexOf("alimentacao") !== -1 ||
1268 chave.indexOf("bares restaurantes") !== -1
1269 ) {
1270 return "alimentacao";
1271 }
1272
1273 if (chave.indexOf("evento") !== -1) {
1274 return "eventos";
1275 }
1276
1277 if (chave.indexOf("industr") !== -1) {
1278 return "industria";
1279 }
1280
1281 if (
1282 chave.indexOf("posto") !== -1 &&
1283 chave.indexOf("combust") !== -1
1284 ) {
1285 return "postos";
1286 }
1287
1288 if (chave.indexOf("saude") !== -1) {
1289 return "saude";
1290 }
1291
1292 if (chave.indexOf("servico") !== -1) {
1293 return "servicos";
1294 }
1295
1296 if (chave.indexOf("varejo") !== -1) {
1297 return "varejo";
1298 }
1299
1300
1301 return chave;
1302
1303 }
1304
1305
1306 /* =========================================================
1307 LABEL DO FILTRO
1308 ========================================================= */
1309
1310 function obterLabelFiltroSegmento(chave, segmentoOriginal) {
1311
1312 var labels = {
1313 "alimentacao": "ALIMENTAÇÃO",
1314 "eventos": "EVENTOS",
1315 "industria": "INDÚSTRIA",
1316 "postos": "POSTOS DE COMBUSTÍVEIS",
1317 "saude": "SAÚDE",
1318 "servicos": "SERVIÇOS",
1319 "varejo": "VAREJO"
1320 };
1321
1322
1323 if (labels[chave]) {
1324 return labels[chave];
1325 }
1326
1327
1328 return (segmentoOriginal || "")
1329 .toString()
1330 .trim()
1331 .toUpperCase();
1332
1333 }
1334
1335
1336 /* =========================================================
1337 NOME VISUAL DO SEGMENTO NO CARD / MODAL
1338 ========================================================= */
1339
1340 function obterLabelSegmento(segmento) {
1341
1342 var chave =
1343 normalizarTexto(segmento);
1344
1345
1346 var labels = {
1347 "alimentacao": "Alimentação (Bares, Restaurantes e Lanchonetes)",
1348 "alimentacao bares restaurantes e lanchonetes":
1349 "Alimentação (Bares, Restaurantes e Lanchonetes)",
1350 "bares restaurantes e lanchonetes":
1351 "Alimentação (Bares, Restaurantes e Lanchonetes)",
1352 "eventos": "Eventos",
1353 "industria": "Indústria",
1354 "posto": "Postos de Combustíveis",
1355 "postos": "Postos de Combustíveis",
1356 "posto de combustivel": "Postos de Combustíveis",
1357 "postos de combustivel": "Postos de Combustíveis",
1358 "postos de combustiveis": "Postos de Combustíveis",
1359 "saude": "Saúde",
1360 "servicos": "Serviços",
1361 "varejo": "Varejo"
1362 };
1363
1364
1365 if (labels[chave]) {
1366 return labels[chave];
1367 }
1368
1369
1370 return segmento
1371 .toString()
1372 .trim();
1373
1374 }
1375
1376
1377 /* =========================================================
1378 FORMATA OS SEGMENTOS NOS CARDS
1379 ========================================================= */
1380
1381 function formatarListaSegmentos(lista) {
1382
1383 if (!lista.length) {
1384 return "";
1385 }
1386
1387 if (lista.length === 1) {
1388 return lista[0];
1389 }
1390
1391 if (lista.length === 2) {
1392 return lista[0] + " e " + lista[1];
1393 }
1394
1395
1396 return (
1397 lista.slice(0, -1).join(", ") +
1398 " e " +
1399 lista[lista.length - 1]
1400 );
1401
1402 }
1403
1404
1405 function formatarSegmentosCards() {
1406
1407 parceiros.forEach(
1408 function (parceiro) {
1409
1410 var campo =
1411 parceiro.querySelector(
1412 ".js-segmento-card"
1413 );
1414
1415
1416 if (!campo) {
1417 return;
1418 }
1419
1420
1421 var segmentos =
1422 obterSegmentos(
1423 parceiro.getAttribute(
1424 "data-category"
1425 )
1426 );
1427
1428
1429 var labels =
1430 segmentos.map(function (segmento) {
1431
1432 return obterLabelSegmento(
1433 segmento
1434 );
1435
1436 });
1437
1438
1439 campo.textContent =
1440 formatarListaSegmentos(labels);
1441
1442 }
1443 );
1444
1445 }
1446
1447
1448 /* =========================================================
1449 CRIAR FILTROS AUTOMATICAMENTE
1450
1451 SOMENTE SEGMENTOS USADOS
1452 ========================================================= */
1453
1454 function gerarFiltros() {
1455
1456 if (!filtrosContainer) {
1457 return;
1458 }
1459
1460
1461 var segmentosUsados = {};
1462
1463
1464 parceiros.forEach(
1465 function (parceiro) {
1466
1467 var categorias =
1468 obterSegmentos(
1469 parceiro.getAttribute(
1470 "data-category"
1471 )
1472 );
1473
1474
1475 categorias.forEach(
1476 function (categoria) {
1477
1478 var chave =
1479 obterChaveSegmento(
1480 categoria
1481 );
1482
1483
1484 if (!chave) {
1485 return;
1486 }
1487
1488
1489 if (
1490 !segmentosUsados[chave]
1491 ) {
1492
1493 segmentosUsados[chave] = {
1494 chave: chave,
1495 valor: categoria,
1496 label:
1497 obterLabelFiltroSegmento(
1498 chave,
1499 categoria
1500 )
1501 };
1502
1503 }
1504
1505 }
1506 );
1507
1508 }
1509 );
1510
1511
1512 while (
1513 filtrosContainer.firstChild
1514 ) {
1515
1516 filtrosContainer.removeChild(
1517 filtrosContainer.firstChild
1518 );
1519
1520 }
1521
1522
1523 var segmentos =
1524 Object.keys(
1525 segmentosUsados
1526 )
1527 .map(function (chave) {
1528
1529 return segmentosUsados[
1530 chave
1531 ];
1532
1533 });
1534
1535
1536 if (!segmentos.length) {
1537
1538 if (filtrosArea) {
1539
1540 filtrosArea.style.display =
1541 "none";
1542
1543 }
1544
1545 return;
1546
1547 }
1548
1549
1550 if (filtrosArea) {
1551
1552 filtrosArea.style.display = "";
1553
1554 }
1555
1556
1557 /* TODOS */
1558 var botaoTodos =
1559 document.createElement(
1560 "button"
1561 );
1562
1563
1564 botaoTodos.type = "button";
1565
1566 botaoTodos.className =
1567 "btn btn-pill active";
1568
1569 botaoTodos.setAttribute(
1570 "data-filter",
1571 "all"
1572 );
1573
1574 botaoTodos.setAttribute(
1575 "aria-pressed",
1576 "true"
1577 );
1578
1579
1580 botaoTodos.appendChild(
1581 document.createTextNode(
1582 "TODOS OS SEGMENTOS"
1583 )
1584 );
1585
1586
1587 filtrosContainer.appendChild(
1588 botaoTodos
1589 );
1590
1591
1592 /* ORDEM ALFABÉTICA */
1593 segmentos.sort(
1594 function (a, b) {
1595
1596 return a.label.localeCompare(
1597 b.label,
1598 "pt-BR"
1599 );
1600
1601 }
1602 );
1603
1604
1605 /* CRIA SOMENTE OS USADOS */
1606 segmentos.forEach(
1607 function (segmento) {
1608
1609 var botao =
1610 document.createElement(
1611 "button"
1612 );
1613
1614
1615 botao.type = "button";
1616
1617 botao.className =
1618 "btn btn-pill";
1619
1620 botao.setAttribute(
1621 "data-filter",
1622 segmento.chave
1623 );
1624
1625 botao.setAttribute(
1626 "aria-pressed",
1627 "false"
1628 );
1629
1630
1631 botao.appendChild(
1632 document.createTextNode(
1633 segmento.label
1634 )
1635 );
1636
1637
1638 filtrosContainer.appendChild(
1639 botao
1640 );
1641
1642 }
1643 );
1644
1645 }
1646
1647
1648 /* =========================================================
1649 FILTRAR PARCEIROS
1650 ========================================================= */
1651
1652 function filtrarParceiros() {
1653
1654 var termo =
1655 normalizarTexto(
1656 busca ?
1657 busca.value :
1658 ""
1659 );
1660
1661
1662 var quantidadeVisivel = 0;
1663
1664
1665 parceiros.forEach(
1666 function (parceiro) {
1667
1668 var nome =
1669 normalizarTexto(
1670 parceiro.getAttribute(
1671 "data-name"
1672 )
1673 );
1674
1675
1676 var segmentos =
1677 obterSegmentos(
1678 parceiro.getAttribute(
1679 "data-category"
1680 )
1681 );
1682
1683
1684 var categoriasNormalizadas =
1685 segmentos.map(
1686 function (item) {
1687
1688 return obterChaveSegmento(
1689 item
1690 );
1691
1692 }
1693 );
1694
1695
1696 var textoCategorias =
1697 segmentos
1698 .map(function (item) {
1699
1700 return normalizarTexto(
1701 item + " " +
1702 obterLabelSegmento(item)
1703 );
1704
1705 })
1706 .join(" ");
1707
1708
1709 /* BUSCA */
1710 var atendeBusca =
1711 !termo ||
1712 nome.indexOf(termo) !== -1 ||
1713 textoCategorias.indexOf(
1714 termo
1715 ) !== -1;
1716
1717
1718 /* FILTRO */
1719 var atendeFiltro =
1720 filtroAtual === "all" ||
1721 categoriasNormalizadas
1722 .indexOf(
1723 filtroAtual
1724 ) !== -1;
1725
1726
1727 var exibir =
1728 atendeBusca &&
1729 atendeFiltro;
1730
1731
1732 parceiro.style.display =
1733 exibir ? "" : "none";
1734
1735
1736 if (exibir) {
1737 quantidadeVisivel++;
1738 }
1739
1740 }
1741 );
1742
1743
1744 if (mensagemVazia) {
1745
1746 mensagemVazia.hidden =
1747 quantidadeVisivel !== 0;
1748
1749 }
1750
1751 }
1752
1753
1754 /* =========================================================
1755 EVENTO FILTROS
1756 ========================================================= */
1757
1758 if (filtrosContainer) {
1759
1760 filtrosContainer.addEventListener(
1761 "click",
1762 function (event) {
1763
1764 var botao =
1765 event.target.closest(
1766 ".btn-pill[data-filter]"
1767 );
1768
1769
1770 if (!botao) {
1771 return;
1772 }
1773
1774
1775 filtroAtual =
1776 botao.getAttribute(
1777 "data-filter"
1778 ) || "all";
1779
1780
1781 var botoes =
1782 filtrosContainer
1783 .querySelectorAll(
1784 ".btn-pill"
1785 );
1786
1787
1788 botoes.forEach(
1789 function (item) {
1790
1791 item.classList.remove(
1792 "active"
1793 );
1794
1795 item.setAttribute(
1796 "aria-pressed",
1797 "false"
1798 );
1799
1800 }
1801 );
1802
1803
1804 botao.classList.add(
1805 "active"
1806 );
1807
1808 botao.setAttribute(
1809 "aria-pressed",
1810 "true"
1811 );
1812
1813
1814 filtrarParceiros();
1815
1816 }
1817 );
1818
1819 }
1820
1821
1822 /* =========================================================
1823 EVENTO BUSCA
1824 ========================================================= */
1825
1826 if (busca) {
1827
1828 busca.addEventListener(
1829 "input",
1830 filtrarParceiros
1831 );
1832
1833 }
1834
1835
1836 /* =========================================================
1837 ELEMENTOS MODAL
1838 ========================================================= */
1839
1840 var modal =
1841 componente.querySelector(
1842 "#modalParceiro"
1843 );
1844
1845 var tituloModal =
1846 componente.querySelector(
1847 "#modalParceiroTitulo"
1848 );
1849
1850 var modalDescricao =
1851 componente.querySelector(
1852 "#modalDescricao"
1853 );
1854
1855 var modalSegmentos =
1856 componente.querySelector(
1857 "#modalSegmentos"
1858 );
1859
1860 var modalTerminais =
1861 componente.querySelector(
1862 "#modalTerminais"
1863 );
1864
1865 var modalContato =
1866 componente.querySelector(
1867 "#modalContato"
1868 );
1869
1870 var modalSite =
1871 componente.querySelector(
1872 "#modalSite"
1873 );
1874
1875
1876 var blocoDescricao =
1877 componente.querySelector(
1878 "#modalBlocoDescricao"
1879 );
1880
1881 var blocoSegmentos =
1882 componente.querySelector(
1883 "#modalBlocoSegmentos"
1884 );
1885
1886 var blocoTerminais =
1887 componente.querySelector(
1888 "#modalBlocoTerminais"
1889 );
1890
1891 var blocoContato =
1892 componente.querySelector(
1893 "#modalBlocoContato"
1894 );
1895
1896 var blocoSite =
1897 componente.querySelector(
1898 "#modalBlocoSite"
1899 );
1900
1901
1902 var elementoFocoAnterior = null;
1903 var overflowAnterior = "";
1904
1905
1906 /* =========================================================
1907 LIMPAR ELEMENTO
1908 ========================================================= */
1909
1910 function limparElemento(elemento) {
1911
1912 if (!elemento) {
1913 return;
1914 }
1915
1916
1917 while (elemento.firstChild) {
1918
1919 elemento.removeChild(
1920 elemento.firstChild
1921 );
1922
1923 }
1924
1925 }
1926
1927
1928 /* =========================================================
1929 COPIA RICH TEXT
1930
1931 NÃO USA innerHTML
1932 ========================================================= */
1933
1934 function copiarConteudo(
1935 origem,
1936 destino
1937 ) {
1938
1939 limparElemento(destino);
1940
1941
1942 if (
1943 !origem ||
1944 !destino
1945 ) {
1946 return false;
1947 }
1948
1949
1950 var possuiConteudo =
1951 origem.textContent.trim() !== "" ||
1952 origem.children.length > 0;
1953
1954
1955 if (!possuiConteudo) {
1956 return false;
1957 }
1958
1959
1960 Array.prototype.slice
1961 .call(
1962 origem.childNodes
1963 )
1964 .forEach(
1965 function (node) {
1966
1967 destino.appendChild(
1968 node.cloneNode(true)
1969 );
1970
1971 }
1972 );
1973
1974
1975 return true;
1976
1977 }
1978
1979
1980 /* =========================================================
1981 CRIAR LINK
1982 ========================================================= */
1983
1984 function criarLink(
1985 texto,
1986 href,
1987 target
1988 ) {
1989
1990 var link =
1991 document.createElement("a");
1992
1993
1994 link.href = href;
1995
1996
1997 link.appendChild(
1998 document.createTextNode(
1999 texto
2000 )
2001 );
2002
2003
2004 if (target) {
2005
2006 link.target = target;
2007
2008 link.rel =
2009 "noopener noreferrer";
2010
2011 }
2012
2013
2014 return link;
2015
2016 }
2017
2018
2019 /* =========================================================
2020 URL WHATSAPP
2021 ========================================================= */
2022
2023 function criarUrlWhatsApp(
2024 numero
2025 ) {
2026
2027 var numeroLimpo =
2028 (numero || "")
2029 .replace(/\D/g, "");
2030
2031
2032 if (!numeroLimpo) {
2033 return "";
2034 }
2035
2036
2037 if (
2038 numeroLimpo.indexOf("55") !== 0
2039 ) {
2040
2041 numeroLimpo =
2042 "55" + numeroLimpo;
2043
2044 }
2045
2046
2047 return (
2048 "https://wa.me/" +
2049 numeroLimpo
2050 );
2051
2052 }
2053
2054
2055 /* =========================================================
2056 URL INSTAGRAM
2057 ========================================================= */
2058
2059 function criarUrlInstagram(
2060 instagram
2061 ) {
2062
2063 var valor =
2064 (instagram || "")
2065 .trim();
2066
2067
2068 if (!valor) {
2069 return "";
2070 }
2071
2072
2073 if (
2074 valor.indexOf(
2075 "http://"
2076 ) === 0 ||
2077 valor.indexOf(
2078 "https://"
2079 ) === 0
2080 ) {
2081
2082 return valor;
2083
2084 }
2085
2086
2087 valor = valor
2088 .replace(/^@/, "")
2089 .replace(/^www\./, "")
2090 .replace(
2091 /^instagram\.com\//,
2092 ""
2093 );
2094
2095
2096 return (
2097 "https://instagram.com/" +
2098 valor
2099 );
2100
2101 }
2102
2103
2104 /* =========================================================
2105 URL SITE
2106 ========================================================= */
2107
2108 function criarUrlSite(site) {
2109
2110 var valor =
2111 (site || "").trim();
2112
2113
2114 if (!valor) {
2115 return "";
2116 }
2117
2118
2119 if (
2120 valor.indexOf(
2121 "http://"
2122 ) === 0 ||
2123 valor.indexOf(
2124 "https://"
2125 ) === 0
2126 ) {
2127
2128 return valor;
2129
2130 }
2131
2132
2133 return (
2134 "https://" + valor
2135 );
2136
2137 }
2138
2139
2140 /* =========================================================
2141 ADICIONAR CONTATO
2142 ========================================================= */
2143
2144 function adicionarContato(
2145 titulo,
2146 texto,
2147 href,
2148 novaAba
2149 ) {
2150
2151 if (!texto) {
2152 return false;
2153 }
2154
2155
2156 var p =
2157 document.createElement("p");
2158
2159
2160 p.appendChild(
2161 document.createTextNode(
2162 titulo + ": "
2163 )
2164 );
2165
2166
2167 if (href) {
2168
2169 p.appendChild(
2170 criarLink(
2171 texto,
2172 href,
2173 novaAba ?
2174 "_blank" :
2175 ""
2176 )
2177 );
2178
2179 } else {
2180
2181 p.appendChild(
2182 document.createTextNode(
2183 texto
2184 )
2185 );
2186
2187 }
2188
2189
2190 modalContato.appendChild(p);
2191
2192
2193 return true;
2194
2195 }
2196
2197
2198 /* =========================================================
2199 SEGMENTOS DO MODAL
2200 ========================================================= */
2201
2202 function montarSegmentosModal(
2203 valor
2204 ) {
2205
2206 limparElemento(
2207 modalSegmentos
2208 );
2209
2210
2211 var segmentos =
2212 obterSegmentos(valor);
2213
2214
2215 if (!segmentos.length) {
2216 return false;
2217 }
2218
2219
2220 segmentos.forEach(
2221 function (segmento) {
2222
2223 var span =
2224 document.createElement(
2225 "span"
2226 );
2227
2228
2229 span.className =
2230 "modal-segmento-tag";
2231
2232
2233 span.appendChild(
2234 document.createTextNode(
2235 obterLabelSegmento(
2236 segmento
2237 )
2238 )
2239 );
2240
2241
2242 modalSegmentos
2243 .appendChild(span);
2244
2245 }
2246 );
2247
2248
2249 return true;
2250
2251 }
2252
2253
2254 /* =========================================================
2255 ABRIR MODAL
2256 ========================================================= */
2257
2258 function abrirModal(botao) {
2259
2260 if (!modal) {
2261 return;
2262 }
2263
2264
2265 var parceiro =
2266 botao.closest(
2267 ".parceiro"
2268 );
2269
2270
2271 if (!parceiro) {
2272 return;
2273 }
2274
2275
2276 var dados =
2277 parceiro.querySelector(
2278 ".parceiro-dados"
2279 );
2280
2281
2282 if (!dados) {
2283 return;
2284 }
2285
2286
2287 /* ======================
2288 NOME
2289 ====================== */
2290
2291 var nome =
2292 dados.querySelector(
2293 ".js-nome"
2294 );
2295
2296
2297 tituloModal.textContent =
2298 nome ?
2299 nome.textContent.trim() :
2300 "";
2301
2302
2303 /* ======================
2304 DESCRIÇÃO
2305 ====================== */
2306
2307 var descricao =
2308 dados.querySelector(
2309 ".js-descricao"
2310 );
2311
2312
2313 blocoDescricao.hidden =
2314 !copiarConteudo(
2315 descricao,
2316 modalDescricao
2317 );
2318
2319
2320 /* ======================
2321 SEGMENTOS
2322 ====================== */
2323
2324 var segmentos =
2325 dados.querySelector(
2326 ".js-segmentos"
2327 );
2328
2329
2330 blocoSegmentos.hidden =
2331 !montarSegmentosModal(
2332 segmentos ?
2333 segmentos
2334 .textContent
2335 .trim() :
2336 ""
2337 );
2338
2339
2340 /* ======================
2341 TERMINAIS
2342 ====================== */
2343
2344 var terminais =
2345 dados.querySelector(
2346 ".js-terminais"
2347 );
2348
2349
2350 blocoTerminais.hidden =
2351 !copiarConteudo(
2352 terminais,
2353 modalTerminais
2354 );
2355
2356
2357 /* ======================
2358 CONTATO
2359 ====================== */
2360
2361 limparElemento(
2362 modalContato
2363 );
2364
2365
2366 var emailElemento =
2367 dados.querySelector(
2368 ".js-email"
2369 );
2370
2371 var whatsappElemento =
2372 dados.querySelector(
2373 ".js-whatsapp"
2374 );
2375
2376 var instagramElemento =
2377 dados.querySelector(
2378 ".js-instagram"
2379 );
2380
2381
2382 var email =
2383 emailElemento ?
2384 emailElemento
2385 .textContent
2386 .trim() :
2387 "";
2388
2389
2390 var whatsapp =
2391 whatsappElemento ?
2392 whatsappElemento
2393 .textContent
2394 .trim() :
2395 "";
2396
2397
2398 var instagram =
2399 instagramElemento ?
2400 instagramElemento
2401 .textContent
2402 .trim() :
2403 "";
2404
2405
2406 var possuiContato = false;
2407
2408
2409 if (email) {
2410
2411 possuiContato =
2412 adicionarContato(
2413 "E-mail",
2414 email,
2415 "mailto:" + email,
2416 false
2417 ) ||
2418 possuiContato;
2419
2420 }
2421
2422
2423 if (whatsapp) {
2424
2425 possuiContato =
2426 adicionarContato(
2427 "WhatsApp",
2428 whatsapp,
2429 criarUrlWhatsApp(
2430 whatsapp
2431 ),
2432 true
2433 ) ||
2434 possuiContato;
2435
2436 }
2437
2438
2439 if (instagram) {
2440
2441 var instagramLabel =
2442 instagram;
2443
2444
2445 if (
2446 instagramLabel.indexOf(
2447 "http"
2448 ) !== 0 &&
2449 instagramLabel.charAt(0)
2450 !== "@"
2451 ) {
2452
2453 instagramLabel =
2454 "@" +
2455 instagramLabel;
2456
2457 }
2458
2459
2460 possuiContato =
2461 adicionarContato(
2462 "Instagram",
2463 instagramLabel,
2464 criarUrlInstagram(
2465 instagram
2466 ),
2467 true
2468 ) ||
2469 possuiContato;
2470
2471 }
2472
2473
2474 blocoContato.hidden =
2475 !possuiContato;
2476
2477
2478 /* ======================
2479 SITE
2480 ====================== */
2481
2482 limparElemento(
2483 modalSite
2484 );
2485
2486
2487 var siteElemento =
2488 dados.querySelector(
2489 ".js-site"
2490 );
2491
2492
2493 var site =
2494 siteElemento ?
2495 siteElemento
2496 .textContent
2497 .trim() :
2498 "";
2499
2500
2501 if (site) {
2502
2503 modalSite.appendChild(
2504 criarLink(
2505 site,
2506 criarUrlSite(site),
2507 "_blank"
2508 )
2509 );
2510
2511
2512 blocoSite.hidden = false;
2513
2514 } else {
2515
2516 blocoSite.hidden = true;
2517
2518 }
2519
2520
2521 /* ======================
2522 ABRIR
2523 ====================== */
2524
2525 elementoFocoAnterior =
2526 document.activeElement;
2527
2528
2529 overflowAnterior =
2530 document.body.style
2531 .overflow;
2532
2533
2534 modal.hidden = false;
2535
2536
2537 document.body.style
2538 .overflow = "hidden";
2539
2540
2541 var fechar =
2542 modal.querySelector(
2543 ".close-modal"
2544 );
2545
2546
2547 if (fechar) {
2548 fechar.focus();
2549 }
2550
2551 }
2552
2553
2554 /* =========================================================
2555 FECHAR MODAL
2556 ========================================================= */
2557
2558 function fecharModal() {
2559
2560 if (
2561 !modal ||
2562 modal.hidden
2563 ) {
2564 return;
2565 }
2566
2567
2568 modal.hidden = true;
2569
2570
2571 document.body.style
2572 .overflow =
2573 overflowAnterior;
2574
2575
2576 if (
2577 elementoFocoAnterior &&
2578 typeof elementoFocoAnterior
2579 .focus === "function"
2580 ) {
2581
2582 elementoFocoAnterior
2583 .focus();
2584
2585 }
2586
2587 }
2588
2589
2590 /* =========================================================
2591 CLIQUES
2592 ========================================================= */
2593
2594 componente.addEventListener(
2595 "click",
2596 function (event) {
2597
2598 var botaoModal =
2599 event.target.closest(
2600 ".btn-modal"
2601 );
2602
2603
2604 if (botaoModal) {
2605
2606 event.preventDefault();
2607
2608 abrirModal(
2609 botaoModal
2610 );
2611
2612 return;
2613
2614 }
2615
2616
2617 var fechar =
2618 event.target.closest(
2619 ".close-modal"
2620 );
2621
2622
2623 if (fechar) {
2624
2625 event.preventDefault();
2626
2627 fecharModal();
2628
2629 return;
2630
2631 }
2632
2633
2634 /*
2635 * Fecha clicando no fundo
2636 */
2637 if (
2638 modal &&
2639 event.target === modal
2640 ) {
2641
2642 fecharModal();
2643
2644 }
2645
2646 }
2647 );
2648
2649
2650 /* =========================================================
2651 ESC
2652 ========================================================= */
2653
2654 document.addEventListener(
2655 "keydown",
2656 function (event) {
2657
2658 if (
2659 event.key === "Escape" &&
2660 modal &&
2661 !modal.hidden
2662 ) {
2663
2664 fecharModal();
2665
2666 }
2667
2668 }
2669 );
2670
2671
2672 /* =========================================================
2673 INICIALIZAÇÃO
2674 ========================================================= */
2675
2676 formatarSegmentosCards();
2677
2678 gerarFiltros();
2679
2680 filtrarParceiros();
2681
2682})();
2683</script>
Conta Especial
Uma conta corrente com crédito garantido e excelentes taxas, ideal para atender suas necessidades do dia a dia ou cobrir despesas emergenciais.
Conta Salário
Uma conta aberta por iniciativa do empregador para efetuar o
pagamento mensal aos seus colaboradores.
Conta Capital
Ao abrir sua conta, você deposita uma quantia em sua Conta Capital que fica rendendo e participa dos resultados financeiros ao final do ano!
Portabilidade
Faça a portabilidade e solicite a transferência automática do seu salário ou do recebimento da sua aposentadoria sem burocracia.
The following has evaluated to null or missing:
==> Fieldset67243883 [in template "20102#20128#189538129" at line 811, column 8]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #list Fieldset67243883.getSiblings() ... [in template "20102#20128#189538129" at line 811, column 1]
----
1<style type="text/css">
2/* =========================================================
3 PARCEIROS SIPAG - LAYOUT PRINCIPAL
4========================================================= */
5
6.sipag-parceiros {
7 background-color: #fff;
8 color: #003641;
9 padding: 34px 0 56px;
10}
11
12.sipag-parceiros > .container {
13 max-width: 1440px;
14 padding-left: 24px;
15 padding-right: 24px;
16 width: 100%;
17}
18
19/* =========================================================
20 FILTROS
21========================================================= */
22
23.sipag-parceiros .parceiros-filtros-area {
24 margin-bottom: 34px;
25}
26
27.sipag-parceiros .parceiros-intro {
28 color: #003641;
29 font-size: 17px;
30 line-height: 1.4;
31 margin: 0 0 26px;
32 text-align: center;
33}
34
35.sipag-parceiros .filtros {
36 align-items: center;
37 display: flex;
38 flex-wrap: wrap;
39 gap: 12px;
40 justify-content: center;
41 margin: 0 auto;
42 width: 100%;
43}
44
45.sipag-parceiros .btn-pill {
46 align-items: center;
47 background-color: #fff;
48 border: 1px solid #d9dcdf;
49 border-radius: 10px;
50 box-shadow: none;
51 color: #272833;
52 cursor: pointer;
53 display: inline-flex;
54 flex: 0 0 auto;
55 font-size: 18px;
56 font-weight: 700;
57 justify-content: center;
58 line-height: 1.2;
59 min-height: 64px;
60 min-width: 250px;
61 padding: 14px 22px;
62 text-align: center;
63 text-transform: uppercase;
64 transition:
65 background-color .2s ease,
66 border-color .2s ease,
67 color .2s ease;
68 white-space: nowrap;
69}
70
71.sipag-parceiros .btn-pill:hover {
72 background-color: #f5fffd;
73 border-color: #00ae9d;
74 color: #003641;
75}
76
77.sipag-parceiros .btn-pill.active {
78 background-color: #003641;
79 border-color: #003641;
80 color: #fff;
81}
82
83.sipag-parceiros .btn-pill:focus {
84 box-shadow: 0 0 0 3px rgba(0, 174, 157, .16);
85 outline: none;
86}
87
88/* =========================================================
89 BUSCA
90========================================================= */
91
92.sipag-parceiros .parceiros-busca {
93 margin: 0 auto 56px;
94 max-width: none;
95 position: relative;
96 width: 100%;
97}
98
99.sipag-parceiros .parceiros-busca-icone {
100 color: #00ae9d;
101 height: 28px;
102 left: 21px;
103 pointer-events: none;
104 position: absolute;
105 top: 50%;
106 transform: translateY(-50%);
107 width: 28px;
108}
109
110.sipag-parceiros .parceiros-busca-campo {
111 background-color: #fff;
112 border: 2px solid #00ae9d;
113 border-radius: 7px;
114 color: #003641;
115 font-size: 16px;
116 height: 68px;
117 outline: none;
118 padding: 0 24px 0 62px;
119 transition:
120 border-color .2s ease,
121 box-shadow .2s ease;
122 width: 100%;
123}
124
125.sipag-parceiros .parceiros-busca-campo::placeholder {
126 color: #b1bbc8;
127 opacity: 1;
128}
129
130.sipag-parceiros .parceiros-busca-campo:focus {
131 border-color: #00ae9d;
132 box-shadow: 0 0 0 3px rgba(0, 174, 157, .12);
133}
134
135/* =========================================================
136 GRID
137========================================================= */
138
139.sipag-parceiros #grid-parceiros {
140 align-items: stretch;
141}
142
143.sipag-parceiros .parceiro {
144 display: flex;
145}
146
147/* =========================================================
148 CARD
149========================================================= */
150
151.sipag-parceiros .card-parceiro {
152 background-color: #fff;
153 border: 1px solid #dedede;
154 border-radius: 14px;
155 box-shadow: none;
156 display: flex;
157 flex-direction: column;
158 min-height: 510px;
159 padding: 18px;
160 transition:
161 border-color .2s ease,
162 box-shadow .2s ease;
163 width: 100%;
164}
165
166.sipag-parceiros .card-parceiro:hover {
167 border-color: #d1d8d7;
168 box-shadow: 0 8px 22px rgba(0, 54, 65, .08);
169 transform: none;
170}
171
172/* =========================================================
173 LOGO
174========================================================= */
175
176.sipag-parceiros .parceiro-logo {
177 align-items: center;
178 display: flex;
179 height: 255px;
180 justify-content: center;
181 margin-bottom: 0;
182 overflow: hidden;
183 width: 100%;
184}
185
186.sipag-parceiros .parceiro-logo img {
187 display: block;
188 max-height: 169px;
189 max-width: 230px;
190 object-fit: contain;
191 width: auto;
192}
193
194/* =========================================================
195 TEXTO DO CARD
196========================================================= */
197
198.sipag-parceiros .card-parceiro h6 {
199 color: #00ae9d;
200 font-size: 23px;
201 font-weight: 700;
202 line-height: 1.25;
203 margin: 0 0 10px;
204}
205
206.sipag-parceiros .parceiro-segmento {
207 color: #5b5b5b;
208 font-size: 15px;
209 line-height: 1.55;
210 margin: 0 0 24px;
211}
212
213/* =========================================================
214 AÇÕES DO CARD
215========================================================= */
216
217.sipag-parceiros .parceiro-acoes {
218 display: flex;
219 flex-direction: column;
220 gap: 10px;
221 margin-top: auto;
222 width: 100%;
223}
224
225.sipag-parceiros .btn-parceiro {
226 align-items: center;
227 border-radius: 9px;
228 cursor: pointer;
229 display: inline-flex;
230 flex: none;
231 font-size: 18px;
232 font-weight: 700;
233 justify-content: center;
234 min-height: 62px;
235 padding: 10px 14px;
236 text-align: center;
237 text-decoration: none !important;
238 transition:
239 background-color .2s ease,
240 border-color .2s ease,
241 color .2s ease;
242 width: 100%;
243}
244
245.sipag-parceiros .btn-site {
246 background-color: #fff;
247 border: 1px solid #00ae9d;
248 color: #00ae9d;
249}
250
251.sipag-parceiros .btn-site:hover {
252 background-color: #f3fffd;
253 border-color: #00ae9d;
254 color: #008f83;
255}
256
257.sipag-parceiros .btn-saiba {
258 background-color: #00ae9d;
259 border: 1px solid #00ae9d;
260 color: #fff;
261}
262
263.sipag-parceiros .btn-saiba:hover {
264 background-color: #008f83;
265 border-color: #008f83;
266 color: #fff;
267}
268
269/* =========================================================
270 NENHUM RESULTADO
271========================================================= */
272
273.sipag-parceiros .parceiros-vazio {
274 color: #536463;
275 font-size: 18px;
276 margin: 40px 0;
277 text-align: center;
278}
279
280@media (max-width: 1199.98px) {
281 .sipag-parceiros > .container {
282 max-width: 1140px;
283 }
284
285 .sipag-parceiros .btn-pill {
286 font-size: 16px;
287 min-height: 58px;
288 min-width: 210px;
289 }
290
291 .sipag-parceiros .card-parceiro {
292 min-height: 545px;
293 }
294
295 .sipag-parceiros .parceiro-logo {
296 height: 235px;
297 }
298
299 .sipag-parceiros .parceiro-logo img {
300 max-height: 140px;
301 max-width: 210px;
302 }
303}
304
305/* =========================================================
306 MODAL - FUNDO
307========================================================= */
308
309.modal-parceiro-sipag {
310 align-items: center;
311 background-color: rgba(0, 0, 0, .55);
312 bottom: 0;
313 display: flex;
314 justify-content: center;
315 left: 0;
316 overflow-y: auto;
317 padding: 14px;
318 position: fixed;
319 right: 0;
320 top: 0;
321 z-index: 11000;
322}
323
324.modal-parceiro-sipag[hidden] {
325 display: none !important;
326}
327
328/* =========================================================
329 MODAL - CONTAINER
330========================================================= */
331
332.modal-parceiro-sipag .modal-parceiro-dialog {
333 background-color: #fff;
334 border-radius: 18px;
335 box-shadow: 0 16px 45px rgba(0, 54, 65, .25);
336 margin: auto;
337 max-width: 1265px;
338 overflow: hidden;
339 width: 100%;
340}
341
342/* =========================================================
343 MODAL - CABEÇALHO
344========================================================= */
345
346.modal-parceiro-sipag .modal-parceiro-header {
347 align-items: center;
348 border-bottom: 1px solid #dfe5e4;
349 display: flex;
350 justify-content: space-between;
351 min-height: 68px;
352 padding: 12px 38px;
353}
354
355.modal-parceiro-sipag .modal-parceiro-header h4 {
356 color: #00ae9d;
357 font-size: 34px;
358 font-weight: 700;
359 line-height: 1.2;
360 margin: 0;
361}
362
363/* =========================================================
364 MODAL - FECHAR
365========================================================= */
366
367.modal-parceiro-sipag .close-modal {
368 align-items: center;
369 background-color: #fff;
370 border: 2px solid #005461;
371 border-radius: 50%;
372 color: #005461;
373 cursor: pointer;
374 display: flex;
375 flex: 0 0 38px;
376 font-size: 28px;
377 font-weight: 400;
378 height: 38px;
379 justify-content: center;
380 line-height: 1;
381 padding: 0 0 3px;
382 transition:
383 background-color .2s ease,
384 color .2s ease;
385 width: 38px;
386}
387
388.modal-parceiro-sipag .close-modal:hover {
389 background-color: #005461;
390 color: #fff;
391}
392
393.modal-parceiro-sipag .close-modal:focus {
394 box-shadow: 0 0 0 3px rgba(0, 174, 157, .2);
395 outline: none;
396}
397
398/* =========================================================
399 MODAL - CORPO
400========================================================= */
401
402.modal-parceiro-sipag .modal-parceiro-body {
403 max-height: calc(100vh - 100px);
404 overflow-y: auto;
405 padding: 24px 28px 34px;
406}
407
408/* =========================================================
409 MODAL - BLOCOS
410========================================================= */
411
412.modal-parceiro-sipag .modal-bloco {
413 border: 1px solid #00ae9d;
414 border-radius: 9px;
415 box-sizing: border-box;
416 margin: 0;
417 padding: 22px 24px;
418}
419
420.modal-parceiro-sipag .modal-bloco h6 {
421 color: #00ae9d;
422 font-size: 20px;
423 font-weight: 700;
424 line-height: 1.3;
425 margin: 0 0 20px;
426}
427
428/* =========================================================
429 DESCRIÇÃO
430========================================================= */
431
432.modal-parceiro-sipag #modalBlocoDescricao {
433 margin-bottom: 16px;
434 min-height: 145px;
435}
436
437.modal-parceiro-sipag #modalDescricao,
438.modal-parceiro-sipag #modalDescricao p {
439 color: #004653;
440 font-size: 21px;
441 line-height: 1.7;
442}
443
444.modal-parceiro-sipag #modalDescricao p {
445 margin: 0 0 8px;
446}
447
448.modal-parceiro-sipag #modalDescricao p:last-child {
449 margin-bottom: 0;
450}
451
452/* =========================================================
453 GRID DO MODAL
454========================================================= */
455
456.modal-parceiro-sipag .modal-detalhes-grid {
457 display: grid;
458 gap: 16px 20px;
459 grid-template-columns: repeat(2, minmax(0, 1fr));
460}
461
462.modal-parceiro-sipag #modalBlocoSegmentos,
463.modal-parceiro-sipag #modalBlocoTerminais {
464 min-height: 280px;
465}
466
467.modal-parceiro-sipag #modalBlocoContato,
468.modal-parceiro-sipag #modalBlocoSite {
469 min-height: 170px;
470}
471
472/* =========================================================
473 SEGMENTOS DO MODAL
474========================================================= */
475
476.modal-parceiro-sipag .modal-segmentos {
477 align-items: flex-start;
478 display: flex;
479 flex-wrap: wrap;
480 gap: 12px;
481}
482
483.modal-parceiro-sipag .modal-segmento-tag {
484 background-color: #fafafa;
485 border: 1px solid #cfcfcf;
486 border-radius: 6px;
487 color: #5d6262;
488 display: inline-flex;
489 font-size: 15px;
490 font-weight: 400;
491 line-height: 1.2;
492 padding: 10px 12px;
493 text-transform: uppercase;
494}
495
496/* =========================================================
497 TERMINAIS
498========================================================= */
499
500.modal-parceiro-sipag #modalTerminais,
501.modal-parceiro-sipag #modalTerminais p {
502 color: #004653;
503 font-size: 21px;
504 line-height: 1.8;
505}
506
507.modal-parceiro-sipag #modalTerminais p {
508 margin: 0 0 6px;
509}
510
511.modal-parceiro-sipag #modalTerminais p:last-child {
512 margin-bottom: 0;
513}
514
515/* =========================================================
516 CONTATO
517========================================================= */
518
519.modal-parceiro-sipag #modalContato {
520 color: #004653;
521 font-size: 21px;
522 line-height: 1.8;
523}
524
525.modal-parceiro-sipag #modalContato p {
526 color: #004653;
527 font-size: 21px;
528 line-height: 1.8;
529 margin: 0;
530}
531
532.modal-parceiro-sipag #modalContato strong {
533 color: #004653;
534 font-weight: 400;
535}
536
537.modal-parceiro-sipag #modalContato a {
538 color: #00a99d;
539 text-decoration: none;
540}
541
542.modal-parceiro-sipag #modalContato a:hover {
543 text-decoration: underline;
544}
545
546/* =========================================================
547 WEBSITE
548========================================================= */
549
550.modal-parceiro-sipag #modalSite {
551 font-size: 21px;
552 line-height: 1.7;
553}
554
555.modal-parceiro-sipag #modalSite a {
556 color: #00a99d;
557 overflow-wrap: anywhere;
558 text-decoration: none;
559}
560
561.modal-parceiro-sipag #modalSite a:hover {
562 text-decoration: underline;
563}
564
565/* =========================================================
566 RICH TEXT
567========================================================= */
568
569.modal-parceiro-sipag .modal-bloco ul,
570.modal-parceiro-sipag .modal-bloco ol {
571 color: #004653;
572 margin-bottom: 0;
573 padding-left: 20px;
574}
575
576.modal-parceiro-sipag .modal-bloco li {
577 color: #004653;
578 line-height: 1.7;
579 margin-bottom: 5px;
580}
581
582/* =========================================================
583 MOBILE
584========================================================= */
585
586@media (max-width: 767.98px) {
587 .sipag-parceiros {
588 padding: 28px 0 40px;
589 }
590
591 .sipag-parceiros > .container {
592 padding-left: 15px;
593 padding-right: 15px;
594 }
595
596 .sipag-parceiros .parceiros-filtros-area {
597 margin-bottom: 24px;
598 }
599
600 .sipag-parceiros .parceiros-intro {
601 font-size: 16px;
602 margin-bottom: 18px;
603 }
604
605 .sipag-parceiros .filtros {
606 flex-wrap: nowrap;
607 gap: 10px;
608 justify-content: flex-start;
609 margin-left: -15px;
610 margin-right: -15px;
611 overflow-x: auto;
612 padding: 3px 15px 12px;
613 width: auto;
614 -webkit-overflow-scrolling: touch;
615 }
616
617 .sipag-parceiros .filtros::-webkit-scrollbar {
618 height: 4px;
619 }
620
621 .sipag-parceiros .filtros::-webkit-scrollbar-thumb {
622 background-color: #b5c7c5;
623 border-radius: 10px;
624 }
625
626 .sipag-parceiros .btn-pill {
627 border-radius: 8px;
628 flex: 0 0 auto;
629 font-size: 14px;
630 min-height: 54px;
631 min-width: 205px;
632 padding: 12px 16px;
633 }
634
635 .sipag-parceiros .parceiros-busca {
636 margin-bottom: 34px;
637 }
638
639 .sipag-parceiros .parceiros-busca-campo {
640 font-size: 16px;
641 height: 56px;
642 padding-left: 52px;
643 }
644
645 .sipag-parceiros .parceiros-busca-icone {
646 height: 22px;
647 left: 18px;
648 width: 22px;
649 }
650
651 .sipag-parceiros .card-parceiro {
652 border-radius: 12px;
653 min-height: auto;
654 padding: 20px;
655 }
656
657 .sipag-parceiros .parceiro-logo {
658 height: 200px;
659 }
660
661 .sipag-parceiros .parceiro-logo img {
662 max-height: 130px;
663 max-width: 200px;
664 }
665
666 .sipag-parceiros .card-parceiro h6 {
667 font-size: 21px;
668 }
669
670 .sipag-parceiros .parceiro-segmento {
671 font-size: 14px;
672 }
673
674 .sipag-parceiros .parceiro-acoes {
675 flex-direction: column;
676 }
677
678 .sipag-parceiros .btn-parceiro {
679 font-size: 17px;
680 min-height: 54px;
681 width: 100%;
682 }
683
684 .modal-parceiro-sipag {
685 align-items: flex-end;
686 padding: 0;
687 }
688
689 .modal-parceiro-sipag .modal-parceiro-dialog {
690 border-radius: 16px 16px 0 0;
691 max-height: 95vh;
692 }
693
694 .modal-parceiro-sipag .modal-parceiro-header {
695 min-height: 65px;
696 padding: 14px 20px;
697 }
698
699 .modal-parceiro-sipag .modal-parceiro-header h4 {
700 font-size: 24px;
701 }
702
703 .modal-parceiro-sipag .close-modal {
704 flex: 0 0 36px;
705 height: 36px;
706 width: 36px;
707 }
708
709 .modal-parceiro-sipag .modal-parceiro-body {
710 max-height: calc(95vh - 65px);
711 padding: 18px 15px 25px;
712 }
713
714 .modal-parceiro-sipag .modal-detalhes-grid {
715 grid-template-columns: 1fr;
716 }
717
718 .modal-parceiro-sipag .modal-bloco {
719 min-height: auto !important;
720 padding: 20px;
721 }
722
723 .modal-parceiro-sipag #modalBlocoDescricao {
724 min-height: auto;
725 }
726
727 .modal-parceiro-sipag .modal-bloco h6 {
728 margin-bottom: 15px;
729 }
730}
731</style>
732
733<div class="col-12 px-0">
734 <section class="sipag-parceiros" id="sipag-parceiros">
735
736<div class="container">
737
738 <!-- =====================================================
739 FILTROS
740 ====================================================== -->
741
742 <div
743 class="parceiros-filtros-area"
744 id="parceiros-filtros-area"
745 >
746
747<p class="parceiros-intro">
748 Filtre abaixo os segmentos que deseja visualizar:
749</p>
750
751<div
752 aria-label="Filtrar parceiros por segmento"
753 class="filtros"
754 id="filtros-parceiros"
755 role="group"
756></div>
757
758 </div>
759
760 <!-- =====================================================
761 BUSCA
762 ====================================================== -->
763
764 <div class="parceiros-busca" role="search">
765
766<label
767 class="sr-only"
768 for="busca-parceiros"
769>
770 Pesquisar parceiros por nome ou categoria
771</label>
772
773<svg
774 aria-hidden="true"
775 class="parceiros-busca-icone"
776 fill="none"
777 viewBox="0 0 24 24"
778>
779 <circle
780 cx="11"
781 cy="11"
782 r="7"
783 stroke="currentColor"
784 stroke-width="2"
785 ></circle>
786
787 <path
788 d="M16 16L21 21"
789 stroke="currentColor"
790 stroke-linecap="round"
791 stroke-width="2"
792 ></path>
793</svg>
794
795<input
796 autocomplete="off"
797 class="parceiros-busca-campo"
798 id="busca-parceiros"
799 placeholder="Pesquise por nome do anexo ou categoria"
800 type="search"
801/>
802
803 </div>
804
805 <!-- =====================================================
806 GRID DE PARCEIROS
807 ====================================================== -->
808
809 <div class="row" id="grid-parceiros">
810
811<#list Fieldset67243883.getSiblings() as parceiro>
812
813 <#assign nome = parceiro.Text51037391.getData()!"" />
814 <#assign segmentos = parceiro.CheckboxMultiple15617005.getData()!"" />
815 <#assign site = parceiro.Text51612886.getData()!"" />
816
817 <#assign siteUrl = site />
818
819 <#if site?has_content
820 && !site?starts_with("http://")
821 && !site?starts_with("https://")>
822
823 <#assign siteUrl = "https://" + site />
824
825 </#if>
826
827
828 <div
829 class="col-sm-6 col-lg-4 col-xl-3 mb-4 parceiro"
830 data-category="${segmentos?html}"
831 data-name="${nome?html}"
832 >
833
834 <div class="card-parceiro">
835
836 <!-- LOGO -->
837 <div class="parceiro-logo">
838
839 <#if parceiro.Image82450298.getData()??
840 && parceiro.Image82450298.getData() != "">
841
842 <img
843 alt="${nome?html}"
844 class="img-fluid"
845 loading="lazy"
846 src="${parceiro.Image82450298.getData()}"
847 />
848
849 </#if>
850
851 </div>
852
853
854 <!-- NOME -->
855 <h6>
856 ${nome?html}
857 </h6>
858
859
860 <!-- SEGMENTOS -->
861 <p class="parceiro-segmento js-segmento-card"></p>
862
863
864 <!-- AÇÕES -->
865 <div class="parceiro-acoes">
866
867 <#if site?has_content>
868
869 <a
870 class="btn-parceiro btn-site"
871 href="${siteUrl?html}"
872 rel="noopener noreferrer"
873 target="_blank"
874 >
875 Acessar site
876 </a>
877
878 </#if>
879
880
881 <button
882 class="btn-parceiro btn-saiba btn-modal"
883 type="button"
884 >
885 Saiba mais
886 </button>
887
888 </div>
889
890
891 <!-- =================================================
892 DADOS UTILIZADOS PELO MODAL
893 ================================================== -->
894
895 <div
896 aria-hidden="true"
897 class="parceiro-dados d-none"
898 >
899
900 <span class="js-nome">
901 ${nome?html}
902 </span>
903
904
905 <span class="js-segmentos">
906 ${segmentos?html}
907 </span>
908
909
910 <div class="js-descricao">
911
912<#if (Fieldset67243883.RichText77766022.getData())??>
913${Fieldset67243883.RichText77766022.getData()}
914</#if>
915</div>
916
917 <div class="js-terminais">
918
919<#if (Fieldset67243883.RichText36172897.getData())??>
920${Fieldset67243883.RichText36172897.getData()}
921</#if>
922</div>
923
924 <span class="js-email">
925 <#if parceiro.Text26526715.getData()??>
926 ${parceiro.Text26526715.getData()?html}
927 </#if>
928 </span>
929
930
931 <span class="js-whatsapp">
932 <#if parceiro.Campo12763757.getData()??>
933 ${parceiro.Campo12763757.getData()?html}
934 </#if>
935 </span>
936
937
938 <span class="js-instagram">
939 <#if parceiro.Campo47414182.getData()??>
940 ${parceiro.Campo47414182.getData()?html}
941 </#if>
942 </span>
943
944
945 <span class="js-site">
946 ${site?html}
947 </span>
948
949 </div>
950
951 </div>
952
953 </div>
954
955</#list>
956
957 </div>
958
959 <!-- =====================================================
960 SEM RESULTADO
961 ====================================================== -->
962
963 <p
964 aria-live="polite"
965 class="parceiros-vazio"
966 hidden
967 id="parceiros-vazio"
968 role="status"
969 >
970 Nenhum parceiro encontrado.
971 </p>
972
973</div>
974
975<!-- =====================================================
976 MODAL
977====================================================== -->
978
979<div
980 aria-labelledby="modalParceiroTitulo"
981 aria-modal="true"
982 class="modal-parceiro-sipag"
983 hidden
984 id="modalParceiro"
985 role="dialog"
986>
987
988 <div class="modal-parceiro-dialog">
989
990<!-- CABEÇALHO -->
991<div class="modal-parceiro-header">
992
993 <h4 id="modalParceiroTitulo"></h4>
994
995 <button
996 aria-label="Fechar modal"
997 class="close-modal"
998 type="button"
999 >
1000 ×
1001 </button>
1002
1003</div>
1004
1005
1006<!-- CORPO -->
1007<div class="modal-parceiro-body">
1008
1009 <!-- DESCRIÇÃO -->
1010 <div
1011 class="modal-bloco"
1012 id="modalBlocoDescricao"
1013 >
1014
1015 <h6>Descrição</h6>
1016
1017 <div id="modalDescricao"></div>
1018
1019 </div>
1020
1021
1022 <!-- GRID 2x2 -->
1023 <div class="modal-detalhes-grid">
1024
1025 <!-- SEGMENTOS -->
1026 <div
1027 class="modal-bloco"
1028 id="modalBlocoSegmentos"
1029 >
1030
1031 <h6>Segmentos atendidos</h6>
1032
1033 <div
1034 class="modal-segmentos"
1035 id="modalSegmentos"
1036 ></div>
1037
1038 </div>
1039
1040
1041 <!-- TERMINAIS -->
1042 <div
1043 class="modal-bloco"
1044 id="modalBlocoTerminais"
1045 >
1046
1047 <h6>Terminais habilitados</h6>
1048
1049 <div id="modalTerminais"></div>
1050
1051 </div>
1052
1053
1054 <!-- CONTATO -->
1055 <div
1056 class="modal-bloco"
1057 id="modalBlocoContato"
1058 >
1059
1060 <h6>Informações e contato</h6>
1061
1062 <div id="modalContato"></div>
1063
1064 </div>
1065
1066
1067 <!-- WEBSITE -->
1068 <div
1069 class="modal-bloco"
1070 id="modalBlocoSite"
1071 >
1072
1073 <h6>Website</h6>
1074
1075 <div id="modalSite"></div>
1076
1077 </div>
1078
1079 </div>
1080
1081</div>
1082
1083 </div>
1084
1085</div>
1086
1087 </section>
1088</div>
1089
1090<script>
1091(function () {
1092
1093 var componente = document.getElementById("sipag-parceiros");
1094
1095 if (!componente) {
1096 return;
1097 }
1098
1099
1100 if (
1101 componente.getAttribute(
1102 "data-inicializado"
1103 ) === "true"
1104 ) {
1105 return;
1106 }
1107
1108
1109 componente.setAttribute(
1110 "data-inicializado",
1111 "true"
1112 );
1113
1114
1115 /* =========================================================
1116 ELEMENTOS
1117 ========================================================= */
1118
1119 var busca =
1120 componente.querySelector(
1121 "#busca-parceiros"
1122 );
1123
1124 var filtrosContainer =
1125 componente.querySelector(
1126 "#filtros-parceiros"
1127 );
1128
1129 var filtrosArea =
1130 componente.querySelector(
1131 "#parceiros-filtros-area"
1132 );
1133
1134 var parceiros =
1135 componente.querySelectorAll(
1136 ".parceiro"
1137 );
1138
1139 var mensagemVazia =
1140 componente.querySelector(
1141 "#parceiros-vazio"
1142 );
1143
1144
1145 var filtroAtual = "all";
1146
1147
1148 /* =========================================================
1149 NORMALIZA TEXTO
1150 ========================================================= */
1151
1152 function normalizarTexto(texto) {
1153
1154 var valor =
1155 (texto || "")
1156 .toString()
1157 .toLowerCase();
1158
1159
1160 if (valor.normalize) {
1161
1162 valor = valor
1163 .normalize("NFD")
1164 .replace(
1165 /[\u0300-\u036f]/g,
1166 ""
1167 );
1168
1169 }
1170
1171
1172 return valor
1173 .replace(
1174 /[^a-z0-9]+/g,
1175 " "
1176 )
1177 .trim();
1178
1179 }
1180
1181
1182 /* =========================================================
1183 OBTÉM SEGMENTOS
1184
1185 Suporta:
1186 ["varejo","servicos"]
1187
1188 varejo,servicos
1189
1190 varejo;servicos
1191 ========================================================= */
1192
1193 function obterSegmentos(valor) {
1194
1195 if (!valor) {
1196 return [];
1197 }
1198
1199
1200 var texto =
1201 valor.toString().trim();
1202
1203
1204 if (!texto) {
1205 return [];
1206 }
1207
1208
1209 /*
1210 * Tenta JSON primeiro.
1211 */
1212 try {
1213
1214 var json =
1215 JSON.parse(texto);
1216
1217
1218 if (Array.isArray(json)) {
1219
1220 return json
1221 .map(function (item) {
1222
1223 return item
1224 .toString()
1225 .trim();
1226
1227 })
1228 .filter(Boolean);
1229
1230 }
1231
1232 } catch (erro) {
1233 /* segue normalmente */
1234 }
1235
1236
1237 texto = texto
1238 .replace(/^\[/, "")
1239 .replace(/\]$/, "")
1240 .replace(/"/g, "")
1241 .replace(/'/g, "");
1242
1243
1244 return texto
1245 .split(/[,;|]+/)
1246 .map(function (item) {
1247
1248 return item.trim();
1249
1250 })
1251 .filter(Boolean);
1252
1253 }
1254
1255
1256 /* =========================================================
1257 CHAVE CANÔNICA DO SEGMENTO
1258 ========================================================= */
1259
1260 function obterChaveSegmento(segmento) {
1261
1262 var chave =
1263 normalizarTexto(segmento);
1264
1265
1266 if (
1267 chave.indexOf("alimentacao") !== -1 ||
1268 chave.indexOf("bares restaurantes") !== -1
1269 ) {
1270 return "alimentacao";
1271 }
1272
1273 if (chave.indexOf("evento") !== -1) {
1274 return "eventos";
1275 }
1276
1277 if (chave.indexOf("industr") !== -1) {
1278 return "industria";
1279 }
1280
1281 if (
1282 chave.indexOf("posto") !== -1 &&
1283 chave.indexOf("combust") !== -1
1284 ) {
1285 return "postos";
1286 }
1287
1288 if (chave.indexOf("saude") !== -1) {
1289 return "saude";
1290 }
1291
1292 if (chave.indexOf("servico") !== -1) {
1293 return "servicos";
1294 }
1295
1296 if (chave.indexOf("varejo") !== -1) {
1297 return "varejo";
1298 }
1299
1300
1301 return chave;
1302
1303 }
1304
1305
1306 /* =========================================================
1307 LABEL DO FILTRO
1308 ========================================================= */
1309
1310 function obterLabelFiltroSegmento(chave, segmentoOriginal) {
1311
1312 var labels = {
1313 "alimentacao": "ALIMENTAÇÃO",
1314 "eventos": "EVENTOS",
1315 "industria": "INDÚSTRIA",
1316 "postos": "POSTOS DE COMBUSTÍVEIS",
1317 "saude": "SAÚDE",
1318 "servicos": "SERVIÇOS",
1319 "varejo": "VAREJO"
1320 };
1321
1322
1323 if (labels[chave]) {
1324 return labels[chave];
1325 }
1326
1327
1328 return (segmentoOriginal || "")
1329 .toString()
1330 .trim()
1331 .toUpperCase();
1332
1333 }
1334
1335
1336 /* =========================================================
1337 NOME VISUAL DO SEGMENTO NO CARD / MODAL
1338 ========================================================= */
1339
1340 function obterLabelSegmento(segmento) {
1341
1342 var chave =
1343 normalizarTexto(segmento);
1344
1345
1346 var labels = {
1347 "alimentacao": "Alimentação (Bares, Restaurantes e Lanchonetes)",
1348 "alimentacao bares restaurantes e lanchonetes":
1349 "Alimentação (Bares, Restaurantes e Lanchonetes)",
1350 "bares restaurantes e lanchonetes":
1351 "Alimentação (Bares, Restaurantes e Lanchonetes)",
1352 "eventos": "Eventos",
1353 "industria": "Indústria",
1354 "posto": "Postos de Combustíveis",
1355 "postos": "Postos de Combustíveis",
1356 "posto de combustivel": "Postos de Combustíveis",
1357 "postos de combustivel": "Postos de Combustíveis",
1358 "postos de combustiveis": "Postos de Combustíveis",
1359 "saude": "Saúde",
1360 "servicos": "Serviços",
1361 "varejo": "Varejo"
1362 };
1363
1364
1365 if (labels[chave]) {
1366 return labels[chave];
1367 }
1368
1369
1370 return segmento
1371 .toString()
1372 .trim();
1373
1374 }
1375
1376
1377 /* =========================================================
1378 FORMATA OS SEGMENTOS NOS CARDS
1379 ========================================================= */
1380
1381 function formatarListaSegmentos(lista) {
1382
1383 if (!lista.length) {
1384 return "";
1385 }
1386
1387 if (lista.length === 1) {
1388 return lista[0];
1389 }
1390
1391 if (lista.length === 2) {
1392 return lista[0] + " e " + lista[1];
1393 }
1394
1395
1396 return (
1397 lista.slice(0, -1).join(", ") +
1398 " e " +
1399 lista[lista.length - 1]
1400 );
1401
1402 }
1403
1404
1405 function formatarSegmentosCards() {
1406
1407 parceiros.forEach(
1408 function (parceiro) {
1409
1410 var campo =
1411 parceiro.querySelector(
1412 ".js-segmento-card"
1413 );
1414
1415
1416 if (!campo) {
1417 return;
1418 }
1419
1420
1421 var segmentos =
1422 obterSegmentos(
1423 parceiro.getAttribute(
1424 "data-category"
1425 )
1426 );
1427
1428
1429 var labels =
1430 segmentos.map(function (segmento) {
1431
1432 return obterLabelSegmento(
1433 segmento
1434 );
1435
1436 });
1437
1438
1439 campo.textContent =
1440 formatarListaSegmentos(labels);
1441
1442 }
1443 );
1444
1445 }
1446
1447
1448 /* =========================================================
1449 CRIAR FILTROS AUTOMATICAMENTE
1450
1451 SOMENTE SEGMENTOS USADOS
1452 ========================================================= */
1453
1454 function gerarFiltros() {
1455
1456 if (!filtrosContainer) {
1457 return;
1458 }
1459
1460
1461 var segmentosUsados = {};
1462
1463
1464 parceiros.forEach(
1465 function (parceiro) {
1466
1467 var categorias =
1468 obterSegmentos(
1469 parceiro.getAttribute(
1470 "data-category"
1471 )
1472 );
1473
1474
1475 categorias.forEach(
1476 function (categoria) {
1477
1478 var chave =
1479 obterChaveSegmento(
1480 categoria
1481 );
1482
1483
1484 if (!chave) {
1485 return;
1486 }
1487
1488
1489 if (
1490 !segmentosUsados[chave]
1491 ) {
1492
1493 segmentosUsados[chave] = {
1494 chave: chave,
1495 valor: categoria,
1496 label:
1497 obterLabelFiltroSegmento(
1498 chave,
1499 categoria
1500 )
1501 };
1502
1503 }
1504
1505 }
1506 );
1507
1508 }
1509 );
1510
1511
1512 while (
1513 filtrosContainer.firstChild
1514 ) {
1515
1516 filtrosContainer.removeChild(
1517 filtrosContainer.firstChild
1518 );
1519
1520 }
1521
1522
1523 var segmentos =
1524 Object.keys(
1525 segmentosUsados
1526 )
1527 .map(function (chave) {
1528
1529 return segmentosUsados[
1530 chave
1531 ];
1532
1533 });
1534
1535
1536 if (!segmentos.length) {
1537
1538 if (filtrosArea) {
1539
1540 filtrosArea.style.display =
1541 "none";
1542
1543 }
1544
1545 return;
1546
1547 }
1548
1549
1550 if (filtrosArea) {
1551
1552 filtrosArea.style.display = "";
1553
1554 }
1555
1556
1557 /* TODOS */
1558 var botaoTodos =
1559 document.createElement(
1560 "button"
1561 );
1562
1563
1564 botaoTodos.type = "button";
1565
1566 botaoTodos.className =
1567 "btn btn-pill active";
1568
1569 botaoTodos.setAttribute(
1570 "data-filter",
1571 "all"
1572 );
1573
1574 botaoTodos.setAttribute(
1575 "aria-pressed",
1576 "true"
1577 );
1578
1579
1580 botaoTodos.appendChild(
1581 document.createTextNode(
1582 "TODOS OS SEGMENTOS"
1583 )
1584 );
1585
1586
1587 filtrosContainer.appendChild(
1588 botaoTodos
1589 );
1590
1591
1592 /* ORDEM ALFABÉTICA */
1593 segmentos.sort(
1594 function (a, b) {
1595
1596 return a.label.localeCompare(
1597 b.label,
1598 "pt-BR"
1599 );
1600
1601 }
1602 );
1603
1604
1605 /* CRIA SOMENTE OS USADOS */
1606 segmentos.forEach(
1607 function (segmento) {
1608
1609 var botao =
1610 document.createElement(
1611 "button"
1612 );
1613
1614
1615 botao.type = "button";
1616
1617 botao.className =
1618 "btn btn-pill";
1619
1620 botao.setAttribute(
1621 "data-filter",
1622 segmento.chave
1623 );
1624
1625 botao.setAttribute(
1626 "aria-pressed",
1627 "false"
1628 );
1629
1630
1631 botao.appendChild(
1632 document.createTextNode(
1633 segmento.label
1634 )
1635 );
1636
1637
1638 filtrosContainer.appendChild(
1639 botao
1640 );
1641
1642 }
1643 );
1644
1645 }
1646
1647
1648 /* =========================================================
1649 FILTRAR PARCEIROS
1650 ========================================================= */
1651
1652 function filtrarParceiros() {
1653
1654 var termo =
1655 normalizarTexto(
1656 busca ?
1657 busca.value :
1658 ""
1659 );
1660
1661
1662 var quantidadeVisivel = 0;
1663
1664
1665 parceiros.forEach(
1666 function (parceiro) {
1667
1668 var nome =
1669 normalizarTexto(
1670 parceiro.getAttribute(
1671 "data-name"
1672 )
1673 );
1674
1675
1676 var segmentos =
1677 obterSegmentos(
1678 parceiro.getAttribute(
1679 "data-category"
1680 )
1681 );
1682
1683
1684 var categoriasNormalizadas =
1685 segmentos.map(
1686 function (item) {
1687
1688 return obterChaveSegmento(
1689 item
1690 );
1691
1692 }
1693 );
1694
1695
1696 var textoCategorias =
1697 segmentos
1698 .map(function (item) {
1699
1700 return normalizarTexto(
1701 item + " " +
1702 obterLabelSegmento(item)
1703 );
1704
1705 })
1706 .join(" ");
1707
1708
1709 /* BUSCA */
1710 var atendeBusca =
1711 !termo ||
1712 nome.indexOf(termo) !== -1 ||
1713 textoCategorias.indexOf(
1714 termo
1715 ) !== -1;
1716
1717
1718 /* FILTRO */
1719 var atendeFiltro =
1720 filtroAtual === "all" ||
1721 categoriasNormalizadas
1722 .indexOf(
1723 filtroAtual
1724 ) !== -1;
1725
1726
1727 var exibir =
1728 atendeBusca &&
1729 atendeFiltro;
1730
1731
1732 parceiro.style.display =
1733 exibir ? "" : "none";
1734
1735
1736 if (exibir) {
1737 quantidadeVisivel++;
1738 }
1739
1740 }
1741 );
1742
1743
1744 if (mensagemVazia) {
1745
1746 mensagemVazia.hidden =
1747 quantidadeVisivel !== 0;
1748
1749 }
1750
1751 }
1752
1753
1754 /* =========================================================
1755 EVENTO FILTROS
1756 ========================================================= */
1757
1758 if (filtrosContainer) {
1759
1760 filtrosContainer.addEventListener(
1761 "click",
1762 function (event) {
1763
1764 var botao =
1765 event.target.closest(
1766 ".btn-pill[data-filter]"
1767 );
1768
1769
1770 if (!botao) {
1771 return;
1772 }
1773
1774
1775 filtroAtual =
1776 botao.getAttribute(
1777 "data-filter"
1778 ) || "all";
1779
1780
1781 var botoes =
1782 filtrosContainer
1783 .querySelectorAll(
1784 ".btn-pill"
1785 );
1786
1787
1788 botoes.forEach(
1789 function (item) {
1790
1791 item.classList.remove(
1792 "active"
1793 );
1794
1795 item.setAttribute(
1796 "aria-pressed",
1797 "false"
1798 );
1799
1800 }
1801 );
1802
1803
1804 botao.classList.add(
1805 "active"
1806 );
1807
1808 botao.setAttribute(
1809 "aria-pressed",
1810 "true"
1811 );
1812
1813
1814 filtrarParceiros();
1815
1816 }
1817 );
1818
1819 }
1820
1821
1822 /* =========================================================
1823 EVENTO BUSCA
1824 ========================================================= */
1825
1826 if (busca) {
1827
1828 busca.addEventListener(
1829 "input",
1830 filtrarParceiros
1831 );
1832
1833 }
1834
1835
1836 /* =========================================================
1837 ELEMENTOS MODAL
1838 ========================================================= */
1839
1840 var modal =
1841 componente.querySelector(
1842 "#modalParceiro"
1843 );
1844
1845 var tituloModal =
1846 componente.querySelector(
1847 "#modalParceiroTitulo"
1848 );
1849
1850 var modalDescricao =
1851 componente.querySelector(
1852 "#modalDescricao"
1853 );
1854
1855 var modalSegmentos =
1856 componente.querySelector(
1857 "#modalSegmentos"
1858 );
1859
1860 var modalTerminais =
1861 componente.querySelector(
1862 "#modalTerminais"
1863 );
1864
1865 var modalContato =
1866 componente.querySelector(
1867 "#modalContato"
1868 );
1869
1870 var modalSite =
1871 componente.querySelector(
1872 "#modalSite"
1873 );
1874
1875
1876 var blocoDescricao =
1877 componente.querySelector(
1878 "#modalBlocoDescricao"
1879 );
1880
1881 var blocoSegmentos =
1882 componente.querySelector(
1883 "#modalBlocoSegmentos"
1884 );
1885
1886 var blocoTerminais =
1887 componente.querySelector(
1888 "#modalBlocoTerminais"
1889 );
1890
1891 var blocoContato =
1892 componente.querySelector(
1893 "#modalBlocoContato"
1894 );
1895
1896 var blocoSite =
1897 componente.querySelector(
1898 "#modalBlocoSite"
1899 );
1900
1901
1902 var elementoFocoAnterior = null;
1903 var overflowAnterior = "";
1904
1905
1906 /* =========================================================
1907 LIMPAR ELEMENTO
1908 ========================================================= */
1909
1910 function limparElemento(elemento) {
1911
1912 if (!elemento) {
1913 return;
1914 }
1915
1916
1917 while (elemento.firstChild) {
1918
1919 elemento.removeChild(
1920 elemento.firstChild
1921 );
1922
1923 }
1924
1925 }
1926
1927
1928 /* =========================================================
1929 COPIA RICH TEXT
1930
1931 NÃO USA innerHTML
1932 ========================================================= */
1933
1934 function copiarConteudo(
1935 origem,
1936 destino
1937 ) {
1938
1939 limparElemento(destino);
1940
1941
1942 if (
1943 !origem ||
1944 !destino
1945 ) {
1946 return false;
1947 }
1948
1949
1950 var possuiConteudo =
1951 origem.textContent.trim() !== "" ||
1952 origem.children.length > 0;
1953
1954
1955 if (!possuiConteudo) {
1956 return false;
1957 }
1958
1959
1960 Array.prototype.slice
1961 .call(
1962 origem.childNodes
1963 )
1964 .forEach(
1965 function (node) {
1966
1967 destino.appendChild(
1968 node.cloneNode(true)
1969 );
1970
1971 }
1972 );
1973
1974
1975 return true;
1976
1977 }
1978
1979
1980 /* =========================================================
1981 CRIAR LINK
1982 ========================================================= */
1983
1984 function criarLink(
1985 texto,
1986 href,
1987 target
1988 ) {
1989
1990 var link =
1991 document.createElement("a");
1992
1993
1994 link.href = href;
1995
1996
1997 link.appendChild(
1998 document.createTextNode(
1999 texto
2000 )
2001 );
2002
2003
2004 if (target) {
2005
2006 link.target = target;
2007
2008 link.rel =
2009 "noopener noreferrer";
2010
2011 }
2012
2013
2014 return link;
2015
2016 }
2017
2018
2019 /* =========================================================
2020 URL WHATSAPP
2021 ========================================================= */
2022
2023 function criarUrlWhatsApp(
2024 numero
2025 ) {
2026
2027 var numeroLimpo =
2028 (numero || "")
2029 .replace(/\D/g, "");
2030
2031
2032 if (!numeroLimpo) {
2033 return "";
2034 }
2035
2036
2037 if (
2038 numeroLimpo.indexOf("55") !== 0
2039 ) {
2040
2041 numeroLimpo =
2042 "55" + numeroLimpo;
2043
2044 }
2045
2046
2047 return (
2048 "https://wa.me/" +
2049 numeroLimpo
2050 );
2051
2052 }
2053
2054
2055 /* =========================================================
2056 URL INSTAGRAM
2057 ========================================================= */
2058
2059 function criarUrlInstagram(
2060 instagram
2061 ) {
2062
2063 var valor =
2064 (instagram || "")
2065 .trim();
2066
2067
2068 if (!valor) {
2069 return "";
2070 }
2071
2072
2073 if (
2074 valor.indexOf(
2075 "http://"
2076 ) === 0 ||
2077 valor.indexOf(
2078 "https://"
2079 ) === 0
2080 ) {
2081
2082 return valor;
2083
2084 }
2085
2086
2087 valor = valor
2088 .replace(/^@/, "")
2089 .replace(/^www\./, "")
2090 .replace(
2091 /^instagram\.com\//,
2092 ""
2093 );
2094
2095
2096 return (
2097 "https://instagram.com/" +
2098 valor
2099 );
2100
2101 }
2102
2103
2104 /* =========================================================
2105 URL SITE
2106 ========================================================= */
2107
2108 function criarUrlSite(site) {
2109
2110 var valor =
2111 (site || "").trim();
2112
2113
2114 if (!valor) {
2115 return "";
2116 }
2117
2118
2119 if (
2120 valor.indexOf(
2121 "http://"
2122 ) === 0 ||
2123 valor.indexOf(
2124 "https://"
2125 ) === 0
2126 ) {
2127
2128 return valor;
2129
2130 }
2131
2132
2133 return (
2134 "https://" + valor
2135 );
2136
2137 }
2138
2139
2140 /* =========================================================
2141 ADICIONAR CONTATO
2142 ========================================================= */
2143
2144 function adicionarContato(
2145 titulo,
2146 texto,
2147 href,
2148 novaAba
2149 ) {
2150
2151 if (!texto) {
2152 return false;
2153 }
2154
2155
2156 var p =
2157 document.createElement("p");
2158
2159
2160 p.appendChild(
2161 document.createTextNode(
2162 titulo + ": "
2163 )
2164 );
2165
2166
2167 if (href) {
2168
2169 p.appendChild(
2170 criarLink(
2171 texto,
2172 href,
2173 novaAba ?
2174 "_blank" :
2175 ""
2176 )
2177 );
2178
2179 } else {
2180
2181 p.appendChild(
2182 document.createTextNode(
2183 texto
2184 )
2185 );
2186
2187 }
2188
2189
2190 modalContato.appendChild(p);
2191
2192
2193 return true;
2194
2195 }
2196
2197
2198 /* =========================================================
2199 SEGMENTOS DO MODAL
2200 ========================================================= */
2201
2202 function montarSegmentosModal(
2203 valor
2204 ) {
2205
2206 limparElemento(
2207 modalSegmentos
2208 );
2209
2210
2211 var segmentos =
2212 obterSegmentos(valor);
2213
2214
2215 if (!segmentos.length) {
2216 return false;
2217 }
2218
2219
2220 segmentos.forEach(
2221 function (segmento) {
2222
2223 var span =
2224 document.createElement(
2225 "span"
2226 );
2227
2228
2229 span.className =
2230 "modal-segmento-tag";
2231
2232
2233 span.appendChild(
2234 document.createTextNode(
2235 obterLabelSegmento(
2236 segmento
2237 )
2238 )
2239 );
2240
2241
2242 modalSegmentos
2243 .appendChild(span);
2244
2245 }
2246 );
2247
2248
2249 return true;
2250
2251 }
2252
2253
2254 /* =========================================================
2255 ABRIR MODAL
2256 ========================================================= */
2257
2258 function abrirModal(botao) {
2259
2260 if (!modal) {
2261 return;
2262 }
2263
2264
2265 var parceiro =
2266 botao.closest(
2267 ".parceiro"
2268 );
2269
2270
2271 if (!parceiro) {
2272 return;
2273 }
2274
2275
2276 var dados =
2277 parceiro.querySelector(
2278 ".parceiro-dados"
2279 );
2280
2281
2282 if (!dados) {
2283 return;
2284 }
2285
2286
2287 /* ======================
2288 NOME
2289 ====================== */
2290
2291 var nome =
2292 dados.querySelector(
2293 ".js-nome"
2294 );
2295
2296
2297 tituloModal.textContent =
2298 nome ?
2299 nome.textContent.trim() :
2300 "";
2301
2302
2303 /* ======================
2304 DESCRIÇÃO
2305 ====================== */
2306
2307 var descricao =
2308 dados.querySelector(
2309 ".js-descricao"
2310 );
2311
2312
2313 blocoDescricao.hidden =
2314 !copiarConteudo(
2315 descricao,
2316 modalDescricao
2317 );
2318
2319
2320 /* ======================
2321 SEGMENTOS
2322 ====================== */
2323
2324 var segmentos =
2325 dados.querySelector(
2326 ".js-segmentos"
2327 );
2328
2329
2330 blocoSegmentos.hidden =
2331 !montarSegmentosModal(
2332 segmentos ?
2333 segmentos
2334 .textContent
2335 .trim() :
2336 ""
2337 );
2338
2339
2340 /* ======================
2341 TERMINAIS
2342 ====================== */
2343
2344 var terminais =
2345 dados.querySelector(
2346 ".js-terminais"
2347 );
2348
2349
2350 blocoTerminais.hidden =
2351 !copiarConteudo(
2352 terminais,
2353 modalTerminais
2354 );
2355
2356
2357 /* ======================
2358 CONTATO
2359 ====================== */
2360
2361 limparElemento(
2362 modalContato
2363 );
2364
2365
2366 var emailElemento =
2367 dados.querySelector(
2368 ".js-email"
2369 );
2370
2371 var whatsappElemento =
2372 dados.querySelector(
2373 ".js-whatsapp"
2374 );
2375
2376 var instagramElemento =
2377 dados.querySelector(
2378 ".js-instagram"
2379 );
2380
2381
2382 var email =
2383 emailElemento ?
2384 emailElemento
2385 .textContent
2386 .trim() :
2387 "";
2388
2389
2390 var whatsapp =
2391 whatsappElemento ?
2392 whatsappElemento
2393 .textContent
2394 .trim() :
2395 "";
2396
2397
2398 var instagram =
2399 instagramElemento ?
2400 instagramElemento
2401 .textContent
2402 .trim() :
2403 "";
2404
2405
2406 var possuiContato = false;
2407
2408
2409 if (email) {
2410
2411 possuiContato =
2412 adicionarContato(
2413 "E-mail",
2414 email,
2415 "mailto:" + email,
2416 false
2417 ) ||
2418 possuiContato;
2419
2420 }
2421
2422
2423 if (whatsapp) {
2424
2425 possuiContato =
2426 adicionarContato(
2427 "WhatsApp",
2428 whatsapp,
2429 criarUrlWhatsApp(
2430 whatsapp
2431 ),
2432 true
2433 ) ||
2434 possuiContato;
2435
2436 }
2437
2438
2439 if (instagram) {
2440
2441 var instagramLabel =
2442 instagram;
2443
2444
2445 if (
2446 instagramLabel.indexOf(
2447 "http"
2448 ) !== 0 &&
2449 instagramLabel.charAt(0)
2450 !== "@"
2451 ) {
2452
2453 instagramLabel =
2454 "@" +
2455 instagramLabel;
2456
2457 }
2458
2459
2460 possuiContato =
2461 adicionarContato(
2462 "Instagram",
2463 instagramLabel,
2464 criarUrlInstagram(
2465 instagram
2466 ),
2467 true
2468 ) ||
2469 possuiContato;
2470
2471 }
2472
2473
2474 blocoContato.hidden =
2475 !possuiContato;
2476
2477
2478 /* ======================
2479 SITE
2480 ====================== */
2481
2482 limparElemento(
2483 modalSite
2484 );
2485
2486
2487 var siteElemento =
2488 dados.querySelector(
2489 ".js-site"
2490 );
2491
2492
2493 var site =
2494 siteElemento ?
2495 siteElemento
2496 .textContent
2497 .trim() :
2498 "";
2499
2500
2501 if (site) {
2502
2503 modalSite.appendChild(
2504 criarLink(
2505 site,
2506 criarUrlSite(site),
2507 "_blank"
2508 )
2509 );
2510
2511
2512 blocoSite.hidden = false;
2513
2514 } else {
2515
2516 blocoSite.hidden = true;
2517
2518 }
2519
2520
2521 /* ======================
2522 ABRIR
2523 ====================== */
2524
2525 elementoFocoAnterior =
2526 document.activeElement;
2527
2528
2529 overflowAnterior =
2530 document.body.style
2531 .overflow;
2532
2533
2534 modal.hidden = false;
2535
2536
2537 document.body.style
2538 .overflow = "hidden";
2539
2540
2541 var fechar =
2542 modal.querySelector(
2543 ".close-modal"
2544 );
2545
2546
2547 if (fechar) {
2548 fechar.focus();
2549 }
2550
2551 }
2552
2553
2554 /* =========================================================
2555 FECHAR MODAL
2556 ========================================================= */
2557
2558 function fecharModal() {
2559
2560 if (
2561 !modal ||
2562 modal.hidden
2563 ) {
2564 return;
2565 }
2566
2567
2568 modal.hidden = true;
2569
2570
2571 document.body.style
2572 .overflow =
2573 overflowAnterior;
2574
2575
2576 if (
2577 elementoFocoAnterior &&
2578 typeof elementoFocoAnterior
2579 .focus === "function"
2580 ) {
2581
2582 elementoFocoAnterior
2583 .focus();
2584
2585 }
2586
2587 }
2588
2589
2590 /* =========================================================
2591 CLIQUES
2592 ========================================================= */
2593
2594 componente.addEventListener(
2595 "click",
2596 function (event) {
2597
2598 var botaoModal =
2599 event.target.closest(
2600 ".btn-modal"
2601 );
2602
2603
2604 if (botaoModal) {
2605
2606 event.preventDefault();
2607
2608 abrirModal(
2609 botaoModal
2610 );
2611
2612 return;
2613
2614 }
2615
2616
2617 var fechar =
2618 event.target.closest(
2619 ".close-modal"
2620 );
2621
2622
2623 if (fechar) {
2624
2625 event.preventDefault();
2626
2627 fecharModal();
2628
2629 return;
2630
2631 }
2632
2633
2634 /*
2635 * Fecha clicando no fundo
2636 */
2637 if (
2638 modal &&
2639 event.target === modal
2640 ) {
2641
2642 fecharModal();
2643
2644 }
2645
2646 }
2647 );
2648
2649
2650 /* =========================================================
2651 ESC
2652 ========================================================= */
2653
2654 document.addEventListener(
2655 "keydown",
2656 function (event) {
2657
2658 if (
2659 event.key === "Escape" &&
2660 modal &&
2661 !modal.hidden
2662 ) {
2663
2664 fecharModal();
2665
2666 }
2667
2668 }
2669 );
2670
2671
2672 /* =========================================================
2673 INICIALIZAÇÃO
2674 ========================================================= */
2675
2676 formatarSegmentosCards();
2677
2678 gerarFiltros();
2679
2680 filtrarParceiros();
2681
2682})();
2683</script>
The following has evaluated to null or missing:
==> Fieldset67243883 [in template "20102#20128#189538129" at line 811, column 8]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #list Fieldset67243883.getSiblings() ... [in template "20102#20128#189538129" at line 811, column 1]
----
1<style type="text/css">
2/* =========================================================
3 PARCEIROS SIPAG - LAYOUT PRINCIPAL
4========================================================= */
5
6.sipag-parceiros {
7 background-color: #fff;
8 color: #003641;
9 padding: 34px 0 56px;
10}
11
12.sipag-parceiros > .container {
13 max-width: 1440px;
14 padding-left: 24px;
15 padding-right: 24px;
16 width: 100%;
17}
18
19/* =========================================================
20 FILTROS
21========================================================= */
22
23.sipag-parceiros .parceiros-filtros-area {
24 margin-bottom: 34px;
25}
26
27.sipag-parceiros .parceiros-intro {
28 color: #003641;
29 font-size: 17px;
30 line-height: 1.4;
31 margin: 0 0 26px;
32 text-align: center;
33}
34
35.sipag-parceiros .filtros {
36 align-items: center;
37 display: flex;
38 flex-wrap: wrap;
39 gap: 12px;
40 justify-content: center;
41 margin: 0 auto;
42 width: 100%;
43}
44
45.sipag-parceiros .btn-pill {
46 align-items: center;
47 background-color: #fff;
48 border: 1px solid #d9dcdf;
49 border-radius: 10px;
50 box-shadow: none;
51 color: #272833;
52 cursor: pointer;
53 display: inline-flex;
54 flex: 0 0 auto;
55 font-size: 18px;
56 font-weight: 700;
57 justify-content: center;
58 line-height: 1.2;
59 min-height: 64px;
60 min-width: 250px;
61 padding: 14px 22px;
62 text-align: center;
63 text-transform: uppercase;
64 transition:
65 background-color .2s ease,
66 border-color .2s ease,
67 color .2s ease;
68 white-space: nowrap;
69}
70
71.sipag-parceiros .btn-pill:hover {
72 background-color: #f5fffd;
73 border-color: #00ae9d;
74 color: #003641;
75}
76
77.sipag-parceiros .btn-pill.active {
78 background-color: #003641;
79 border-color: #003641;
80 color: #fff;
81}
82
83.sipag-parceiros .btn-pill:focus {
84 box-shadow: 0 0 0 3px rgba(0, 174, 157, .16);
85 outline: none;
86}
87
88/* =========================================================
89 BUSCA
90========================================================= */
91
92.sipag-parceiros .parceiros-busca {
93 margin: 0 auto 56px;
94 max-width: none;
95 position: relative;
96 width: 100%;
97}
98
99.sipag-parceiros .parceiros-busca-icone {
100 color: #00ae9d;
101 height: 28px;
102 left: 21px;
103 pointer-events: none;
104 position: absolute;
105 top: 50%;
106 transform: translateY(-50%);
107 width: 28px;
108}
109
110.sipag-parceiros .parceiros-busca-campo {
111 background-color: #fff;
112 border: 2px solid #00ae9d;
113 border-radius: 7px;
114 color: #003641;
115 font-size: 16px;
116 height: 68px;
117 outline: none;
118 padding: 0 24px 0 62px;
119 transition:
120 border-color .2s ease,
121 box-shadow .2s ease;
122 width: 100%;
123}
124
125.sipag-parceiros .parceiros-busca-campo::placeholder {
126 color: #b1bbc8;
127 opacity: 1;
128}
129
130.sipag-parceiros .parceiros-busca-campo:focus {
131 border-color: #00ae9d;
132 box-shadow: 0 0 0 3px rgba(0, 174, 157, .12);
133}
134
135/* =========================================================
136 GRID
137========================================================= */
138
139.sipag-parceiros #grid-parceiros {
140 align-items: stretch;
141}
142
143.sipag-parceiros .parceiro {
144 display: flex;
145}
146
147/* =========================================================
148 CARD
149========================================================= */
150
151.sipag-parceiros .card-parceiro {
152 background-color: #fff;
153 border: 1px solid #dedede;
154 border-radius: 14px;
155 box-shadow: none;
156 display: flex;
157 flex-direction: column;
158 min-height: 510px;
159 padding: 18px;
160 transition:
161 border-color .2s ease,
162 box-shadow .2s ease;
163 width: 100%;
164}
165
166.sipag-parceiros .card-parceiro:hover {
167 border-color: #d1d8d7;
168 box-shadow: 0 8px 22px rgba(0, 54, 65, .08);
169 transform: none;
170}
171
172/* =========================================================
173 LOGO
174========================================================= */
175
176.sipag-parceiros .parceiro-logo {
177 align-items: center;
178 display: flex;
179 height: 255px;
180 justify-content: center;
181 margin-bottom: 0;
182 overflow: hidden;
183 width: 100%;
184}
185
186.sipag-parceiros .parceiro-logo img {
187 display: block;
188 max-height: 169px;
189 max-width: 230px;
190 object-fit: contain;
191 width: auto;
192}
193
194/* =========================================================
195 TEXTO DO CARD
196========================================================= */
197
198.sipag-parceiros .card-parceiro h6 {
199 color: #00ae9d;
200 font-size: 23px;
201 font-weight: 700;
202 line-height: 1.25;
203 margin: 0 0 10px;
204}
205
206.sipag-parceiros .parceiro-segmento {
207 color: #5b5b5b;
208 font-size: 15px;
209 line-height: 1.55;
210 margin: 0 0 24px;
211}
212
213/* =========================================================
214 AÇÕES DO CARD
215========================================================= */
216
217.sipag-parceiros .parceiro-acoes {
218 display: flex;
219 flex-direction: column;
220 gap: 10px;
221 margin-top: auto;
222 width: 100%;
223}
224
225.sipag-parceiros .btn-parceiro {
226 align-items: center;
227 border-radius: 9px;
228 cursor: pointer;
229 display: inline-flex;
230 flex: none;
231 font-size: 18px;
232 font-weight: 700;
233 justify-content: center;
234 min-height: 62px;
235 padding: 10px 14px;
236 text-align: center;
237 text-decoration: none !important;
238 transition:
239 background-color .2s ease,
240 border-color .2s ease,
241 color .2s ease;
242 width: 100%;
243}
244
245.sipag-parceiros .btn-site {
246 background-color: #fff;
247 border: 1px solid #00ae9d;
248 color: #00ae9d;
249}
250
251.sipag-parceiros .btn-site:hover {
252 background-color: #f3fffd;
253 border-color: #00ae9d;
254 color: #008f83;
255}
256
257.sipag-parceiros .btn-saiba {
258 background-color: #00ae9d;
259 border: 1px solid #00ae9d;
260 color: #fff;
261}
262
263.sipag-parceiros .btn-saiba:hover {
264 background-color: #008f83;
265 border-color: #008f83;
266 color: #fff;
267}
268
269/* =========================================================
270 NENHUM RESULTADO
271========================================================= */
272
273.sipag-parceiros .parceiros-vazio {
274 color: #536463;
275 font-size: 18px;
276 margin: 40px 0;
277 text-align: center;
278}
279
280@media (max-width: 1199.98px) {
281 .sipag-parceiros > .container {
282 max-width: 1140px;
283 }
284
285 .sipag-parceiros .btn-pill {
286 font-size: 16px;
287 min-height: 58px;
288 min-width: 210px;
289 }
290
291 .sipag-parceiros .card-parceiro {
292 min-height: 545px;
293 }
294
295 .sipag-parceiros .parceiro-logo {
296 height: 235px;
297 }
298
299 .sipag-parceiros .parceiro-logo img {
300 max-height: 140px;
301 max-width: 210px;
302 }
303}
304
305/* =========================================================
306 MODAL - FUNDO
307========================================================= */
308
309.modal-parceiro-sipag {
310 align-items: center;
311 background-color: rgba(0, 0, 0, .55);
312 bottom: 0;
313 display: flex;
314 justify-content: center;
315 left: 0;
316 overflow-y: auto;
317 padding: 14px;
318 position: fixed;
319 right: 0;
320 top: 0;
321 z-index: 11000;
322}
323
324.modal-parceiro-sipag[hidden] {
325 display: none !important;
326}
327
328/* =========================================================
329 MODAL - CONTAINER
330========================================================= */
331
332.modal-parceiro-sipag .modal-parceiro-dialog {
333 background-color: #fff;
334 border-radius: 18px;
335 box-shadow: 0 16px 45px rgba(0, 54, 65, .25);
336 margin: auto;
337 max-width: 1265px;
338 overflow: hidden;
339 width: 100%;
340}
341
342/* =========================================================
343 MODAL - CABEÇALHO
344========================================================= */
345
346.modal-parceiro-sipag .modal-parceiro-header {
347 align-items: center;
348 border-bottom: 1px solid #dfe5e4;
349 display: flex;
350 justify-content: space-between;
351 min-height: 68px;
352 padding: 12px 38px;
353}
354
355.modal-parceiro-sipag .modal-parceiro-header h4 {
356 color: #00ae9d;
357 font-size: 34px;
358 font-weight: 700;
359 line-height: 1.2;
360 margin: 0;
361}
362
363/* =========================================================
364 MODAL - FECHAR
365========================================================= */
366
367.modal-parceiro-sipag .close-modal {
368 align-items: center;
369 background-color: #fff;
370 border: 2px solid #005461;
371 border-radius: 50%;
372 color: #005461;
373 cursor: pointer;
374 display: flex;
375 flex: 0 0 38px;
376 font-size: 28px;
377 font-weight: 400;
378 height: 38px;
379 justify-content: center;
380 line-height: 1;
381 padding: 0 0 3px;
382 transition:
383 background-color .2s ease,
384 color .2s ease;
385 width: 38px;
386}
387
388.modal-parceiro-sipag .close-modal:hover {
389 background-color: #005461;
390 color: #fff;
391}
392
393.modal-parceiro-sipag .close-modal:focus {
394 box-shadow: 0 0 0 3px rgba(0, 174, 157, .2);
395 outline: none;
396}
397
398/* =========================================================
399 MODAL - CORPO
400========================================================= */
401
402.modal-parceiro-sipag .modal-parceiro-body {
403 max-height: calc(100vh - 100px);
404 overflow-y: auto;
405 padding: 24px 28px 34px;
406}
407
408/* =========================================================
409 MODAL - BLOCOS
410========================================================= */
411
412.modal-parceiro-sipag .modal-bloco {
413 border: 1px solid #00ae9d;
414 border-radius: 9px;
415 box-sizing: border-box;
416 margin: 0;
417 padding: 22px 24px;
418}
419
420.modal-parceiro-sipag .modal-bloco h6 {
421 color: #00ae9d;
422 font-size: 20px;
423 font-weight: 700;
424 line-height: 1.3;
425 margin: 0 0 20px;
426}
427
428/* =========================================================
429 DESCRIÇÃO
430========================================================= */
431
432.modal-parceiro-sipag #modalBlocoDescricao {
433 margin-bottom: 16px;
434 min-height: 145px;
435}
436
437.modal-parceiro-sipag #modalDescricao,
438.modal-parceiro-sipag #modalDescricao p {
439 color: #004653;
440 font-size: 21px;
441 line-height: 1.7;
442}
443
444.modal-parceiro-sipag #modalDescricao p {
445 margin: 0 0 8px;
446}
447
448.modal-parceiro-sipag #modalDescricao p:last-child {
449 margin-bottom: 0;
450}
451
452/* =========================================================
453 GRID DO MODAL
454========================================================= */
455
456.modal-parceiro-sipag .modal-detalhes-grid {
457 display: grid;
458 gap: 16px 20px;
459 grid-template-columns: repeat(2, minmax(0, 1fr));
460}
461
462.modal-parceiro-sipag #modalBlocoSegmentos,
463.modal-parceiro-sipag #modalBlocoTerminais {
464 min-height: 280px;
465}
466
467.modal-parceiro-sipag #modalBlocoContato,
468.modal-parceiro-sipag #modalBlocoSite {
469 min-height: 170px;
470}
471
472/* =========================================================
473 SEGMENTOS DO MODAL
474========================================================= */
475
476.modal-parceiro-sipag .modal-segmentos {
477 align-items: flex-start;
478 display: flex;
479 flex-wrap: wrap;
480 gap: 12px;
481}
482
483.modal-parceiro-sipag .modal-segmento-tag {
484 background-color: #fafafa;
485 border: 1px solid #cfcfcf;
486 border-radius: 6px;
487 color: #5d6262;
488 display: inline-flex;
489 font-size: 15px;
490 font-weight: 400;
491 line-height: 1.2;
492 padding: 10px 12px;
493 text-transform: uppercase;
494}
495
496/* =========================================================
497 TERMINAIS
498========================================================= */
499
500.modal-parceiro-sipag #modalTerminais,
501.modal-parceiro-sipag #modalTerminais p {
502 color: #004653;
503 font-size: 21px;
504 line-height: 1.8;
505}
506
507.modal-parceiro-sipag #modalTerminais p {
508 margin: 0 0 6px;
509}
510
511.modal-parceiro-sipag #modalTerminais p:last-child {
512 margin-bottom: 0;
513}
514
515/* =========================================================
516 CONTATO
517========================================================= */
518
519.modal-parceiro-sipag #modalContato {
520 color: #004653;
521 font-size: 21px;
522 line-height: 1.8;
523}
524
525.modal-parceiro-sipag #modalContato p {
526 color: #004653;
527 font-size: 21px;
528 line-height: 1.8;
529 margin: 0;
530}
531
532.modal-parceiro-sipag #modalContato strong {
533 color: #004653;
534 font-weight: 400;
535}
536
537.modal-parceiro-sipag #modalContato a {
538 color: #00a99d;
539 text-decoration: none;
540}
541
542.modal-parceiro-sipag #modalContato a:hover {
543 text-decoration: underline;
544}
545
546/* =========================================================
547 WEBSITE
548========================================================= */
549
550.modal-parceiro-sipag #modalSite {
551 font-size: 21px;
552 line-height: 1.7;
553}
554
555.modal-parceiro-sipag #modalSite a {
556 color: #00a99d;
557 overflow-wrap: anywhere;
558 text-decoration: none;
559}
560
561.modal-parceiro-sipag #modalSite a:hover {
562 text-decoration: underline;
563}
564
565/* =========================================================
566 RICH TEXT
567========================================================= */
568
569.modal-parceiro-sipag .modal-bloco ul,
570.modal-parceiro-sipag .modal-bloco ol {
571 color: #004653;
572 margin-bottom: 0;
573 padding-left: 20px;
574}
575
576.modal-parceiro-sipag .modal-bloco li {
577 color: #004653;
578 line-height: 1.7;
579 margin-bottom: 5px;
580}
581
582/* =========================================================
583 MOBILE
584========================================================= */
585
586@media (max-width: 767.98px) {
587 .sipag-parceiros {
588 padding: 28px 0 40px;
589 }
590
591 .sipag-parceiros > .container {
592 padding-left: 15px;
593 padding-right: 15px;
594 }
595
596 .sipag-parceiros .parceiros-filtros-area {
597 margin-bottom: 24px;
598 }
599
600 .sipag-parceiros .parceiros-intro {
601 font-size: 16px;
602 margin-bottom: 18px;
603 }
604
605 .sipag-parceiros .filtros {
606 flex-wrap: nowrap;
607 gap: 10px;
608 justify-content: flex-start;
609 margin-left: -15px;
610 margin-right: -15px;
611 overflow-x: auto;
612 padding: 3px 15px 12px;
613 width: auto;
614 -webkit-overflow-scrolling: touch;
615 }
616
617 .sipag-parceiros .filtros::-webkit-scrollbar {
618 height: 4px;
619 }
620
621 .sipag-parceiros .filtros::-webkit-scrollbar-thumb {
622 background-color: #b5c7c5;
623 border-radius: 10px;
624 }
625
626 .sipag-parceiros .btn-pill {
627 border-radius: 8px;
628 flex: 0 0 auto;
629 font-size: 14px;
630 min-height: 54px;
631 min-width: 205px;
632 padding: 12px 16px;
633 }
634
635 .sipag-parceiros .parceiros-busca {
636 margin-bottom: 34px;
637 }
638
639 .sipag-parceiros .parceiros-busca-campo {
640 font-size: 16px;
641 height: 56px;
642 padding-left: 52px;
643 }
644
645 .sipag-parceiros .parceiros-busca-icone {
646 height: 22px;
647 left: 18px;
648 width: 22px;
649 }
650
651 .sipag-parceiros .card-parceiro {
652 border-radius: 12px;
653 min-height: auto;
654 padding: 20px;
655 }
656
657 .sipag-parceiros .parceiro-logo {
658 height: 200px;
659 }
660
661 .sipag-parceiros .parceiro-logo img {
662 max-height: 130px;
663 max-width: 200px;
664 }
665
666 .sipag-parceiros .card-parceiro h6 {
667 font-size: 21px;
668 }
669
670 .sipag-parceiros .parceiro-segmento {
671 font-size: 14px;
672 }
673
674 .sipag-parceiros .parceiro-acoes {
675 flex-direction: column;
676 }
677
678 .sipag-parceiros .btn-parceiro {
679 font-size: 17px;
680 min-height: 54px;
681 width: 100%;
682 }
683
684 .modal-parceiro-sipag {
685 align-items: flex-end;
686 padding: 0;
687 }
688
689 .modal-parceiro-sipag .modal-parceiro-dialog {
690 border-radius: 16px 16px 0 0;
691 max-height: 95vh;
692 }
693
694 .modal-parceiro-sipag .modal-parceiro-header {
695 min-height: 65px;
696 padding: 14px 20px;
697 }
698
699 .modal-parceiro-sipag .modal-parceiro-header h4 {
700 font-size: 24px;
701 }
702
703 .modal-parceiro-sipag .close-modal {
704 flex: 0 0 36px;
705 height: 36px;
706 width: 36px;
707 }
708
709 .modal-parceiro-sipag .modal-parceiro-body {
710 max-height: calc(95vh - 65px);
711 padding: 18px 15px 25px;
712 }
713
714 .modal-parceiro-sipag .modal-detalhes-grid {
715 grid-template-columns: 1fr;
716 }
717
718 .modal-parceiro-sipag .modal-bloco {
719 min-height: auto !important;
720 padding: 20px;
721 }
722
723 .modal-parceiro-sipag #modalBlocoDescricao {
724 min-height: auto;
725 }
726
727 .modal-parceiro-sipag .modal-bloco h6 {
728 margin-bottom: 15px;
729 }
730}
731</style>
732
733<div class="col-12 px-0">
734 <section class="sipag-parceiros" id="sipag-parceiros">
735
736<div class="container">
737
738 <!-- =====================================================
739 FILTROS
740 ====================================================== -->
741
742 <div
743 class="parceiros-filtros-area"
744 id="parceiros-filtros-area"
745 >
746
747<p class="parceiros-intro">
748 Filtre abaixo os segmentos que deseja visualizar:
749</p>
750
751<div
752 aria-label="Filtrar parceiros por segmento"
753 class="filtros"
754 id="filtros-parceiros"
755 role="group"
756></div>
757
758 </div>
759
760 <!-- =====================================================
761 BUSCA
762 ====================================================== -->
763
764 <div class="parceiros-busca" role="search">
765
766<label
767 class="sr-only"
768 for="busca-parceiros"
769>
770 Pesquisar parceiros por nome ou categoria
771</label>
772
773<svg
774 aria-hidden="true"
775 class="parceiros-busca-icone"
776 fill="none"
777 viewBox="0 0 24 24"
778>
779 <circle
780 cx="11"
781 cy="11"
782 r="7"
783 stroke="currentColor"
784 stroke-width="2"
785 ></circle>
786
787 <path
788 d="M16 16L21 21"
789 stroke="currentColor"
790 stroke-linecap="round"
791 stroke-width="2"
792 ></path>
793</svg>
794
795<input
796 autocomplete="off"
797 class="parceiros-busca-campo"
798 id="busca-parceiros"
799 placeholder="Pesquise por nome do anexo ou categoria"
800 type="search"
801/>
802
803 </div>
804
805 <!-- =====================================================
806 GRID DE PARCEIROS
807 ====================================================== -->
808
809 <div class="row" id="grid-parceiros">
810
811<#list Fieldset67243883.getSiblings() as parceiro>
812
813 <#assign nome = parceiro.Text51037391.getData()!"" />
814 <#assign segmentos = parceiro.CheckboxMultiple15617005.getData()!"" />
815 <#assign site = parceiro.Text51612886.getData()!"" />
816
817 <#assign siteUrl = site />
818
819 <#if site?has_content
820 && !site?starts_with("http://")
821 && !site?starts_with("https://")>
822
823 <#assign siteUrl = "https://" + site />
824
825 </#if>
826
827
828 <div
829 class="col-sm-6 col-lg-4 col-xl-3 mb-4 parceiro"
830 data-category="${segmentos?html}"
831 data-name="${nome?html}"
832 >
833
834 <div class="card-parceiro">
835
836 <!-- LOGO -->
837 <div class="parceiro-logo">
838
839 <#if parceiro.Image82450298.getData()??
840 && parceiro.Image82450298.getData() != "">
841
842 <img
843 alt="${nome?html}"
844 class="img-fluid"
845 loading="lazy"
846 src="${parceiro.Image82450298.getData()}"
847 />
848
849 </#if>
850
851 </div>
852
853
854 <!-- NOME -->
855 <h6>
856 ${nome?html}
857 </h6>
858
859
860 <!-- SEGMENTOS -->
861 <p class="parceiro-segmento js-segmento-card"></p>
862
863
864 <!-- AÇÕES -->
865 <div class="parceiro-acoes">
866
867 <#if site?has_content>
868
869 <a
870 class="btn-parceiro btn-site"
871 href="${siteUrl?html}"
872 rel="noopener noreferrer"
873 target="_blank"
874 >
875 Acessar site
876 </a>
877
878 </#if>
879
880
881 <button
882 class="btn-parceiro btn-saiba btn-modal"
883 type="button"
884 >
885 Saiba mais
886 </button>
887
888 </div>
889
890
891 <!-- =================================================
892 DADOS UTILIZADOS PELO MODAL
893 ================================================== -->
894
895 <div
896 aria-hidden="true"
897 class="parceiro-dados d-none"
898 >
899
900 <span class="js-nome">
901 ${nome?html}
902 </span>
903
904
905 <span class="js-segmentos">
906 ${segmentos?html}
907 </span>
908
909
910 <div class="js-descricao">
911
912<#if (Fieldset67243883.RichText77766022.getData())??>
913${Fieldset67243883.RichText77766022.getData()}
914</#if>
915</div>
916
917 <div class="js-terminais">
918
919<#if (Fieldset67243883.RichText36172897.getData())??>
920${Fieldset67243883.RichText36172897.getData()}
921</#if>
922</div>
923
924 <span class="js-email">
925 <#if parceiro.Text26526715.getData()??>
926 ${parceiro.Text26526715.getData()?html}
927 </#if>
928 </span>
929
930
931 <span class="js-whatsapp">
932 <#if parceiro.Campo12763757.getData()??>
933 ${parceiro.Campo12763757.getData()?html}
934 </#if>
935 </span>
936
937
938 <span class="js-instagram">
939 <#if parceiro.Campo47414182.getData()??>
940 ${parceiro.Campo47414182.getData()?html}
941 </#if>
942 </span>
943
944
945 <span class="js-site">
946 ${site?html}
947 </span>
948
949 </div>
950
951 </div>
952
953 </div>
954
955</#list>
956
957 </div>
958
959 <!-- =====================================================
960 SEM RESULTADO
961 ====================================================== -->
962
963 <p
964 aria-live="polite"
965 class="parceiros-vazio"
966 hidden
967 id="parceiros-vazio"
968 role="status"
969 >
970 Nenhum parceiro encontrado.
971 </p>
972
973</div>
974
975<!-- =====================================================
976 MODAL
977====================================================== -->
978
979<div
980 aria-labelledby="modalParceiroTitulo"
981 aria-modal="true"
982 class="modal-parceiro-sipag"
983 hidden
984 id="modalParceiro"
985 role="dialog"
986>
987
988 <div class="modal-parceiro-dialog">
989
990<!-- CABEÇALHO -->
991<div class="modal-parceiro-header">
992
993 <h4 id="modalParceiroTitulo"></h4>
994
995 <button
996 aria-label="Fechar modal"
997 class="close-modal"
998 type="button"
999 >
1000 ×
1001 </button>
1002
1003</div>
1004
1005
1006<!-- CORPO -->
1007<div class="modal-parceiro-body">
1008
1009 <!-- DESCRIÇÃO -->
1010 <div
1011 class="modal-bloco"
1012 id="modalBlocoDescricao"
1013 >
1014
1015 <h6>Descrição</h6>
1016
1017 <div id="modalDescricao"></div>
1018
1019 </div>
1020
1021
1022 <!-- GRID 2x2 -->
1023 <div class="modal-detalhes-grid">
1024
1025 <!-- SEGMENTOS -->
1026 <div
1027 class="modal-bloco"
1028 id="modalBlocoSegmentos"
1029 >
1030
1031 <h6>Segmentos atendidos</h6>
1032
1033 <div
1034 class="modal-segmentos"
1035 id="modalSegmentos"
1036 ></div>
1037
1038 </div>
1039
1040
1041 <!-- TERMINAIS -->
1042 <div
1043 class="modal-bloco"
1044 id="modalBlocoTerminais"
1045 >
1046
1047 <h6>Terminais habilitados</h6>
1048
1049 <div id="modalTerminais"></div>
1050
1051 </div>
1052
1053
1054 <!-- CONTATO -->
1055 <div
1056 class="modal-bloco"
1057 id="modalBlocoContato"
1058 >
1059
1060 <h6>Informações e contato</h6>
1061
1062 <div id="modalContato"></div>
1063
1064 </div>
1065
1066
1067 <!-- WEBSITE -->
1068 <div
1069 class="modal-bloco"
1070 id="modalBlocoSite"
1071 >
1072
1073 <h6>Website</h6>
1074
1075 <div id="modalSite"></div>
1076
1077 </div>
1078
1079 </div>
1080
1081</div>
1082
1083 </div>
1084
1085</div>
1086
1087 </section>
1088</div>
1089
1090<script>
1091(function () {
1092
1093 var componente = document.getElementById("sipag-parceiros");
1094
1095 if (!componente) {
1096 return;
1097 }
1098
1099
1100 if (
1101 componente.getAttribute(
1102 "data-inicializado"
1103 ) === "true"
1104 ) {
1105 return;
1106 }
1107
1108
1109 componente.setAttribute(
1110 "data-inicializado",
1111 "true"
1112 );
1113
1114
1115 /* =========================================================
1116 ELEMENTOS
1117 ========================================================= */
1118
1119 var busca =
1120 componente.querySelector(
1121 "#busca-parceiros"
1122 );
1123
1124 var filtrosContainer =
1125 componente.querySelector(
1126 "#filtros-parceiros"
1127 );
1128
1129 var filtrosArea =
1130 componente.querySelector(
1131 "#parceiros-filtros-area"
1132 );
1133
1134 var parceiros =
1135 componente.querySelectorAll(
1136 ".parceiro"
1137 );
1138
1139 var mensagemVazia =
1140 componente.querySelector(
1141 "#parceiros-vazio"
1142 );
1143
1144
1145 var filtroAtual = "all";
1146
1147
1148 /* =========================================================
1149 NORMALIZA TEXTO
1150 ========================================================= */
1151
1152 function normalizarTexto(texto) {
1153
1154 var valor =
1155 (texto || "")
1156 .toString()
1157 .toLowerCase();
1158
1159
1160 if (valor.normalize) {
1161
1162 valor = valor
1163 .normalize("NFD")
1164 .replace(
1165 /[\u0300-\u036f]/g,
1166 ""
1167 );
1168
1169 }
1170
1171
1172 return valor
1173 .replace(
1174 /[^a-z0-9]+/g,
1175 " "
1176 )
1177 .trim();
1178
1179 }
1180
1181
1182 /* =========================================================
1183 OBTÉM SEGMENTOS
1184
1185 Suporta:
1186 ["varejo","servicos"]
1187
1188 varejo,servicos
1189
1190 varejo;servicos
1191 ========================================================= */
1192
1193 function obterSegmentos(valor) {
1194
1195 if (!valor) {
1196 return [];
1197 }
1198
1199
1200 var texto =
1201 valor.toString().trim();
1202
1203
1204 if (!texto) {
1205 return [];
1206 }
1207
1208
1209 /*
1210 * Tenta JSON primeiro.
1211 */
1212 try {
1213
1214 var json =
1215 JSON.parse(texto);
1216
1217
1218 if (Array.isArray(json)) {
1219
1220 return json
1221 .map(function (item) {
1222
1223 return item
1224 .toString()
1225 .trim();
1226
1227 })
1228 .filter(Boolean);
1229
1230 }
1231
1232 } catch (erro) {
1233 /* segue normalmente */
1234 }
1235
1236
1237 texto = texto
1238 .replace(/^\[/, "")
1239 .replace(/\]$/, "")
1240 .replace(/"/g, "")
1241 .replace(/'/g, "");
1242
1243
1244 return texto
1245 .split(/[,;|]+/)
1246 .map(function (item) {
1247
1248 return item.trim();
1249
1250 })
1251 .filter(Boolean);
1252
1253 }
1254
1255
1256 /* =========================================================
1257 CHAVE CANÔNICA DO SEGMENTO
1258 ========================================================= */
1259
1260 function obterChaveSegmento(segmento) {
1261
1262 var chave =
1263 normalizarTexto(segmento);
1264
1265
1266 if (
1267 chave.indexOf("alimentacao") !== -1 ||
1268 chave.indexOf("bares restaurantes") !== -1
1269 ) {
1270 return "alimentacao";
1271 }
1272
1273 if (chave.indexOf("evento") !== -1) {
1274 return "eventos";
1275 }
1276
1277 if (chave.indexOf("industr") !== -1) {
1278 return "industria";
1279 }
1280
1281 if (
1282 chave.indexOf("posto") !== -1 &&
1283 chave.indexOf("combust") !== -1
1284 ) {
1285 return "postos";
1286 }
1287
1288 if (chave.indexOf("saude") !== -1) {
1289 return "saude";
1290 }
1291
1292 if (chave.indexOf("servico") !== -1) {
1293 return "servicos";
1294 }
1295
1296 if (chave.indexOf("varejo") !== -1) {
1297 return "varejo";
1298 }
1299
1300
1301 return chave;
1302
1303 }
1304
1305
1306 /* =========================================================
1307 LABEL DO FILTRO
1308 ========================================================= */
1309
1310 function obterLabelFiltroSegmento(chave, segmentoOriginal) {
1311
1312 var labels = {
1313 "alimentacao": "ALIMENTAÇÃO",
1314 "eventos": "EVENTOS",
1315 "industria": "INDÚSTRIA",
1316 "postos": "POSTOS DE COMBUSTÍVEIS",
1317 "saude": "SAÚDE",
1318 "servicos": "SERVIÇOS",
1319 "varejo": "VAREJO"
1320 };
1321
1322
1323 if (labels[chave]) {
1324 return labels[chave];
1325 }
1326
1327
1328 return (segmentoOriginal || "")
1329 .toString()
1330 .trim()
1331 .toUpperCase();
1332
1333 }
1334
1335
1336 /* =========================================================
1337 NOME VISUAL DO SEGMENTO NO CARD / MODAL
1338 ========================================================= */
1339
1340 function obterLabelSegmento(segmento) {
1341
1342 var chave =
1343 normalizarTexto(segmento);
1344
1345
1346 var labels = {
1347 "alimentacao": "Alimentação (Bares, Restaurantes e Lanchonetes)",
1348 "alimentacao bares restaurantes e lanchonetes":
1349 "Alimentação (Bares, Restaurantes e Lanchonetes)",
1350 "bares restaurantes e lanchonetes":
1351 "Alimentação (Bares, Restaurantes e Lanchonetes)",
1352 "eventos": "Eventos",
1353 "industria": "Indústria",
1354 "posto": "Postos de Combustíveis",
1355 "postos": "Postos de Combustíveis",
1356 "posto de combustivel": "Postos de Combustíveis",
1357 "postos de combustivel": "Postos de Combustíveis",
1358 "postos de combustiveis": "Postos de Combustíveis",
1359 "saude": "Saúde",
1360 "servicos": "Serviços",
1361 "varejo": "Varejo"
1362 };
1363
1364
1365 if (labels[chave]) {
1366 return labels[chave];
1367 }
1368
1369
1370 return segmento
1371 .toString()
1372 .trim();
1373
1374 }
1375
1376
1377 /* =========================================================
1378 FORMATA OS SEGMENTOS NOS CARDS
1379 ========================================================= */
1380
1381 function formatarListaSegmentos(lista) {
1382
1383 if (!lista.length) {
1384 return "";
1385 }
1386
1387 if (lista.length === 1) {
1388 return lista[0];
1389 }
1390
1391 if (lista.length === 2) {
1392 return lista[0] + " e " + lista[1];
1393 }
1394
1395
1396 return (
1397 lista.slice(0, -1).join(", ") +
1398 " e " +
1399 lista[lista.length - 1]
1400 );
1401
1402 }
1403
1404
1405 function formatarSegmentosCards() {
1406
1407 parceiros.forEach(
1408 function (parceiro) {
1409
1410 var campo =
1411 parceiro.querySelector(
1412 ".js-segmento-card"
1413 );
1414
1415
1416 if (!campo) {
1417 return;
1418 }
1419
1420
1421 var segmentos =
1422 obterSegmentos(
1423 parceiro.getAttribute(
1424 "data-category"
1425 )
1426 );
1427
1428
1429 var labels =
1430 segmentos.map(function (segmento) {
1431
1432 return obterLabelSegmento(
1433 segmento
1434 );
1435
1436 });
1437
1438
1439 campo.textContent =
1440 formatarListaSegmentos(labels);
1441
1442 }
1443 );
1444
1445 }
1446
1447
1448 /* =========================================================
1449 CRIAR FILTROS AUTOMATICAMENTE
1450
1451 SOMENTE SEGMENTOS USADOS
1452 ========================================================= */
1453
1454 function gerarFiltros() {
1455
1456 if (!filtrosContainer) {
1457 return;
1458 }
1459
1460
1461 var segmentosUsados = {};
1462
1463
1464 parceiros.forEach(
1465 function (parceiro) {
1466
1467 var categorias =
1468 obterSegmentos(
1469 parceiro.getAttribute(
1470 "data-category"
1471 )
1472 );
1473
1474
1475 categorias.forEach(
1476 function (categoria) {
1477
1478 var chave =
1479 obterChaveSegmento(
1480 categoria
1481 );
1482
1483
1484 if (!chave) {
1485 return;
1486 }
1487
1488
1489 if (
1490 !segmentosUsados[chave]
1491 ) {
1492
1493 segmentosUsados[chave] = {
1494 chave: chave,
1495 valor: categoria,
1496 label:
1497 obterLabelFiltroSegmento(
1498 chave,
1499 categoria
1500 )
1501 };
1502
1503 }
1504
1505 }
1506 );
1507
1508 }
1509 );
1510
1511
1512 while (
1513 filtrosContainer.firstChild
1514 ) {
1515
1516 filtrosContainer.removeChild(
1517 filtrosContainer.firstChild
1518 );
1519
1520 }
1521
1522
1523 var segmentos =
1524 Object.keys(
1525 segmentosUsados
1526 )
1527 .map(function (chave) {
1528
1529 return segmentosUsados[
1530 chave
1531 ];
1532
1533 });
1534
1535
1536 if (!segmentos.length) {
1537
1538 if (filtrosArea) {
1539
1540 filtrosArea.style.display =
1541 "none";
1542
1543 }
1544
1545 return;
1546
1547 }
1548
1549
1550 if (filtrosArea) {
1551
1552 filtrosArea.style.display = "";
1553
1554 }
1555
1556
1557 /* TODOS */
1558 var botaoTodos =
1559 document.createElement(
1560 "button"
1561 );
1562
1563
1564 botaoTodos.type = "button";
1565
1566 botaoTodos.className =
1567 "btn btn-pill active";
1568
1569 botaoTodos.setAttribute(
1570 "data-filter",
1571 "all"
1572 );
1573
1574 botaoTodos.setAttribute(
1575 "aria-pressed",
1576 "true"
1577 );
1578
1579
1580 botaoTodos.appendChild(
1581 document.createTextNode(
1582 "TODOS OS SEGMENTOS"
1583 )
1584 );
1585
1586
1587 filtrosContainer.appendChild(
1588 botaoTodos
1589 );
1590
1591
1592 /* ORDEM ALFABÉTICA */
1593 segmentos.sort(
1594 function (a, b) {
1595
1596 return a.label.localeCompare(
1597 b.label,
1598 "pt-BR"
1599 );
1600
1601 }
1602 );
1603
1604
1605 /* CRIA SOMENTE OS USADOS */
1606 segmentos.forEach(
1607 function (segmento) {
1608
1609 var botao =
1610 document.createElement(
1611 "button"
1612 );
1613
1614
1615 botao.type = "button";
1616
1617 botao.className =
1618 "btn btn-pill";
1619
1620 botao.setAttribute(
1621 "data-filter",
1622 segmento.chave
1623 );
1624
1625 botao.setAttribute(
1626 "aria-pressed",
1627 "false"
1628 );
1629
1630
1631 botao.appendChild(
1632 document.createTextNode(
1633 segmento.label
1634 )
1635 );
1636
1637
1638 filtrosContainer.appendChild(
1639 botao
1640 );
1641
1642 }
1643 );
1644
1645 }
1646
1647
1648 /* =========================================================
1649 FILTRAR PARCEIROS
1650 ========================================================= */
1651
1652 function filtrarParceiros() {
1653
1654 var termo =
1655 normalizarTexto(
1656 busca ?
1657 busca.value :
1658 ""
1659 );
1660
1661
1662 var quantidadeVisivel = 0;
1663
1664
1665 parceiros.forEach(
1666 function (parceiro) {
1667
1668 var nome =
1669 normalizarTexto(
1670 parceiro.getAttribute(
1671 "data-name"
1672 )
1673 );
1674
1675
1676 var segmentos =
1677 obterSegmentos(
1678 parceiro.getAttribute(
1679 "data-category"
1680 )
1681 );
1682
1683
1684 var categoriasNormalizadas =
1685 segmentos.map(
1686 function (item) {
1687
1688 return obterChaveSegmento(
1689 item
1690 );
1691
1692 }
1693 );
1694
1695
1696 var textoCategorias =
1697 segmentos
1698 .map(function (item) {
1699
1700 return normalizarTexto(
1701 item + " " +
1702 obterLabelSegmento(item)
1703 );
1704
1705 })
1706 .join(" ");
1707
1708
1709 /* BUSCA */
1710 var atendeBusca =
1711 !termo ||
1712 nome.indexOf(termo) !== -1 ||
1713 textoCategorias.indexOf(
1714 termo
1715 ) !== -1;
1716
1717
1718 /* FILTRO */
1719 var atendeFiltro =
1720 filtroAtual === "all" ||
1721 categoriasNormalizadas
1722 .indexOf(
1723 filtroAtual
1724 ) !== -1;
1725
1726
1727 var exibir =
1728 atendeBusca &&
1729 atendeFiltro;
1730
1731
1732 parceiro.style.display =
1733 exibir ? "" : "none";
1734
1735
1736 if (exibir) {
1737 quantidadeVisivel++;
1738 }
1739
1740 }
1741 );
1742
1743
1744 if (mensagemVazia) {
1745
1746 mensagemVazia.hidden =
1747 quantidadeVisivel !== 0;
1748
1749 }
1750
1751 }
1752
1753
1754 /* =========================================================
1755 EVENTO FILTROS
1756 ========================================================= */
1757
1758 if (filtrosContainer) {
1759
1760 filtrosContainer.addEventListener(
1761 "click",
1762 function (event) {
1763
1764 var botao =
1765 event.target.closest(
1766 ".btn-pill[data-filter]"
1767 );
1768
1769
1770 if (!botao) {
1771 return;
1772 }
1773
1774
1775 filtroAtual =
1776 botao.getAttribute(
1777 "data-filter"
1778 ) || "all";
1779
1780
1781 var botoes =
1782 filtrosContainer
1783 .querySelectorAll(
1784 ".btn-pill"
1785 );
1786
1787
1788 botoes.forEach(
1789 function (item) {
1790
1791 item.classList.remove(
1792 "active"
1793 );
1794
1795 item.setAttribute(
1796 "aria-pressed",
1797 "false"
1798 );
1799
1800 }
1801 );
1802
1803
1804 botao.classList.add(
1805 "active"
1806 );
1807
1808 botao.setAttribute(
1809 "aria-pressed",
1810 "true"
1811 );
1812
1813
1814 filtrarParceiros();
1815
1816 }
1817 );
1818
1819 }
1820
1821
1822 /* =========================================================
1823 EVENTO BUSCA
1824 ========================================================= */
1825
1826 if (busca) {
1827
1828 busca.addEventListener(
1829 "input",
1830 filtrarParceiros
1831 );
1832
1833 }
1834
1835
1836 /* =========================================================
1837 ELEMENTOS MODAL
1838 ========================================================= */
1839
1840 var modal =
1841 componente.querySelector(
1842 "#modalParceiro"
1843 );
1844
1845 var tituloModal =
1846 componente.querySelector(
1847 "#modalParceiroTitulo"
1848 );
1849
1850 var modalDescricao =
1851 componente.querySelector(
1852 "#modalDescricao"
1853 );
1854
1855 var modalSegmentos =
1856 componente.querySelector(
1857 "#modalSegmentos"
1858 );
1859
1860 var modalTerminais =
1861 componente.querySelector(
1862 "#modalTerminais"
1863 );
1864
1865 var modalContato =
1866 componente.querySelector(
1867 "#modalContato"
1868 );
1869
1870 var modalSite =
1871 componente.querySelector(
1872 "#modalSite"
1873 );
1874
1875
1876 var blocoDescricao =
1877 componente.querySelector(
1878 "#modalBlocoDescricao"
1879 );
1880
1881 var blocoSegmentos =
1882 componente.querySelector(
1883 "#modalBlocoSegmentos"
1884 );
1885
1886 var blocoTerminais =
1887 componente.querySelector(
1888 "#modalBlocoTerminais"
1889 );
1890
1891 var blocoContato =
1892 componente.querySelector(
1893 "#modalBlocoContato"
1894 );
1895
1896 var blocoSite =
1897 componente.querySelector(
1898 "#modalBlocoSite"
1899 );
1900
1901
1902 var elementoFocoAnterior = null;
1903 var overflowAnterior = "";
1904
1905
1906 /* =========================================================
1907 LIMPAR ELEMENTO
1908 ========================================================= */
1909
1910 function limparElemento(elemento) {
1911
1912 if (!elemento) {
1913 return;
1914 }
1915
1916
1917 while (elemento.firstChild) {
1918
1919 elemento.removeChild(
1920 elemento.firstChild
1921 );
1922
1923 }
1924
1925 }
1926
1927
1928 /* =========================================================
1929 COPIA RICH TEXT
1930
1931 NÃO USA innerHTML
1932 ========================================================= */
1933
1934 function copiarConteudo(
1935 origem,
1936 destino
1937 ) {
1938
1939 limparElemento(destino);
1940
1941
1942 if (
1943 !origem ||
1944 !destino
1945 ) {
1946 return false;
1947 }
1948
1949
1950 var possuiConteudo =
1951 origem.textContent.trim() !== "" ||
1952 origem.children.length > 0;
1953
1954
1955 if (!possuiConteudo) {
1956 return false;
1957 }
1958
1959
1960 Array.prototype.slice
1961 .call(
1962 origem.childNodes
1963 )
1964 .forEach(
1965 function (node) {
1966
1967 destino.appendChild(
1968 node.cloneNode(true)
1969 );
1970
1971 }
1972 );
1973
1974
1975 return true;
1976
1977 }
1978
1979
1980 /* =========================================================
1981 CRIAR LINK
1982 ========================================================= */
1983
1984 function criarLink(
1985 texto,
1986 href,
1987 target
1988 ) {
1989
1990 var link =
1991 document.createElement("a");
1992
1993
1994 link.href = href;
1995
1996
1997 link.appendChild(
1998 document.createTextNode(
1999 texto
2000 )
2001 );
2002
2003
2004 if (target) {
2005
2006 link.target = target;
2007
2008 link.rel =
2009 "noopener noreferrer";
2010
2011 }
2012
2013
2014 return link;
2015
2016 }
2017
2018
2019 /* =========================================================
2020 URL WHATSAPP
2021 ========================================================= */
2022
2023 function criarUrlWhatsApp(
2024 numero
2025 ) {
2026
2027 var numeroLimpo =
2028 (numero || "")
2029 .replace(/\D/g, "");
2030
2031
2032 if (!numeroLimpo) {
2033 return "";
2034 }
2035
2036
2037 if (
2038 numeroLimpo.indexOf("55") !== 0
2039 ) {
2040
2041 numeroLimpo =
2042 "55" + numeroLimpo;
2043
2044 }
2045
2046
2047 return (
2048 "https://wa.me/" +
2049 numeroLimpo
2050 );
2051
2052 }
2053
2054
2055 /* =========================================================
2056 URL INSTAGRAM
2057 ========================================================= */
2058
2059 function criarUrlInstagram(
2060 instagram
2061 ) {
2062
2063 var valor =
2064 (instagram || "")
2065 .trim();
2066
2067
2068 if (!valor) {
2069 return "";
2070 }
2071
2072
2073 if (
2074 valor.indexOf(
2075 "http://"
2076 ) === 0 ||
2077 valor.indexOf(
2078 "https://"
2079 ) === 0
2080 ) {
2081
2082 return valor;
2083
2084 }
2085
2086
2087 valor = valor
2088 .replace(/^@/, "")
2089 .replace(/^www\./, "")
2090 .replace(
2091 /^instagram\.com\//,
2092 ""
2093 );
2094
2095
2096 return (
2097 "https://instagram.com/" +
2098 valor
2099 );
2100
2101 }
2102
2103
2104 /* =========================================================
2105 URL SITE
2106 ========================================================= */
2107
2108 function criarUrlSite(site) {
2109
2110 var valor =
2111 (site || "").trim();
2112
2113
2114 if (!valor) {
2115 return "";
2116 }
2117
2118
2119 if (
2120 valor.indexOf(
2121 "http://"
2122 ) === 0 ||
2123 valor.indexOf(
2124 "https://"
2125 ) === 0
2126 ) {
2127
2128 return valor;
2129
2130 }
2131
2132
2133 return (
2134 "https://" + valor
2135 );
2136
2137 }
2138
2139
2140 /* =========================================================
2141 ADICIONAR CONTATO
2142 ========================================================= */
2143
2144 function adicionarContato(
2145 titulo,
2146 texto,
2147 href,
2148 novaAba
2149 ) {
2150
2151 if (!texto) {
2152 return false;
2153 }
2154
2155
2156 var p =
2157 document.createElement("p");
2158
2159
2160 p.appendChild(
2161 document.createTextNode(
2162 titulo + ": "
2163 )
2164 );
2165
2166
2167 if (href) {
2168
2169 p.appendChild(
2170 criarLink(
2171 texto,
2172 href,
2173 novaAba ?
2174 "_blank" :
2175 ""
2176 )
2177 );
2178
2179 } else {
2180
2181 p.appendChild(
2182 document.createTextNode(
2183 texto
2184 )
2185 );
2186
2187 }
2188
2189
2190 modalContato.appendChild(p);
2191
2192
2193 return true;
2194
2195 }
2196
2197
2198 /* =========================================================
2199 SEGMENTOS DO MODAL
2200 ========================================================= */
2201
2202 function montarSegmentosModal(
2203 valor
2204 ) {
2205
2206 limparElemento(
2207 modalSegmentos
2208 );
2209
2210
2211 var segmentos =
2212 obterSegmentos(valor);
2213
2214
2215 if (!segmentos.length) {
2216 return false;
2217 }
2218
2219
2220 segmentos.forEach(
2221 function (segmento) {
2222
2223 var span =
2224 document.createElement(
2225 "span"
2226 );
2227
2228
2229 span.className =
2230 "modal-segmento-tag";
2231
2232
2233 span.appendChild(
2234 document.createTextNode(
2235 obterLabelSegmento(
2236 segmento
2237 )
2238 )
2239 );
2240
2241
2242 modalSegmentos
2243 .appendChild(span);
2244
2245 }
2246 );
2247
2248
2249 return true;
2250
2251 }
2252
2253
2254 /* =========================================================
2255 ABRIR MODAL
2256 ========================================================= */
2257
2258 function abrirModal(botao) {
2259
2260 if (!modal) {
2261 return;
2262 }
2263
2264
2265 var parceiro =
2266 botao.closest(
2267 ".parceiro"
2268 );
2269
2270
2271 if (!parceiro) {
2272 return;
2273 }
2274
2275
2276 var dados =
2277 parceiro.querySelector(
2278 ".parceiro-dados"
2279 );
2280
2281
2282 if (!dados) {
2283 return;
2284 }
2285
2286
2287 /* ======================
2288 NOME
2289 ====================== */
2290
2291 var nome =
2292 dados.querySelector(
2293 ".js-nome"
2294 );
2295
2296
2297 tituloModal.textContent =
2298 nome ?
2299 nome.textContent.trim() :
2300 "";
2301
2302
2303 /* ======================
2304 DESCRIÇÃO
2305 ====================== */
2306
2307 var descricao =
2308 dados.querySelector(
2309 ".js-descricao"
2310 );
2311
2312
2313 blocoDescricao.hidden =
2314 !copiarConteudo(
2315 descricao,
2316 modalDescricao
2317 );
2318
2319
2320 /* ======================
2321 SEGMENTOS
2322 ====================== */
2323
2324 var segmentos =
2325 dados.querySelector(
2326 ".js-segmentos"
2327 );
2328
2329
2330 blocoSegmentos.hidden =
2331 !montarSegmentosModal(
2332 segmentos ?
2333 segmentos
2334 .textContent
2335 .trim() :
2336 ""
2337 );
2338
2339
2340 /* ======================
2341 TERMINAIS
2342 ====================== */
2343
2344 var terminais =
2345 dados.querySelector(
2346 ".js-terminais"
2347 );
2348
2349
2350 blocoTerminais.hidden =
2351 !copiarConteudo(
2352 terminais,
2353 modalTerminais
2354 );
2355
2356
2357 /* ======================
2358 CONTATO
2359 ====================== */
2360
2361 limparElemento(
2362 modalContato
2363 );
2364
2365
2366 var emailElemento =
2367 dados.querySelector(
2368 ".js-email"
2369 );
2370
2371 var whatsappElemento =
2372 dados.querySelector(
2373 ".js-whatsapp"
2374 );
2375
2376 var instagramElemento =
2377 dados.querySelector(
2378 ".js-instagram"
2379 );
2380
2381
2382 var email =
2383 emailElemento ?
2384 emailElemento
2385 .textContent
2386 .trim() :
2387 "";
2388
2389
2390 var whatsapp =
2391 whatsappElemento ?
2392 whatsappElemento
2393 .textContent
2394 .trim() :
2395 "";
2396
2397
2398 var instagram =
2399 instagramElemento ?
2400 instagramElemento
2401 .textContent
2402 .trim() :
2403 "";
2404
2405
2406 var possuiContato = false;
2407
2408
2409 if (email) {
2410
2411 possuiContato =
2412 adicionarContato(
2413 "E-mail",
2414 email,
2415 "mailto:" + email,
2416 false
2417 ) ||
2418 possuiContato;
2419
2420 }
2421
2422
2423 if (whatsapp) {
2424
2425 possuiContato =
2426 adicionarContato(
2427 "WhatsApp",
2428 whatsapp,
2429 criarUrlWhatsApp(
2430 whatsapp
2431 ),
2432 true
2433 ) ||
2434 possuiContato;
2435
2436 }
2437
2438
2439 if (instagram) {
2440
2441 var instagramLabel =
2442 instagram;
2443
2444
2445 if (
2446 instagramLabel.indexOf(
2447 "http"
2448 ) !== 0 &&
2449 instagramLabel.charAt(0)
2450 !== "@"
2451 ) {
2452
2453 instagramLabel =
2454 "@" +
2455 instagramLabel;
2456
2457 }
2458
2459
2460 possuiContato =
2461 adicionarContato(
2462 "Instagram",
2463 instagramLabel,
2464 criarUrlInstagram(
2465 instagram
2466 ),
2467 true
2468 ) ||
2469 possuiContato;
2470
2471 }
2472
2473
2474 blocoContato.hidden =
2475 !possuiContato;
2476
2477
2478 /* ======================
2479 SITE
2480 ====================== */
2481
2482 limparElemento(
2483 modalSite
2484 );
2485
2486
2487 var siteElemento =
2488 dados.querySelector(
2489 ".js-site"
2490 );
2491
2492
2493 var site =
2494 siteElemento ?
2495 siteElemento
2496 .textContent
2497 .trim() :
2498 "";
2499
2500
2501 if (site) {
2502
2503 modalSite.appendChild(
2504 criarLink(
2505 site,
2506 criarUrlSite(site),
2507 "_blank"
2508 )
2509 );
2510
2511
2512 blocoSite.hidden = false;
2513
2514 } else {
2515
2516 blocoSite.hidden = true;
2517
2518 }
2519
2520
2521 /* ======================
2522 ABRIR
2523 ====================== */
2524
2525 elementoFocoAnterior =
2526 document.activeElement;
2527
2528
2529 overflowAnterior =
2530 document.body.style
2531 .overflow;
2532
2533
2534 modal.hidden = false;
2535
2536
2537 document.body.style
2538 .overflow = "hidden";
2539
2540
2541 var fechar =
2542 modal.querySelector(
2543 ".close-modal"
2544 );
2545
2546
2547 if (fechar) {
2548 fechar.focus();
2549 }
2550
2551 }
2552
2553
2554 /* =========================================================
2555 FECHAR MODAL
2556 ========================================================= */
2557
2558 function fecharModal() {
2559
2560 if (
2561 !modal ||
2562 modal.hidden
2563 ) {
2564 return;
2565 }
2566
2567
2568 modal.hidden = true;
2569
2570
2571 document.body.style
2572 .overflow =
2573 overflowAnterior;
2574
2575
2576 if (
2577 elementoFocoAnterior &&
2578 typeof elementoFocoAnterior
2579 .focus === "function"
2580 ) {
2581
2582 elementoFocoAnterior
2583 .focus();
2584
2585 }
2586
2587 }
2588
2589
2590 /* =========================================================
2591 CLIQUES
2592 ========================================================= */
2593
2594 componente.addEventListener(
2595 "click",
2596 function (event) {
2597
2598 var botaoModal =
2599 event.target.closest(
2600 ".btn-modal"
2601 );
2602
2603
2604 if (botaoModal) {
2605
2606 event.preventDefault();
2607
2608 abrirModal(
2609 botaoModal
2610 );
2611
2612 return;
2613
2614 }
2615
2616
2617 var fechar =
2618 event.target.closest(
2619 ".close-modal"
2620 );
2621
2622
2623 if (fechar) {
2624
2625 event.preventDefault();
2626
2627 fecharModal();
2628
2629 return;
2630
2631 }
2632
2633
2634 /*
2635 * Fecha clicando no fundo
2636 */
2637 if (
2638 modal &&
2639 event.target === modal
2640 ) {
2641
2642 fecharModal();
2643
2644 }
2645
2646 }
2647 );
2648
2649
2650 /* =========================================================
2651 ESC
2652 ========================================================= */
2653
2654 document.addEventListener(
2655 "keydown",
2656 function (event) {
2657
2658 if (
2659 event.key === "Escape" &&
2660 modal &&
2661 !modal.hidden
2662 ) {
2663
2664 fecharModal();
2665
2666 }
2667
2668 }
2669 );
2670
2671
2672 /* =========================================================
2673 INICIALIZAÇÃO
2674 ========================================================= */
2675
2676 formatarSegmentosCards();
2677
2678 gerarFiltros();
2679
2680 filtrarParceiros();
2681
2682})();
2683</script>
The following has evaluated to null or missing:
==> Fieldset67243883 [in template "20102#20128#189538129" at line 811, column 8]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #list Fieldset67243883.getSiblings() ... [in template "20102#20128#189538129" at line 811, column 1]
----
1<style type="text/css">
2/* =========================================================
3 PARCEIROS SIPAG - LAYOUT PRINCIPAL
4========================================================= */
5
6.sipag-parceiros {
7 background-color: #fff;
8 color: #003641;
9 padding: 34px 0 56px;
10}
11
12.sipag-parceiros > .container {
13 max-width: 1440px;
14 padding-left: 24px;
15 padding-right: 24px;
16 width: 100%;
17}
18
19/* =========================================================
20 FILTROS
21========================================================= */
22
23.sipag-parceiros .parceiros-filtros-area {
24 margin-bottom: 34px;
25}
26
27.sipag-parceiros .parceiros-intro {
28 color: #003641;
29 font-size: 17px;
30 line-height: 1.4;
31 margin: 0 0 26px;
32 text-align: center;
33}
34
35.sipag-parceiros .filtros {
36 align-items: center;
37 display: flex;
38 flex-wrap: wrap;
39 gap: 12px;
40 justify-content: center;
41 margin: 0 auto;
42 width: 100%;
43}
44
45.sipag-parceiros .btn-pill {
46 align-items: center;
47 background-color: #fff;
48 border: 1px solid #d9dcdf;
49 border-radius: 10px;
50 box-shadow: none;
51 color: #272833;
52 cursor: pointer;
53 display: inline-flex;
54 flex: 0 0 auto;
55 font-size: 18px;
56 font-weight: 700;
57 justify-content: center;
58 line-height: 1.2;
59 min-height: 64px;
60 min-width: 250px;
61 padding: 14px 22px;
62 text-align: center;
63 text-transform: uppercase;
64 transition:
65 background-color .2s ease,
66 border-color .2s ease,
67 color .2s ease;
68 white-space: nowrap;
69}
70
71.sipag-parceiros .btn-pill:hover {
72 background-color: #f5fffd;
73 border-color: #00ae9d;
74 color: #003641;
75}
76
77.sipag-parceiros .btn-pill.active {
78 background-color: #003641;
79 border-color: #003641;
80 color: #fff;
81}
82
83.sipag-parceiros .btn-pill:focus {
84 box-shadow: 0 0 0 3px rgba(0, 174, 157, .16);
85 outline: none;
86}
87
88/* =========================================================
89 BUSCA
90========================================================= */
91
92.sipag-parceiros .parceiros-busca {
93 margin: 0 auto 56px;
94 max-width: none;
95 position: relative;
96 width: 100%;
97}
98
99.sipag-parceiros .parceiros-busca-icone {
100 color: #00ae9d;
101 height: 28px;
102 left: 21px;
103 pointer-events: none;
104 position: absolute;
105 top: 50%;
106 transform: translateY(-50%);
107 width: 28px;
108}
109
110.sipag-parceiros .parceiros-busca-campo {
111 background-color: #fff;
112 border: 2px solid #00ae9d;
113 border-radius: 7px;
114 color: #003641;
115 font-size: 16px;
116 height: 68px;
117 outline: none;
118 padding: 0 24px 0 62px;
119 transition:
120 border-color .2s ease,
121 box-shadow .2s ease;
122 width: 100%;
123}
124
125.sipag-parceiros .parceiros-busca-campo::placeholder {
126 color: #b1bbc8;
127 opacity: 1;
128}
129
130.sipag-parceiros .parceiros-busca-campo:focus {
131 border-color: #00ae9d;
132 box-shadow: 0 0 0 3px rgba(0, 174, 157, .12);
133}
134
135/* =========================================================
136 GRID
137========================================================= */
138
139.sipag-parceiros #grid-parceiros {
140 align-items: stretch;
141}
142
143.sipag-parceiros .parceiro {
144 display: flex;
145}
146
147/* =========================================================
148 CARD
149========================================================= */
150
151.sipag-parceiros .card-parceiro {
152 background-color: #fff;
153 border: 1px solid #dedede;
154 border-radius: 14px;
155 box-shadow: none;
156 display: flex;
157 flex-direction: column;
158 min-height: 510px;
159 padding: 18px;
160 transition:
161 border-color .2s ease,
162 box-shadow .2s ease;
163 width: 100%;
164}
165
166.sipag-parceiros .card-parceiro:hover {
167 border-color: #d1d8d7;
168 box-shadow: 0 8px 22px rgba(0, 54, 65, .08);
169 transform: none;
170}
171
172/* =========================================================
173 LOGO
174========================================================= */
175
176.sipag-parceiros .parceiro-logo {
177 align-items: center;
178 display: flex;
179 height: 255px;
180 justify-content: center;
181 margin-bottom: 0;
182 overflow: hidden;
183 width: 100%;
184}
185
186.sipag-parceiros .parceiro-logo img {
187 display: block;
188 max-height: 169px;
189 max-width: 230px;
190 object-fit: contain;
191 width: auto;
192}
193
194/* =========================================================
195 TEXTO DO CARD
196========================================================= */
197
198.sipag-parceiros .card-parceiro h6 {
199 color: #00ae9d;
200 font-size: 23px;
201 font-weight: 700;
202 line-height: 1.25;
203 margin: 0 0 10px;
204}
205
206.sipag-parceiros .parceiro-segmento {
207 color: #5b5b5b;
208 font-size: 15px;
209 line-height: 1.55;
210 margin: 0 0 24px;
211}
212
213/* =========================================================
214 AÇÕES DO CARD
215========================================================= */
216
217.sipag-parceiros .parceiro-acoes {
218 display: flex;
219 flex-direction: column;
220 gap: 10px;
221 margin-top: auto;
222 width: 100%;
223}
224
225.sipag-parceiros .btn-parceiro {
226 align-items: center;
227 border-radius: 9px;
228 cursor: pointer;
229 display: inline-flex;
230 flex: none;
231 font-size: 18px;
232 font-weight: 700;
233 justify-content: center;
234 min-height: 62px;
235 padding: 10px 14px;
236 text-align: center;
237 text-decoration: none !important;
238 transition:
239 background-color .2s ease,
240 border-color .2s ease,
241 color .2s ease;
242 width: 100%;
243}
244
245.sipag-parceiros .btn-site {
246 background-color: #fff;
247 border: 1px solid #00ae9d;
248 color: #00ae9d;
249}
250
251.sipag-parceiros .btn-site:hover {
252 background-color: #f3fffd;
253 border-color: #00ae9d;
254 color: #008f83;
255}
256
257.sipag-parceiros .btn-saiba {
258 background-color: #00ae9d;
259 border: 1px solid #00ae9d;
260 color: #fff;
261}
262
263.sipag-parceiros .btn-saiba:hover {
264 background-color: #008f83;
265 border-color: #008f83;
266 color: #fff;
267}
268
269/* =========================================================
270 NENHUM RESULTADO
271========================================================= */
272
273.sipag-parceiros .parceiros-vazio {
274 color: #536463;
275 font-size: 18px;
276 margin: 40px 0;
277 text-align: center;
278}
279
280@media (max-width: 1199.98px) {
281 .sipag-parceiros > .container {
282 max-width: 1140px;
283 }
284
285 .sipag-parceiros .btn-pill {
286 font-size: 16px;
287 min-height: 58px;
288 min-width: 210px;
289 }
290
291 .sipag-parceiros .card-parceiro {
292 min-height: 545px;
293 }
294
295 .sipag-parceiros .parceiro-logo {
296 height: 235px;
297 }
298
299 .sipag-parceiros .parceiro-logo img {
300 max-height: 140px;
301 max-width: 210px;
302 }
303}
304
305/* =========================================================
306 MODAL - FUNDO
307========================================================= */
308
309.modal-parceiro-sipag {
310 align-items: center;
311 background-color: rgba(0, 0, 0, .55);
312 bottom: 0;
313 display: flex;
314 justify-content: center;
315 left: 0;
316 overflow-y: auto;
317 padding: 14px;
318 position: fixed;
319 right: 0;
320 top: 0;
321 z-index: 11000;
322}
323
324.modal-parceiro-sipag[hidden] {
325 display: none !important;
326}
327
328/* =========================================================
329 MODAL - CONTAINER
330========================================================= */
331
332.modal-parceiro-sipag .modal-parceiro-dialog {
333 background-color: #fff;
334 border-radius: 18px;
335 box-shadow: 0 16px 45px rgba(0, 54, 65, .25);
336 margin: auto;
337 max-width: 1265px;
338 overflow: hidden;
339 width: 100%;
340}
341
342/* =========================================================
343 MODAL - CABEÇALHO
344========================================================= */
345
346.modal-parceiro-sipag .modal-parceiro-header {
347 align-items: center;
348 border-bottom: 1px solid #dfe5e4;
349 display: flex;
350 justify-content: space-between;
351 min-height: 68px;
352 padding: 12px 38px;
353}
354
355.modal-parceiro-sipag .modal-parceiro-header h4 {
356 color: #00ae9d;
357 font-size: 34px;
358 font-weight: 700;
359 line-height: 1.2;
360 margin: 0;
361}
362
363/* =========================================================
364 MODAL - FECHAR
365========================================================= */
366
367.modal-parceiro-sipag .close-modal {
368 align-items: center;
369 background-color: #fff;
370 border: 2px solid #005461;
371 border-radius: 50%;
372 color: #005461;
373 cursor: pointer;
374 display: flex;
375 flex: 0 0 38px;
376 font-size: 28px;
377 font-weight: 400;
378 height: 38px;
379 justify-content: center;
380 line-height: 1;
381 padding: 0 0 3px;
382 transition:
383 background-color .2s ease,
384 color .2s ease;
385 width: 38px;
386}
387
388.modal-parceiro-sipag .close-modal:hover {
389 background-color: #005461;
390 color: #fff;
391}
392
393.modal-parceiro-sipag .close-modal:focus {
394 box-shadow: 0 0 0 3px rgba(0, 174, 157, .2);
395 outline: none;
396}
397
398/* =========================================================
399 MODAL - CORPO
400========================================================= */
401
402.modal-parceiro-sipag .modal-parceiro-body {
403 max-height: calc(100vh - 100px);
404 overflow-y: auto;
405 padding: 24px 28px 34px;
406}
407
408/* =========================================================
409 MODAL - BLOCOS
410========================================================= */
411
412.modal-parceiro-sipag .modal-bloco {
413 border: 1px solid #00ae9d;
414 border-radius: 9px;
415 box-sizing: border-box;
416 margin: 0;
417 padding: 22px 24px;
418}
419
420.modal-parceiro-sipag .modal-bloco h6 {
421 color: #00ae9d;
422 font-size: 20px;
423 font-weight: 700;
424 line-height: 1.3;
425 margin: 0 0 20px;
426}
427
428/* =========================================================
429 DESCRIÇÃO
430========================================================= */
431
432.modal-parceiro-sipag #modalBlocoDescricao {
433 margin-bottom: 16px;
434 min-height: 145px;
435}
436
437.modal-parceiro-sipag #modalDescricao,
438.modal-parceiro-sipag #modalDescricao p {
439 color: #004653;
440 font-size: 21px;
441 line-height: 1.7;
442}
443
444.modal-parceiro-sipag #modalDescricao p {
445 margin: 0 0 8px;
446}
447
448.modal-parceiro-sipag #modalDescricao p:last-child {
449 margin-bottom: 0;
450}
451
452/* =========================================================
453 GRID DO MODAL
454========================================================= */
455
456.modal-parceiro-sipag .modal-detalhes-grid {
457 display: grid;
458 gap: 16px 20px;
459 grid-template-columns: repeat(2, minmax(0, 1fr));
460}
461
462.modal-parceiro-sipag #modalBlocoSegmentos,
463.modal-parceiro-sipag #modalBlocoTerminais {
464 min-height: 280px;
465}
466
467.modal-parceiro-sipag #modalBlocoContato,
468.modal-parceiro-sipag #modalBlocoSite {
469 min-height: 170px;
470}
471
472/* =========================================================
473 SEGMENTOS DO MODAL
474========================================================= */
475
476.modal-parceiro-sipag .modal-segmentos {
477 align-items: flex-start;
478 display: flex;
479 flex-wrap: wrap;
480 gap: 12px;
481}
482
483.modal-parceiro-sipag .modal-segmento-tag {
484 background-color: #fafafa;
485 border: 1px solid #cfcfcf;
486 border-radius: 6px;
487 color: #5d6262;
488 display: inline-flex;
489 font-size: 15px;
490 font-weight: 400;
491 line-height: 1.2;
492 padding: 10px 12px;
493 text-transform: uppercase;
494}
495
496/* =========================================================
497 TERMINAIS
498========================================================= */
499
500.modal-parceiro-sipag #modalTerminais,
501.modal-parceiro-sipag #modalTerminais p {
502 color: #004653;
503 font-size: 21px;
504 line-height: 1.8;
505}
506
507.modal-parceiro-sipag #modalTerminais p {
508 margin: 0 0 6px;
509}
510
511.modal-parceiro-sipag #modalTerminais p:last-child {
512 margin-bottom: 0;
513}
514
515/* =========================================================
516 CONTATO
517========================================================= */
518
519.modal-parceiro-sipag #modalContato {
520 color: #004653;
521 font-size: 21px;
522 line-height: 1.8;
523}
524
525.modal-parceiro-sipag #modalContato p {
526 color: #004653;
527 font-size: 21px;
528 line-height: 1.8;
529 margin: 0;
530}
531
532.modal-parceiro-sipag #modalContato strong {
533 color: #004653;
534 font-weight: 400;
535}
536
537.modal-parceiro-sipag #modalContato a {
538 color: #00a99d;
539 text-decoration: none;
540}
541
542.modal-parceiro-sipag #modalContato a:hover {
543 text-decoration: underline;
544}
545
546/* =========================================================
547 WEBSITE
548========================================================= */
549
550.modal-parceiro-sipag #modalSite {
551 font-size: 21px;
552 line-height: 1.7;
553}
554
555.modal-parceiro-sipag #modalSite a {
556 color: #00a99d;
557 overflow-wrap: anywhere;
558 text-decoration: none;
559}
560
561.modal-parceiro-sipag #modalSite a:hover {
562 text-decoration: underline;
563}
564
565/* =========================================================
566 RICH TEXT
567========================================================= */
568
569.modal-parceiro-sipag .modal-bloco ul,
570.modal-parceiro-sipag .modal-bloco ol {
571 color: #004653;
572 margin-bottom: 0;
573 padding-left: 20px;
574}
575
576.modal-parceiro-sipag .modal-bloco li {
577 color: #004653;
578 line-height: 1.7;
579 margin-bottom: 5px;
580}
581
582/* =========================================================
583 MOBILE
584========================================================= */
585
586@media (max-width: 767.98px) {
587 .sipag-parceiros {
588 padding: 28px 0 40px;
589 }
590
591 .sipag-parceiros > .container {
592 padding-left: 15px;
593 padding-right: 15px;
594 }
595
596 .sipag-parceiros .parceiros-filtros-area {
597 margin-bottom: 24px;
598 }
599
600 .sipag-parceiros .parceiros-intro {
601 font-size: 16px;
602 margin-bottom: 18px;
603 }
604
605 .sipag-parceiros .filtros {
606 flex-wrap: nowrap;
607 gap: 10px;
608 justify-content: flex-start;
609 margin-left: -15px;
610 margin-right: -15px;
611 overflow-x: auto;
612 padding: 3px 15px 12px;
613 width: auto;
614 -webkit-overflow-scrolling: touch;
615 }
616
617 .sipag-parceiros .filtros::-webkit-scrollbar {
618 height: 4px;
619 }
620
621 .sipag-parceiros .filtros::-webkit-scrollbar-thumb {
622 background-color: #b5c7c5;
623 border-radius: 10px;
624 }
625
626 .sipag-parceiros .btn-pill {
627 border-radius: 8px;
628 flex: 0 0 auto;
629 font-size: 14px;
630 min-height: 54px;
631 min-width: 205px;
632 padding: 12px 16px;
633 }
634
635 .sipag-parceiros .parceiros-busca {
636 margin-bottom: 34px;
637 }
638
639 .sipag-parceiros .parceiros-busca-campo {
640 font-size: 16px;
641 height: 56px;
642 padding-left: 52px;
643 }
644
645 .sipag-parceiros .parceiros-busca-icone {
646 height: 22px;
647 left: 18px;
648 width: 22px;
649 }
650
651 .sipag-parceiros .card-parceiro {
652 border-radius: 12px;
653 min-height: auto;
654 padding: 20px;
655 }
656
657 .sipag-parceiros .parceiro-logo {
658 height: 200px;
659 }
660
661 .sipag-parceiros .parceiro-logo img {
662 max-height: 130px;
663 max-width: 200px;
664 }
665
666 .sipag-parceiros .card-parceiro h6 {
667 font-size: 21px;
668 }
669
670 .sipag-parceiros .parceiro-segmento {
671 font-size: 14px;
672 }
673
674 .sipag-parceiros .parceiro-acoes {
675 flex-direction: column;
676 }
677
678 .sipag-parceiros .btn-parceiro {
679 font-size: 17px;
680 min-height: 54px;
681 width: 100%;
682 }
683
684 .modal-parceiro-sipag {
685 align-items: flex-end;
686 padding: 0;
687 }
688
689 .modal-parceiro-sipag .modal-parceiro-dialog {
690 border-radius: 16px 16px 0 0;
691 max-height: 95vh;
692 }
693
694 .modal-parceiro-sipag .modal-parceiro-header {
695 min-height: 65px;
696 padding: 14px 20px;
697 }
698
699 .modal-parceiro-sipag .modal-parceiro-header h4 {
700 font-size: 24px;
701 }
702
703 .modal-parceiro-sipag .close-modal {
704 flex: 0 0 36px;
705 height: 36px;
706 width: 36px;
707 }
708
709 .modal-parceiro-sipag .modal-parceiro-body {
710 max-height: calc(95vh - 65px);
711 padding: 18px 15px 25px;
712 }
713
714 .modal-parceiro-sipag .modal-detalhes-grid {
715 grid-template-columns: 1fr;
716 }
717
718 .modal-parceiro-sipag .modal-bloco {
719 min-height: auto !important;
720 padding: 20px;
721 }
722
723 .modal-parceiro-sipag #modalBlocoDescricao {
724 min-height: auto;
725 }
726
727 .modal-parceiro-sipag .modal-bloco h6 {
728 margin-bottom: 15px;
729 }
730}
731</style>
732
733<div class="col-12 px-0">
734 <section class="sipag-parceiros" id="sipag-parceiros">
735
736<div class="container">
737
738 <!-- =====================================================
739 FILTROS
740 ====================================================== -->
741
742 <div
743 class="parceiros-filtros-area"
744 id="parceiros-filtros-area"
745 >
746
747<p class="parceiros-intro">
748 Filtre abaixo os segmentos que deseja visualizar:
749</p>
750
751<div
752 aria-label="Filtrar parceiros por segmento"
753 class="filtros"
754 id="filtros-parceiros"
755 role="group"
756></div>
757
758 </div>
759
760 <!-- =====================================================
761 BUSCA
762 ====================================================== -->
763
764 <div class="parceiros-busca" role="search">
765
766<label
767 class="sr-only"
768 for="busca-parceiros"
769>
770 Pesquisar parceiros por nome ou categoria
771</label>
772
773<svg
774 aria-hidden="true"
775 class="parceiros-busca-icone"
776 fill="none"
777 viewBox="0 0 24 24"
778>
779 <circle
780 cx="11"
781 cy="11"
782 r="7"
783 stroke="currentColor"
784 stroke-width="2"
785 ></circle>
786
787 <path
788 d="M16 16L21 21"
789 stroke="currentColor"
790 stroke-linecap="round"
791 stroke-width="2"
792 ></path>
793</svg>
794
795<input
796 autocomplete="off"
797 class="parceiros-busca-campo"
798 id="busca-parceiros"
799 placeholder="Pesquise por nome do anexo ou categoria"
800 type="search"
801/>
802
803 </div>
804
805 <!-- =====================================================
806 GRID DE PARCEIROS
807 ====================================================== -->
808
809 <div class="row" id="grid-parceiros">
810
811<#list Fieldset67243883.getSiblings() as parceiro>
812
813 <#assign nome = parceiro.Text51037391.getData()!"" />
814 <#assign segmentos = parceiro.CheckboxMultiple15617005.getData()!"" />
815 <#assign site = parceiro.Text51612886.getData()!"" />
816
817 <#assign siteUrl = site />
818
819 <#if site?has_content
820 && !site?starts_with("http://")
821 && !site?starts_with("https://")>
822
823 <#assign siteUrl = "https://" + site />
824
825 </#if>
826
827
828 <div
829 class="col-sm-6 col-lg-4 col-xl-3 mb-4 parceiro"
830 data-category="${segmentos?html}"
831 data-name="${nome?html}"
832 >
833
834 <div class="card-parceiro">
835
836 <!-- LOGO -->
837 <div class="parceiro-logo">
838
839 <#if parceiro.Image82450298.getData()??
840 && parceiro.Image82450298.getData() != "">
841
842 <img
843 alt="${nome?html}"
844 class="img-fluid"
845 loading="lazy"
846 src="${parceiro.Image82450298.getData()}"
847 />
848
849 </#if>
850
851 </div>
852
853
854 <!-- NOME -->
855 <h6>
856 ${nome?html}
857 </h6>
858
859
860 <!-- SEGMENTOS -->
861 <p class="parceiro-segmento js-segmento-card"></p>
862
863
864 <!-- AÇÕES -->
865 <div class="parceiro-acoes">
866
867 <#if site?has_content>
868
869 <a
870 class="btn-parceiro btn-site"
871 href="${siteUrl?html}"
872 rel="noopener noreferrer"
873 target="_blank"
874 >
875 Acessar site
876 </a>
877
878 </#if>
879
880
881 <button
882 class="btn-parceiro btn-saiba btn-modal"
883 type="button"
884 >
885 Saiba mais
886 </button>
887
888 </div>
889
890
891 <!-- =================================================
892 DADOS UTILIZADOS PELO MODAL
893 ================================================== -->
894
895 <div
896 aria-hidden="true"
897 class="parceiro-dados d-none"
898 >
899
900 <span class="js-nome">
901 ${nome?html}
902 </span>
903
904
905 <span class="js-segmentos">
906 ${segmentos?html}
907 </span>
908
909
910 <div class="js-descricao">
911
912<#if (Fieldset67243883.RichText77766022.getData())??>
913${Fieldset67243883.RichText77766022.getData()}
914</#if>
915</div>
916
917 <div class="js-terminais">
918
919<#if (Fieldset67243883.RichText36172897.getData())??>
920${Fieldset67243883.RichText36172897.getData()}
921</#if>
922</div>
923
924 <span class="js-email">
925 <#if parceiro.Text26526715.getData()??>
926 ${parceiro.Text26526715.getData()?html}
927 </#if>
928 </span>
929
930
931 <span class="js-whatsapp">
932 <#if parceiro.Campo12763757.getData()??>
933 ${parceiro.Campo12763757.getData()?html}
934 </#if>
935 </span>
936
937
938 <span class="js-instagram">
939 <#if parceiro.Campo47414182.getData()??>
940 ${parceiro.Campo47414182.getData()?html}
941 </#if>
942 </span>
943
944
945 <span class="js-site">
946 ${site?html}
947 </span>
948
949 </div>
950
951 </div>
952
953 </div>
954
955</#list>
956
957 </div>
958
959 <!-- =====================================================
960 SEM RESULTADO
961 ====================================================== -->
962
963 <p
964 aria-live="polite"
965 class="parceiros-vazio"
966 hidden
967 id="parceiros-vazio"
968 role="status"
969 >
970 Nenhum parceiro encontrado.
971 </p>
972
973</div>
974
975<!-- =====================================================
976 MODAL
977====================================================== -->
978
979<div
980 aria-labelledby="modalParceiroTitulo"
981 aria-modal="true"
982 class="modal-parceiro-sipag"
983 hidden
984 id="modalParceiro"
985 role="dialog"
986>
987
988 <div class="modal-parceiro-dialog">
989
990<!-- CABEÇALHO -->
991<div class="modal-parceiro-header">
992
993 <h4 id="modalParceiroTitulo"></h4>
994
995 <button
996 aria-label="Fechar modal"
997 class="close-modal"
998 type="button"
999 >
1000 ×
1001 </button>
1002
1003</div>
1004
1005
1006<!-- CORPO -->
1007<div class="modal-parceiro-body">
1008
1009 <!-- DESCRIÇÃO -->
1010 <div
1011 class="modal-bloco"
1012 id="modalBlocoDescricao"
1013 >
1014
1015 <h6>Descrição</h6>
1016
1017 <div id="modalDescricao"></div>
1018
1019 </div>
1020
1021
1022 <!-- GRID 2x2 -->
1023 <div class="modal-detalhes-grid">
1024
1025 <!-- SEGMENTOS -->
1026 <div
1027 class="modal-bloco"
1028 id="modalBlocoSegmentos"
1029 >
1030
1031 <h6>Segmentos atendidos</h6>
1032
1033 <div
1034 class="modal-segmentos"
1035 id="modalSegmentos"
1036 ></div>
1037
1038 </div>
1039
1040
1041 <!-- TERMINAIS -->
1042 <div
1043 class="modal-bloco"
1044 id="modalBlocoTerminais"
1045 >
1046
1047 <h6>Terminais habilitados</h6>
1048
1049 <div id="modalTerminais"></div>
1050
1051 </div>
1052
1053
1054 <!-- CONTATO -->
1055 <div
1056 class="modal-bloco"
1057 id="modalBlocoContato"
1058 >
1059
1060 <h6>Informações e contato</h6>
1061
1062 <div id="modalContato"></div>
1063
1064 </div>
1065
1066
1067 <!-- WEBSITE -->
1068 <div
1069 class="modal-bloco"
1070 id="modalBlocoSite"
1071 >
1072
1073 <h6>Website</h6>
1074
1075 <div id="modalSite"></div>
1076
1077 </div>
1078
1079 </div>
1080
1081</div>
1082
1083 </div>
1084
1085</div>
1086
1087 </section>
1088</div>
1089
1090<script>
1091(function () {
1092
1093 var componente = document.getElementById("sipag-parceiros");
1094
1095 if (!componente) {
1096 return;
1097 }
1098
1099
1100 if (
1101 componente.getAttribute(
1102 "data-inicializado"
1103 ) === "true"
1104 ) {
1105 return;
1106 }
1107
1108
1109 componente.setAttribute(
1110 "data-inicializado",
1111 "true"
1112 );
1113
1114
1115 /* =========================================================
1116 ELEMENTOS
1117 ========================================================= */
1118
1119 var busca =
1120 componente.querySelector(
1121 "#busca-parceiros"
1122 );
1123
1124 var filtrosContainer =
1125 componente.querySelector(
1126 "#filtros-parceiros"
1127 );
1128
1129 var filtrosArea =
1130 componente.querySelector(
1131 "#parceiros-filtros-area"
1132 );
1133
1134 var parceiros =
1135 componente.querySelectorAll(
1136 ".parceiro"
1137 );
1138
1139 var mensagemVazia =
1140 componente.querySelector(
1141 "#parceiros-vazio"
1142 );
1143
1144
1145 var filtroAtual = "all";
1146
1147
1148 /* =========================================================
1149 NORMALIZA TEXTO
1150 ========================================================= */
1151
1152 function normalizarTexto(texto) {
1153
1154 var valor =
1155 (texto || "")
1156 .toString()
1157 .toLowerCase();
1158
1159
1160 if (valor.normalize) {
1161
1162 valor = valor
1163 .normalize("NFD")
1164 .replace(
1165 /[\u0300-\u036f]/g,
1166 ""
1167 );
1168
1169 }
1170
1171
1172 return valor
1173 .replace(
1174 /[^a-z0-9]+/g,
1175 " "
1176 )
1177 .trim();
1178
1179 }
1180
1181
1182 /* =========================================================
1183 OBTÉM SEGMENTOS
1184
1185 Suporta:
1186 ["varejo","servicos"]
1187
1188 varejo,servicos
1189
1190 varejo;servicos
1191 ========================================================= */
1192
1193 function obterSegmentos(valor) {
1194
1195 if (!valor) {
1196 return [];
1197 }
1198
1199
1200 var texto =
1201 valor.toString().trim();
1202
1203
1204 if (!texto) {
1205 return [];
1206 }
1207
1208
1209 /*
1210 * Tenta JSON primeiro.
1211 */
1212 try {
1213
1214 var json =
1215 JSON.parse(texto);
1216
1217
1218 if (Array.isArray(json)) {
1219
1220 return json
1221 .map(function (item) {
1222
1223 return item
1224 .toString()
1225 .trim();
1226
1227 })
1228 .filter(Boolean);
1229
1230 }
1231
1232 } catch (erro) {
1233 /* segue normalmente */
1234 }
1235
1236
1237 texto = texto
1238 .replace(/^\[/, "")
1239 .replace(/\]$/, "")
1240 .replace(/"/g, "")
1241 .replace(/'/g, "");
1242
1243
1244 return texto
1245 .split(/[,;|]+/)
1246 .map(function (item) {
1247
1248 return item.trim();
1249
1250 })
1251 .filter(Boolean);
1252
1253 }
1254
1255
1256 /* =========================================================
1257 CHAVE CANÔNICA DO SEGMENTO
1258 ========================================================= */
1259
1260 function obterChaveSegmento(segmento) {
1261
1262 var chave =
1263 normalizarTexto(segmento);
1264
1265
1266 if (
1267 chave.indexOf("alimentacao") !== -1 ||
1268 chave.indexOf("bares restaurantes") !== -1
1269 ) {
1270 return "alimentacao";
1271 }
1272
1273 if (chave.indexOf("evento") !== -1) {
1274 return "eventos";
1275 }
1276
1277 if (chave.indexOf("industr") !== -1) {
1278 return "industria";
1279 }
1280
1281 if (
1282 chave.indexOf("posto") !== -1 &&
1283 chave.indexOf("combust") !== -1
1284 ) {
1285 return "postos";
1286 }
1287
1288 if (chave.indexOf("saude") !== -1) {
1289 return "saude";
1290 }
1291
1292 if (chave.indexOf("servico") !== -1) {
1293 return "servicos";
1294 }
1295
1296 if (chave.indexOf("varejo") !== -1) {
1297 return "varejo";
1298 }
1299
1300
1301 return chave;
1302
1303 }
1304
1305
1306 /* =========================================================
1307 LABEL DO FILTRO
1308 ========================================================= */
1309
1310 function obterLabelFiltroSegmento(chave, segmentoOriginal) {
1311
1312 var labels = {
1313 "alimentacao": "ALIMENTAÇÃO",
1314 "eventos": "EVENTOS",
1315 "industria": "INDÚSTRIA",
1316 "postos": "POSTOS DE COMBUSTÍVEIS",
1317 "saude": "SAÚDE",
1318 "servicos": "SERVIÇOS",
1319 "varejo": "VAREJO"
1320 };
1321
1322
1323 if (labels[chave]) {
1324 return labels[chave];
1325 }
1326
1327
1328 return (segmentoOriginal || "")
1329 .toString()
1330 .trim()
1331 .toUpperCase();
1332
1333 }
1334
1335
1336 /* =========================================================
1337 NOME VISUAL DO SEGMENTO NO CARD / MODAL
1338 ========================================================= */
1339
1340 function obterLabelSegmento(segmento) {
1341
1342 var chave =
1343 normalizarTexto(segmento);
1344
1345
1346 var labels = {
1347 "alimentacao": "Alimentação (Bares, Restaurantes e Lanchonetes)",
1348 "alimentacao bares restaurantes e lanchonetes":
1349 "Alimentação (Bares, Restaurantes e Lanchonetes)",
1350 "bares restaurantes e lanchonetes":
1351 "Alimentação (Bares, Restaurantes e Lanchonetes)",
1352 "eventos": "Eventos",
1353 "industria": "Indústria",
1354 "posto": "Postos de Combustíveis",
1355 "postos": "Postos de Combustíveis",
1356 "posto de combustivel": "Postos de Combustíveis",
1357 "postos de combustivel": "Postos de Combustíveis",
1358 "postos de combustiveis": "Postos de Combustíveis",
1359 "saude": "Saúde",
1360 "servicos": "Serviços",
1361 "varejo": "Varejo"
1362 };
1363
1364
1365 if (labels[chave]) {
1366 return labels[chave];
1367 }
1368
1369
1370 return segmento
1371 .toString()
1372 .trim();
1373
1374 }
1375
1376
1377 /* =========================================================
1378 FORMATA OS SEGMENTOS NOS CARDS
1379 ========================================================= */
1380
1381 function formatarListaSegmentos(lista) {
1382
1383 if (!lista.length) {
1384 return "";
1385 }
1386
1387 if (lista.length === 1) {
1388 return lista[0];
1389 }
1390
1391 if (lista.length === 2) {
1392 return lista[0] + " e " + lista[1];
1393 }
1394
1395
1396 return (
1397 lista.slice(0, -1).join(", ") +
1398 " e " +
1399 lista[lista.length - 1]
1400 );
1401
1402 }
1403
1404
1405 function formatarSegmentosCards() {
1406
1407 parceiros.forEach(
1408 function (parceiro) {
1409
1410 var campo =
1411 parceiro.querySelector(
1412 ".js-segmento-card"
1413 );
1414
1415
1416 if (!campo) {
1417 return;
1418 }
1419
1420
1421 var segmentos =
1422 obterSegmentos(
1423 parceiro.getAttribute(
1424 "data-category"
1425 )
1426 );
1427
1428
1429 var labels =
1430 segmentos.map(function (segmento) {
1431
1432 return obterLabelSegmento(
1433 segmento
1434 );
1435
1436 });
1437
1438
1439 campo.textContent =
1440 formatarListaSegmentos(labels);
1441
1442 }
1443 );
1444
1445 }
1446
1447
1448 /* =========================================================
1449 CRIAR FILTROS AUTOMATICAMENTE
1450
1451 SOMENTE SEGMENTOS USADOS
1452 ========================================================= */
1453
1454 function gerarFiltros() {
1455
1456 if (!filtrosContainer) {
1457 return;
1458 }
1459
1460
1461 var segmentosUsados = {};
1462
1463
1464 parceiros.forEach(
1465 function (parceiro) {
1466
1467 var categorias =
1468 obterSegmentos(
1469 parceiro.getAttribute(
1470 "data-category"
1471 )
1472 );
1473
1474
1475 categorias.forEach(
1476 function (categoria) {
1477
1478 var chave =
1479 obterChaveSegmento(
1480 categoria
1481 );
1482
1483
1484 if (!chave) {
1485 return;
1486 }
1487
1488
1489 if (
1490 !segmentosUsados[chave]
1491 ) {
1492
1493 segmentosUsados[chave] = {
1494 chave: chave,
1495 valor: categoria,
1496 label:
1497 obterLabelFiltroSegmento(
1498 chave,
1499 categoria
1500 )
1501 };
1502
1503 }
1504
1505 }
1506 );
1507
1508 }
1509 );
1510
1511
1512 while (
1513 filtrosContainer.firstChild
1514 ) {
1515
1516 filtrosContainer.removeChild(
1517 filtrosContainer.firstChild
1518 );
1519
1520 }
1521
1522
1523 var segmentos =
1524 Object.keys(
1525 segmentosUsados
1526 )
1527 .map(function (chave) {
1528
1529 return segmentosUsados[
1530 chave
1531 ];
1532
1533 });
1534
1535
1536 if (!segmentos.length) {
1537
1538 if (filtrosArea) {
1539
1540 filtrosArea.style.display =
1541 "none";
1542
1543 }
1544
1545 return;
1546
1547 }
1548
1549
1550 if (filtrosArea) {
1551
1552 filtrosArea.style.display = "";
1553
1554 }
1555
1556
1557 /* TODOS */
1558 var botaoTodos =
1559 document.createElement(
1560 "button"
1561 );
1562
1563
1564 botaoTodos.type = "button";
1565
1566 botaoTodos.className =
1567 "btn btn-pill active";
1568
1569 botaoTodos.setAttribute(
1570 "data-filter",
1571 "all"
1572 );
1573
1574 botaoTodos.setAttribute(
1575 "aria-pressed",
1576 "true"
1577 );
1578
1579
1580 botaoTodos.appendChild(
1581 document.createTextNode(
1582 "TODOS OS SEGMENTOS"
1583 )
1584 );
1585
1586
1587 filtrosContainer.appendChild(
1588 botaoTodos
1589 );
1590
1591
1592 /* ORDEM ALFABÉTICA */
1593 segmentos.sort(
1594 function (a, b) {
1595
1596 return a.label.localeCompare(
1597 b.label,
1598 "pt-BR"
1599 );
1600
1601 }
1602 );
1603
1604
1605 /* CRIA SOMENTE OS USADOS */
1606 segmentos.forEach(
1607 function (segmento) {
1608
1609 var botao =
1610 document.createElement(
1611 "button"
1612 );
1613
1614
1615 botao.type = "button";
1616
1617 botao.className =
1618 "btn btn-pill";
1619
1620 botao.setAttribute(
1621 "data-filter",
1622 segmento.chave
1623 );
1624
1625 botao.setAttribute(
1626 "aria-pressed",
1627 "false"
1628 );
1629
1630
1631 botao.appendChild(
1632 document.createTextNode(
1633 segmento.label
1634 )
1635 );
1636
1637
1638 filtrosContainer.appendChild(
1639 botao
1640 );
1641
1642 }
1643 );
1644
1645 }
1646
1647
1648 /* =========================================================
1649 FILTRAR PARCEIROS
1650 ========================================================= */
1651
1652 function filtrarParceiros() {
1653
1654 var termo =
1655 normalizarTexto(
1656 busca ?
1657 busca.value :
1658 ""
1659 );
1660
1661
1662 var quantidadeVisivel = 0;
1663
1664
1665 parceiros.forEach(
1666 function (parceiro) {
1667
1668 var nome =
1669 normalizarTexto(
1670 parceiro.getAttribute(
1671 "data-name"
1672 )
1673 );
1674
1675
1676 var segmentos =
1677 obterSegmentos(
1678 parceiro.getAttribute(
1679 "data-category"
1680 )
1681 );
1682
1683
1684 var categoriasNormalizadas =
1685 segmentos.map(
1686 function (item) {
1687
1688 return obterChaveSegmento(
1689 item
1690 );
1691
1692 }
1693 );
1694
1695
1696 var textoCategorias =
1697 segmentos
1698 .map(function (item) {
1699
1700 return normalizarTexto(
1701 item + " " +
1702 obterLabelSegmento(item)
1703 );
1704
1705 })
1706 .join(" ");
1707
1708
1709 /* BUSCA */
1710 var atendeBusca =
1711 !termo ||
1712 nome.indexOf(termo) !== -1 ||
1713 textoCategorias.indexOf(
1714 termo
1715 ) !== -1;
1716
1717
1718 /* FILTRO */
1719 var atendeFiltro =
1720 filtroAtual === "all" ||
1721 categoriasNormalizadas
1722 .indexOf(
1723 filtroAtual
1724 ) !== -1;
1725
1726
1727 var exibir =
1728 atendeBusca &&
1729 atendeFiltro;
1730
1731
1732 parceiro.style.display =
1733 exibir ? "" : "none";
1734
1735
1736 if (exibir) {
1737 quantidadeVisivel++;
1738 }
1739
1740 }
1741 );
1742
1743
1744 if (mensagemVazia) {
1745
1746 mensagemVazia.hidden =
1747 quantidadeVisivel !== 0;
1748
1749 }
1750
1751 }
1752
1753
1754 /* =========================================================
1755 EVENTO FILTROS
1756 ========================================================= */
1757
1758 if (filtrosContainer) {
1759
1760 filtrosContainer.addEventListener(
1761 "click",
1762 function (event) {
1763
1764 var botao =
1765 event.target.closest(
1766 ".btn-pill[data-filter]"
1767 );
1768
1769
1770 if (!botao) {
1771 return;
1772 }
1773
1774
1775 filtroAtual =
1776 botao.getAttribute(
1777 "data-filter"
1778 ) || "all";
1779
1780
1781 var botoes =
1782 filtrosContainer
1783 .querySelectorAll(
1784 ".btn-pill"
1785 );
1786
1787
1788 botoes.forEach(
1789 function (item) {
1790
1791 item.classList.remove(
1792 "active"
1793 );
1794
1795 item.setAttribute(
1796 "aria-pressed",
1797 "false"
1798 );
1799
1800 }
1801 );
1802
1803
1804 botao.classList.add(
1805 "active"
1806 );
1807
1808 botao.setAttribute(
1809 "aria-pressed",
1810 "true"
1811 );
1812
1813
1814 filtrarParceiros();
1815
1816 }
1817 );
1818
1819 }
1820
1821
1822 /* =========================================================
1823 EVENTO BUSCA
1824 ========================================================= */
1825
1826 if (busca) {
1827
1828 busca.addEventListener(
1829 "input",
1830 filtrarParceiros
1831 );
1832
1833 }
1834
1835
1836 /* =========================================================
1837 ELEMENTOS MODAL
1838 ========================================================= */
1839
1840 var modal =
1841 componente.querySelector(
1842 "#modalParceiro"
1843 );
1844
1845 var tituloModal =
1846 componente.querySelector(
1847 "#modalParceiroTitulo"
1848 );
1849
1850 var modalDescricao =
1851 componente.querySelector(
1852 "#modalDescricao"
1853 );
1854
1855 var modalSegmentos =
1856 componente.querySelector(
1857 "#modalSegmentos"
1858 );
1859
1860 var modalTerminais =
1861 componente.querySelector(
1862 "#modalTerminais"
1863 );
1864
1865 var modalContato =
1866 componente.querySelector(
1867 "#modalContato"
1868 );
1869
1870 var modalSite =
1871 componente.querySelector(
1872 "#modalSite"
1873 );
1874
1875
1876 var blocoDescricao =
1877 componente.querySelector(
1878 "#modalBlocoDescricao"
1879 );
1880
1881 var blocoSegmentos =
1882 componente.querySelector(
1883 "#modalBlocoSegmentos"
1884 );
1885
1886 var blocoTerminais =
1887 componente.querySelector(
1888 "#modalBlocoTerminais"
1889 );
1890
1891 var blocoContato =
1892 componente.querySelector(
1893 "#modalBlocoContato"
1894 );
1895
1896 var blocoSite =
1897 componente.querySelector(
1898 "#modalBlocoSite"
1899 );
1900
1901
1902 var elementoFocoAnterior = null;
1903 var overflowAnterior = "";
1904
1905
1906 /* =========================================================
1907 LIMPAR ELEMENTO
1908 ========================================================= */
1909
1910 function limparElemento(elemento) {
1911
1912 if (!elemento) {
1913 return;
1914 }
1915
1916
1917 while (elemento.firstChild) {
1918
1919 elemento.removeChild(
1920 elemento.firstChild
1921 );
1922
1923 }
1924
1925 }
1926
1927
1928 /* =========================================================
1929 COPIA RICH TEXT
1930
1931 NÃO USA innerHTML
1932 ========================================================= */
1933
1934 function copiarConteudo(
1935 origem,
1936 destino
1937 ) {
1938
1939 limparElemento(destino);
1940
1941
1942 if (
1943 !origem ||
1944 !destino
1945 ) {
1946 return false;
1947 }
1948
1949
1950 var possuiConteudo =
1951 origem.textContent.trim() !== "" ||
1952 origem.children.length > 0;
1953
1954
1955 if (!possuiConteudo) {
1956 return false;
1957 }
1958
1959
1960 Array.prototype.slice
1961 .call(
1962 origem.childNodes
1963 )
1964 .forEach(
1965 function (node) {
1966
1967 destino.appendChild(
1968 node.cloneNode(true)
1969 );
1970
1971 }
1972 );
1973
1974
1975 return true;
1976
1977 }
1978
1979
1980 /* =========================================================
1981 CRIAR LINK
1982 ========================================================= */
1983
1984 function criarLink(
1985 texto,
1986 href,
1987 target
1988 ) {
1989
1990 var link =
1991 document.createElement("a");
1992
1993
1994 link.href = href;
1995
1996
1997 link.appendChild(
1998 document.createTextNode(
1999 texto
2000 )
2001 );
2002
2003
2004 if (target) {
2005
2006 link.target = target;
2007
2008 link.rel =
2009 "noopener noreferrer";
2010
2011 }
2012
2013
2014 return link;
2015
2016 }
2017
2018
2019 /* =========================================================
2020 URL WHATSAPP
2021 ========================================================= */
2022
2023 function criarUrlWhatsApp(
2024 numero
2025 ) {
2026
2027 var numeroLimpo =
2028 (numero || "")
2029 .replace(/\D/g, "");
2030
2031
2032 if (!numeroLimpo) {
2033 return "";
2034 }
2035
2036
2037 if (
2038 numeroLimpo.indexOf("55") !== 0
2039 ) {
2040
2041 numeroLimpo =
2042 "55" + numeroLimpo;
2043
2044 }
2045
2046
2047 return (
2048 "https://wa.me/" +
2049 numeroLimpo
2050 );
2051
2052 }
2053
2054
2055 /* =========================================================
2056 URL INSTAGRAM
2057 ========================================================= */
2058
2059 function criarUrlInstagram(
2060 instagram
2061 ) {
2062
2063 var valor =
2064 (instagram || "")
2065 .trim();
2066
2067
2068 if (!valor) {
2069 return "";
2070 }
2071
2072
2073 if (
2074 valor.indexOf(
2075 "http://"
2076 ) === 0 ||
2077 valor.indexOf(
2078 "https://"
2079 ) === 0
2080 ) {
2081
2082 return valor;
2083
2084 }
2085
2086
2087 valor = valor
2088 .replace(/^@/, "")
2089 .replace(/^www\./, "")
2090 .replace(
2091 /^instagram\.com\//,
2092 ""
2093 );
2094
2095
2096 return (
2097 "https://instagram.com/" +
2098 valor
2099 );
2100
2101 }
2102
2103
2104 /* =========================================================
2105 URL SITE
2106 ========================================================= */
2107
2108 function criarUrlSite(site) {
2109
2110 var valor =
2111 (site || "").trim();
2112
2113
2114 if (!valor) {
2115 return "";
2116 }
2117
2118
2119 if (
2120 valor.indexOf(
2121 "http://"
2122 ) === 0 ||
2123 valor.indexOf(
2124 "https://"
2125 ) === 0
2126 ) {
2127
2128 return valor;
2129
2130 }
2131
2132
2133 return (
2134 "https://" + valor
2135 );
2136
2137 }
2138
2139
2140 /* =========================================================
2141 ADICIONAR CONTATO
2142 ========================================================= */
2143
2144 function adicionarContato(
2145 titulo,
2146 texto,
2147 href,
2148 novaAba
2149 ) {
2150
2151 if (!texto) {
2152 return false;
2153 }
2154
2155
2156 var p =
2157 document.createElement("p");
2158
2159
2160 p.appendChild(
2161 document.createTextNode(
2162 titulo + ": "
2163 )
2164 );
2165
2166
2167 if (href) {
2168
2169 p.appendChild(
2170 criarLink(
2171 texto,
2172 href,
2173 novaAba ?
2174 "_blank" :
2175 ""
2176 )
2177 );
2178
2179 } else {
2180
2181 p.appendChild(
2182 document.createTextNode(
2183 texto
2184 )
2185 );
2186
2187 }
2188
2189
2190 modalContato.appendChild(p);
2191
2192
2193 return true;
2194
2195 }
2196
2197
2198 /* =========================================================
2199 SEGMENTOS DO MODAL
2200 ========================================================= */
2201
2202 function montarSegmentosModal(
2203 valor
2204 ) {
2205
2206 limparElemento(
2207 modalSegmentos
2208 );
2209
2210
2211 var segmentos =
2212 obterSegmentos(valor);
2213
2214
2215 if (!segmentos.length) {
2216 return false;
2217 }
2218
2219
2220 segmentos.forEach(
2221 function (segmento) {
2222
2223 var span =
2224 document.createElement(
2225 "span"
2226 );
2227
2228
2229 span.className =
2230 "modal-segmento-tag";
2231
2232
2233 span.appendChild(
2234 document.createTextNode(
2235 obterLabelSegmento(
2236 segmento
2237 )
2238 )
2239 );
2240
2241
2242 modalSegmentos
2243 .appendChild(span);
2244
2245 }
2246 );
2247
2248
2249 return true;
2250
2251 }
2252
2253
2254 /* =========================================================
2255 ABRIR MODAL
2256 ========================================================= */
2257
2258 function abrirModal(botao) {
2259
2260 if (!modal) {
2261 return;
2262 }
2263
2264
2265 var parceiro =
2266 botao.closest(
2267 ".parceiro"
2268 );
2269
2270
2271 if (!parceiro) {
2272 return;
2273 }
2274
2275
2276 var dados =
2277 parceiro.querySelector(
2278 ".parceiro-dados"
2279 );
2280
2281
2282 if (!dados) {
2283 return;
2284 }
2285
2286
2287 /* ======================
2288 NOME
2289 ====================== */
2290
2291 var nome =
2292 dados.querySelector(
2293 ".js-nome"
2294 );
2295
2296
2297 tituloModal.textContent =
2298 nome ?
2299 nome.textContent.trim() :
2300 "";
2301
2302
2303 /* ======================
2304 DESCRIÇÃO
2305 ====================== */
2306
2307 var descricao =
2308 dados.querySelector(
2309 ".js-descricao"
2310 );
2311
2312
2313 blocoDescricao.hidden =
2314 !copiarConteudo(
2315 descricao,
2316 modalDescricao
2317 );
2318
2319
2320 /* ======================
2321 SEGMENTOS
2322 ====================== */
2323
2324 var segmentos =
2325 dados.querySelector(
2326 ".js-segmentos"
2327 );
2328
2329
2330 blocoSegmentos.hidden =
2331 !montarSegmentosModal(
2332 segmentos ?
2333 segmentos
2334 .textContent
2335 .trim() :
2336 ""
2337 );
2338
2339
2340 /* ======================
2341 TERMINAIS
2342 ====================== */
2343
2344 var terminais =
2345 dados.querySelector(
2346 ".js-terminais"
2347 );
2348
2349
2350 blocoTerminais.hidden =
2351 !copiarConteudo(
2352 terminais,
2353 modalTerminais
2354 );
2355
2356
2357 /* ======================
2358 CONTATO
2359 ====================== */
2360
2361 limparElemento(
2362 modalContato
2363 );
2364
2365
2366 var emailElemento =
2367 dados.querySelector(
2368 ".js-email"
2369 );
2370
2371 var whatsappElemento =
2372 dados.querySelector(
2373 ".js-whatsapp"
2374 );
2375
2376 var instagramElemento =
2377 dados.querySelector(
2378 ".js-instagram"
2379 );
2380
2381
2382 var email =
2383 emailElemento ?
2384 emailElemento
2385 .textContent
2386 .trim() :
2387 "";
2388
2389
2390 var whatsapp =
2391 whatsappElemento ?
2392 whatsappElemento
2393 .textContent
2394 .trim() :
2395 "";
2396
2397
2398 var instagram =
2399 instagramElemento ?
2400 instagramElemento
2401 .textContent
2402 .trim() :
2403 "";
2404
2405
2406 var possuiContato = false;
2407
2408
2409 if (email) {
2410
2411 possuiContato =
2412 adicionarContato(
2413 "E-mail",
2414 email,
2415 "mailto:" + email,
2416 false
2417 ) ||
2418 possuiContato;
2419
2420 }
2421
2422
2423 if (whatsapp) {
2424
2425 possuiContato =
2426 adicionarContato(
2427 "WhatsApp",
2428 whatsapp,
2429 criarUrlWhatsApp(
2430 whatsapp
2431 ),
2432 true
2433 ) ||
2434 possuiContato;
2435
2436 }
2437
2438
2439 if (instagram) {
2440
2441 var instagramLabel =
2442 instagram;
2443
2444
2445 if (
2446 instagramLabel.indexOf(
2447 "http"
2448 ) !== 0 &&
2449 instagramLabel.charAt(0)
2450 !== "@"
2451 ) {
2452
2453 instagramLabel =
2454 "@" +
2455 instagramLabel;
2456
2457 }
2458
2459
2460 possuiContato =
2461 adicionarContato(
2462 "Instagram",
2463 instagramLabel,
2464 criarUrlInstagram(
2465 instagram
2466 ),
2467 true
2468 ) ||
2469 possuiContato;
2470
2471 }
2472
2473
2474 blocoContato.hidden =
2475 !possuiContato;
2476
2477
2478 /* ======================
2479 SITE
2480 ====================== */
2481
2482 limparElemento(
2483 modalSite
2484 );
2485
2486
2487 var siteElemento =
2488 dados.querySelector(
2489 ".js-site"
2490 );
2491
2492
2493 var site =
2494 siteElemento ?
2495 siteElemento
2496 .textContent
2497 .trim() :
2498 "";
2499
2500
2501 if (site) {
2502
2503 modalSite.appendChild(
2504 criarLink(
2505 site,
2506 criarUrlSite(site),
2507 "_blank"
2508 )
2509 );
2510
2511
2512 blocoSite.hidden = false;
2513
2514 } else {
2515
2516 blocoSite.hidden = true;
2517
2518 }
2519
2520
2521 /* ======================
2522 ABRIR
2523 ====================== */
2524
2525 elementoFocoAnterior =
2526 document.activeElement;
2527
2528
2529 overflowAnterior =
2530 document.body.style
2531 .overflow;
2532
2533
2534 modal.hidden = false;
2535
2536
2537 document.body.style
2538 .overflow = "hidden";
2539
2540
2541 var fechar =
2542 modal.querySelector(
2543 ".close-modal"
2544 );
2545
2546
2547 if (fechar) {
2548 fechar.focus();
2549 }
2550
2551 }
2552
2553
2554 /* =========================================================
2555 FECHAR MODAL
2556 ========================================================= */
2557
2558 function fecharModal() {
2559
2560 if (
2561 !modal ||
2562 modal.hidden
2563 ) {
2564 return;
2565 }
2566
2567
2568 modal.hidden = true;
2569
2570
2571 document.body.style
2572 .overflow =
2573 overflowAnterior;
2574
2575
2576 if (
2577 elementoFocoAnterior &&
2578 typeof elementoFocoAnterior
2579 .focus === "function"
2580 ) {
2581
2582 elementoFocoAnterior
2583 .focus();
2584
2585 }
2586
2587 }
2588
2589
2590 /* =========================================================
2591 CLIQUES
2592 ========================================================= */
2593
2594 componente.addEventListener(
2595 "click",
2596 function (event) {
2597
2598 var botaoModal =
2599 event.target.closest(
2600 ".btn-modal"
2601 );
2602
2603
2604 if (botaoModal) {
2605
2606 event.preventDefault();
2607
2608 abrirModal(
2609 botaoModal
2610 );
2611
2612 return;
2613
2614 }
2615
2616
2617 var fechar =
2618 event.target.closest(
2619 ".close-modal"
2620 );
2621
2622
2623 if (fechar) {
2624
2625 event.preventDefault();
2626
2627 fecharModal();
2628
2629 return;
2630
2631 }
2632
2633
2634 /*
2635 * Fecha clicando no fundo
2636 */
2637 if (
2638 modal &&
2639 event.target === modal
2640 ) {
2641
2642 fecharModal();
2643
2644 }
2645
2646 }
2647 );
2648
2649
2650 /* =========================================================
2651 ESC
2652 ========================================================= */
2653
2654 document.addEventListener(
2655 "keydown",
2656 function (event) {
2657
2658 if (
2659 event.key === "Escape" &&
2660 modal &&
2661 !modal.hidden
2662 ) {
2663
2664 fecharModal();
2665
2666 }
2667
2668 }
2669 );
2670
2671
2672 /* =========================================================
2673 INICIALIZAÇÃO
2674 ========================================================= */
2675
2676 formatarSegmentosCards();
2677
2678 gerarFiltros();
2679
2680 filtrarParceiros();
2681
2682})();
2683</script>
Dúvidas Frequentes
Agradecemos o seu interesse em abrir uma conta no Sicoob! O processo é bem simples e pode ser feito de maneira totalmente digital. Basta baixar nosso aplicativo, o App Sicoob.
Você também pode ir até a cooperativa mais próxima ou de sua escolha e realizar a abertura.
Clicando aqui, você encontra o Sicoob mais próximo de você.
Para abrir uma conta de microempreendedor individual (MEI), você precisa ir pessoalmente até uma de nossas cooperativas com os seguintes documentos:
- Contrato social/alterações do MEI
- CPF e identidade
- Comprovante de endereço
- Faturamento dos últimos meses
- Declaração de Imposto de Renda
Clicando aqui, você encontra o Sicoob mais próximo de você.
Para abrir uma conta Pessoa Jurídica, você precisa ir até uma de nossas cooperativas com os seguintes documentos:
- Contrato social/alterações, CNPJ/MF e inscrição estadual
- CPF e identidade
- Comprovante de endereço
- Balanço patrimonial e alvará (quando disponível)
- Faturamento dos últimos meses
- Declaração de Imposto de Renda da empresa
Clicando aqui, você encontra o Sicoob mais próximo.
Para abrir uma conta poupança, você precisa ir até uma de nossas cooperativas com os seguintes documentos:
- Documento de identificação
- Comprovante de endereço
- Comprovante de renda
Clicando aqui, você encontra o Sicoob mais próximo de você.
Caso já seja cooperado, você pode abrir a conta poupança direto pelo App Sicoob.
No Sicoob, antes de tudo, você é dono! Por isso, é preciso comprar uma parte do capital da cooperativa, a integralização. Esse valor é variável e você consegue ver qual valor será, ao selecionar a sua agência de preferência no app Faça Parte. Além desse valor, existe a opção de selecionar um pacote de serviços, e o custo dele também varia de uma cooperativa para outra.
1º passo: acesse sua conta pelo Internet Banking do Sicoob e acesse qualquer transação financeira. É considerada transação financeira toda operação que altere o saldo da conta, por exemplo, pagamento de títulos, transferência entre contas, resgate de poupança, etc. O cadastro pode ser iniciado através do menu "Outras Opções > Computadores > Gerenciamento de Computadores".
Siga os passos indicados, e anote o Código de Liberação que será apresentado ao final em seu computador (Código de Liberação é um número de 4 dígitos).
2º passo: agora, basta liberar o seu computador informando o Código de Liberação em outro canal de atendimento de sua escolha, que pode ser:
- Em um caixa eletrônico do Sicoob: acessando o menu, clique em "Outras opções > Liberar / Bloquear Computadores > SicoobNet Pessoal";
- Em sua cooperativa do Sicoob.
Ao concluir o "2º passo", seu computador estará cadastrado e liberado para realizar transações financeiras (pagamentos e transferências) pela Internet.
- Cadastre sua senha de acesso (8 dígitos) em qualquer cooperativa do Sicoob.
- A partir do site www.sicoob.com.br, informe os números de sua cooperativa e conta corrente e clique OK para continuar.
- Na tela que apresenta o teclado virtual, digite sua senha de 8 dígitos.
Pronto. Você já está no Internet Banking do Sicoob.
O cadastramento de computadores é obrigatório para efetuar as transações financeiras (pagamentos e transferências).
No acesso por meio de computadores não cadastrados e liberados, só será possível a execução de transações de consulta (saldos e extratos).
Para a abertura de uma conta conjunta, você e a pessoa que deseja abrir a conta em conjunto precisam ir pessoalmente até uma de nossas cooperativas com os seguintes documentos:
- Comprovante de residência
- Comprovante de renda
- Documentos pessoais (identidade e CPF)
Clicando aqui, você encontra o Sicoob mais próximo de você.
A cota capital é o valor que cada pessoa paga ao ingressar na cooperativa. Ela é paga na abertura da conta, e é depositada em uma conta capital. Essa conta é importante para a sustentabilidade da cooperativa, e não pode ser movimentada como a conta corrente comum. Seus aportes, bem como as condições de saque, estão estabelecidos no Estatuto Social de cada cooperativa. A cota rende de acordo com o tempo que você fica na cooperativa. Como qualquer instituição, buscamos sustentabilidade financeira e trabalhamos em função de resultados, não existindo a palavra lucro, mas sim sobras. Parte das sobras é divididas entre os cooperados anualmente, de acordo com a sua participação.
Temos o Pacote Essencial, disponível com tarifas reduzidas e serviços básicos limitados. Para conferir a disponibilidade, basta visitar a cooperativa mais próxima. Os valores podem variar de acordo com a cooperativa selecionada.
Assim como existe o FGC nos bancos, nas cooperativas temos o FGCoop (Fundo Garantidor do Cooperativismo de Crédito). Na prática, cada cooperado tem até 250 mil reais garantidos caso ocorra qualquer imprevisto. Estamos sempre pensando na sua segurança. Para mais informações acesse https://www.fgcoop.coop.br/quem-somos