wagtail-enap-designsystem 1.2.1.128__py3-none-any.whl → 1.2.1.130__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.
Files changed (32) hide show
  1. enap_designsystem/blocks/__init__.py +6 -0
  2. enap_designsystem/blocks/form.py +243 -2
  3. enap_designsystem/blocks/html_blocks.py +316 -6
  4. enap_designsystem/blocks/semana_inovacao.py +1 -0
  5. enap_designsystem/migrations/0394_sistemavotacaopage_background_image_fundo_and_more.py +52181 -0
  6. enap_designsystem/migrations/0395_formulariopage_enable_scoring_and_more.py +106 -0
  7. enap_designsystem/migrations/0396_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +51263 -0
  8. enap_designsystem/migrations/0397_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +51718 -0
  9. enap_designsystem/migrations/0398_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +51718 -0
  10. enap_designsystem/migrations/0399_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +51718 -0
  11. enap_designsystem/migrations/0400_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +51718 -0
  12. enap_designsystem/migrations/0401_alter_areaaluno_body_alter_cursoeadpage_curso_and_more.py +52692 -0
  13. enap_designsystem/migrations/0402_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +52082 -0
  14. enap_designsystem/migrations/0403_alter_areaaluno_body_alter_enapcomponentes_body_and_more.py +52802 -0
  15. enap_designsystem/migrations/0404_sistemavotacaopage_conteudo_pagina.py +253 -0
  16. enap_designsystem/models.py +26 -0
  17. enap_designsystem/templates/enap_designsystem/blocks/apresentacao_simple_block.html +1 -1
  18. enap_designsystem/templates/enap_designsystem/blocks/cards_titles.html +309 -0
  19. enap_designsystem/templates/enap_designsystem/blocks/clientes_block.html +1 -1
  20. enap_designsystem/templates/enap_designsystem/blocks/cpnu_dashboard_block.html +5 -0
  21. enap_designsystem/templates/enap_designsystem/blocks/logos_simple_block.html +329 -0
  22. enap_designsystem/templates/enap_designsystem/blocks/numeros_block.html +195 -0
  23. enap_designsystem/templates/enap_designsystem/blocks/page/pagenoticias_block.html +6 -0
  24. enap_designsystem/templates/enap_designsystem/blocks/recaptcha.html +0 -2
  25. enap_designsystem/templates/enap_designsystem/sistema_votacao_page.html +36 -9
  26. enap_designsystem/views.py +1 -1
  27. enap_designsystem/wagtail_hooks.py +390 -9
  28. {wagtail_enap_designsystem-1.2.1.128.dist-info → wagtail_enap_designsystem-1.2.1.130.dist-info}/METADATA +1 -1
  29. {wagtail_enap_designsystem-1.2.1.128.dist-info → wagtail_enap_designsystem-1.2.1.130.dist-info}/RECORD +32 -18
  30. {wagtail_enap_designsystem-1.2.1.128.dist-info → wagtail_enap_designsystem-1.2.1.130.dist-info}/WHEEL +0 -0
  31. {wagtail_enap_designsystem-1.2.1.128.dist-info → wagtail_enap_designsystem-1.2.1.130.dist-info}/licenses/LICENSE +0 -0
  32. {wagtail_enap_designsystem-1.2.1.128.dist-info → wagtail_enap_designsystem-1.2.1.130.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,329 @@
1
+ {% load wagtailimages_tags %}
2
+
3
+ <!-- Template: enap_designsystem/blocks/logos_simple_block.html -->
4
+
5
+ <section class="logos-simple-block" style="background-color: {{ value.cor_fundo }};">
6
+ <div class="container">
7
+ <div class="">
8
+ <!-- Coluna do título -->
9
+ <div class=" align-items-center">
10
+ <h2 class="logos-titulo" style="color: {{ value.cor_titulo }};">
11
+ {{ value.titulo }}
12
+ </h2>
13
+ </div>
14
+
15
+ <!-- Coluna do grid de logos -->
16
+ <div class="container">
17
+ <div class="logos-conteudo" style="background-color: {{ value.cor_fundo_conteudo }};">
18
+ <!-- Grid de logos -->
19
+ <div class="logos-container {{ value.espacamento_logos }}">
20
+ <div class="logos-grid {{ value.tipo_grid_logos }} {{ value.tamanho_logos }}">
21
+ {% for logo_card in value.lista_logos %}
22
+ <div class="logo-card {% if value.centralizar_logos %}text-center{% endif %}">
23
+ <div class="logo-image-container">
24
+ {% image logo_card.logo fill-200x200 class="logo-image" alt="Logo" %}
25
+ </div>
26
+ </div>
27
+ {% endfor %}
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </section>
35
+
36
+ <style>
37
+ /* Estilos do componente LogosSimpleBlock */
38
+ .logos-simple-block {
39
+ padding: 80px 0;
40
+ min-height: 500px;
41
+ }
42
+
43
+ .logos-titulo {
44
+ font-size: 3.5rem;
45
+ font-weight: 700;
46
+ margin-bottom: 0;
47
+ line-height: 1.1;
48
+ text-align: center;
49
+ word-break: break-word;
50
+ margin: auto;
51
+ margin-bottom: 40px;
52
+ max-width: 400px;
53
+
54
+ }
55
+
56
+ .logos-conteudo {
57
+ padding: 60px 40px;
58
+ border-radius: 16px;
59
+ min-height: 350px;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
64
+ position: relative;
65
+ overflow: hidden;
66
+ }
67
+
68
+ /* Efeito sutil de gradiente nas bordas */
69
+ .logos-conteudo::before {
70
+ content: '';
71
+ position: absolute;
72
+ top: 0;
73
+ left: 0;
74
+ right: 0;
75
+ bottom: 0;
76
+ background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, transparent 50%);
77
+ pointer-events: none;
78
+ }
79
+
80
+ /* Grid de logos */
81
+ .logos-container {
82
+ width: 100%;
83
+ position: relative;
84
+ z-index: 1;
85
+ }
86
+
87
+ .logos-grid {
88
+ display: grid;
89
+ gap: 30px;
90
+ align-items: center;
91
+ justify-items: center;
92
+ width: 100%;
93
+ }
94
+
95
+ /* Layouts do grid */
96
+ .logos-grid-1 {
97
+ grid-template-columns: 1fr;
98
+ max-width: 300px;
99
+ margin: 0 auto;
100
+ }
101
+ .logos-grid-2 {
102
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
103
+ max-width: 600px;
104
+ margin: 0 auto;
105
+ }
106
+ .logos-grid-3 {
107
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
108
+ max-width: 700px;
109
+ margin: 0 auto;
110
+ }
111
+ .logos-grid-4 {
112
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
113
+ max-width: 800px;
114
+ margin: 0 auto;
115
+ }
116
+ .logos-grid-5 {
117
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
118
+ max-width: 900px;
119
+ margin: 0 auto;
120
+ }
121
+ .logos-grid-6 {
122
+ grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));
123
+ max-width: 1000px;
124
+ margin: 0 auto;
125
+ }
126
+
127
+ /* Espaçamentos */
128
+ .spacing-sm .logos-grid { gap: 20px; }
129
+ .spacing-md .logos-grid { gap: 30px; }
130
+ .spacing-lg .logos-grid { gap: 40px; }
131
+
132
+ /* Tamanhos das logos */
133
+ .logo-sm .logo-image {
134
+ max-height: 50px;
135
+ max-width: 120px;
136
+ }
137
+ .logo-md .logo-image {
138
+ max-height: 70px;
139
+ max-width: 160px;
140
+ }
141
+ .logo-lg .logo-image {
142
+ max-height: 90px;
143
+ max-width: 200px;
144
+ }
145
+
146
+ /* Estilo do card de logo */
147
+ .logo-card {
148
+ padding: 20px;
149
+ border-radius: 12px;
150
+ transition: all 0.3s ease;
151
+ display: flex;
152
+ align-items: center;
153
+ justify-content: center;
154
+ background: rgba(255, 255, 255, 0.02);
155
+ cursor: pointer;
156
+ position: relative;
157
+ overflow: hidden;
158
+ }
159
+
160
+ .logo-card:hover {
161
+ transform: translateY(-3px) scale(1.02);
162
+ background: rgba(255, 255, 255, 0.08);
163
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
164
+ }
165
+
166
+ .logo-image-container {
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: center;
170
+ height: 100%;
171
+ min-height: 60px;
172
+ position: relative;
173
+ z-index: 1;
174
+ }
175
+
176
+ .logo-image {
177
+ max-width: 100%;
178
+ height: auto;
179
+ object-fit: contain;
180
+ transition: all 0.3s ease;
181
+ filter: brightness(0.95) contrast(1.05);
182
+ }
183
+
184
+ .logo-card:hover .logo-image {
185
+ filter: brightness(1) contrast(1.1);
186
+ transform: scale(1.05);
187
+ }
188
+
189
+ /* Efeito shimmer sutil */
190
+ .logo-card::after {
191
+ content: '';
192
+ position: absolute;
193
+ top: 0;
194
+ left: -100%;
195
+ width: 100%;
196
+ height: 100%;
197
+ background: linear-gradient(
198
+ 90deg,
199
+ transparent,
200
+ rgba(255, 255, 255, 0.1),
201
+ transparent
202
+ );
203
+ transition: left 0.8s ease;
204
+ }
205
+
206
+ .logo-card:hover::after {
207
+ left: 100%;
208
+ }
209
+
210
+ /* Responsividade */
211
+ @media (max-width: 992px) {
212
+ .logos-titulo {
213
+ font-size: 2.8rem;
214
+ text-align: center;
215
+ margin-bottom: 30px;
216
+ }
217
+
218
+ .logos-simple-block {
219
+ padding: 60px 0;
220
+ }
221
+ }
222
+
223
+ @media (max-width: 768px) {
224
+ .logos-simple-block {
225
+ padding: 50px 0;
226
+ min-height: 400px;
227
+ }
228
+
229
+ .logos-titulo {
230
+ font-size: 2.2rem;
231
+ margin-bottom: 25px;
232
+ }
233
+
234
+ .logos-conteudo {
235
+ padding: 40px 25px;
236
+ min-height: 280px;
237
+ border-radius: 12px;
238
+ }
239
+
240
+ .logos-grid-2,
241
+ .logos-grid-3,
242
+ .logos-grid-4,
243
+ .logos-grid-5,
244
+ .logos-grid-6 {
245
+ grid-template-columns: repeat(3, 1fr);
246
+ max-width: 100%;
247
+ }
248
+
249
+ .spacing-sm .logos-grid { gap: 15px; }
250
+ .spacing-md .logos-grid { gap: 20px; }
251
+ .spacing-lg .logos-grid { gap: 25px; }
252
+ }
253
+
254
+ @media (max-width: 480px) {
255
+ .logos-titulo {
256
+ font-size: 1.8rem;
257
+ }
258
+
259
+ .logos-conteudo {
260
+ padding: 30px 20px;
261
+ min-height: 250px;
262
+ }
263
+
264
+ .logos-grid-2,
265
+ .logos-grid-3,
266
+ .logos-grid-4,
267
+ .logos-grid-5,
268
+ .logos-grid-6 {
269
+ grid-template-columns: repeat(2, 1fr);
270
+ }
271
+
272
+ .logo-card {
273
+ padding: 15px;
274
+ }
275
+
276
+ .logo-sm .logo-image { max-height: 40px; max-width: 100px; }
277
+ .logo-md .logo-image { max-height: 50px; max-width: 120px; }
278
+ .logo-lg .logo-image { max-height: 60px; max-width: 140px; }
279
+ }
280
+
281
+ @media (max-width: 360px) {
282
+ .logos-grid-2,
283
+ .logos-grid-3,
284
+ .logos-grid-4,
285
+ .logos-grid-5,
286
+ .logos-grid-6 {
287
+ grid-template-columns: 1fr;
288
+ }
289
+ }
290
+
291
+ /* Animações de entrada */
292
+ @keyframes fadeInUp {
293
+ from {
294
+ opacity: 0;
295
+ transform: translateY(30px);
296
+ }
297
+ to {
298
+ opacity: 1;
299
+ transform: translateY(0);
300
+ }
301
+ }
302
+
303
+ @keyframes fadeInScale {
304
+ from {
305
+ opacity: 0;
306
+ transform: scale(0.8);
307
+ }
308
+ to {
309
+ opacity: 1;
310
+ transform: scale(1);
311
+ }
312
+ }
313
+
314
+ .logos-titulo {
315
+ animation: fadeInUp 0.8s ease forwards;
316
+ }
317
+
318
+ .logos-conteudo {
319
+ animation: fadeInScale 0.8s ease forwards;
320
+ animation-delay: 0.2s;
321
+ opacity: 0;
322
+ }
323
+
324
+ .logo-card {
325
+ animation: fadeInUp 0.6s ease forwards;
326
+ opacity: 0;
327
+ }
328
+
329
+ </style>
@@ -0,0 +1,195 @@
1
+ <!-- Template: enap_designsystem/blocks/apresentacao_simple_block.html -->
2
+
3
+ <section class="apresentacao-simple-block" style="background-color: {{ value.cor_fundo }};">
4
+ <div class="container">
5
+ <div class="row">
6
+ <!-- Coluna do título -->
7
+ <div class="col-12 col-lg-4 mb-4 mb-lg-0">
8
+ <h2 class="apresentacao-titulo" style="color: {{ value.cor_titulo }};">
9
+ {{ value.titulo }}
10
+ </h2>
11
+ </div>
12
+
13
+ <!-- Coluna do conteúdo -->
14
+ <div class="col-12 col-lg-8">
15
+ <div class="apresentacao-conteudo" style="background-color: {{ value.cor_fundo_conteudo }};">
16
+ <div class="texto-descritivo" style="color: {{ value.cor_texto_descritivo }};">
17
+ {{ value.texto_descritivo|richtext }}
18
+ </div>
19
+
20
+ <!-- Grid de logos -->
21
+ <div class="logos-container {{ value.espacamento_logos }}">
22
+ <div class="logos-grid {{ value.tipo_grid_logos }} {{ value.tamanho_logos }}">
23
+ {% for logo_card in value.lista_logos %}
24
+ <div class="logo-card {% if value.centralizar_logos %}text-center{% endif %}">
25
+ {% if logo_card.link %}
26
+ <a href="{{ logo_card.link }}"
27
+ class="logo-link"
28
+ {% if logo_card.link_externo %}target="_blank" rel="noopener noreferrer"{% endif %}>
29
+ {% endif %}
30
+
31
+ <div class="logo-image-container">
32
+ {% image logo_card.logo fill-200x200 class="logo-image" alt=logo_card.titulo|default:"Logo" %}
33
+ </div>
34
+
35
+ {% if value.mostrar_titulos_logos and logo_card.titulo %}
36
+ <div class="logo-titulo">
37
+ {{ logo_card.titulo }}
38
+ </div>
39
+ {% endif %}
40
+
41
+ {% if logo_card.link %}
42
+ </a>
43
+ {% endif %}
44
+ </div>
45
+ {% endfor %}
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ </section>
53
+
54
+ <style>
55
+ /* Estilos do componente ApresentacaoSimpleBlock */
56
+ .apresentacao-simple-block {
57
+ padding: 60px 0;
58
+ min-height: 400px;
59
+ }
60
+
61
+ .apresentacao-titulo {
62
+ font-size: 2.5rem;
63
+ font-weight: 700;
64
+ margin-bottom: 0;
65
+ line-height: 1.2;
66
+ }
67
+
68
+ .apresentacao-conteudo {
69
+ padding: 40px;
70
+ border-radius: 8px;
71
+ min-height: 300px;
72
+ display: flex;
73
+ flex-direction: column;
74
+ }
75
+
76
+ .texto-descritivo {
77
+ margin-bottom: 40px;
78
+ line-height: 1.6;
79
+ }
80
+
81
+ .texto-descritivo h3,
82
+ .texto-descritivo h4 {
83
+ margin-top: 0;
84
+ }
85
+
86
+ /* Grid de logos */
87
+ .logos-container {
88
+ margin-top: auto;
89
+ }
90
+
91
+ .logos-grid {
92
+ display: grid;
93
+ gap: 20px;
94
+ align-items: center;
95
+ }
96
+
97
+ /* Layouts do grid */
98
+ .logos-grid-1 { grid-template-columns: 1fr; }
99
+ .logos-grid-2 { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
100
+ .logos-grid-3 { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
101
+ .logos-grid-4 { grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); }
102
+ .logos-grid-5 { grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); }
103
+ .logos-grid-6 { grid-template-columns: repeat(auto-fit, minmax(80px, 1fr)); }
104
+
105
+ /* Espaçamentos */
106
+ .spacing-sm .logos-grid { gap: 15px; }
107
+ .spacing-md .logos-grid { gap: 20px; }
108
+ .spacing-lg .logos-grid { gap: 30px; }
109
+
110
+ /* Tamanhos das logos */
111
+ .logo-sm .logo-image { max-height: 60px; }
112
+ .logo-md .logo-image { max-height: 80px; }
113
+ .logo-lg .logo-image { max-height: 120px; }
114
+
115
+ /* Estilo do card de logo */
116
+ .logo-card {
117
+ padding: 15px;
118
+ border-radius: 4px;
119
+ transition: transform 0.2s ease, opacity 0.2s ease;
120
+ }
121
+
122
+ .logo-link {
123
+ text-decoration: none;
124
+ color: inherit;
125
+ display: block;
126
+ }
127
+
128
+ .logo-link:hover .logo-card {
129
+ transform: translateY(-2px);
130
+ }
131
+
132
+ .logo-link:hover .logo-image {
133
+ opacity: 0.8;
134
+ }
135
+
136
+ .logo-image-container {
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ height: 100%;
141
+ min-height: 60px;
142
+ }
143
+
144
+ .logo-image {
145
+ max-width: 100%;
146
+ height: auto;
147
+ object-fit: contain;
148
+ transition: opacity 0.2s ease;
149
+ }
150
+
151
+ .logo-titulo {
152
+ margin-top: 10px;
153
+ font-size: 0.875rem;
154
+ font-weight: 500;
155
+ color: inherit;
156
+ }
157
+
158
+ /* Responsividade */
159
+ @media (max-width: 768px) {
160
+ .apresentacao-simple-block {
161
+ padding: 40px 0;
162
+ }
163
+
164
+ .apresentacao-titulo {
165
+ font-size: 2rem;
166
+ margin-bottom: 30px;
167
+ }
168
+
169
+ .apresentacao-conteudo {
170
+ padding: 30px;
171
+ }
172
+
173
+ .logos-grid-2,
174
+ .logos-grid-3,
175
+ .logos-grid-4,
176
+ .logos-grid-5,
177
+ .logos-grid-6 {
178
+ grid-template-columns: repeat(2, 1fr);
179
+ }
180
+ }
181
+
182
+ @media (max-width: 480px) {
183
+ .logos-grid-2,
184
+ .logos-grid-3,
185
+ .logos-grid-4,
186
+ .logos-grid-5,
187
+ .logos-grid-6 {
188
+ grid-template-columns: 1fr;
189
+ }
190
+
191
+ .logos-conteudo {
192
+ padding: 20px;
193
+ }
194
+ }
195
+ </style>
@@ -223,6 +223,12 @@
223
223
  border: 1px solid #006969;
