[init] Add Files

main
Joaquin 3 years ago
commit 076270067d
Signed by: puly
GPG Key ID: 9E9299CD96C65EC6
  1. 2
      .gitignore
  2. 2
      Makefile
  3. 367
      app.js
  4. 939
      css/dist.css
  5. BIN
      css/manrope.ttf
  6. 144
      css/source.css
  7. 1409
      package-lock.json
  8. 17
      package.json
  9. 1
      repo/credentials
  10. 14
      repo/credentials.bak
  11. 26
      tailwind.config.js
  12. 89
      webFiles/adminpanel.html
  13. 42
      webFiles/alrvote.html
  14. 50
      webFiles/login.html
  15. 42
      webFiles/noactivity.html
  16. 35
      webFiles/nodash.html
  17. 57
      webFiles/show.html
  18. 54
      webFiles/vote.html

2
.gitignore vendored

@ -0,0 +1,2 @@
node_modules
repo/secret

@ -0,0 +1,2 @@
stylesheet:
npx tailwindcss --input css/source.css --output css/dist.css

367
app.js

@ -0,0 +1,367 @@
const http = require('http');
const express = require('express');
const fs = require('fs');
const url = require('url');
const crypto = require('crypto');
const session = require('express-session')
//const FileStore = require('session-file-store')(session)
const app = express();
if(!fs.existsSync('repo')) fs.mkdirSync('repo');
var secret;
var logString = "";
var credString;
var credentials;
var activity = "none";
var voteText = "Sunteti de acord cu initiativa X?";
var yesVotes = 0;
var noVotes = 0;
if(!fs.existsSync('repo/secret')){
secret = crypto.randomBytes(35).toString('hex');
fs.writeFileSync('repo/secret', secret);
}else{
secret = fs.readFileSync('repo/secret');
}
if(fs.existsSync('repo/credentials')){
credString = fs.readFileSync('repo/credentials')
credentials = JSON.parse(credString);
}
app.use(session({
secret: secret.toString(),
saveUninitialized:false,
resave:false,
cookie: {maxAge: 120000}
//store:new FileStore()
}));
function report(str){
console.log(str);
logString = logString.concat('\n', str);
}
report("sha256 of secret string, check for persistance: 0x" + crypto.createHash('sha256').update(secret).digest('hex'));
Object.keys(credentials).forEach(function(key) {
credentials[key].votingRights = 0;
credentials[key].loggedIn = 0;
credentials[key].present = 0;
});
function giveVotingRights(){
Object.keys(credentials).forEach(function(key) {
credentials[key].votingRights = 1;
});
}
function takeVotingRights(){
Object.keys(credentials).forEach(function(key) {
credentials[key].votingRights = 0;
});
}
app.get('/', (request, response) => {
if(!request.session.user){
response.redirect('/login');
response.end();
}else{
response.redirect('/home');
response.end();
}
return;
});
app.get('/logout', (request, response) => {
if(request.session.user){
report('LOGGED OUT: ' + request.session.user);
credentials[request.session.user].loggedIn = 0;
request.session.user = '';
response.redirect('/');
response.end();
return;
}
});
app.get('/login', (request, response) => {
fs.readFile('./webFiles/login.html', function(error, content){
if(error) report(error);
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(content);
});
return;
});
app.get('/loginact', (request, response) => {
if(request.query.user && request.query.pass){
if(activity === 'pass'){
credentials[request.query.user].pass = crypto.createHash('sha256').update(request.query.pass).digest('hex');
report(request.query.user + " RESET THEIR PASSWORD");
return;
}
if(credentials[request.query.user].pass === crypto.createHash('sha256').update(request.query.pass).digest('hex')){
if(credentials[request.query.user].loggedIn === 1){
response.writeHeader(200);
response.end("ALREADY LOGGED IN");
return;
}
request.session.user = request.query.user;
credentials[request.query.user].loggedIn = 1;
report("LOG IN: " + request.query.user);
}
}
response.redirect('/home');
response.end();
return;
});
app.get('/home', (request, response) => {
if(request.session.user === 'admin'){
response.redirect('/admin');
response.end();
return;
}
if(request.session.user){
if(activity === "none"){
fs.readFile('./webFiles/noactivity.html', function(error, content){
if(error) report(error);
contentx = content.toString().replace("$USER$" , request.session.user);
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(contentx);
});
}
if(activity === "vote" && credentials[request.session.user].votingRights === 1){
fs.readFile('./webFiles/vote.html', function(error, content){
if(error) report(error);
contentx = content.toString().replace("$VOTETEXT$" , voteText);
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(contentx);
});
}
if(activity === "vote" && credentials[request.session.user].votingRights === 0){
fs.readFile('./webFiles/alrvote.html', function(error, content){
if(error) report(error);
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(content);
});
}
if(activity === "show"){
fs.readFile('./webFiles/show.html', function(error, content){
if(error) report(error);
contentx = content.toString().replace("$VOTETEXT$" , voteText);
contentx = contentx.toString().replace("$YESVOTES$", yesVotes);
contentx = contentx.toString().replace("$NOVOTES$", noVotes);
if(yesVotes >= noVotes)
contentx = contentx.toString().replace("$RESULT$", "Motiunea a trecut");
else
contentx = contentx.toString().replace("$RESULT$", "Motiunea a picat");
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(contentx);
});
}
}else{
response.redirect("/");
response.end();
}
return;
});
app.get('/dashboard', (request, response) => {
if(activity === "show"){
fs.readFile('./webFiles/show.html', function(error, content){
if(error) report(error);
contentx = content.toString().replace("$VOTETEXT$" , voteText);
contentx = contentx.toString().replace("$YESVOTES$", yesVotes);
contentx = contentx.toString().replace("$NOVOTES$", noVotes);
if(yesVotes >= noVotes)
contentx = contentx.toString().replace("$RESULT$", "Motiunea a trecut");
else
contentx = contentx.toString().replace("$RESULT$", "Motiunea a picat");
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(contentx);
});
}else{
fs.readFile('./webFiles/nodash.html', function(error, content){
if(error) report(error);
contentx = content.toString().replace("$USER$" , request.session.user);
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(contentx);
});
}
return;
});
app.get('/vote/yes', (request, response) => {
if(request.session.user){
if(credentials[request.session.user].votingRights === 1){
credentials[request.session.user].votingRights = 0;
yesVotes++;
report(request.session.user + " - YES");
}else{
response.writeHead(200);
response.end("ALREADY VOTED");
return;
}
}
response.redirect('/home');
response.end();
return;
});
app.get('/vote/no', (request, response) => {
if(request.session.user){
if(credentials[request.session.user].votingRights === 1){
credentials[request.session.user].votingRights = 0;
noVotes++;
report(request.session.user + " - NO");
}else{
response.writeHead(200);
response.end("ALREADY VOTED");
return;
}
}
response.redirect('/home');
response.end();
return;
});
app.get('/admin', (request, response) => {
if(request.session.user === 'admin'){
fs.readFile('./webFiles/adminpanel.html', function(error, content){
if(error) report(error);
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(content);
return;
});
}
});
app.get('/admindo', (request, response) => {
if(request.session.user === 'admin'){
if(request.query.do === 'start-vot'){
activity = "vote";
voteText = request.query.text;
giveVotingRights();
report("------------VOT: " + voteText + " ------------");
}
if(request.query.do === 'clear'){
takeVotingRights();
activity = "none";
yesVotes = 0;
noVotes = 0;
report("------------CLEAR------------");
}
if(request.query.do === 'show'){
takeVotingRights();
activity = "show";
report("------------");
report("DA - " + yesVotes.toString() + " | NU - " + noVotes.toString());
report("------------STOP VOT------------");
}
if(request.query.do === 'pass'){
report("------------SETTING PASSWORDS------------");
activity = "pass";
}
if(request.query.do === 'writerepo'){
report("------------STOP PASSWORD SETTING------------");
activity = "none";
fs.writeFileSync('repo/credentials', JSON.stringify(credentials));
}
if(request.query.do === 'getaudit'){
response.writeHead(200);
response.end(logString);
return;
}
}
response.redirect('/admin');
response.end();
return;
});
app.get('/css/dist.css', (request, response) => {
fs.readFile('./css/dist.css', function(error, content){
if(error) report(error);
response.writeHead(200, {'Content-Type': 'text/css'});
response.end(content);
});
return;
});
app.get('/css/manrope.ttf', (request, response) => {
fs.readFile('./css/manrope.ttf', function(error, content){
if(error) report(error);
response.writeHead(200, {'Content-Type': 'font/ttf'});
response.end(content);
});
return;
});
const server = http.createServer(app);
server.listen(8881);

