diff --git a/app.rb b/app.rb
index 100a814..750d2c2 100644
--- a/app.rb
+++ b/app.rb
@@ -2,8 +2,44 @@ require 'gollum/app'
require 'sinatra/flash'
require "sqlite3"
require 'tonton_web'
+require 'pathname'
class TonTonWeb::App < Sinatra::Base
+ # Renders a view by the filename without the extension (without a predefined render)
+ # TODO: pass this to tonton-web code
+ def render_any template_name, base_dir, options = {}
+ for extension in ['.markdown', '.erb']
+ template_name.delete_suffix!(extension)
+ end
+
+ views_root = settings.views || "./views"
+
+ # Search for any file with the given name and any extension
+ # Dir.glob returns an array of matching file paths
+ views_dir = Dir.new("#{views_root}/#{base_dir}")
+
+ found = false
+ filename = nil
+
+ while not found and ( filename = views_dir.read ) != nil
+ if File.basename(filename, ".*") == template_name
+ found = true
+ end
+ end
+
+ if not found
+ halt 404, "Template named '#{template_name}' not found."
+ end
+
+ file_path = "#{base_dir}/#{template_name}"
+
+ engine = File.extname(filename).delete('.').to_sym
+
+ # Dynamically call the correct Sinatra method (e.g., erb :hello, markdown :hello)
+ # We use 'send' to call the method by its name symbol
+ send(engine, file_path.to_sym, options)
+ end
+
set :host_authorization, { permitted_hosts: ['localhost', 'mytonton.com.br'] }
set :sessions, true
@@ -16,15 +52,17 @@ class TonTonWeb::App < Sinatra::Base
markdown File.read("readme.md"), layout_engine: :erb, layout: true
end
- get '/:name' do
- markdown request.path_info.to_sym, layout_engine: :erb, layout: true
- end
+ # Chapa Sigmóide
- get '/chapa-sigmoide/readme' do
- erb request.path_info.to_sym, layout_engine: :erb, layout: :chapa_sigmoide
+ get '/chapa-sigmoide' do
+ redirect "/chapa-sigmoide/readme.markdown"
end
get '/chapa-sigmoide/:name' do
- markdown request.path_info.to_sym, layout_engine: :erb, layout: :chapa_sigmoide
+ render_any params['name'], 'chapa-sigmoide', layout_engine: :erb, layout: :chapa_sigmoide
+ end
+
+ get '/chapa-sigmoide/members/:name' do
+ render_any params['name'], 'chapa-sigmoide/members', layout_engine: :erb, layout: :chapa_sigmoide
end
end
\ No newline at end of file
diff --git a/public/chapa-sigmoide/fabill.jpg b/public/chapa-sigmoide/fabill.jpg
new file mode 100644
index 0000000..eecc84b
Binary files /dev/null and b/public/chapa-sigmoide/fabill.jpg differ
diff --git a/public/chapa-sigmoide/henrique.png b/public/chapa-sigmoide/henrique.png
new file mode 100644
index 0000000..51a035f
Binary files /dev/null and b/public/chapa-sigmoide/henrique.png differ
diff --git a/public/chapa-sigmoide/leonardo-easteregg.jpg b/public/chapa-sigmoide/leonardo-easteregg.jpg
new file mode 100644
index 0000000..2732a82
Binary files /dev/null and b/public/chapa-sigmoide/leonardo-easteregg.jpg differ
diff --git a/public/chapa-sigmoide/logo-circular.svg b/public/chapa-sigmoide/logo-circular.svg
new file mode 100644
index 0000000..c7a80bf
--- /dev/null
+++ b/public/chapa-sigmoide/logo-circular.svg
@@ -0,0 +1,89 @@
+
+
+
+
diff --git a/public/chapa-sigmoide/logo-retangular-com-texto.svg b/public/chapa-sigmoide/logo-retangular-com-texto.svg
new file mode 100644
index 0000000..98bc36c
--- /dev/null
+++ b/public/chapa-sigmoide/logo-retangular-com-texto.svg
@@ -0,0 +1,131 @@
+
+
+
+
diff --git a/public/chapa-sigmoide/logo-retangular-sem-texto.svg b/public/chapa-sigmoide/logo-retangular-sem-texto.svg
new file mode 100644
index 0000000..24637ba
--- /dev/null
+++ b/public/chapa-sigmoide/logo-retangular-sem-texto.svg
@@ -0,0 +1,112 @@
+
+
+
+
diff --git a/public/chapa-sigmoide/mateus-easteregg.gif b/public/chapa-sigmoide/mateus-easteregg.gif
new file mode 100644
index 0000000..115ae00
Binary files /dev/null and b/public/chapa-sigmoide/mateus-easteregg.gif differ
diff --git a/public/chapa-sigmoide/sigmoid-function.svg b/public/chapa-sigmoide/sigmoid-function.svg
new file mode 100644
index 0000000..3fb2cce
--- /dev/null
+++ b/public/chapa-sigmoide/sigmoid-function.svg
@@ -0,0 +1,160 @@
+
+
+
+
diff --git a/public/css/chapa_sigmoide.css b/public/css/chapa_sigmoide.css
index 4424edc..ef110da 100644
--- a/public/css/chapa_sigmoide.css
+++ b/public/css/chapa_sigmoide.css
@@ -9,35 +9,20 @@
:root, ::backdrop
{
--content-space-width: min(100vw, 100vh);
-
--empty-space-width: calc( 100vw - var(--content-space-width) );
-
--main-font: "Victor Mono";
-
--border-width: 0.6vw;
-
--default-distance: min(1vw, 1vh);
-
--color-background-1: #060e1e;
-
--color-background-faded: #212121ab;
-
--color-background-2: #060e1e;
-
--color-background-interactive: #ffb30029;
-
--color-text-normal: #dcdcdc;
-
--color-text-marked: #85e80c;
-
--color-text-shadowed: grey;
-
--color-clickable-normal: #FF7700;
-
--color-clickable-selected: #ffcd5b;
-
--color-border: #85e80c;
-
--color-border-hover: #bdbdbd;
}
@@ -200,6 +185,7 @@ hr { color: var(--color-border); }
h1, h2, h3, h4, h5, h6, p:not( div > p )
{
overflow-x: auto;
+ overflow-y: hidden;
line-height: 1.4em;
margin-top: 0;
}
@@ -234,6 +220,13 @@ button, input[type="submit"], input[type="reset"], input[type="button"]
button svg {pointer-events:none;}
+header img
+{
+ width: min(50vw, 50vh);
+ margin-right: auto;
+ margin-left: auto;
+}
+
div.ficha
{
display: grid;
@@ -270,17 +263,24 @@ div.ficha figure
padding: 0;
}
-div.ficha figure img
+div.ficha img
{
margin: 0;
aspect-ratio: 3 / 4;
+}
+
+div.ficha:not(.easteregg-visible) img
+{
animation-name: image-change;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
animation-duration: 10s;
}
-div.ficha div.description
+div.ficha.easteregg-visible img:not(.easteregg)
+{ opacity: 0; }
+
+div.ficha div.description, div.ficha div.easteregg
{
grid-row: 2;
grid-column: 1 / 3;
@@ -296,46 +296,78 @@ div.ficha div.description
@keyframes image-change
{
0% { opacity: 0; }
-
10% { opacity: 1; }
-
50% { opacity: 1; }
-
60% { opacity: 0; }
-
100% { opacity: 0; }
}
+@keyframes shake {
+ 0%, 100% { transform: translateX(0); }
+ 20%, 60% { transform: translateX(-8px) rotate(-1deg); }
+ 40%, 80% { transform: translateX(8px) rotate(1deg); }
+}
+
+.animate-shake
+{ animation: shake 0.3s ease-in-out; }
+
+div.easteregg-visible
+{ animation: glow 1s infinite alternate ease-in-out; }
+
+@keyframes glow {
+ 0% {
+ border-color: orange;
+ box-shadow: 0 0 10px orange,
+ 0 0 20px orange;
+ }
+
+ 100% {
+ border-color: red;
+ box-shadow: 0 0 10px red,
+ 0 0 30px red;
+ }
+}
+
+div.easteregg-visible div.description,
+div:not(.easteregg-visible) .easteregg,
+div:not(.easteregg-visible).easteregg
+{ display: none; }
+
+div.easteregg-visible .easteregg
+{ display: block; }
+
div.ficha figure img:nth-of-type(1)
{ animation-delay: 0s;}
-div.ficha figure img:nth-of-type(2)
+div.ficha figure img:not(:nth-of-type(1))
{
- animation-delay: 5s;
- opacity: 0;
position: absolute;
left: 0rem;
top: 0rem;
- width: 100%;;
+ width: 100%;
padding: inherit;
box-sizing: border-box;
}
+div.ficha figure img:not(:nth-of-type(1)):not(.easteregg)
+{ opacity: 0; animation-delay: 5s; }
+
+div.ficha img.easteregg
+{ opacity: 1; }
+
+
@media print
{
:root
{
- --color-text-normal: #000000;
- --color-clickable-normal: #003cc7;
+ --color-text-normal: black;
+ --color-text-marked: black;
+ --color-border: black;
+ --color-clickable-normal: blue;
}
h1, h2, h3, h4, h5, h6, p:not( div > p )
{
word-wrap: break-word;
}
-
- #buttonShowDialogMain
- {
- display: none;
- }
}
\ No newline at end of file
diff --git a/public/javascript/chapa_sigmoide.js b/public/javascript/chapa_sigmoide.js
new file mode 100644
index 0000000..3468fbe
--- /dev/null
+++ b/public/javascript/chapa_sigmoide.js
@@ -0,0 +1,75 @@
+const cards = document.querySelectorAll('div.ficha');
+
+for (const card of cards)
+{
+ card.addEventListener('click', handleCardClick);
+}
+
+const eastereggContainers = document.querySelectorAll('div.ficha:has(.easteregg), div.ficha.easteregg');
+
+const messageBox = document.getElementById('message-box');
+
+let clickCount = 0;
+let lastClickTime = 0;
+const clickThreshold = 800;
+const expandDuration = 5000;
+
+let hideTimeoutId = null;
+
+function hideEastereggs() {
+ for (const div of eastereggContainers)
+ {
+ div.classList.remove('easteregg-visible');
+ }
+}
+
+function expandEastereggs() {
+ for (const div of eastereggContainers)
+ {
+ div.classList.add('easteregg-visible');
+ }
+
+ // Clear any existing timeout and set a new one
+ if (hideTimeoutId) {
+ clearTimeout(hideTimeoutId);
+ }
+
+ hideTimeoutId = setTimeout(
+ () => { hideEastereggs(); },
+ expandDuration
+ );
+
+ clickCount = 0;
+}
+
+function handleCardClick(event) {
+ const now = Date.now();
+
+ let element = event.target;
+
+ while (!element.classList.contains("ficha"))
+ { element = element.parentElement }
+
+ element.classList.add('animate-shake');
+
+ setTimeout(
+ () => { element.classList.remove('animate-shake'); },
+ 300
+ );
+
+ // Determine if the click is 'in a row'
+ if (now - lastClickTime < clickThreshold)
+ { clickCount++; }
+ else
+ {
+ clickCount = 1;
+ if (element.classList.contains('easteregg-visible'))
+ { hideEastereggs(); }
+ }
+
+ lastClickTime = now;
+
+ // Check for the 3-click trigger
+ if (clickCount >= 3)
+ { expandEastereggs(); }
+}
\ No newline at end of file
diff --git a/views/chapa-sigmoide/ARM-computer-at-CA.markdown b/views/chapa-sigmoide/ARM-computer-at-CA.markdown
new file mode 100644
index 0000000..e69de29
diff --git a/views/chapa-sigmoide/QA.markdown b/views/chapa-sigmoide/QA.markdown
new file mode 100644
index 0000000..a284913
--- /dev/null
+++ b/views/chapa-sigmoide/QA.markdown
@@ -0,0 +1,53 @@
+# Perguntas e respostas sobre a Chapa Sigmóide
+
+## Quais são as chapas alternativas à Chapa Sigmóide?
+
+Apenas a [Chapa Linus Torvalds](https://www.instagram.com/chapalinus/).
+
+## Qual é a relação entre a Chapa Sigmóide e a Chapa Linus Torvalds?
+
+Muitos dos integrantes de ambas as chapas são colegas de sala, e ingressaram juntos na faculdade.
+
+A Chapa Sigmóide reconhece a competência da Chapa Linus Torvalds, e deseja-lhe boa sorte. ♥
+
+## Por que duas chapas?
+
+Para dar mais opções aos eleitores, para ser algo singular.
+
+Observando a personalidade própria que a chapa desenvolveu, avaliamos que isso foi alcançado.
+
+## Por que a chapa não tem mulheres?
+
+Dentre as diversas pessoas convidadas para integrar a chapa, estavam algumas graduandas.
+
+No entanto, a assintonia entre os números de homens e de mulheres no curso foi um desafio durante a escolha. A proporção dentre os calouros de 2025 estava em torno de 8 para 1, conforme a [primeira lista de classificados](https://files.listao.ufpa.br/classificados/038.html) divulgada pela UFPA. Isso é algo que a chapa visa se esforçar para melhorar.
+
+Conforme o estatuto do Centro Acadêmico, além da diretoria executiva, da qual fazem parte os 6 membros atuais, a gestão também possui 5 diretorias integradas, cada uma com dois cargos de diretor. Caso eleita, a Chapa Sigmóide deixará aberto um cargo de cada diretoria integrada, e reitera os convites anteriores a quem quiser ocupar um desses cargos.
+
+Apenas um cargo de cada diretoria integrada ficaria aberto até o ano de 2026, para que entrantes desse ano, incluindo as calouras, também tenham a oportunidade de participar da gerência do Centro Acadêmico.
+
+## Não ter mulheres em cargos de liderança não é algo negativo?
+
+A presença de mulheres em cargos de liderança é um incentivo ao público feminino. Isso foi algo levado em consideração no convite de membros, apesar dos desafios já citados.
+
+No entanto, o termo "cargo de liderança" é relativo. De certo modo, todos os cargos da chapa são cargos de liderança.
+
+Apesar das diferentes atribuições dos cargos, previstas pelo estatuto do Centro Acadêmico, há uma convergência no diálogo e na importância de cada um, no direito de se engajar e no direito de ser engajado.
+
+Metaforicamente, a Chapa Sigmóide nasceu como uma tábula redonda e aberta, e continuará carregando essa premissa consigo.
+
+## O que foi levado em consideração na escolha dos membros?
+
+Principalmente, o interesse em participar e em colaborar, assim como o engajamento observado.
+
+Para decidir o cargo a ser ocupado por cada pessoa, foi levado em conta suas habilidades e gostos pessoais.
+
+O desempenho das funções dentro da Chapa Sigmóide visa a felicidade de quem atua. Por isso, além das atribuições primárias, os membros também podem (e são encorajados) a contribuir com aquilo que se identificam.
+
+Por exemplo, o Secretário Geral atua em design e produção visual e artística dentro da chapa, e o Presidente atua na programação e administração do site.
+
+## Por que eu deveria votar na Chapa Sigmóide?
+
+Em última análise, essa é uma pergunta que fica para você, eleitor.
+
+Enquanto isso, a chapa continuará sendo uma opção para os eleitores, e agradeçe aos que, de alguma forma, se identificam com o aquilo que apresentamos.
diff --git a/views/chapa-sigmoide/acting.markdown b/views/chapa-sigmoide/acting.markdown
new file mode 100644
index 0000000..d5c1926
--- /dev/null
+++ b/views/chapa-sigmoide/acting.markdown
@@ -0,0 +1,31 @@
+# Propostas
+
+A proposta de atuação da Chapa Sigmóide se baseia, principalmente, nos tópicos que compõem a [personalidade](personality.markdown) da chapa.
+
+Como itens mais específicos, temos:
+
+ - [Presença no CA](presence-at-CA.markdown)
+
+ - [Site do curso e do CA](site.markdown)
+
+ - [Canal no Youtube](youtube.markdown)
+
+ - [Servidor aberto no Discord](discord.markdown)
+
+ - [Gravação de reuniões](meeting-recording.markdown)
+
+ - [Programação competitiva](competitive-programming.markdown)
+
+ - [Torneios de jogos](game-tournaments.markdown)
+
+ - [Vitrine de projetos](project-showcase.markdown)
+
+ - [Câmera de segurança no Centro Acadêmico](security-camera.markdown)
+
+ - [Computador x64 no Centro Acadêmico](x64-computer-at-CA.markdown)
+
+ - [Computador ARM no Centro Acadêmico](ARM-computer-at-CA.markdown)
+
+ - [Computador ARM no Centro Acadêmico](ARM-computer-at-CA.markdown)
+
+ - [Compilado do calouro](begginer-compilated.markdown)
diff --git a/views/chapa-sigmoide/begginer-compilated.markdown b/views/chapa-sigmoide/begginer-compilated.markdown
new file mode 100644
index 0000000..e69de29
diff --git a/views/chapa-sigmoide/competitive-programming.markdown b/views/chapa-sigmoide/competitive-programming.markdown
new file mode 100644
index 0000000..04487a3
--- /dev/null
+++ b/views/chapa-sigmoide/competitive-programming.markdown
@@ -0,0 +1,3 @@
+## Programação competitiva
+
+Organizar eventos de programação competitiva (como Capture The Flag) presenciais e remotos, buscando o apoio da Facomp e de empresas interessadas.
\ No newline at end of file
diff --git a/views/chapa-sigmoide/discord.markdown b/views/chapa-sigmoide/discord.markdown
new file mode 100644
index 0000000..2641421
--- /dev/null
+++ b/views/chapa-sigmoide/discord.markdown
@@ -0,0 +1,3 @@
+## Kortéx, um servidor no Discord aberto para o curso
+
+Atuar na moderação e na divulgação do Kortéx, um servidor aberto de estudos de computação no Discord.
\ No newline at end of file
diff --git a/views/chapa-sigmoide/game-tournaments.markdown b/views/chapa-sigmoide/game-tournaments.markdown
new file mode 100644
index 0000000..b32e161
--- /dev/null
+++ b/views/chapa-sigmoide/game-tournaments.markdown
@@ -0,0 +1,3 @@
+## Torneios de games
+
+Organizar torneios de jogos presenciais e remotos, e buscar a parceria com o Centro Acadêmico de Sistemas de Informação nesses eventos.
\ No newline at end of file
diff --git a/views/chapa-sigmoide/meeting-recording.markdown b/views/chapa-sigmoide/meeting-recording.markdown
new file mode 100644
index 0000000..4b7afb2
--- /dev/null
+++ b/views/chapa-sigmoide/meeting-recording.markdown
@@ -0,0 +1,5 @@
+## Reuniões ordinárias gravadas
+
+Gravação das reuniões mensais do centro academico, que serão postadas no Youtube.
+
+Atas serão disponibilizadas no site.
\ No newline at end of file
diff --git a/views/chapa-sigmoide/readme.erb b/views/chapa-sigmoide/members.erb
similarity index 71%
rename from views/chapa-sigmoide/readme.erb
rename to views/chapa-sigmoide/members.erb
index cfa11ae..ac96968 100644
--- a/views/chapa-sigmoide/readme.erb
+++ b/views/chapa-sigmoide/members.erb
@@ -15,6 +15,8 @@
+
+
Gosta de: programação, Linux, código aberto, Hollow Knight, Undertale, Deltarune, Chuunibyo.
- + +UwU
Gosta de: tecnologia, estudar, séries, filmes, jogos, desenhos.
- + @@ -63,6 +69,8 @@
+
+ BUSTAMONTE
Gosta de: design em geral, filmes e quadrinhos.
- + @@ -117,7 +129,7 @@Semestre: 2º.
Gosta de: Linux, Low-Level, Ficção Científica, Conhecimento Livre e Cibersegurança.
- + @@ -131,9 +143,9 @@
+
-
+
Gosta de: animes, manhwa, games, rpg, cibersegurança e curiosidades tecnológicas
- + +(Quase) Tesoureiro
+ +Fabill
+ +Windows user
+
+ Semestre: 2º.
+ +Gosta de: bíblia, animes e FNAF.
+ +america yaaa
+ +Último detentor do Orange Pi.