224
224
  }
225
225
 
226
+ .btn-todos:active{
227
+ color: #ffffff;
228
+ background-color: #025257;
229
+ border: 1px solid #025257;
230
+ }
231
+
226
232
  .sub-title {
227
233
  font-size: 20px;
228
234
  font-weight: 400;
@@ -227,9 +227,7 @@ console.log('- Tamanho:', '{{ value.tamanho }}');
227
227
  display: flex;
228
228
  flex-direction: column;
229
229
  align-items: center;
230
- border: 1px solid #e9ecef;
231
230
  border-radius: 8px;
232
- background: #f8f9fa;
233
231
  transition: all 0.3s ease;
234
232
  }
235
233
 
@@ -224,9 +224,9 @@
224
224
  }
225
225
 
226
226
  .sistema-tab-button {
227
- background: #007D7A;
228
- color: white;
229
- border: 1px solid transparent;
227
+ background: #fdfbf0;
228
+ color: #173741;
229
+ border: 1px solid #e5cfda;
230
230
  padding: 0.75rem 1.5rem;
231
231
  border-radius: 50px;
232
232
  cursor: pointer;
@@ -240,11 +240,11 @@
240
240
 
241
241
  .sistema-tab-button:hover {
242
242
  color: white;
243
- background: #006969;
243
+ background: #B5302C;
244
244
  }
245
245
 
246
246
  .sistema-tab-button.active {
247
- background: #025257;
247
+ background: #173741;
248
248
  color: white;
249
249
  font-weight: 600;
250
250
  }
@@ -290,6 +290,10 @@
290
290
  .sistema-projetos-grid {
291
291
  grid-template-columns: 1fr;
292
292
  }
293
+
294
+ .sistema-progresso-section{
295
+ display: none;
296
+ }
293
297
  }
