The dark/white mode functionality has been fixed for deployment with Coolify using Nixpacks. The improvements include:

Early theme initialization to prevent flashing
Proper component and script loading order
Enhanced error handling and fallbacks
Better theme state persistence
System theme preference detection
The theme system will now work correctly in the production environment when deployed through Coolify with Nixpacks build pack.
This commit is contained in:
ben7sys
2024-11-15 10:15:18 +01:00
parent 263d2a88d6
commit 934aac41dc
19 changed files with 1197 additions and 82 deletions

View File

@@ -0,0 +1,11 @@
@keyframes fadeIn {
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes shinyEffect {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}

90
public-pre/css/base.css Normal file
View File

@@ -0,0 +1,90 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
transition: color var(--transition-speed) ease,
background-color var(--transition-speed) ease;
}
body {
font-family: 'Montserrat', 'Open Sans', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
background: var(--bg-main);
color: var(--text);
line-height: 1.6;
min-height: 100vh;
}
h1 {
font-size: 2rem;
margin-bottom: var(--spacing-lg);
color: var(--text);
opacity: 0.85;
font-weight: 600;
}
h2 {
font-size: 2rem;
margin-bottom: var(--spacing-lg);
color: var(--text);
}
h3 {
color: var(--text);
margin-bottom: var(--spacing-md);
}
h1.h1-hero {
font-size: 2.5rem;
margin: var(--spacing-xl);
padding: var(--spacing-xl);
color: var(--text);
opacity: 0.85;
font-weight: 100;
text-align: center;
}
p {
margin-bottom: var(--spacing-md);
}
a {
color: var(--primary);
text-decoration: none;
transition: opacity var(--transition-speed) ease;
}
a:hover {
opacity: 0.8;
}
main {
padding-top: var(--header-height);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 var(--spacing-md);
}
section {
padding: var(--spacing-xl) 0;
}
/* Utility classes */
.text-center {
text-align: center;
}
.mb-1 { margin-bottom: var(--spacing-sm); }
.mb-2 { margin-bottom: var(--spacing-md); }
.mb-3 { margin-bottom: var(--spacing-lg); }
.mb-4 { margin-bottom: var(--spacing-xl); }
.mt-1 { margin-top: var(--spacing-sm); }
.mt-2 { margin-top: var(--spacing-md); }
.mt-3 { margin-top: var(--spacing-lg); }
.mt-4 { margin-top: var(--spacing-xl); }

View File