@ -0,0 +1,939 @@
/*
! tailwindcss v3.0.18 | MIT License | https://tailwindcss.com
*/
/*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/
*,
::before,
::after {
box-sizing: border-box;
/* 1 */
border-width: 0;
/* 2 */
border-style: solid;
/* 2 */
border-color: #e5e7eb;
/* 2 */
}
::before,
::after {
--tw-content: '';
}
/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
*/
html {
line-height: 1.5;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
-moz-tab-size: 4;
/* 3 */
-o-tab-size: 4;
tab-size: 4;
/* 3 */
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
/* 4 */
}
/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/
body {
margin: 0;
/* 1 */
line-height: inherit;
/* 2 */
}
/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/
hr {
height: 0;
/* 1 */
color: inherit;
/* 2 */
border-top-width: 1px;
/* 3 */
}
/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
/*
Remove the default font size and weight for headings.
*/
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
/*
Reset links to optimize for opt-in styling instead of opt-out.
*/
a {
color: inherit;
text-decoration: inherit;
}
/*
Add the correct font weight in Edge and Safari.
*/
b,
strong {
font-weight: bolder;
}
/*
1. Use the user's configured `mono` font family by default.
2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp,
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* 1 */
font-size: 1em;
/* 2 */
}
/*
Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/
table {
text-indent: 0;
/* 1 */
border-color: inherit;
/* 2 */
border-collapse: collapse;
/* 3 */
}
/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
/* 1 */
font-size: 100%;
/* 1 */
line-height: inherit;
/* 1 */
color: inherit;
/* 1 */
margin: 0;
/* 2 */
padding: 0;
/* 3 */
}
/*
Remove the inheritance of text transform in Edge and Firefox.
*/
button,
select {
text-transform: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button styles.
*/
button,
[type='button'],
[type='reset'],
[type='submit'] {
-webkit-appearance: button;
/* 1 */
background-color: transparent;
/* 2 */
background-image: none;
/* 2 */
}
/*
Use the modern Firefox focus style for all focusable elements.
*/
:-moz-focusring {
outline: auto;
}
/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/
:-moz-ui-invalid {
box-shadow: none;
}
/*
Add the correct vertical alignment in Chrome and Firefox.
*/
progress {
vertical-align: baseline;
}
/*
Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/
[type='search'] {
-webkit-appearance: textfield;
/* 1 */
outline-offset: -2px;
/* 2 */
}
/*
Remove the inner padding in Chrome and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button;
/* 1 */
font: inherit;
/* 2 */
}
/*
Add the correct display in Chrome and Safari.
*/
summary {
display: list-item;
}
/*
Removes the default spacing and border for appropriate elements.
*/
blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
margin: 0;
}
fieldset {
margin: 0;
padding: 0;
}
legend {
padding: 0;
}
ol,
ul,
menu {
list-style: none;
margin: 0;
padding: 0;
}
/*
Prevent resizing textareas horizontally by default.
*/
textarea {
resize: vertical;
}
/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/
input::-moz-placeholder, textarea::-moz-placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
input:-ms-input-placeholder, textarea:-ms-input-placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
input::placeholder,
textarea::placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
/*
Set the default cursor for buttons.
*/
button,
[role="button"] {
cursor: pointer;
}
/*
Make sure disabled buttons don't get the pointer cursor.
*/
:disabled {
cursor: default;
}
/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
This can trigger a poorly considered lint error in some tools but is included by design.
*/
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block;
/* 1 */
vertical-align: middle;
/* 2 */
}
/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/
img,
video {
max-width: 100%;
height: auto;
}
/*
Ensure the default browser behavior of the `hidden` attribute.
*/
[hidden] {
display: none;
}
*, ::before, ::after {
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
}
.fixed {
position: fixed;
}
.bottom-4 {
bottom: 1rem;
}
.my-5 {
margin-top: 1.25rem;
margin-bottom: 1.25rem;
}
.my-2 {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
.mx-2 {
margin-left: 0.5rem;
margin-right: 0.5rem;
}
.ml-auto {
margin-left: auto;
}
.mr-auto {
margin-right: auto;
}
.flex {
display: flex;
}
.min-h-\[100vh\] {
min-height: 100vh;
}
.w-full {
width: 100%;
}
.w-5\/6 {
width: 83.333333%;
}
.min-w-\[60vw\] {
min-width: 60vw;
}
.flex-row {
flex-direction: row;
}
.flex-wrap {
flex-wrap: wrap;
}
.items-center {
align-items: center;
}
.justify-center {
justify-content: center;
}
.rounded-3xl {
border-radius: 1.5rem;
}
.rounded-xl {
border-radius: 0.75rem;
}
.rounded-md {
border-radius: 0.375rem;
}
.bg-indigo-900 {
--tw-bg-opacity: 1;
background-color: rgb(49 46 129 / var(--tw-bg-opacity));
}
.bg-mycol2 {
--tw-bg-opacity: 1;
background-color: rgb(22 21 36 / var(--tw-bg-opacity));
}
.bg-\[\#0B5D1E\] {
--tw-bg-opacity: 1;
background-color: rgb(11 93 30 / var(--tw-bg-opacity));
}
.bg-\[\#820933\] {
--tw-bg-opacity: 1;
background-color: rgb(130 9 51 / var(--tw-bg-opacity));
}
.bg-\[url\(\'\.\.\/\.\.\/img\/bground1\.jpg\'\)\] {
background-image: url('../../img/bground1.jpg');
}
.py-10 {
padding-top: 2.5rem;
padding-bottom: 2.5rem;
}
.px-8 {
padding-left: 2rem;
padding-right: 2rem;
}
.py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
.px-3 {
padding-left: 0.75rem;
padding-right: 0.75rem;
}
.py-5 {
padding-top: 1.25rem;
padding-bottom: 1.25rem;
}
.px-5 {
padding-left: 1.25rem;
padding-right: 1.25rem;
}
.px-2 {
padding-left: 0.5rem;
padding-right: 0.5rem;
}
.py-1 {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
}
.pb-10 {
padding-bottom: 2.5rem;
}
.pr-5 {
padding-right: 1.25rem;
}
.pl-5 {
padding-left: 1.25rem;
}
.text-center {
text-align: center;
}
.font-\[manrope\] {
font-family: manrope;
}
.text-3xl {
font-size: 1.875rem;
line-height: 2.25rem;
}
.text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
}
.text-sm {
font-size: 0.875rem;
line-height: 1.25rem;
}
.font-extrabold {
font-weight: 800;
}
.font-bold {
font-weight: 700;
}
.tracking-wide {
letter-spacing: 0.025em;
}
.text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.text-black {
--tw-text-opacity: 1;
color: rgb(0 0 0 / var(--tw-text-opacity));
}
.outline {
outline-style: solid;
}
.outline-0 {
outline-width: 0px;
}
.outline-white {
outline-color: #fff;
}
@font-face {
font-family: 'manrope';
src: url('./manrope.ttf');
}
body {
padding: 0;
margin: 0;
font-family: 'manrope', 'MR', sans-serif;
font-weight: 600;
width: 100vw;
height: 100vh;
background: #0b001b;
overflow-x: hidden;
max-width: 100%;
}
img.profile{
border-radius: 30px;
height: 100px;
aspect-ratio: 1 / 1;
box-shadow: 6px 6px 15px #0b001b;
}
p{
}
.kmscontainer {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr;
gap: 0px 0px;
grid-template-areas:
"windows office";
}
.windows {
grid-area: windows;
}
.office {
grid-area: office;
}
.winvercontainer {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: 1fr;
gap: 0px 0px;
grid-template-areas:
"eleven ten eight seven";
}
.eleven {
grid-area: eleven;
}
.ten {
grid-area: ten;
}
.eight {
grid-area: eight;
}
.seven {
grid-area: seven;
}
.officevercontainer {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr;
gap: 0px 0px;
grid-template-areas:
"twentyone nineteen legacy";
}
.twentyone {
grid-area: twentyone;
}
.nineteen {
grid-area: nineteen;
}
.legacy {
grid-area: legacy;
}
.wave {
-webkit-animation-name: wave-animation;
animation-name: wave-animation;
-webkit-animation-duration: 2.5s;
animation-duration: 2.5s;
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
transform-origin: 70% 70%;
display: inline-block;
}
.emohi:hover {
-webkit-animation-name: wave-animation;
animation-name: wave-animation;
-webkit-animation-duration: 2.5s;
animation-duration: 2.5s;
-webkit-animation-iteration-count: 1;
animation-iteration-count: 1;
transform-origin: 70% 70%;
display: inline-block;
}
@-webkit-keyframes wave-animation {
0% {
transform: rotate( 0.0deg)
}
10% {
transform: rotate(14.0deg)
}
20% {
transform: rotate(-8.0deg)
}
30% {
transform: rotate(14.0deg)
}
40% {
transform: rotate(-4.0deg)
}
50% {
transform: rotate(10.0deg)
}
60% {
transform: rotate( 0.0deg)
}
100% {
transform: rotate( 0.0deg)
}
}
@keyframes wave-animation {
0% {
transform: rotate( 0.0deg)
}
10% {
transform: rotate(14.0deg)
}
20% {
transform: rotate(-8.0deg)
}
30% {
transform: rotate(14.0deg)
}
40% {
transform: rotate(-4.0deg)
}
50% {
transform: rotate(10.0deg)
}
60% {
transform: rotate( 0.0deg)
}
100% {
transform: rotate( 0.0deg)
}
}
.blurbg {
width:100%;
height:100%;
background-size:cover;
-moz-filter: blur(4px);
-ms-filter: blur(4px);
-o-filter: blur(4px);
filter: blur(4px);
}
button{
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.45), 0 17px 50px 0 rgba(0,0,0,0.40);
transition: transform .1s;
outline: none;
}
button:hover{
transform: scale(1.06);
}
.modal{
display: block;
position: fixed;
z-index: 1;
padding-top: 100px;
left: 0;
top: 0;
background-color: rgba(0,0,0,0.9);
}
.modal-content{
margin: auto;
display: block;
width: 80%;
max-width: 700px;
}
.hover\:bg-indigo-900:hover {
--tw-bg-opacity: 1;
background-color: rgb(49 46 129 / var(--tw-bg-opacity));
}
@media (min-width: 640px) {
.sm\:flex-nowrap {
flex-wrap: nowrap;
}
}
@media (min-width: 768px) {
.md\:w-2\/3 {
width: 66.666667%;
}
.md\:max-w-\[70vw\] {
max-width: 70vw;
}
.md\:bg-transparent {
background-color: transparent;
}
.md\:py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
.md\:px-7 {
padding-left: 1.75rem;
padding-right: 1.75rem;
}
.md\:text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
}
}