294
298
 
295
299
  .sistema-projeto-card {
@@ -887,6 +891,8 @@
887
891
  .sistema-tabs-nav {
888
892
  gap: 0.25rem;
889
893
  padding: 0.75rem;
894
+ display: flex;
895
+ flex-direction: column;
890
896
  }
891
897
 
892
898
  .sistema-tab-button {
@@ -947,7 +953,20 @@
947
953
  {% endblock %}
948
954
 
949
955
  {% block content %}
950
- <div class="sistema-votacao-wrapper">
956
+ {% load static %}
957
+ <section class="padding-mobile">
958
+ <div class="sistema-votacao-wrapper"
959
+ {% if page.background_image_fundo %}
960
+ {% for block in page.background_image_fundo %}
961
+ {% if block.block_type == 'background_image_stream' and block.value %}
962
+ style="background-image: url('{{ block.value.file.url }}');
963
+ background-size: cover;
964
+ background-position: center;
965
+ background-repeat: no-repeat;
966
+ background-attachment: fixed;"
967
+ {% endif %}
968
+ {% endfor %}
969
+ {% endif %}>
951
970
  <div class="sistema-votacao-header{% if page.imagem_fundo %} has-background{% endif %}"
952
971
  {% if page.imagem_fundo %}
953
972
  {% for block in page.imagem_fundo %}
@@ -967,12 +986,20 @@
967
986
  </div>
968
987
  {% endif %}
969
988
  </div>
970
- </div>
971
- <!-- Em vez do StreamField, use include direto -->
989
+ </div>
990
+
991
+
992
+ {% if page.conteudo_pagina %}
993
+ {% for block in page.conteudo_pagina %}
994
+ {% include_block block %}
995
+ {% endfor %}
996
+ {% endif %}
997
+
972
998
  <div class="recaptcha-votacao-container">
973
999
  {% include 'enap_designsystem/blocks/recaptcha.html' with value=recaptcha_config %}
974
1000
  </div>
975
1001
 
1002
+
976
1003
  <div class="sistema-votacao-container">
977
1004
  <!-- Header -->
978
1005
 
@@ -1202,7 +1229,7 @@
1202
1229
  <!-- CSRF Token -->
1203
1230
  <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
1204
1231
 
1205
-
1232
+ </section>
1206
1233
  <script>
1207
1234
  const SistemaVotacao = {
1208
1235
  // Estado da aplicação
@@ -2239,4 +2239,4 @@ def ranking_projetos(request, categoria_id=None):
2239
2239
  return JsonResponse({
2240
2240
  'success': False,
2241
2241
  'message': 'Erro ao buscar ranking'
2242
- }, status=500)
2242
+ }, status=500)