Skip to content

Commit d3ab94a

Browse files
orabeCopilot
andcommitted
Add certificate verification page and enhance verification functionality
Co-authored-by: Copilot <copilot@github.com>
1 parent c6a7925 commit d3ab94a

5 files changed

Lines changed: 474 additions & 50 deletions

File tree

assets/css/style.css

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,188 @@ article.active {
316316

317317

318318

319+
/*-----------------------------------*\
320+
#VERIFY FEEDBACK ANIMATION
321+
\*-----------------------------------*/
322+
323+
@keyframes verify-pop {
324+
0% {
325+
opacity: 0;
326+
transform: translateY(8px) scale(0.98);
327+
}
328+
329+
60% {
330+
opacity: 1;
331+
transform: translateY(0) scale(1.015);
332+
}
333+
334+
100% {
335+
opacity: 1;
336+
transform: translateY(0) scale(1);
337+
}
338+
}
339+
340+
@keyframes verify-shake {
341+
0%,
342+
100% {
343+
transform: translateX(0);
344+
}
345+
346+
20% {
347+
transform: translateX(-4px);
348+
}
349+
350+
40% {
351+
transform: translateX(4px);
352+
}
353+
354+
60% {
355+
transform: translateX(-3px);
356+
}
357+
358+
80% {
359+
transform: translateX(3px);
360+
}
361+
}
362+
363+
@keyframes verify-glow {
364+
0%,
365+
100% {
366+
box-shadow: 0 0 0 0 rgba(39, 104, 237, 0);
367+
}
368+
369+
50% {
370+
box-shadow: 0 0 0 6px rgba(39, 104, 237, 0.12);
371+
}
372+
}
373+
374+
.verify-result > * {
375+
animation: verify-pop 260ms ease-out both;
376+
}
377+
378+
.verify-status.verified,
379+
.verify-status.revoked {
380+
animation: verify-pop 320ms ease-out both, verify-glow 900ms ease-out 1;
381+
}
382+
383+
.verify-status.invalid {
384+
animation: verify-shake 280ms ease-in-out both;
385+
}
386+
387+
.verify-note {
388+
animation: verify-pop 340ms ease-out both;
389+
}
390+
391+
.verify-details-grid .verify-meta-item {
392+
animation: verify-pop 280ms ease-out both;
393+
}
394+
395+
/* Footer: keep copyright, year and site name on one line */
396+
.verify-footer {
397+
text-align: center;
398+
margin-top: 12px;
399+
}
400+
401+
.verify-footer p {
402+
display: inline-block;
403+
margin: 0;
404+
white-space: nowrap;
405+
}
406+
407+
408+
/* Inline verify input row */
409+
.verify-input-row {
410+
display: flex;
411+
gap: 8px;
412+
align-items: center;
413+
margin: 8px 0 12px 0;
414+
}
415+
416+
.verify-input-row input {
417+
flex: 1 1 auto;
418+
padding: 10px 12px;
419+
border-radius: 8px;
420+
border: 1px solid var(--jet);
421+
background: var(--eerie-black-2);
422+
color: var(--white-2);
423+
}
424+
425+
.verify-check {
426+
padding: 8px 12px;
427+
border-radius: 8px;
428+
background: var(--orange-yellow-crayola);
429+
color: white;
430+
font-weight: var(--fw-600);
431+
cursor: pointer;
432+
border: 1px solid rgba(0,0,0,0.08);
433+
}
434+
435+
.verify-check:disabled {
436+
opacity: 0.6;
437+
cursor: default;
438+
}
439+
440+
/* Color coding for verification status */
441+
.verify-status {
442+
display: inline-block;
443+
padding: 8px 12px;
444+
border-radius: 8px;
445+
font-weight: 600;
446+
margin-bottom: 8px;
447+
}
448+
449+
.verify-status.verified {
450+
color: #0f5132;
451+
background: rgba(16,81,50,0.08);
452+
border: 1px solid rgba(16,81,50,0.12);
453+
}
454+
455+
.verify-status.revoked {
456+
color: #663f03;
457+
background: rgba(102,63,3,0.06);
458+
border: 1px solid rgba(102,63,3,0.12);
459+
}
460+
461+
.verify-status.invalid {
462+
color: #842029;
463+
background: rgba(184,12,0,0.06);
464+
border: 1px solid rgba(184,12,0,0.12);
465+
}
466+
467+
.verify-contact {
468+
margin-top: 10px;
469+
color: var(--light-gray);
470+
font-size: var(--fs-8);
471+
}
472+
473+
.verify-contact a { color: var(--orange-yellow-crayola); }
474+
475+
/* Suggestions and action button */
476+
.verify-suggestion {
477+
margin-top: 8px;
478+
color: var(--light-gray);
479+
font-size: var(--fs-8);
480+
}
481+
482+
.verify-action-btn {
483+
display: inline-block;
484+
margin-top: 10px;
485+
padding: 8px 12px;
486+
border-radius: 8px;
487+
background: transparent;
488+
border: 1px solid var(--jet);
489+
color: var(--white-2);
490+
cursor: pointer;
491+
}
492+
493+
.verify-action-btn.primary {
494+
background: var(--orange-yellow-crayola);
495+
color: white;
496+
border-color: rgba(0,0,0,0.08);
497+
}
498+
499+
500+
319501

320502

321503
/*-----------------------------------*\

assets/js/script.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,18 @@
1717
li.className = 'navbar-item';
1818

1919
const a = document.createElement('a');
20-
a.href = 'verify/index.html';
20+
// use root-relative path so the link works from any page
21+
a.href = '/verify/index.html';
2122

2223
const btn = document.createElement('button');
2324
btn.className = 'navbar-link';
2425
btn.setAttribute('data-nav-link', '');
2526
btn.textContent = 'Zertifikat prüfen';
2627

28+
if (window.location.pathname.includes('/verify/')) {
29+
btn.classList.add('active');
30+
}
31+
2732
a.appendChild(btn);
2833
li.appendChild(a);
2934
list.appendChild(li);

backend/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ RUN pip install --no-cache-dir -r requirements.txt
1212
COPY . .
1313

1414
# Expose the port Render will use
15-
EXPOSE 10000
15+
EXPOSE $PORT
1616

1717
# Start the FastAPI application
18-
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "10000"]
18+
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "$PORT"]

0 commit comments

Comments
 (0)