Binary file not shown.

@ -0,0 +1,144 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@font-face {
font-family: 'manrope';
src: url('./manrope.ttf');
}
body {
padding: 0;
margin: 0;
font-family: 'manrope', 'MR', sans-serif;
font-weight: 600;
width: 100vw;
height: 100vh;
background: #0b001b;
overflow-x: hidden;
max-width: 100%;
}
img.profile{
border-radius: 30px;
height: 100px;
aspect-ratio: 1 / 1;
box-shadow: 6px 6px 15px #0b001b;
}
p{
}
.kmscontainer {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr;
gap: 0px 0px;
grid-template-areas:
"windows office";
}
.windows { grid-area: windows; }
.office { grid-area: office; }
.winvercontainer {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: 1fr;
gap: 0px 0px;
grid-template-areas:
"eleven ten eight seven";
}
.eleven { grid-area: eleven; }
.ten { grid-area: ten; }
.eight { grid-area: eight; }
.seven { grid-area: seven; }
.officevercontainer {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr;
gap: 0px 0px;
grid-template-areas:
"twentyone nineteen legacy";
}
.twentyone { grid-area: twentyone; }
.nineteen { grid-area: nineteen; }
.legacy { grid-area: legacy; }
.wave {
animation-name: wave-animation;
animation-duration: 2.5s;
animation-iteration-count: infinite;
transform-origin: 70% 70%;
display: inline-block;
}
.emohi:hover {
animation-name: wave-animation;
animation-duration: 2.5s;
animation-iteration-count: 1;
transform-origin: 70% 70%;
display: inline-block;
}
@keyframes wave-animation {
0% { transform: rotate( 0.0deg) }
10% { transform: rotate(14.0deg) }
20% { transform: rotate(-8.0deg) }
30% { transform: rotate(14.0deg) }
40% { transform: rotate(-4.0deg) }
50% { transform: rotate(10.0deg) }
60% { transform: rotate( 0.0deg) }
100% { transform: rotate( 0.0deg) }
}
.blurbg {
width:100%;
height:100%;
background-size:cover;
-webkit-filter: blur(4px);
-moz-filter: blur(4px);
-ms-filter: blur(4px);
-o-filter: blur(4px);
filter: blur(4px);
}
button{
box-shadow: 0 12px 16px 0 rgba(0,0,0,0.45), 0 17px 50px 0 rgba(0,0,0,0.40);
transition: transform .1s;
outline: none;
}
button:hover{
transform: scale(1.06);
}
.modal{
display: block;
position: fixed;
z-index: 1;
padding-top: 100px;
left: 0;
top: 0;
background-color: rgba(0,0,0,0.9);
}
.modal-content{
margin: auto;
display: block;
width: 80%;
max-width: 700px;
}

