wagtail-enap-designsystem 1.2.1.105__py3-none-any.whl → 1.2.1.106__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of wagtail-enap-designsystem might be problematic. Click here for more details.

@@ -742,7 +742,12 @@ CARD_CARDS_STREAMBLOCKS = [
742
742
  "enap_section", EnapSectionBlock([
743
743
  ("enap_cardgrid", EnapCardGridBlock([
744
744
  ("enap_card", EnapCardBlock()),
745
- ]))
745
+ ("richtext", RichTextBlock()),
746
+ ("button", ButtonBlock()),
747
+ ("image", ImageBlock()),
748
+ ("quote", QuoteBlock()),
749
+ ('buttoncenter', ButtonCenter()),
750
+ ]))
746
751
  ])
747
752
  )
748
753
  ]
@@ -1478,13 +1478,6 @@ nav li:hover > ul {
1478
1478
  font-size: 32px;
1479
1479
  }
1480
1480
 
1481
- .img-fluid {
1482
- width: 100%;
1483
- height: auto;
1484
- overflow: hidden;
1485
- max-width: 300px;
1486
- object-fit: cover;
1487
- }
1488
1481
 
1489
1482
  .img-cta {
1490
1483
  width: 90%;
@@ -2162,13 +2155,6 @@ nav li:hover > ul {
2162
2155
  font-size: 32px;
2163
2156
  }
2164
2157
 
2165
- .img-fluid {
2166
- width: 100%;
2167
- height: auto;
2168
- overflow: hidden;
2169
- max-width: 300px;
2170
- object-fit: cover;
2171
- }
2172
2158
 
2173
2159
  .grid-two-hero{
2174
2160
  display: grid;
@@ -761,7 +761,6 @@ a.hero-menu-button.no-children:hover {
761
761
  width: 100%;
762
762
  height: auto;
763
763
  overflow: hidden;
764
- max-width: 300px;
765
764
  object-fit: cover;
766
765
  }
767
766
 
@@ -565,7 +565,6 @@ nav li:hover > ul {
565
565
  width: 100%;
566
566
  height: auto;
567
567
  overflow: hidden;
568
- max-width: 300px;
569
568
  object-fit: cover;
570
569
  }
571
570
 
@@ -56,7 +56,17 @@
56
56
  transition: transform 0.3s ease-in-out;
57
57
  gap: 25px;
58
58
  cursor: grab;
59
- padding-bottom: 10px; /* Para evitar corte da sombra */
59
+ padding-bottom: 10px;
60
+
61
+ /* CORREÇÃO SAFARI */
62
+ align-items: stretch;
63
+ -webkit-align-items: stretch;
64
+
65
+ /* Safari flexbox fixes */
66
+ min-height: 0;
67
+ -webkit-transform: translateZ(0);
68
+ transform: translateZ(0);
69
+ will-change: transform;
60
70
  }
61
71
 
62
72
  .testimonial-carousel-items:active {
@@ -65,8 +75,15 @@
65
75
 
66
76
  .testimonial-item-wrapper {
67
77
  flex: 0 0 auto;
68
- width: calc(45% - 15px);
78
+ -webkit-flex: 0 0 auto; /* Safari precisa do prefixo */
79
+
80
+ /* CORREÇÃO CRÍTICA - Safari não calcula calc() bem em flex */
81
+ width: 410px; /* Use valor fixo ao invés de calc(45% - 15px) */
69
82
  min-width: 410px;
83
+
84
+ /* Garante altura consistente no Safari */
85
+ display: flex;
86
+ flex-direction: column;
70
87
  }
71
88
 
72
89
  .testimonial-container {
@@ -9,7 +9,7 @@
9
9
  <h3 class="sub-title">Fique sabendo de tudo o que acontece na Enap</h3>
10
10
  </div>
11
11
 
12
- <!-- Desktop: Layout Original (COM LEGENDA HOME) -->
12
+ <!-- Desktop: Layout Original -->
13
13
  <div class="news-grid-container desktop-only">
14
14
  {% for page in pages %}
15
15
  {% if forloop.first %}
@@ -35,7 +35,6 @@
35
35
  <div class="news-main-overlay">
36
36
  <h3 class="news-main-title">{{ page.title }}</h3>
37
37
 
38
- {# NOVO: Usa legenda_home com fallbacks inteligentes #}
39
38
  {% if page.specific.legenda_home %}
40
39
  <p class="news-main-text">{{ page.specific.legenda_home|truncatewords:25 }}</p>
41
40
  {% elif page.specific.subtitulo %}
@@ -55,12 +54,10 @@
55
54
  </a>
56
55
  </div>
57
56
  {% else %}
58
- <!-- Primeira iteração das notícias secundárias -->
59
57
  {% if forloop.counter == 2 %}
60
58
  <div class="news-grid-secondary">
61
59
  {% endif %}
62
60
 
63
- <!-- Notícias Secundárias (pequenas) -->
64
61
  <div class="news-secondary-item">
65
62
  <div class="news-secondary-image">
66
63
  {% if page.specific.imagem_externa %}
@@ -74,7 +71,7 @@
74
71
  <img class="img-fluid" src="{{ sec_img.url }}" alt="{{ sec_img.title }}">
75
72
  </a>
76
73
  {% elif page.cover_image %}
77
- {% image page.cover_image original format-webp format-webp preserve-svg as sec_img %}
74
+ {% image page.cover_image original format-webp preserve-svg as sec_img %}
78
75
  <a href="{% pageurl page %}" title="{{ page.title }}">
79
76
  <img class="img-fluid" src="{{ sec_img.url }}" alt="{{ sec_img.title }}">
80
77
  </a>
@@ -88,11 +85,8 @@
88
85
  </div>
89
86
  <a href="{% pageurl page %}">
90
87
  <div class="news-secondary-content">
91
- <h4 class="news-secondary-title">
92
- {{ page.title }}
93
- </h4>
88
+ <h4 class="news-secondary-title">{{ page.title }}</h4>
94
89
 
95
- {# NOVO: Usa legenda_home com fallbacks inteligentes #}
96
90
  {% if page.specific.legenda_home %}
97
91
  <p class="news-secondary-text">{{ page.specific.legenda_home|truncatewords:15 }}</p>
98
92
  {% elif page.specific.subtitulo %}
@@ -119,13 +113,12 @@
119
113
  </div>
120
114
  {% endfor %}
121
115
 
122
- <!-- Fechar div das notícias secundárias se houver pelo menos 2 notícias -->
123
116
  {% if pages|length > 1 %}
124
117
  </div>
125
118
  {% endif %}
126
119
  </div>
127
120
 
128
- <!-- Mobile: Carrossel COM LEGENDA HOME -->
121
+ <!-- Mobile: Carrossel -->
129
122
  <div class="news-carousel-container mobile-only">
130
123
  <div class="news-carousel" id="newsCarousel">
131
124
  <div class="news-carousel-track" id="carouselTrack">
@@ -155,7 +148,6 @@
155
148
  </div>
156
149
  <h3 class="news-carousel-title">{{ page.title }}</h3>
157
150
 
158
- {# NOVO: Usa legenda_home com fallbacks inteligentes #}
159
151
  {% if page.specific.legenda_home %}
160
152
  <p class="news-carousel-text">{{ page.specific.legenda_home|truncatewords:20 }}</p>
161
153
  {% elif page.specific.subtitulo %}
@@ -179,16 +171,6 @@
179
171
  </div>
180
172
  </div>
181
173
 
182
- <!-- Controles do Carrossel -->
183
- <div class="carousel-controls" style="display: none;">
184
- <button class="carousel-btn carousel-prev" id="prevBtn" aria-label="Notícia anterior">
185
- <i class="fa fa-chevron-left"></i>
186
- </button>
187
- <button class="carousel-btn carousel-next" id="nextBtn" aria-label="Próxima notícia">
188
- <i class="fa fa-chevron-right"></i>
189
- </button>
190
- </div>
191
-
192
174
  <!-- Indicadores -->
193
175
  <div class="carousel-indicators" id="carouselIndicators">
194
176
  {% for page in pages %}
@@ -204,9 +186,8 @@
204
186
  </div>
205
187
  </section>
206
188
 
207
-
208
189
  <style>
209
- /* === ESTILOS ORIGINAIS DO DESKTOP (INALTERADOS) === */
190
+ /* === ESTILOS BÁSICOS === */
210
191
  .btn-todos {
211
192
  display: flex;
212
193
  align-items: center;
@@ -221,24 +202,15 @@
221
202
  font-weight: 600;
222
203
  margin: 0 auto;
223
204
  width: fit-content;
205
+ transition: all 0.3s ease;
224
206
  }
225
207
 
226
- .news-secondary-date{
227
- font-size: 12px;
228
- color: #525155;
229
- }
230
-
231
208
  .btn-todos:hover {
232
209
  color: white;
233
210
  background-color: #006969;
234
211
  border: 1px solid #006969;
235
212
  }
236
213
 
237
- .btn-todos:active {
238
- color: #025257;
239
- border: 1px solid #025257;
240
- }
241
-
242
214
  .sub-title {
243
215
  font-size: 20px;
244
216
  font-weight: 400;
@@ -263,6 +235,7 @@
263
235
  margin-bottom: 40px;
264
236
  }
265
237
 
238
+ /* === DESKTOP GRID === */
266
239
  .news-grid-container {
267
240
  display: grid;
268
241
  grid-template-columns: 1fr 1fr;
@@ -270,7 +243,6 @@
270
243
  margin-bottom: 40px;
271
244
  }
272
245
 
273
- /* Notícia Principal */
274
246
  .news-grid-main {
275
247
  position: relative;
276
248
  border-radius: 12px;
@@ -294,7 +266,7 @@
294
266
 
295
267
  .news-main-image {
296
268
  width: 100%;
297
- height: 100%;
269
+ height: 400px; /* Altura fixa para Safari */
298
270
  overflow: hidden;
299
271
  position: relative;
300
272
  }
@@ -304,7 +276,6 @@
304
276
  height: 100%;
305
277
  object-fit: cover;
306
278
  transition: transform 0.3s ease;
307
- min-width: 100%;
308
279
  }
309
280
 
310
281
  .news-grid-main:hover .news-main-image img {
@@ -332,10 +303,15 @@
332
303
  .news-main-text {
333
304
  color: rgba(255, 255, 255, 0.9);
334
305
  line-height: 1.6;
335
- margin: 0;
306
+ margin: 0 0 10px 0;
336
307
  font-size: 16px;
337
308
  }
338
309
 
310
+ .news-main-date {
311
+ font-size: 12px;
312
+ color: rgba(255, 255, 255, 0.8);
313
+ }
314
+
339
315
  /* Notícias Secundárias */
340
316
  .news-grid-secondary {
341
317
  display: flex;
@@ -348,7 +324,7 @@
348
324
  gap: 15px;
349
325
  background: white;
350
326
  border-radius: 8px;
351
- transition: transform 0.3s ease, box-shadow 0.3s ease;
327
+ transition: transform 0.3s ease;
352
328
  }
353
329
 
354
330
  .news-secondary-item:hover {
@@ -361,8 +337,8 @@
361
337
  }
362
338
 
363
339
  .news-secondary-image {
364
- width:150px;
365
- height: 100%;
340
+ width: 150px;
341
+ height: 100px; /* Altura fixa */
366
342
  border-radius: 6px;
367
343
  overflow: hidden;
368
344
  flex-shrink: 0;
@@ -372,7 +348,7 @@
372
348
  width: 100%;
373
349
  height: 100%;
374
350
  object-fit: cover;
375
- min-width: 100%;
351
+ transition: transform 0.3s ease;
376
352
  }
377
353
 
378
354
  .news-secondary-content {
@@ -391,20 +367,6 @@
391
367
  color: #007D7A;
392
368
  }
393
369
 
394
- .news-secondary-title a {
395
- color: #007D7A;
396
- text-decoration: none;
397
- transition: color 0.3s ease;
398
- }
399
-
400
- .news-secondary-title p :hover {
401
- color: #006969;
402
- }
403
-
404
- .news-secondary-title a p h4 a:hover {
405
- color: #006969;
406
- }
407
-
408
370
  .news-secondary-text {
409
371
  font-size: 14px;
410
372
  color: #525155;
@@ -412,7 +374,13 @@
412
374
  margin: 0;
413
375
  }
414
376
 
415
- /* Placeholders para imagens */
377
+ .news-secondary-date {
378
+ font-size: 12px;
379
+ color: #525155;
380
+ margin-top: 5px;
381
+ }
382
+
383
+ /* Placeholders */
416
384
  .no-image-placeholder {
417
385
  display: flex;
418
386
  flex-direction: column;
@@ -446,7 +414,7 @@
446
414
  }
447
415
 
448
416
  .secondary-placeholder {
449
- height: 100%;
417
+ height: 100px;
450
418
  font-size: 24px;
451
419
  }
452
420
 
@@ -459,7 +427,7 @@
459
427
  font-size: 18px;
460
428
  }
461
429
 
462
- /* === NOVOS ESTILOS PARA MOBILE CARROSSEL === */
430
+ /* === CARROSSEL MOBILE === */
463
431
  .news-carousel-container {
464
432
  position: relative;
465
433
  margin-bottom: 40px;
@@ -468,14 +436,14 @@
468
436
  .news-carousel {
469
437
  overflow: hidden;
470
438
  margin-bottom: 20px;
471
- padding: 0 ;
472
- height: 50vh;
439
+ padding: 0;
440
+ height: 50vh;
441
+ min-height: 300px;
473
442
  }
474
443
 
475
444
  .news-carousel-track {
476
445
  display: flex;
477
446
  transition: transform 0.3s ease;
478
- will-change: transform;
479
447
  height: 100%;
480
448
  }
481
449
 
@@ -483,6 +451,7 @@
483
451
  flex: 0 0 70vw;
484
452
  position: relative;
485
453
  margin-right: 15px;
454
+ height: 100%;
486
455
  }
487
456
 
488
457
  .news-carousel-link {
@@ -490,11 +459,12 @@
490
459
  position: relative;
491
460
  text-decoration: none;
492
461
  color: inherit;
462
+ height: 100%;
493
463
  }
494
464
 
495
465
  .news-carousel-image {
496
466
  width: 100%;
497
- height: 250px;
467
+ height: 100%;
498
468
  overflow: hidden;
499
469
  position: relative;
500
470
  border-radius: 12px;
@@ -532,8 +502,14 @@
532
502
  font-size: 14px;
533
503
  }
534
504
 
505
+ .news-carousel-date {
506
+ font-size: 12px;
507
+ color: rgba(255, 255, 255, 0.8);
508
+ margin-bottom: 10px;
509
+ }
510
+
535
511
  .carousel-placeholder {
536
- height: 250px;
512
+ height: 100%;
537
513
  font-size: 32px;
538
514
  background: linear-gradient(135deg, #f5f5f5, #e8e8e8);
539
515
  }
@@ -543,48 +519,6 @@
543
519
  margin-top: 8px;
544
520
  }
545
521
 
546
- /* Controles do Carrossel */
547
- .carousel-controls {
548
- display: flex;
549
- justify-content: space-between;
550
- position: absolute;
551
- top: 50%;
552
- left: 0;
553
- right: 0;
554
- transform: translateY(-50%);
555
- padding: 0 15px;
556
- pointer-events: none;
557
- }
558
-
559
- .carousel-btn {
560
- width: 40px;
561
- height: 40px;
562
- border-radius: 50%;
563
- background: rgba(255, 255, 255, 0.9);
564
- border: none;
565
- color: #007D7A;
566
- font-size: 16px;
567
- cursor: pointer;
568
- pointer-events: all;
569
- transition: all 0.3s ease;
570
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
571
- display: flex;
572
- align-items: center;
573
- justify-content: center;
574
- }
575
-
576
- .carousel-btn:hover {
577
- background: white;
578
- transform: scale(1.1);
579
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
580
- }
581
-
582
- .carousel-btn:disabled {
583
- opacity: 0.5;
584
- cursor: not-allowed;
585
- transform: none;
586
- }
587
-
588
522
  /* Indicadores */
589
523
  .carousel-indicators {
590
524
  display: flex;
@@ -610,36 +544,20 @@
610
544
 
611
545
  /* === RESPONSIVIDADE === */
612
546
  .mobile-only {
613
- display: none !important;
547
+ display: none;
614
548
  }
615
549
 
616
550
  .desktop-only {
617
551
  display: grid;
618
552
  }
619
553
 
620
- /* Força esconder carrossel no desktop */
621
- .news-carousel-container {
622
- display: none !important;
623
- }
624
-
625
554
  @media (max-width: 768px) {
626
555
  .mobile-only {
627
- display: block !important;
556
+ display: block;
628
557
  }
629
558
 
630
559
  .desktop-only {
631
- display: none !important;
632
- }
633
-
634
- /* Força mostrar carrossel no mobile */
635
- .news-carousel-container.mobile-only {
636
- display: block !important;
637
- height: 55vh;
638
- }
639
-
640
- /* Força esconder grid no mobile */
641
- .news-grid-container.desktop-only {
642
- display: none !important;
560
+ display: none;
643
561
  }
644
562
 
645
563
  .news-section {
@@ -661,10 +579,19 @@
661
579
  margin-top: 10px;
662
580
  }
663
581
 
664
- .news-carousel-image {
582
+ .news-carousel-container {
583
+ height: 55vh;
584
+ min-height: 320px;
585
+ }
586
+
587
+ .news-carousel {
665
588
  height: 100%;
666
589
  }
667
590
 
591
+ .news-carousel-slide {
592
+ flex: 0 0 75vw;
593
+ }
594
+
668
595
  .news-carousel-title {
669
596
  font-size: 16px;
670
597
  }
@@ -672,12 +599,6 @@
672
599
  .news-carousel-text {
673
600
  font-size: 13px;
674
601
  }
675
-
676
- .carousel-btn {
677
- width: 35px;
678
- height: 35px;
679
- font-size: 14px;
680
- }
681
602
  }
682
603
 
683
604
  @media (max-width: 480px) {
@@ -689,18 +610,58 @@
689
610
  font-size: 28px;
690
611
  }
691
612
 
692
- .news-carousel-image {
693
- height: 100%;
613
+ .news-carousel-slide {
614
+ flex: 0 0 85vw;
615
+ }
616
+
617
+ .news-carousel-container {
618
+ height: 45vh;
619
+ min-height: 280px;
694
620
  }
621
+ }
622
+
623
+ /* === CORREÇÕES ESPECÍFICAS PARA SAFARI === */
695
624
 
696
- .carousel-controls {
697
- padding: 0 10px;
625
+ /* Safari iOS - altura do viewport */
626
+ @supports (-webkit-touch-callout: none) {
627
+ .news-carousel {
628
+ height: -webkit-fill-available;
698
629
  }
630
+ }
631
+
632
+ /* Safari - prefixos essenciais */
633
+ .news-carousel-track {
634
+ -webkit-transform: translateX(0);
635
+ transform: translateX(0);
636
+ }
637
+
638
+ .btn-todos {
639
+ -webkit-appearance: none;
640
+ }
641
+
642
+ .carousel-indicator {
643
+ -webkit-appearance: none;
644
+ }
699
645
 
700
- .carousel-btn {
701
- width: 32px;
702
- height: 32px;
703
- font-size: 12px;
646
+ /* Safari - smooth scrolling */
647
+ .news-carousel {
648
+ -webkit-overflow-scrolling: touch;
649
+ }
650
+
651
+ /* Fallback para Safari sem object-fit */
652
+ @supports not (object-fit: cover) {
653
+ .news-main-image,
654
+ .news-secondary-image,
655
+ .news-carousel-image {
656
+ background-size: cover;
657
+ background-position: center;
658
+ background-repeat: no-repeat;
659
+ }
660
+
661
+ .news-main-image img,
662
+ .news-secondary-image img,
663
+ .news-carousel-image img {
664
+ opacity: 0;
704
665
  }
705
666
  }
706
667
  </style>
@@ -709,8 +670,6 @@
709
670
  document.addEventListener('DOMContentLoaded', function() {
710
671
  const carousel = document.getElementById('newsCarousel');
711
672
  const track = document.getElementById('carouselTrack');
712
- const prevBtn = document.getElementById('prevBtn');
713
- const nextBtn = document.getElementById('nextBtn');
714
673
  const indicators = document.getElementById('carouselIndicators');
715
674
 
716
675
  if (!carousel || !track) return;
@@ -728,9 +687,19 @@ document.addEventListener('DOMContentLoaded', function() {
728
687
  if (slideIndex >= totalSlides) slideIndex = totalSlides - 1;
729
688
 
730
689
  currentSlide = slideIndex;
731
- const slideWidth = 70; // 70vw
732
- const spacing = 4; // espaçamento aproximado em vw
690
+
691
+ // Calcular largura do slide baseado no viewport
692
+ let slideWidth = 70; // padrão desktop
693
+
694
+ if (window.innerWidth <= 480) {
695
+ slideWidth = 85;
696
+ } else if (window.innerWidth <= 768) {
697
+ slideWidth = 75;
698
+ }
699
+
700
+ const spacing = 4; // espaçamento em vw
733
701
  const translateX = -(slideIndex * (slideWidth + spacing));
702
+
734
703
  track.style.transform = `translateX(${translateX}vw)`;
735
704
 
736
705
  // Atualizar indicadores
@@ -740,19 +709,6 @@ document.addEventListener('DOMContentLoaded', function() {
740
709
  });
741
710
  }
742
711
 
743
- // Event listeners para botões
744
- if (prevBtn) {
745
- prevBtn.addEventListener('click', () => {
746
- goToSlide(currentSlide - 1);
747
- });
748
- }
749
-
750
- if (nextBtn) {
751
- nextBtn.addEventListener('click', () => {
752
- goToSlide(currentSlide + 1);
753
- });
754
- }
755
-
756
712
  // Event listeners para indicadores
757
713
  if (indicators) {
758
714
  indicators.addEventListener('click', (e) => {
@@ -763,7 +719,7 @@ document.addEventListener('DOMContentLoaded', function() {
763
719
  });
764
720
  }
765
721
 
766
- // Touch/swipe support
722
+ // Touch/swipe - SIMPLES E FUNCIONAL
767
723
  track.addEventListener('touchstart', (e) => {
768
724
  startX = e.touches[0].clientX;
769
725
  isDragging = true;
@@ -775,10 +731,18 @@ document.addEventListener('DOMContentLoaded', function() {
775
731
 
776
732
  currentX = e.touches[0].clientX;
777
733
  const diffX = currentX - startX;
778
- const slideWidth = 70; // 70vw
779
- const spacing = 4; // espaçamento aproximado em vw
734
+
735
+ // Converter para vw
736
+ const diffXInVw = (diffX / window.innerWidth) * 100;
737
+
738
+ // Calcular posição atual
739
+ let slideWidth = 70;
740
+ if (window.innerWidth <= 480) slideWidth = 85;
741
+ else if (window.innerWidth <= 768) slideWidth = 75;
742
+
743
+ const spacing = 4;
780
744
  const currentTranslate = -(currentSlide * (slideWidth + spacing));
781
- const newTranslate = currentTranslate + (diffX / window.innerWidth * 100);
745
+ const newTranslate = currentTranslate + diffXInVw;
782
746
 
783
747
  track.style.transform = `translateX(${newTranslate}vw)`;
784
748
  });
@@ -803,14 +767,6 @@ document.addEventListener('DOMContentLoaded', function() {
803
767
  }
804
768
  });
805
769
 
806
- // Auto-play (desabilitado para melhor UX com swipe)
807
- // Usuário controla totalmente com swipe
808
-
809
- // Inicializar
810
- goToSlide(0);
811
-
812
- // Remover autoplay - usuário controla com swipe
813
-
814
770
  // Keyboard navigation
815
771
  document.addEventListener('keydown', (e) => {
816
772
  if (e.key === 'ArrowLeft') {
@@ -819,6 +775,18 @@ document.addEventListener('DOMContentLoaded', function() {
819
775
  goToSlide(currentSlide + 1);
820
776
  }
821
777
  });
778
+
779
+ // Resize handler
780
+ let resizeTimeout;
781
+ window.addEventListener('resize', () => {
782
+ clearTimeout(resizeTimeout);
783
+ resizeTimeout = setTimeout(() => {
784
+ goToSlide(currentSlide);
785
+ }, 100);
786
+ });
787
+
788
+ // Inicializar
789
+ goToSlide(0);
822
790
  });
823
791
  </script>
824
792
 
@@ -176,35 +176,55 @@
176
176
  showSlide(currentIndex + moveBy);
177
177
  });
178
178
 
179
- // NOVA FUNCIONALIDADE: Scroll horizontal APENAS com trackpad
179
+
180
180
  carousel.addEventListener('wheel', function(e) {
181
- // Responder APENAS ao scroll horizontal (trackpad lateral)
182
- if (Math.abs(e.deltaX) > 0 && Math.abs(e.deltaX) > Math.abs(e.deltaY)) {
183
- e.preventDefault(); // Prevenir scroll da página
181
+ if (Math.abs(e.deltaX) > 0) {
182
+ e.preventDefault();
183
+
184
+ // Obter posição atual do transform
185
+ const currentTransform = carousel.style.transform;
186
+ const match = currentTransform.match(/translateX\((-?\d*\.?\d*)px\)/);
187
+ let currentOffset = match ? parseFloat(match[1]) : 0;
184
188
 
185
- // Evitar múltiplos scrolls muito rápidos
186
- if (isScrolling) return;
189
+ // Aplicar movimento proporcional (ajuste a velocidade aqui)
190
+ const scrollMultiplier = 1.2;
191
+ const newOffset = currentOffset - (e.deltaX * scrollMultiplier);
187
192
 
188
- isScrolling = true;
193
+ // Calcular limites
194
+ const maxOffset = 0;
195
+ const minOffset = -(maxIndex * (itemWidth + itemsGap));
189
196
 
190
- // Determinar direção do scroll
191
- if (e.deltaX > 0) {
192
- // Scroll para direita - próximo slide
193
- showSlide(currentIndex + 1);
194
- } else {
195
- // Scroll para esquerda - slide anterior
196
- showSlide(currentIndex - 1);
197
+ // Aplicar limites com resistência
198
+ let finalOffset = newOffset;
199
+
200
+ if (newOffset > maxOffset) {
201
+ const overscroll = newOffset - maxOffset;
202
+ finalOffset = maxOffset + (overscroll * 0.3);
203
+ } else if (newOffset < minOffset) {
204
+ const overscroll = newOffset - minOffset;
205
+ finalOffset = minOffset + (overscroll * 0.3);
197
206
  }
198
207
 
199
- // Resetar flag após um tempo
208
+ // Aplicar transform
209
+ carousel.style.transition = 'none';
210
+ carousel.style.transform = `translateX(${finalOffset}px)`;
211
+
212
+ // Atualizar currentIndex baseado na posição
213
+ const newIndex = Math.round(Math.abs(finalOffset) / (itemWidth + itemsGap));
214
+ currentIndex = Math.max(0, Math.min(newIndex, maxIndex));
215
+
216
+ // Atualizar botões
217
+ updateNavigationButtons();
218
+
219
+ // Snap suave quando parar
200
220
  clearTimeout(scrollTimeout);
201
221
  scrollTimeout = setTimeout(() => {
202
- isScrolling = false;
203
- }, 300);
222
+ carousel.style.transition = 'transform 0.3s ease-out';
223
+ showSlide(currentIndex);
224
+ }, 150);
204
225
  }
205
- // Para scroll vertical, não fazer nada - deixar comportamento normal da página
206
- }, { passive: false }); // passive: false para permitir preventDefault
207
-
226
+ }, { passive: false });
227
+
208
228
  // Touch events - sempre ativados (para dispositivos touch)
209
229
  carousel.addEventListener('touchstart', handleStart, { passive: true });
210
230
  carousel.addEventListener('touchmove', handleMove, { passive: true });
@@ -479,52 +479,48 @@
479
479
  showSlide(currentIndex + moveBy);
480
480
  });
481
481
 
482
- // SCROLL FLUIDO com trackpad
482
+ // SCROLL FLUIDO dinâmico com trackpad
483
483
  carousel.addEventListener('wheel', function(e) {
484
- // Responder APENAS ao scroll horizontal (trackpad lateral)
485
- if (Math.abs(e.deltaX) > 0 && Math.abs(e.deltaX) > Math.abs(e.deltaY)) {
486
- e.preventDefault(); // Prevenir scroll da página
484
+ if (Math.abs(e.deltaX) > 0) {
485
+ e.preventDefault();
487
486
 
488
- // Acumular o scroll para movimento mais fluido
489
- scrollAccumulator += e.deltaX * 0.01; // Fator de sensibilidade
487
+ // Obter posição atual
488
+ const currentTransform = carousel.style.transform;
489
+ const match = currentTransform.match(/translateX\((-?\d*\.?\d*)px\)/);
490
+ let currentOffset = match ? parseFloat(match[1]) : 0;
490
491
 
491
- // Calcular nova posição baseada no acumulador
492
- const newPosition = currentIndex + scrollAccumulator;
492
+ // Movimento proporcional ao deltaX
493
+ const scrollMultiplier = 1.5;
494
+ const newOffset = currentOffset - (e.deltaX * scrollMultiplier);
493
495
 
494
- // Aplicar movimento fluido
495
- const clampedPosition = setCarouselPosition(newPosition);
496
+ // Limites
497
+ const maxOffset = 0;
498
+ const minOffset = -(maxIndex * (itemWidth + itemsGap));
496
499
 
497
- // Cancelar animação anterior se existir
498
- if (scrollAnimationFrame) {
499
- cancelAnimationFrame(scrollAnimationFrame);
500
+ // Resistência nas bordas
501
+ let finalOffset = newOffset;
502
+ if (newOffset > maxOffset) {
503
+ finalOffset = maxOffset + ((newOffset - maxOffset) * 0.3);
504
+ } else if (newOffset < minOffset) {
505
+ finalOffset = minOffset + ((newOffset - minOffset) * 0.3);
500
506
  }
501
507
 
502
- // Se parou de fazer scroll, fazer snap para o slide mais próximo
503
- isScrolling = true;
508
+ // Aplicar posição
509
+ carousel.style.transition = 'none';
510
+ carousel.style.transform = `translateX(${finalOffset}px)`;
511
+
512
+ // Atualizar currentIndex
513
+ const newIndex = Math.round(Math.abs(finalOffset) / (itemWidth + itemsGap));
514
+ currentIndex = Math.max(0, Math.min(newIndex, maxIndex));
515
+ updateNavigationButtons();
516
+
517
+ // Snap quando parar
504
518
  clearTimeout(scrollTimeout);
505
519
  scrollTimeout = setTimeout(() => {
506
- isScrolling = false;
507
-
508
- // Snap para o slide mais próximo
509
- const targetIndex = Math.round(clampedPosition);
510
- currentIndex = targetIndex;
511
-
512
- // Animação suave para o snap
513
- carousel.style.transition = 'transform 0.2s ease-out';
514
- setCarouselPosition(currentIndex);
515
- updateNavigationButtons();
516
-
517
- // Remover transição após a animação
518
- setTimeout(() => {
519
- carousel.style.transition = 'none';
520
- }, 200);
521
-
522
- // Resetar acumulador
523
- scrollAccumulator = 0;
524
- }, 150); // Tempo de espera antes do snap
525
-
520
+ carousel.style.transition = 'transform 0.3s ease-out';
521
+ showSlide(currentIndex);
522
+ }, 150);
526
523
  }
527
- // Para scroll vertical, não fazer nada - deixar comportamento normal da página
528
524
  }, { passive: false });
529
525
 
530
526
  // Touch e arraste para mobile
@@ -62,6 +62,7 @@
62
62
  let currentIndex = 0;
63
63
  let startX, moveX, initialPosition;
64
64
  let isDragging = false;
65
+ let isScrolling = false;
65
66
 
66
67
  // Verifica se é dispositivo mobile
67
68
  function isMobile() {
@@ -75,27 +76,61 @@
75
76
  return 2;
76
77
  }
77
78
 
78
- // Verifica se deve mostrar as setas
79
+ // NOVA FUNÇÃO: Verifica se cards à esquerda
80
+ function hasCardsToLeft() {
81
+ return currentIndex > 0;
82
+ }
83
+
84
+ // NOVA FUNÇÃO: Verifica se há cards à direita
85
+ function hasCardsToRight() {
86
+ // Método mais simples e confiável
87
+ return currentIndex < getMaxIndex();
88
+ }
89
+
90
+ // Verifica se deve mostrar as setas (MELHORADO)
79
91
  function shouldShowArrows() {
80
- if (isMobile()) return false; // Sempre esconder no mobile
81
- return items.length > getVisibleItems(); // Só mostrar se há mais itens que o visível
92
+ if (isMobile()) return false;
93
+ return items.length > getVisibleItems();
82
94
  }
83
95
 
84
- // Esconde os botões quando necessário
85
- function hideButtonsWhenNeeded() {
96
+ // Esconde/mostra botões baseado na existência de cards (MELHORADO)
97
+ function updateArrowVisibility() {
86
98
  if (!shouldShowArrows()) {
87
99
  prevButton.style.setProperty('display', 'none', 'important');
88
100
  nextButton.style.setProperty('display', 'none', 'important');
89
- } else {
90
- // Mostrar os botões no desktop quando há mais itens
101
+ return;
102
+ }
103
+
104
+ // Debug: mostra valores no console
105
+ console.log('Current Index:', currentIndex);
106
+ console.log('Max Index:', getMaxIndex());
107
+ console.log('Has Cards Left:', hasCardsToLeft());
108
+ console.log('Has Cards Right:', hasCardsToRight());
109
+
110
+ // Mostrar/esconder botão anterior baseado se há cards à esquerda
111
+ if (hasCardsToLeft()) {
91
112
  prevButton.style.removeProperty('display');
113
+ prevButton.style.opacity = '1';
114
+ prevButton.style.pointerEvents = 'auto';
115
+ } else {
116
+ prevButton.style.opacity = '0';
117
+ prevButton.style.pointerEvents = 'none';
118
+ }
119
+
120
+ // Mostrar/esconder botão próximo baseado se há cards à direita
121
+ if (hasCardsToRight()) {
92
122
  nextButton.style.removeProperty('display');
123
+ nextButton.style.setProperty('opacity', '1', 'important');
124
+ nextButton.style.setProperty('display', 'flex', 'important');
125
+ nextButton.style.setProperty('pointer-events', 'auto', 'important');
126
+ } else {
127
+ nextButton.style.setProperty('opacity', '0', 'important');
128
+ nextButton.style.setProperty('pointer-events', 'none', 'important');
93
129
  }
94
130
  }
95
131
 
96
132
  // Obtém a largura de um item considerando a viewport
97
133
  function getItemWidth() {
98
- // Em telas muito pequenas, use a largura da viewport menos padding
99
134
  if (window.innerWidth < 480) {
100
135
  return Math.min(items[0].offsetWidth, window.innerWidth * 0.9);
101
136
  }
@@ -103,18 +138,16 @@
103
138
  }
104
139
 
105
140
  function getItemGap() {
106
- // Gap ajustável dependendo da tela
107
141
  return window.innerWidth < 768 ? 15 : 25;
108
142
  }
109
143
 
110
- // Calcula o índice máximo com base nos itens visíveis
111
144
  function getMaxIndex() {
112
- return Math.max(0, items.length - getVisibleItems());
145
+ const visibleItems = getVisibleItems();
146
+ return Math.max(0, items.length - visibleItems);
113
147
  }
114
148
 
115
- // Define quantos itens rolar por vez (1 no mobile, 1 no desktop)
116
149
  function getScrollAmount() {
117
- return 1; // Sempre 1 neste carrossel específico
150
+ return 1;
118
151
  }
119
152
 
120
153
  // Mostra os slides baseado no índice atual
@@ -125,47 +158,107 @@
125
158
  const offset = currentIndex * (itemWidth + itemGap);
126
159
 
127
160
  carousel.style.transform = `translateX(-${offset}px)`;
128
- updateNavigationButtons();
161
+ updateArrowVisibility(); // Atualizada para nova função
129
162
  }
130
163
 
131
- // Atualiza a visibilidade dos botões de navegação
132
- function updateNavigationButtons() {
133
- // Se não deve mostrar setas, esconder ambos os botões
134
- if (!shouldShowArrows()) {
135
- hideButtonsWhenNeeded();
136
- return;
137
- }
164
+ // NOVA FUNCIONALIDADE: Scroll dinâmico com trackpad/mouse wheel
165
+ function handleWheel(e) {
166
+ // Debug: mostra valores do evento
167
+ console.log('Wheel event:', { deltaX: e.deltaX, deltaY: e.deltaY, shiftKey: e.shiftKey });
138
168
 
139
- // No primeiro slide, ocultar o botão anterior
140
- if (currentIndex === 0) {
141
- prevButton.style.opacity = '0';
142
- prevButton.style.pointerEvents = 'none';
143
- } else {
144
- prevButton.style.opacity = '1';
145
- prevButton.style.pointerEvents = 'auto';
169
+ let deltaX = e.deltaX;
170
+
171
+ // Para mouse wheel: usar Shift + wheel (deltaY vira deltaX)
172
+ if (e.shiftKey && Math.abs(e.deltaY) > Math.abs(e.deltaX)) {
173
+ deltaX = e.deltaY;
146
174
  }
147
175
 
148
- // No último slide, ocultar o botão próximo
149
- if (currentIndex >= getMaxIndex()) {
150
- nextButton.style.setProperty('opacity', '0');
151
- nextButton.style.setProperty('pointer-events', 'none');
152
- } else {
153
- nextButton.style.setProperty('opacity', '1', 'important');
154
- nextButton.style.setProperty('display', 'flex', 'important');
155
- nextButton.style.setProperty('pointer-events', 'auto', 'important');
176
+ // Detectar qualquer scroll horizontal (sem threshold mínimo)
177
+ if (Math.abs(deltaX) > 0) {
178
+ e.preventDefault();
179
+ e.stopPropagation();
180
+
181
+ // Obter posição atual do transform
182
+ const currentTransform = carousel.style.transform;
183
+ const match = currentTransform.match(/translateX\((-?\d*\.?\d*)px\)/);
184
+ let currentOffset = match ? parseFloat(match[1]) : 0;
185
+
186
+ // Aplicar o movimento proporcional ao deltaX
187
+ // Multiplicador para controlar a velocidade (ajuste conforme necessário)
188
+ const scrollMultiplier = 1.5;
189
+ const newOffset = currentOffset - (deltaX * scrollMultiplier);
190
+
191
+ // Calcular limites
192
+ const maxOffset = 0; // Limite esquerdo
193
+ const itemWidth = getItemWidth();
194
+ const itemGap = getItemGap();
195
+ const totalItems = items.length;
196
+ const visibleItems = getVisibleItems();
197
+ const minOffset = -((totalItems - visibleItems) * (itemWidth + itemGap));
198
+
199
+ // Aplicar limites com efeito de "elastic" nas bordas
200
+ let finalOffset = newOffset;
201
+
202
+ if (newOffset > maxOffset) {
203
+ // Resistência ao puxar além do início
204
+ const overscroll = newOffset - maxOffset;
205
+ finalOffset = maxOffset + (overscroll * 0.3);
206
+ } else if (newOffset < minOffset) {
207
+ // Resistência ao puxar além do fim
208
+ const overscroll = newOffset - minOffset;
209
+ finalOffset = minOffset + (overscroll * 0.3);
210
+ }
211
+
212
+ // Aplicar o transform
213
+ carousel.style.transition = 'none';
214
+ carousel.style.transform = `translateX(${finalOffset}px)`;
215
+
216
+ // Atualizar currentIndex baseado na posição
217
+ const newIndex = Math.round(Math.abs(finalOffset) / (itemWidth + itemGap));
218
+ currentIndex = Math.max(0, Math.min(newIndex, getMaxIndex()));
219
+
220
+ // Atualizar setas baseado na nova posição
221
+ updateArrowVisibility();
222
+
223
+ // Aplicar snap suave quando parar de rolar
224
+ clearTimeout(window.snapTimeout);
225
+ window.snapTimeout = setTimeout(() => {
226
+ carousel.style.transition = 'transform 0.3s ease-out';
227
+ showSlide(currentIndex);
228
+ }, 150);
229
+
230
+ console.log('Smooth scroll:', {
231
+ deltaX,
232
+ currentOffset,
233
+ newOffset: finalOffset,
234
+ currentIndex
235
+ });
156
236
  }
157
237
  }
158
238
 
159
- // Eventos dos botões
239
+ // Eventos dos botões (mantidos)
160
240
  prevButton.addEventListener('click', function() {
161
- showSlide(currentIndex - getScrollAmount());
241
+ if (hasCardsToLeft()) {
242
+ showSlide(currentIndex - getScrollAmount());
243
+ }
162
244
  });
163
245
 
164
246
  nextButton.addEventListener('click', function() {
165
- showSlide(currentIndex + getScrollAmount());
247
+ if (hasCardsToRight()) {
248
+ showSlide(currentIndex + getScrollAmount());
249
+ }
166
250
  });
167
251
 
168
- // Eventos de arrastar
252
+ // NOVO: Adicionar evento de scroll do mouse/trackpad
253
+ carousel.addEventListener('wheel', handleWheel, { passive: false });
254
+
255
+ // Adicionar também no container para capturar melhor
256
+ const carouselContainer = carousel.parentElement;
257
+ if (carouselContainer) {
258
+ carouselContainer.addEventListener('wheel', handleWheel, { passive: false });
259
+ }
260
+
261
+ // Eventos de arrastar (mantidos com pequenos ajustes)
169
262
  carousel.addEventListener('mousedown', handleStart);
170
263
  carousel.addEventListener('touchstart', handleStart, { passive: true });
171
264
 
@@ -182,8 +275,6 @@
182
275
  initialPosition = currentIndex * (getItemWidth() + getItemGap());
183
276
  carousel.style.transition = 'none';
184
277
 
185
- // Prevenir comportamento padrão para evitar scrolling da página
186
- // mas apenas se for desktop
187
278
  if (e.type !== 'touchstart') {
188
279
  e.preventDefault();
189
280
  }
@@ -192,26 +283,21 @@
192
283
  function handleMove(e) {
193
284
  if (!isDragging) return;
194
285
 
195
- // Atualizar a posição atual do toque/mouse
196
286
  moveX = e.type === 'touchmove' ? e.touches[0].clientX : e.clientX;
197
287
  const diff = moveX - startX;
198
288
 
199
- // Limitar o arrasto para evitar exceder os limites
200
289
  const maxDrag = getItemWidth() * (items.length - getVisibleItems());
201
290
  let newPosition = diff - initialPosition;
202
291
 
203
- // Adicionar resistência ao arrastar além dos limites
204
292
  if (newPosition > 0) {
205
- newPosition = newPosition * 0.3; // Resistência ao puxar para a direita no início
293
+ newPosition = newPosition * 0.3;
206
294
  } else if (newPosition < -maxDrag) {
207
295
  const overDrag = newPosition + maxDrag;
208
- newPosition = -maxDrag + (overDrag * 0.3); // Resistência ao puxar para a esquerda no final
296
+ newPosition = -maxDrag + (overDrag * 0.3);
209
297
  }
210
298
 
211
299
  carousel.style.transform = `translateX(${newPosition}px)`;
212
300
 
213
- // Prevenir comportamento padrão para evitar scrolling da página
214
- // mas apenas se for desktop
215
301
  if (e.type !== 'touchmove') {
216
302
  e.preventDefault();
217
303
  }
@@ -224,17 +310,16 @@
224
310
  carousel.style.transition = 'transform 0.3s ease-in-out';
225
311
 
226
312
  if (!moveX) {
227
- // Se não houve movimento, apenas restore
228
313
  showSlide(currentIndex);
229
314
  return;
230
315
  }
231
316
 
232
317
  const diff = moveX - startX;
233
- const threshold = getItemWidth() / 3; // 1/3 da largura para mudar de slide
318
+ const threshold = getItemWidth() / 3;
234
319
 
235
- if (diff > threshold) {
320
+ if (diff > threshold && hasCardsToLeft()) {
236
321
  showSlide(currentIndex - getScrollAmount());
237
- } else if (diff < -threshold) {
322
+ } else if (diff < -threshold && hasCardsToRight()) {
238
323
  showSlide(currentIndex + getScrollAmount());
239
324
  } else {
240
325
  showSlide(currentIndex);
@@ -246,19 +331,15 @@
246
331
  window.addEventListener('resize', function() {
247
332
  clearTimeout(resizeTimeout);
248
333
  resizeTimeout = setTimeout(function() {
249
- // Atualiza a visibilidade dos botões com base no novo tamanho da tela
250
- hideButtonsWhenNeeded();
334
+ updateArrowVisibility(); // Usar nova função
251
335
 
252
- // Verifica se o índice atual ainda é válido com o novo tamanho
253
336
  if (currentIndex > getMaxIndex()) {
254
337
  currentIndex = getMaxIndex();
255
338
  }
256
339
 
257
- // Reajustar tamanhos baseados na nova largura da tela
258
- carousel.style.transition = 'none'; // Desativa transição para reposicionamento imediato
340
+ carousel.style.transition = 'none';
259
341
  showSlide(currentIndex);
260
342
 
261
- // Restaura a transição após o reposicionamento
262
343
  setTimeout(() => {
263
344
  carousel.style.transition = 'transform 0.3s ease-in-out';
264
345
  }, 50);
@@ -268,22 +349,18 @@
268
349
  // Inicializar o carrossel
269
350
  showSlide(0);
270
351
 
271
- // Adiciona uma verificação adicional após carregamento completo
352
+ // Verificação adicional após carregamento
272
353
  setTimeout(function() {
273
- // Garante que os botões estejam configurados corretamente
274
- hideButtonsWhenNeeded();
354
+ updateArrowVisibility();
275
355
 
276
- // Verificar se deve mostrar as setas e configurar adequadamente
277
356
  if (shouldShowArrows()) {
278
- updateNavigationButtons();
357
+ updateArrowVisibility(); // Usar nova função
279
358
  }
280
359
 
281
- // Verificar novamente se os elementos têm tamanho correto
282
360
  showSlide(currentIndex);
283
361
  }, 500);
284
362
  }
285
363
 
286
- // Iniciar carrossel com um pequeno atraso para garantir que todos os elementos estejam carregados
287
364
  setTimeout(initCarousel, 100);
288
365
  });
289
366
  </script>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wagtail-enap-designsystem
3
- Version: 1.2.1.105
3
+ Version: 1.2.1.106
4
4
  Summary: Módulo de componentes utilizado nos portais ENAP, desenvolvido com Wagtail + CodeRedCMS
5
5
  Author: Renan Campos
6
6
  Author-email: renan.oliveira@enap.gov.br
@@ -7,7 +7,7 @@ enap_designsystem/signals.py,sha256=oaHpZms4Dkc97ql-55Q0QxU7-45jwg2Y1XoRDOJ45tc,
7
7
  enap_designsystem/urls.py,sha256=zFtWwC98ajREPMNU_GzvFmMULj7DhD2LLNdEDhYnaxs,1846
8
8
  enap_designsystem/views.py,sha256=VMVV7KXv3U2IUXBk7G4yXtmGzrwngOU1CqQEva78hNA,71355
9
9
  enap_designsystem/wagtail_hooks.py,sha256=nEUdWC6oHzLDVDo76D-40aa_0Ex8gUmCEfzcsAQig8w,45979
10
- enap_designsystem/blocks/__init__.py,sha256=kKtQgZ7gub87ZHo-W2rYtfxL5apKnxEJ4z0ObBvVX08,37741
10
+ enap_designsystem/blocks/__init__.py,sha256=F9NHc5bD442qMfeYrmp9ql9mQuydMV4otrcZFzh625Y,37967
11
11
  enap_designsystem/blocks/base_blocks.py,sha256=ZuqVWn4PEAvD3pKM1ST7wjo4lwv98ooen_rs15rRJbg,10866
12
12
  enap_designsystem/blocks/chatbot_blocks.py,sha256=YeCznrXMbFa9MP9vjdTYl53ZhKsywkGOXvFK2bwcqW0,1133
13
13
  enap_designsystem/blocks/content_blocks.py,sha256=4oWDtY0zmvC6k7v_WduCTAyGapJuQTsfJ9ij_vJZXxY,16549
@@ -433,7 +433,7 @@ enap_designsystem/static/enap_designsystem/blocks/banner_search_block.css,sha256
433
433
  enap_designsystem/static/enap_designsystem/blocks/banner_topicos_block.css,sha256=wd_nJcMSfnDafVHgB4EHc0jgKOQW55Wu7Quc_YWkzaE,2347
434
434
  enap_designsystem/static/enap_designsystem/blocks/breadcrumbs.css,sha256=PH8osEkecJTLGFzimzEs1h7oP2sE-p9tDY_Ynd_DLvY,867
435
435
  enap_designsystem/static/enap_designsystem/blocks/btn.css,sha256=1XXt_izxKvC7JejS9XLy_D7crSPynZJLr4uXDJ0sx6Q,1435
436
- enap_designsystem/static/enap_designsystem/blocks/bundle.css,sha256=ZUxRuWnfeFhJJ-3YVBlhS7ANUcnlPyvX-50PI2oWwco,37733
436
+ enap_designsystem/static/enap_designsystem/blocks/bundle.css,sha256=ffte6luGMbYd4ftkpPMq2-dE8OTT7iHJvNkNpT6TH_A,37443
437
437
  enap_designsystem/static/enap_designsystem/blocks/buttongroup.css,sha256=ym2tVLIhAnLWfRbG1L9_LFMfk7laM9bd3oYCJwLPhrY,1200
438
438
  enap_designsystem/static/enap_designsystem/blocks/card_courses.css,sha256=kk4NMA2BF-wvnmqlFBwAEdhaamGJNv65ei-Ceq2Y1WA,3244
439
439
  enap_designsystem/static/enap_designsystem/blocks/card_curso_block.css,sha256=m_YFF4eBzBx8_QwWk5Qv8vagq5TawCxEmY1cWb9Bco4,1300
@@ -486,7 +486,7 @@ enap_designsystem/static/enap_designsystem/blocks/team_carousel.css,sha256=HdV1r
486
486
  enap_designsystem/static/enap_designsystem/blocks/team_carousel.js,sha256=yf8pPuyRubbl5bMgXP-NZHM6JMjb0eF5EFyrXYESlS0,4993
487
487
  enap_designsystem/static/enap_designsystem/blocks/team_modern.css,sha256=pDjuauDRSEUoXMXflHBqBAO71IGuWP8Y0HDny-Fjdqo,3301
488
488
  enap_designsystem/static/enap_designsystem/blocks/template_holofote.css,sha256=WFQz4DorRDiNkXnVIHvAFchpbQQP7rYVFtO0LEZ4mH4,9143
489
- enap_designsystem/static/enap_designsystem/blocks/testimonials_carousel.css,sha256=v4iysJW8A_N3LtnpoQd4Vkeis60NK97Red-EaOxbTJ8,5331
489
+ enap_designsystem/static/enap_designsystem/blocks/testimonials_carousel.css,sha256=Fhx17vYUFhXRUqMQIcj5SPWHzZDMPDCI04BffxfpDew,5815
490
490
  enap_designsystem/static/enap_designsystem/blocks/testimonials_carousel.js,sha256=HKPb7i77PSluF-163ObIHjvdSuAIopWIKCuEtUp3-PI,6120
491
491
  enap_designsystem/static/enap_designsystem/blocks/texto_imagem.css,sha256=W6EYnaNnhPo891Fb1gS7vtZuJlcnoCrG498WdauHehY,2309
492
492
  enap_designsystem/static/enap_designsystem/blocks/topic_links_block.css,sha256=ILNPc66FEbcrFKBdh0AkaZqFMzROAaTCkj-_BoLnOJQ,2416
@@ -497,8 +497,8 @@ enap_designsystem/static/enap_designsystem/blocks/pages/page_search.css,sha256=O
497
497
  enap_designsystem/static/enap_designsystem/blocks/pages/page_search.js,sha256=Y8Glb6rYO0nYQS9ry9-7__XvvXF6fGHwUSEVS9VslTI,4717
498
498
  enap_designsystem/static/enap_designsystem/blocks/pages/template_cursos.css,sha256=f7oyQwzbkCU_aNdSSEqJ62_irFNC1h82Y47p3DppDso,415
499
499
  enap_designsystem/static/enap_designsystem/blocks/pages/template_especializacao.css,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
500
- enap_designsystem/static/enap_designsystem/blocks/pages/template_homeI.css,sha256=gRjkTT61zq6YUxWLwQdMeZGgAE7DPDAKAUjB5gwJ4C8,17134
501
- enap_designsystem/static/enap_designsystem/blocks/pages/template_homeII.css,sha256=Wy85Kw52sM3WyDVz_9_pTCPh0Bv0B7KUmRt4hctgeBs,11723
500
+ enap_designsystem/static/enap_designsystem/blocks/pages/template_homeI.css,sha256=YOkB8Ojb4TDxh53pFjctNcC5RCwspSzwG3Hb2DYhN3o,17108
501
+ enap_designsystem/static/enap_designsystem/blocks/pages/template_homeII.css,sha256=wuuq6VQxFlrpGoxaAmTLMN7Xs4QFjGJvQ0KYm5JMLgY,11697
502
502
  enap_designsystem/static/enap_designsystem/blocks/suap/default_1.png,sha256=UvxSbSAH4-UParJRo6efIH2y3R6tW0fCjhSsnvSRl-Y,328474
503
503
  enap_designsystem/static/enap_designsystem/blocks/suap/default_2.png,sha256=UvxSbSAH4-UParJRo6efIH2y3R6tW0fCjhSsnvSRl-Y,328474
504
504
  enap_designsystem/static/enap_designsystem/blocks/suap/suap_courses_block.css,sha256=9QLL18brmhjv0dDLdAtXVPUgUQX_Vlut2MRNl9D-deo,4450
@@ -691,7 +691,7 @@ enap_designsystem/templates/enap_designsystem/blocks/suap_card_curso_block.html,
691
691
  enap_designsystem/templates/enap_designsystem/blocks/tags.html,sha256=EWCFTP1CITV_zB0KFjGmlId5y8wTaCXVs8OPZZZuKdA,1491
692
692
  enap_designsystem/templates/enap_designsystem/blocks/team_carousel.html,sha256=Kvk2M9npEUnw_iSmGpPLQIpQWhE9qzl56jS3kYh36MI,10126
693
693
  enap_designsystem/templates/enap_designsystem/blocks/team_modern.html,sha256=1fhJQUpasI-WdMNBgCAA0D2JauoMITXyBnZUttk4ttc,6956
694
- enap_designsystem/templates/enap_designsystem/blocks/testimonials_carousel.html,sha256=XR-EOpmwgZMrDDB1iENTD5TxJMWAIpSJp7AMtA1rzaA,12945
694
+ enap_designsystem/templates/enap_designsystem/blocks/testimonials_carousel.html,sha256=aK7wI2MUAPO9SZkhrtoKSpDonFgd86lI8KZjHVTnY24,16151
695
695
  enap_designsystem/templates/enap_designsystem/blocks/texto_imagem.html,sha256=BP4COUYHsVJ52tIwEGSNTFpAa7xmDUgpw_f5pCggWyI,2005
696
696
  enap_designsystem/templates/enap_designsystem/blocks/timeline.html,sha256=YeL5eA4DyFC36RR-7gjiXW8ZDBckyJuCxaEiqdkzmDM,16573
697
697
  enap_designsystem/templates/enap_designsystem/blocks/timeline_container.html,sha256=TQvH3H-gmKGi5qIOuncjcu2W05qsPkIB_fgVH8EfLRU,6559
@@ -705,12 +705,12 @@ enap_designsystem/templates/enap_designsystem/blocks/footer/footer_social_grid_b
705
705
  enap_designsystem/templates/enap_designsystem/blocks/navbar/navbar_block.html,sha256=x_JbxCaARQB1CSz048F5miHssGeAEaWjUetzv41NT3U,40185
706
706
  enap_designsystem/templates/enap_designsystem/blocks/page/lia.html,sha256=54swuKsR3U0AIbTNSNQlQ-HncYT0sGhW82wk9rITg78,27450
707
707
  enap_designsystem/templates/enap_designsystem/blocks/page/pagelist_block.html,sha256=4zJgraGrAPBRTg3malKolNxvIrot67rpfFNn0uwlbSI,27785
708
- enap_designsystem/templates/enap_designsystem/blocks/page/pagenoticias_block.html,sha256=k40AJ2vd1O8wAuQSmKoJZnbTiwsLO6BhGHFvGllnMg0,26005
708
+ enap_designsystem/templates/enap_designsystem/blocks/page/pagenoticias_block.html,sha256=sFT8GCsWpPHUqE_scaN6Zx4j1M8hp51VCM-VLM7p_-0,24572
709
709
  enap_designsystem/templates/enap_designsystem/blocks/rps/apirps_busca_block.html,sha256=V2mkc_duQuljxG-ASzDuesgy6BuHcYifIqFpiBtYkUU,7075
710
710
  enap_designsystem/templates/enap_designsystem/blocks/rps/apirps_ultima_block.html,sha256=kfdhbe9-nxf8my4K2qKNX195d3Sumzm3Hrc3XaSRm_4,2960
711
711
  enap_designsystem/templates/enap_designsystem/blocks/suap/apisuap_courses_block.html,sha256=bgDEbZKv-szE7k2rN6k9kFC8XMgJd7XfKfynEznRscI,23231
712
- enap_designsystem/templates/enap_designsystem/blocks/suap/suap_courses_block.html,sha256=F3YRLBVwG6O65KXeCQ-hb_1omrmEi7Z9EVBGJSD9kMk,14820
713
- enap_designsystem/templates/enap_designsystem/blocks/suap/suap_events_block.html,sha256=-lBLyC9x-jEamEkuU7ig-sn6qK8VRvaLHhmlAxkwQcQ,20415
712
+ enap_designsystem/templates/enap_designsystem/blocks/suap/suap_courses_block.html,sha256=b-9XNIbUkQnvQnn1UsWVEFeQJkv7vyihtbeHX5a0Ghc,15809
713
+ enap_designsystem/templates/enap_designsystem/blocks/suap/suap_events_block.html,sha256=mL2DFQeAuDIx_GyCoEURKmME-Mmd-zQ_NZkO7YW9Z2k,20182
714
714
  enap_designsystem/templates/enap_designsystem/form_templates/form_report.html,sha256=WXf4HgNQY0M6zZ-tERqf01mHbGflqWXT96RaJYjCxFA,16081
715
715
  enap_designsystem/templates/enap_designsystem/form_templates/formulario_page.html,sha256=fWNpSB5IniMyiV3Y0G69zPXdlQtw71vetlgH-7OLAX4,63466
716
716
  enap_designsystem/templates/enap_designsystem/form_templates/formulario_page_landing.html,sha256=YsxUFe2U7aQHY8Xb_WeCjwQZWJOpLVlhS8Q3HpCMNug,7670
@@ -807,8 +807,8 @@ enap_designsystem/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
807
807
  enap_designsystem/utils/decorators.py,sha256=aq6SbLn0LcH2rfE3ZFit8jkD7pSx9fLVBUUwVB747hg,335
808
808
  enap_designsystem/utils/services.py,sha256=6dG5jLSbwH49jpZV9ZNpWlaZqI49gTlwlr1vaerxdiU,5824
809
809
  enap_designsystem/utils/sso.py,sha256=vjAuoYgoLeQAa_dkkyQ6-LmHvKMaVCxizNFpe5y3iUA,1145
810
- wagtail_enap_designsystem-1.2.1.105.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
811
- wagtail_enap_designsystem-1.2.1.105.dist-info/METADATA,sha256=6tHMW2YviSho0q6UJzyCxIoLkveiH8rcGgnDQJLtCoE,3651
812
- wagtail_enap_designsystem-1.2.1.105.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
813
- wagtail_enap_designsystem-1.2.1.105.dist-info/top_level.txt,sha256=RSFgMASxoA-hVftm5i4Qd0rArlX4Dq08lLv5G4sYD-g,18
814
- wagtail_enap_designsystem-1.2.1.105.dist-info/RECORD,,
810
+ wagtail_enap_designsystem-1.2.1.106.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
811
+ wagtail_enap_designsystem-1.2.1.106.dist-info/METADATA,sha256=cZBHZ3EUNWg4beZ97uBIv-JKFafkH_MoVocH8_Uhhto,3651
812
+ wagtail_enap_designsystem-1.2.1.106.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
813
+ wagtail_enap_designsystem-1.2.1.106.dist-info/top_level.txt,sha256=RSFgMASxoA-hVftm5i4Qd0rArlX4Dq08lLv5G4sYD-g,18
814
+ wagtail_enap_designsystem-1.2.1.106.dist-info/RECORD,,