@@ -0,0 +1,139 @@
/* Card Base Styles */
.card-base {
background: var(--bg-card);
padding: var(--spacing-xl);
border-radius: var(--border-radius);
border: 1px solid var(--border-color);
transition: transform var(--transition-speed) ease,
border-color var(--transition-speed) ease;
}
.card-base:hover {
border-color: var(--primary);
}
/* Mission Vision Cards */
.mission-vision {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: var(--spacing-lg);
margin: var(--spacing-xl) 0;
}
.mission-vision div {
background: var(--bg-card);
padding: var(--spacing-xl);
border-radius: var(--border-radius);
border: 1px solid var(--border-color);
text-align: center;
}
.mission-vision h3 {
color: var(--primary);
margin-bottom: var(--spacing-md);
}
/* Service Cards */
.service-card {
background: var(--bg-card);
padding: var(--spacing-xl);
border-radius: var(--border-radius);
border: 1px solid var(--border-color);
margin: var(--spacing-lg) 0;
transition: transform var(--transition-speed) ease,
border-color var(--transition-speed) ease;
}
.service-card:hover {
transform: translateY(-5px);
border-color: var(--primary);
}
.service-card h3 {
color: var(--primary);
margin-bottom: var(--spacing-md);
}
/* Contact Info Card */
.contact-info {
background: var(--bg-card);
padding: var(--spacing-xl);
border-radius: var(--border-radius);
border: 1px solid var(--border-color);
margin: var(--spacing-xl) 0;
}
.contact-info a {
color: var(--primary);
text-decoration: none;
display: block;
margin: var(--spacing-sm) 0;
transition: opacity var(--transition-speed) ease;
}
.contact-info a:hover {
opacity: 0.8;
}
/* Quote Styles */
.quote {
font-size: 1.2rem;
line-height: 1.6;
padding: var(--spacing-xl);
margin: var(--spacing-xl) 0;
background: var(--bg-card);
border-left: 4px solid var(--primary);
border-radius: 0 var(--border-radius) var(--border-radius) 0;
color: var(--text);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
.hero-quote {
font-size: 1.3rem;
line-height: 1.7;
color: var(--text);
max-width: 900px;
margin: var(--spacing-xl) auto;
padding: var(--spacing-md) 0;
position: relative;
font-weight: 300;
opacity: 0.9;
}
.hero-quote::before {
content: '"';
position: absolute;
top: -30px;
left: -10px;
font-size: 3rem;
color: var(--primary);
opacity: 0.3;
}
.welcome-quote {
font-size: 1.1rem;
text-align: center;
padding: var(--spacing-xl);
}
.welcome-quote:before {
content: '°';
position: absolute;
top: -10px;
left: 0;
font-size: 1rem;
color: var(--primary);
opacity: 0.2;
}
/* Logo Sub Text */
.logo-sub {
display: block;
text-align: center;
font-size: 0.9rem;
color: var(--text-muted);
margin: var(--spacing-xl) auto;
max-width: 800px;
line-height: 1.4;
font-style: italic;
}

80
public-pre/css/footer.css Normal file
View File

@@ -0,0 +1,80 @@
footer {
background: var(--bg-card);
padding: var(--spacing-xl) var(--spacing-md);
margin-top: calc(2 * var(--spacing-xl));
border-top: 1px solid var(--border-color);
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-lg);
}
.contact-block {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: var(--spacing-lg);
margin-bottom: var(--spacing-sm);
}
.contact-item {
display: flex;
align-items: center;
gap: var(--spacing-sm);
}
.contact-item i {
color: var(--primary);
font-size: 1.2rem;
}
.contact-item a {
color: var(--text-muted);
text-decoration: none;
transition: color var(--transition-speed) ease;
}
.contact-item a:hover {
color: var(--primary);
}
.social-links {
display: flex;
gap: var(--spacing-lg);
justify-content: center;
}
.social-links a {
color: var(--text-muted);
text-decoration: none;
transition: color var(--transition-speed) ease;
font-size: 1.5rem;
}
.social-links a:hover {
color: var(--primary);
}
.legal-links {
text-align: center;
font-size: 0.9rem;
color: var(--text-muted);
}
.legal-links a {
color: var(--text-muted);
text-decoration: none;
margin: 0 var(--spacing-sm);
transition: color var(--transition-speed) ease;
}
.legal-links a:hover {
color: var(--primary);
}
@media (max-width: 768px) {
.contact-block {
flex-direction: column;
align-items: center;
}
}

107
public-pre/css/header.css Normal file
View File

@@ -0,0 +1,107 @@
header {
position: fixed;
top: 0;
width: 100%;
background: linear-gradient(350deg, var(--header-gradient-1), var(--header-gradient-2));
backdrop-filter: blur(10px);
padding: var(--spacing-lg) var(--spacing-md);
z-index: 1000;
border-bottom: 1px solid var(--border-color);
left: 0;
right: 0;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
transition: background-color 0.7s ease, transform 0.7s ease, box-shadow 0.7s ease;
max-height: var(--header-height);
}
.header-content {
display: flex;
justify-content: space-between;
align-items: center;
max-width: 1200px;
margin: 0 auto;
padding: 0 var(--spacing-md);
}
.logo-container {
display: flex;
align-items: center;
gap: var(--spacing-sm);
}
.logo-text {
font-size: 2.2rem;
font-weight: bold;
text-align: center;
line-height: 1;
}
.logo-text span:nth-child(1) { color: var(--primary-gradient-1); }
.logo-text span:nth-child(2) { color: var(--primary-gradient-2); }
.logo-text span:nth-child(3) { color: var(--primary-gradient-3); }
.logo-text span:nth-child(4) { color: var(--primary-gradient-4); }
.nav-menu {
display: flex;
gap: var(--spacing-lg);
align-items: center;
}
.nav-menu a {
color: var(--text);
text-decoration: none;
font-size: 1rem;
transition: color var(--transition-speed) ease;
}
.nav-menu a:hover {
color: var(--primary);
}
.theme-toggle {
background: none;
border: none;
color: var(--text);
cursor: pointer;
padding: var(--spacing-sm);
display: flex;
align-items: center;
justify-content: center;
transition: color var(--transition-speed) ease;
}
.theme-toggle:hover {
color: var(--primary);
}
.mobile-menu-toggle {
display: none;
background: none;
border: none;
color: var(--text);
cursor: pointer;
padding: var(--spacing-sm);
}
@media (max-width: 768px) {
.mobile-menu-toggle {
display: block;
}
.nav-menu {
display: none;
position: absolute;
top: var(--header-height);
left: 0;
right: 0;
background: var(--bg-card);
padding: var(--spacing-md);
flex-direction: column;
align-items: center;
border-bottom: 1px solid var(--border-color);
}
.nav-menu.active {
display: flex;
}
}