1409
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,17 @@
{
"name": "csevote",
"version": "1.0.0",
"description": "CSE voting system",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Puly",
"license": "0BSD",
"dependencies": {
"cookie-parser": "^1.4.6",
"express": "^4.18.2",
"express-session": "^1.17.3",
"session-file-store": "^1.5.0"
}
}

@ -0,0 +1 @@
{"9a":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"9b":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"9c":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"9d":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"9e":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"9f":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"9g":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"9h":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"9i":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10a":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10b":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10c":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10d":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10e":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10f":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10g":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10h":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"10i":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"11a":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"11b":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"11c":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"11d":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"11e":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"11f":{"pass":"2318b65f445747bfe10c682871f2b47ea17216ffa17534dafa8ddc9da5c32333","votingRights":0,"loggedIn":0,"present":0},"11g":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"11h":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"11i":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12a":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12b":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12c":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12d":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12e":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12f":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12g":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12h":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"12i":{"pass":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","votingRights":0,"loggedIn":0,"present":0},"admin":{"pass":"1ffa7c52a148976b2bf75ca97382f91ed00e563a3019ff43e432fd744b50d168","votingRights":0,"loggedIn":1,"present":0}}

@ -0,0 +1,14 @@
{
"11f" : {
"pass": "2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
"votingRights": 0,
"loggedIn": 0,
"present": 0
},
"admin" : {
"pass": "1ffa7c52a148976b2bf75ca97382f91ed00e563a3019ff43e432fd744b50d168",
"votingRights": 0,
"loggedIn": 0,
"present": 0
}
}

@ -0,0 +1,26 @@
module.exports = {
content: [
'./**/*.html',
'./index.html',
'./*.html'
],
darkMode: true,
theme: {
extend: {
colors: {
'mycol0': '#200f4c',
//'mycol': '#8870ff',
'mycol': '#8a97ff',
'mycol2': '#161524',
},
backgroundImage: {
'bground1': "url('/webPage/img/bground1.jpg')",
},
animation: {
wiggle: 'wiggle 1s ease-in-out infinite',
},
},
},
plugins: [],
}

@ -0,0 +1,89 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/css/dist.css" rel="stylesheet">
<title>ADMIN PANEL</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<div class="flex min-h-[100vh] justify-center items-center text-white">
<div class="md:max-w-[70vw] ml-auto mr-auto">
<div class="min-w-[60vw] rounded-3xl flex flex-wrap sm:flex-nowrap items-center py-10 sm:py-100 px-8 pb-10 justify-center text-center">
<div class="my-5 md:w-2/3 items-center justify-center text-center">
<p class="text-3xl pb-10 font-extrabold tracking-wide">ADMIN PANEL</p>
<div class="text-center text-white">
<input type="url" id="text" class="text-xl rounded-xl text-black py-3 px-3 w-full" placeholder="PROPUNERE">
<p class="pb-10"> </p>
<button type="button" class="rounded-xl w-full bg-indigo-900 my-2 py-5 my-2 px-5 text-sm md:text-xl font-bold tracking-wide justify-center items-center font-[manrope]" id="startvot">STARTVOT</button>
<button type="button" class="rounded-xl w-full bg-indigo-900 my-2 py-5 my-2 px-5 text-sm md:text-xl font-bold tracking-wide justify-center items-center font-[manrope]" id="show">REZULTATE - STOP VOT</button>
<button type="button" class="rounded-xl w-full bg-indigo-900 my-2 py-5 my-2 px-5 text-sm md:text-xl font-bold tracking-wide justify-center items-center font-[manrope]" id="clear">STERGE TABLA</button>
<p class="text-3xl pb-10 font-extrabold tracking-wide">PAROLE</p>
<button type="button" class="rounded-xl w-full bg-indigo-900 my-2 py-5 my-2 px-5 text-sm md:text-xl font-bold tracking-wide justify-center items-center font-[manrope]" id="pass">SETEAZA PAROLELE</button>
<button type="button" class="rounded-xl w-full bg-indigo-900 my-2 py-5 my-2 px-5 text-sm md:text-xl font-bold tracking-wide justify-center items-center font-[manrope]" id="writerepo">SALVEAZA PAROLELE</button>
<p class="text-3xl pb-10 font-extrabold tracking-wide">AUDIT</p>
<button type="button" class="rounded-xl w-full bg-indigo-900 my-2 py-5 my-2 px-5 text-sm md:text-xl font-bold tracking-wide justify-center items-center font-[manrope]" id="audit">ARATA AUDIT</button>
</div>
</div>
</div>
</div>
</div>
</body>
<script>
var propunere = document.getElementById("text");
var start = document.getElementById("startvot");
var show = document.getElementById("show");
var clear = document.getElementById("clear");
var pass = document.getElementById("pass");
var writerepo = document.getElementById("writerepo");
var audit = document.getElementById("audit");
start.addEventListener("click", function(){
var url= "/admindo?do=start-vot&text=" + text.value;
location.href = url;
});
show.addEventListener("click", function(){
var url= "/admindo?do=show";
location.href = url;
});
clear.addEventListener("click", function(){
var url= "/admindo?do=clear";
location.href = url;
});
pass.addEventListener("click", function(){
var url= "/admindo?do=pass";
location.href = url;
});
writerepo.addEventListener("click", function(){
var url= "/admindo?do=writerepo";
location.href = url;
});
audit.addEventListener("click", function(){
var url= "/admindo?do=getaudit";
location.href = url;
});
</script>
</html>

@ -0,0 +1,42 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../../../css/dist.css" rel="stylesheet">
<title>CSE Vote</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<div class="flex min-h-[100vh] justify-center items-center text-white">
<div class="ml-auto mr-auto">
<div class="min-w-[60vw] rounded-3xl flex flex-wrap sm:flex-nowrap items-center py-10 sm:py-100 px-8 pb-10 justify-center text-center">
<div class="my-5 w-5/6 items-center justify-center text-center">
<p class="text-3xl pb-10 font-extrabold tracking-wide">Vot inregistrat, asteptati rezultatele!</p>
</div>
</div>
</div>
<div class="text-white bold fixed bottom-4 flex flex-row flex-wrap sm:flex-nowrap items-center mx-50 justify-center ml-auto mr-auto mx-100 px-2 pt-100 text-md bg-purple md:bg-transparent">
<button type="button" class="redir outline rounded-md py-1 md:py-3 bg-mycol2 px-3 md:px-7 outline-0 outline-white hover:bg-indigo-900 mx-2" onclick="location.href = '/logout';">
<span>Logout</span>
</button>
</div>
</div>
</body>
<script>
setTimeout(function(){
location.reload(false);
}, 5000);
</script>
</html>

@ -0,0 +1,50 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/css/dist.css" rel="stylesheet">
<title>CSE Vote</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<div class="flex min-h-[100vh] justify-center items-center text-white">
<div class="md:max-w-[70vw] ml-auto mr-auto">
<div class="min-w-[60vw] rounded-3xl flex flex-wrap sm:flex-nowrap items-center py-10 sm:py-100 px-8 pb-10 justify-center text-center">
<div class="my-5 md:w-2/3 items-center justify-center text-center">
<p class="text-3xl pb-10 font-extrabold tracking-wide">CSE Vote Login</p>
<div class="text-center text-white">
<input type="url" id="user" class="text-xl rounded-xl text-black py-3 px-3 w-full" placeholder="Clasa">
<p class="pb-10"> </p>
<input type="url" id="pass" class="text-xl rounded-xl text-black py-3 px-3 w-full" placeholder="Parola">
<p class="pb-10"> </p>
<button type="button" class="rounded-xl w-full bg-indigo-900 my-2 py-5 my-2 px-5 text-sm md:text-xl font-bold tracking-wide justify-center items-center font-[manrope]" id="ok">Login</button>
</div>
</div>
</div>
</div>
</div>
</body>
<script>
var user = document.getElementById("user");
var pass = document.getElementById("pass");
var submit = document.getElementById("ok");
submit.addEventListener("click", function(){
var url= "/loginact?user=" + user.value + "&pass=" + pass.value;
location.href = url;
});
</script>
</html>

@ -0,0 +1,42 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../../../css/dist.css" rel="stylesheet">
<title>CSE Vote</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<div class="flex min-h-[100vh] justify-center items-center text-white">
<div class="ml-auto mr-auto">
<div class="min-w-[60vw] rounded-3xl flex flex-wrap sm:flex-nowrap items-center py-10 sm:py-100 px-8 pb-10 justify-center text-center">
<div class="my-5 w-5/6 items-center justify-center text-center">
<p class="text-3xl pb-10 font-extrabold tracking-wide">Buna $USER$, momentan nu se desfasoara niciun vot.</p>
</div>
</div>
</div>
<div class="text-white bold fixed bottom-4 flex flex-row flex-wrap sm:flex-nowrap items-center mx-50 justify-center ml-auto mr-auto mx-100 px-2 pt-100 text-md bg-purple md:bg-transparent">
<button type="button" class="redir outline rounded-md py-1 md:py-3 bg-mycol2 px-3 md:px-7 outline-0 outline-white hover:bg-indigo-900 mx-2" onclick="location.href = '/logout';">
<span>Logout</span>
</button>
</div>
</div>
</body>
<script>
setTimeout(function(){
location.reload(false);
}, 9000);
</script>
</html>

@ -0,0 +1,35 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../../../css/dist.css" rel="stylesheet">
<title>CSE Vote</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<div class="flex min-h-[100vh] justify-center items-center text-white">
<div class="ml-auto mr-auto">
<div class="min-w-[60vw] rounded-3xl flex flex-wrap sm:flex-nowrap items-center py-10 sm:py-100 px-8 pb-10 justify-center text-center">
<div class="my-5 w-5/6 items-center justify-center text-center">
<p class="text-3xl pb-10 font-extrabold tracking-wide">CSE VOTE</p>
</div>
</div>
</div>
</div>
</body>
<script>
setTimeout(function(){
location.reload(false);
}, 9000);
</script>
</html>

@ -0,0 +1,57 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../../css/dist.css" rel="stylesheet">
<title>CSE Vote</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<div class="flex min-h-[100vh] justify-center items-center text-white" bg-[url('../../img/bground1.jpg')]>
<div class="md:max-w-[70vw] ml-auto mr-auto">
<div class="min-w-[60vw] rounded-3xl flex flex-wrap sm:flex-nowrap items-center py-10 sm:py-100 px-8 pb-10 justify-center text-center">
<div class="my-5 md:w-2/3 items-center justify-center text-center">
<p class="text-3xl pb-10 font-extrabold tracking-wide">$VOTETEXT$</p>
<div class="text-center text-white">
<div class="kmscontainer">
<div class="windows pr-5">
<button type="button" class="rounded-xl w-full bg-[#0B5D1E] my-2 py-5 my-2 px-5 py-5 text-3xl font-bold tracking-wide justify-center items-center font-[manrope]">$YESVOTES$</button>
</div>
<div class="office pl-5">
<button type="button" class="rounded-xl w-full bg-[#820933] my-2 py-5 px-5 py-5 text-3xl font-bold tracking-wide justify-center items-center font-[manrope]">$NOVOTES$</button>
</div>
</div>
<p class="text-3xl pb-10 font-extrabold tracking-wide">$RESULT$</p>
</div>
</div>
</div>
</div>
<div class="text-white bold fixed bottom-4 flex flex-row flex-wrap sm:flex-nowrap items-center mx-50 justify-center ml-auto mr-auto mx-100 px-2 pt-100 text-md bg-purple md:bg-transparent">
<button type="button" class="redir outline rounded-md py-1 md:py-3 bg-mycol2 px-3 md:px-7 outline-0 outline-white hover:bg-indigo-900 mx-2" onclick="location.href = '/logout';">
<span>Logout</span>
</button>
</div>
</div>
</body>
<script>
setTimeout(function(){
location.reload(false);
}, 5000);
</script>
</html>

@ -0,0 +1,54 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../../css/dist.css" rel="stylesheet">
<title>CSE Vote</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<div class="flex min-h-[100vh] justify-center items-center text-white" bg-[url('../../img/bground1.jpg')]>
<div class="md:max-w-[70vw] ml-auto mr-auto">
<div class="min-w-[60vw] rounded-3xl flex flex-wrap sm:flex-nowrap items-center py-10 sm:py-100 px-8 pb-10 justify-center text-center">
<div class="my-5 md:w-2/3 items-center justify-center text-center">
<p class="text-3xl pb-10 font-extrabold tracking-wide">$VOTETEXT$</p>
<div class="text-center text-white">
<div class="kmscontainer">
<div class="windows pr-5">
<button type="button" class="rounded-xl w-full bg-[#0B5D1E] my-2 py-5 my-2 px-5 py-5 text-3xl font-bold tracking-wide justify-center items-center font-[manrope]" onclick="location.href='/vote/yes';">DA</button>
</div>
<div class="office pl-5">
<button type="button" class="rounded-xl w-full bg-[#820933] my-2 py-5 px-5 py-5 text-3xl font-bold tracking-wide justify-center items-center font-[manrope]" onclick="location.href = '/vote/no';">NU</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="text-white bold fixed bottom-4 flex flex-row flex-wrap sm:flex-nowrap items-center mx-50 justify-center ml-auto mr-auto mx-100 px-2 pt-100 text-md bg-purple md:bg-transparent">
<button type="button" class="redir outline rounded-md py-1 md:py-3 bg-mycol2 px-3 md:px-7 outline-0 outline-white hover:bg-indigo-900 mx-2" onclick="location.href = '/logout';">
<span>Logout</span>
</button>
</div>
</div>
</body>
<script>
</script>
</html>
Loading…
Cancel
Save