A conta que você precisa, com os benefícios que você merece.
Leia o QR Code e baixe nosso app agora.
Diversifique seus investimentos com o Sicoob DTVM
Mais uma opção para você investir na diversificação do seu patrimônio.
No Sicoob, cooperamos pelo seu sucesso financeiro.
Um erro ocorreu enquanto processava o modelo.
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>
Fundos Exclusivos e/ou Restritos
Permitem uma gestão personalizada, alinhando estratégias ao perfil e objetivos do investidor.
Fundo de Investimento Imobiliário
Uma alternativa prática para diversificar a carteira, com potencial de renda recorrente.
Fundo de Investimento em Direitos Creditórios
O fundo tem por objetivo o investimento em títulos de créditos criados a partir de contas a receber de determinadas Empresas.
Um erro ocorreu enquanto processava o modelo.
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>