diff --git a/templates/qr_destination.html b/templates/qr_destination.html index 400a054..4e676ca 100644 --- a/templates/qr_destination.html +++ b/templates/qr_destination.html @@ -26,6 +26,12 @@ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); --border-radius: 0.5rem; --transition: all 0.2s ease-in-out; + + /* Language Color Coding - High Contrast Theme */ + --english-color: #1e40af; + --english-bg: rgba(59, 130, 246, 0.1); + --spanish-color: #15803d; + --spanish-bg: rgba(34, 197, 94, 0.1); } * { @@ -34,6 +40,36 @@ box-sizing: border-box; } + /* Language Color Classes - Enhanced Contrast */ + .english-text { + color: #1e40af !important; + font-weight: 700; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + } + + .spanish-text { + color: #15803d !important; + font-weight: 700; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + } + + .bilingual-container { + background: rgba(255, 255, 255, 0.98); + border-radius: 8px; + padding: 16px 20px; + margin: 8px 0; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.8); + } + + .language-separator { + color: #64748b; + font-weight: 500; + margin: 0 12px; + font-size: 1.1em; + } + /* Dynamic Background Based on Location Event */ body { font-family: "Inter", -apple-system, BlinkMacSystemFont, sans-serif; @@ -78,17 +114,33 @@ transition: var(--transition); backdrop-filter: blur(10px); font-size: 0.9rem; - font-weight: 500; + font-weight: 600; display: flex; align-items: center; gap: 0.5rem; + outline: none; } .language-toggle:hover { - background: rgba(255, 255, 255, 0.3); + background: rgba(255, 255, 255, 0.3) !important; + border-color: rgba(255, 255, 255, 0.5) !important; transform: translateY(-1px); } + .language-toggle:active { + background: rgba(255, 255, 255, 0.4) !important; + transform: translateY(0); + } + + .language-toggle:focus { + box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.3) !important; + } + + .language-toggle i { + font-size: 1rem; + color: white !important; + } + .destination-header { background: rgba(255, 255, 255, 0.95); border-radius: var(--border-radius); @@ -121,12 +173,20 @@ /* Check In - Blue Icon */ .check-in .header-icon { - background: linear-gradient(135deg, var(--primary-color), var(--primary-hover)); + background: linear-gradient( + 135deg, + var(--primary-color), + var(--primary-hover) + ); } /* Check Out - Orange Icon */ .check-out .header-icon { - background: linear-gradient(135deg, var(--orange-color), var(--orange-hover)); + background: linear-gradient( + 135deg, + var(--orange-color), + var(--orange-hover) + ); } .header-icon i { @@ -139,6 +199,7 @@ font-weight: 700; color: var(--text-primary); margin-bottom: 0.5rem; + line-height: 1.2; } .location-info { @@ -260,186 +321,133 @@ align-items: center; justify-content: center; gap: 0.5rem; - padding: 0.875rem 2rem; - font-size: 1rem; - font-weight: 500; + padding: 1.2rem 2rem; + font-size: 1.2rem; + font-weight: 700; border: none; border-radius: var(--border-radius); cursor: pointer; transition: var(--transition); text-decoration: none; width: 100%; + text-shadow: none; + letter-spacing: 0.5px; } - /* Dynamic Button Colors */ + /* Dynamic Button Colors - Maximum Contrast */ .check-in .btn-primary { - background: linear-gradient(135deg, var(--primary-color), var(--primary-hover)); - color: white; - } - - .check-in .btn-primary:hover { - background: linear-gradient(135deg, var(--primary-hover), #1e40af); - transform: translateY(-1px); - box-shadow: var(--shadow-lg); + background: #000000; + color: #ffffff; + border: 2px solid #000000; } .check-out .btn-primary { - background: linear-gradient(135deg, var(--orange-color), var(--orange-hover)); - color: white; + background: #000000; + color: #ffffff; + border: 2px solid #000000; + } + + .btn-primary:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-lg); + } + + .check-in .btn-primary:hover { + background: #1f2937; + border-color: #1f2937; } .check-out .btn-primary:hover { - background: linear-gradient(135deg, var(--orange-hover), #b91c1c); - transform: translateY(-1px); - box-shadow: var(--shadow-lg); + background: #1f2937; + border-color: #1f2937; + } + + .btn-primary:active { + transform: translateY(0); } .btn:disabled { opacity: 0.6; cursor: not-allowed; - transform: none; + transform: none !important; } - /* Status Message Styles */ - .status-message { - padding: 1rem; - border-radius: var(--border-radius); - margin-bottom: 1rem; - display: none; - align-items: center; - gap: 0.5rem; - font-size: 0.95rem; - font-weight: 500; - border-left: 4px solid; - } - - .status-message.show { - display: flex; - } - - .status-message.success { - background: #f0fdf4; - color: #15803d; - border-left-color: #15803d; - } - - .status-message.error { - background: #fef2f2; - color: #dc2626; - border-left-color: #dc2626; - } - - .status-message.warning { - background: #fffbeb; - color: #d97706; - border-left-color: #d97706; - } - - /* Success Card Styles */ .success-card { - display: none; background: rgba(255, 255, 255, 0.95); border-radius: var(--border-radius); padding: 2rem; + text-align: center; box-shadow: var(--shadow-lg); backdrop-filter: blur(10px); - opacity: 0; - transform: translateY(20px); - transition: all 0.6s ease-out 0.4s; + display: none; } - .success-card.active { - opacity: 1; - transform: translateY(0); + .success-card.show { + display: block; + animation: slideUp 0.5s ease-out; } - .success-header { - text-align: center; - margin-bottom: 1.5rem; + @keyframes slideUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } } .success-icon { - width: 60px; - height: 60px; + width: 100px; + height: 100px; border-radius: 50%; display: flex; align-items: center; justify-content: center; - margin: 0 auto 1rem; - font-size: 1.5rem; + margin: 0 auto 1.5rem; + font-size: 3rem; color: white; } - /* Dynamic Success Icon Colors */ + /* Dynamic Success Icon Colors - Green Theme */ .check-in .success-icon { - background: linear-gradient(135deg, var(--success-color), #047857); + background: #10b981; } .check-out .success-icon { - background: linear-gradient(135deg, var(--orange-color), var(--orange-hover)); + background: #10b981; } - .success-title { + .success-card h2 { font-size: 1.5rem; - font-weight: 600; + font-weight: 700; color: var(--text-primary); - margin-bottom: 0.5rem; - } - - .success-subtitle { - color: var(--text-secondary); - font-size: 0.95rem; - } - - /* Enhanced Checkin Sequence Display */ - .checkin-sequence { - color: white; - padding: 0.5rem 1rem; - border-radius: 1rem; - font-size: 0.8rem; - font-weight: 600; - text-align: center; margin-bottom: 1rem; } - /* Dynamic Sequence Colors */ - .check-in .checkin-sequence { - background: linear-gradient(135deg, var(--primary-color), var(--primary-hover)); - } - - .check-out .checkin-sequence { - background: linear-gradient(135deg, var(--orange-color), var(--orange-hover)); - } - .success-details { - display: grid; - gap: 1rem; - margin-bottom: 1.5rem; + background: var(--background-light); + border-radius: var(--border-radius); + padding: 1.5rem; + margin-top: 1.5rem; } .detail-row { display: flex; justify-content: space-between; align-items: center; - padding: 0.75rem; - background: var(--background-light); - border-radius: 0.375rem; - border-left: 4px solid; + padding: 0.5rem 0; + border-bottom: 1px solid var(--border-color); } - /* Dynamic Detail Row Border Colors */ - .check-in .detail-row { - border-left-color: var(--primary-color); - } - - .check-out .detail-row { - border-left-color: var(--orange-color); + .detail-row:last-child { + border-bottom: none; } .detail-label { font-weight: 500; color: var(--text-secondary); - font-size: 0.9rem; } .detail-value { @@ -448,31 +456,73 @@ text-align: right; } - .interval-info { - background: #f0f9ff; - border: 1px solid #bae6fd; + .status-message { + position: fixed; + top: 20px; + left: 50%; + transform: translateX(-50%); + padding: 1rem 1.5rem; border-radius: var(--border-radius); - padding: 1rem; - margin-bottom: 1rem; + font-weight: 500; + z-index: 1000; + display: none; + box-shadow: var(--shadow-lg); } - .interval-info h4 { - color: #0369a1; - font-size: 0.9rem; - margin-bottom: 0.5rem; - font-weight: 600; + .status-message.show { + display: block; + animation: slideDown 0.3s ease-out; } - .interval-info p { - color: #0369a1; - font-size: 0.85rem; - margin: 0; + .status-message.success { + background: var(--success-color); + color: white; + } + + .status-message.error { + background: var(--error-color); + color: white; + } + + .status-message.processing { + background: var(--warning-color); + color: white; + } + + @keyframes slideDown { + from { + opacity: 0; + transform: translateX(-50%) translateY(-10px); + } + to { + opacity: 1; + transform: translateX(-50%) translateY(0); + } + } + + .loading-spinner { + border: 3px solid rgba(255, 255, 255, 0.3); + border-radius: 50%; + border-top: 3px solid white; + width: 20px; + height: 20px; + animation: spin 1s linear infinite; + margin-right: 0.5rem; + } + + @keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } } .fade-transition { opacity: 0; transform: translateY(20px); - transition: all 0.6s ease-out; + transition: opacity 0.6s ease-out, transform 0.6s ease-out; } .fade-transition.active { @@ -480,6 +530,41 @@ transform: translateY(0); } + /* Language Legend */ + .language-legend { + display: flex; + justify-content: center; + gap: 1.5rem; + margin: 1rem 0; + padding: 12px; + background: rgba(255, 255, 255, 0.9); + border-radius: 8px; + backdrop-filter: blur(10px); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + } + + .legend-item { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.875rem; + font-weight: 500; + } + + .legend-color { + width: 16px; + height: 16px; + border-radius: 4px; + } + + .english-legend { + background: #1e40af; + } + + .spanish-legend { + background: #15803d; + } + /* Responsive Design */ @media (max-width: 640px) { .destination-container { @@ -509,12 +594,19 @@ .detail-value { text-align: left; } + + .language-legend { + flex-direction: column; + gap: 0.75rem; + } } - +
- + - +
{% if qr_code.location_event == 'Check In' %} -

{{ qr_code.location_event }} / Entrada

+

+ {{ qr_code.location_event }} + / + Entrada +

{% else %} -

{{ qr_code.location_event }} / Salida

- {% endif %} +

+ {{ qr_code.location_event }} + / + Salida +

+ {% endif %}

{{ qr_code.location }} @@ -553,158 +653,499 @@

- +
-

- Please enter your Employee ID. / Por favor ingrese su ID de empleado. -

+
+

+ Please enter your Employee ID. + / + Por favor ingrese su ID de empleado. +

+
-
- - - - - - - - +
-
- -
-
-
- -
-

- {{ qr_code.location_event }} Successful! +
+
+ +
+

+ Success! + / + ¡Éxito! +

+
+

+ Your check-in has been recorded successfully. -

-

- Your attendance has been recorded / Su asistencia ha sido registrada/ + Su registro ha sido guardado exitosamente.

- - -
- {{ qr_code.location_event }} #1 -
- -
-
- Employee ID / ID de Empleado - - -
-
- Location/Building - Ubicación/Edificio - - -
-
- Event - - -
-
- {{ qr_code.location_event }} Time - - -
-
- Date - - -
- - - - +
+
- + + - \ No newline at end of file +