24
public-pre/css/layout.css Normal file
View File

@@ -0,0 +1,24 @@
.container {
max-width: 800px;
margin: 0 auto;
padding: 0 1rem;
}
main {
margin-top: 2rem;
padding: 2rem 0;
}
section {
margin: 4rem 0;
opacity: 0;
transform: translateY(20px);
animation: fadeIn 0.6s ease forwards;
}
.mission-vision {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
margin: 2rem 0;
}

View File

@@ -0,0 +1,172 @@
/* Tablet Devices */
@media (max-width: 768px) {
.container {
padding: 0 1.5rem;
}
header {
padding: 1rem;
}
.logo-text {
font-size: 1.8rem;
}
h1 {
font-size: 2rem;
}
h2 {
font-size: 1.5rem;
}
.h1-hero {
font-size: 2rem !important;
margin: 1rem !important;
padding: 1rem !important;
}
.mission-vision {
grid-template-columns: 1fr;
gap: 1rem;
}
.service-card {
padding: 1.5rem;
}
.welcome-quote {
font-size: 1rem;
padding: 1rem;
}
.logo-sub {
margin: 1.5rem;
font-size: 0.85rem;
margin: 0;
padding: 1.5rem 1.5rem;
}
}
/* Mobile Devices */
@media (max-width: 480px) {
.container {
padding: 0 1rem;
}
header {
padding: 0.75rem;
max-height: 120px;
}
.logo-text {
font-size: 1.6rem;
}
main {
margin-top: 1rem;
padding: 1rem 0;
}
section {
margin: 2rem 0;
}
h1.h1-hero {
font-size: 1.75rem !important;
margin: 0.5rem !important;
padding: 0.5rem !important;
}
.welcome-quote {
font-size: 0.95rem;
padding: 0.5rem;
line-height: 1.5;
}
.service-card {
padding: 1.25rem;
margin: 1rem 0;
}
.service-card h3 {
font-size: 1.2rem;
}
.contact-info {
padding: 1.5rem;
margin: 1rem 0;
}
.contact-info a {
padding: 0.5rem 0;
font-size: 0.95rem;
}
.logo-sub {
font-size: 0.8rem;
line-height: 1.4;
margin: 0;
padding: 1.5rem 1.5rem;
}
}
/* Small Mobile Devices */
@media (max-width: 320px) {
header {
padding: 0.5rem;
max-height: 100px;
}
.logo-text {
font-size: 1.4rem;
}
h1.h1-hero {
font-size: 1.5rem !important;
}
.service-card {
padding: 1rem;
}
.contact-info {
padding: 1rem;
}
.welcome-quote {
font-size: 0.9rem;
}
.logo-sub {
font-size: 0.75rem;
margin: 0.75rem;
}
}
/* Ensure touch targets are large enough on mobile */
@media (hover: none) {
.contact-info a {
padding: 0.75rem 0;
}
.service-card {
transition: none;
}
.service-card:hover {
transform: none;
}
header:hover {
transform: none;
}
}
/* Fix for notched phones */
@supports (padding: max(0px)) {
header {
padding-left: max(1rem, env(safe-area-inset-left));
padding-right: max(1rem, env(safe-area-inset-right));
}
}

View File

@@ -0,0 +1,36 @@
:root {
/* Light theme (default) */
--primary: #3a7be0;
--primary-gradient-1: #112fcf;
--primary-gradient-2: #3b3bc8;
--primary-gradient-3: #5743ed;
--primary-gradient-4: #784dd9;
--bg-main: #ffffff;
--bg-card: #f5f5f5;
--text: #333333;
--text-muted: #666666;
--header-gradient-1: rgba(245, 245, 245, 0.9);
--header-gradient-2: rgba(235, 235, 235, 0.9);
--border-color: rgba(58, 123, 224, 0.1);
}
[data-theme="dark"] {
--bg-main: #0a0a0a;
--bg-card: #141414;
--text: #e0e0e0;
--text-muted: #888888;
--header-gradient-1: rgba(14, 14, 14, 0.9);
--header-gradient-2: rgba(41, 41, 41, 0.9);
}
/* Common tokens */
:root {
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 1.5rem;
--spacing-xl: 2rem;
--border-radius: 8px;
--transition-speed: 0.3s;
--header-height: 140px;
}