diff --git a/src/components/Header.astro b/src/components/Header.astro index e2bb6db..473e7e1 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,10 +1,13 @@ --- -// No props needed for this simple header +// src/components/Header.astro +import ThemeToggler from './ThemeToggler.astro'; ---

DSAS CCA Viewer

+
\ No newline at end of file diff --git a/src/components/ThemeToggler.astro b/src/components/ThemeToggler.astro new file mode 100644 index 0000000..e4bbc05 --- /dev/null +++ b/src/components/ThemeToggler.astro @@ -0,0 +1,108 @@ +--- +// src/components/ThemeToggler.astro +--- + + + + + \ No newline at end of file diff --git a/src/styles/global.css b/src/styles/global.css index 983867f..ec3a662 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,20 +1,84 @@ +/* src/styles/global.css */ + /* Basic Reset & Defaults */ +:root { + /* Light Mode Variables (Default) */ + --bg-color: #f4f7f6; + --text-color: #333; + --header-bg: #2c3e50; + --header-text: white; + --header-link-hover: #1abc9c; + --footer-bg: #34495e; + --footer-text: #ecf0f1; + --card-bg: white; + --card-box-shadow: rgba(0,0,0,0.1); + --card-box-shadow-hover: rgba(0,0,0,0.15); + --card-border: #eee; /* For borders like in card-details-section */ + --search-bar-bg: #ffffff; + --search-bar-border: #ddd; + --search-bar-text: #333; /* Text inside input fields */ + --button-bg: #1abc9c; + --button-text: white; + --button-bg-hover: #16a085; + --placeholder-text: #888; + --modal-content-bg: white; + --modal-overlay-bg: rgba(0, 0, 0, 0.6); + --modal-header-border: #eee; + --modal-close-button-color: #888; + --modal-close-button-hover-color: #333; + --accent-color: #1abc9c; /* For things like modal h3 */ + --strong-text-color: #555; + --link-color: #1abc9c; /* General link color if needed */ +} + +body.dark-mode { + /* Dark Mode Variable Overrides */ + --bg-color: #1a1a1a; /* Darker background */ + --text-color: #e0e0e0; /* Lighter text */ + --header-bg: #1f2937; /* Slightly different dark header */ + --header-text: #e0e0e0; + --header-link-hover: #58c1ac; /* Lighter accent for hover */ + --footer-bg: #111827; /* Darker footer */ + --footer-text: #c7c7c7; + --card-bg: #2d2d2d; /* Dark card background */ + --card-box-shadow: rgba(255,255,255,0.05); /* Lighter shadow for dark mode */ + --card-box-shadow-hover: rgba(255,255,255,0.1); + --card-border: #444; /* Darker border */ + --search-bar-bg: #2d2d2d; + --search-bar-border: #555; + --search-bar-text: #e0e0e0; /* Text inside input fields */ + --button-bg: #58c1ac; /* Lighter accent for buttons */ + --button-text: #1a1a1a; /* Darker text on light buttons */ + --button-bg-hover: #4aa08c; + --placeholder-text: #777; + --modal-content-bg: #2d2d2d; + --modal-overlay-bg: rgba(0, 0, 0, 0.8); /* Darker overlay */ + --modal-header-border: #444; + --modal-close-button-color: #aaa; + --modal-close-button-hover-color: #e0e0e0; + --accent-color: #58c1ac; + --strong-text-color: #bbb; + --link-color: #58c1ac; +} + + body { font-family: sans-serif; margin: 0; - background-color: #f4f7f6; - color: #333; + background-color: var(--bg-color); /* USE VAR */ + color: var(--text-color); /* USE VAR */ line-height: 1.6; - box-sizing: border-box; /* Add to body and inherit */ + box-sizing: border-box; + transition: background-color 0.3s ease, color 0.3s ease; /* Smooth transition */ } *, *::before, *::after { - box-sizing: inherit; /* Ensure all elements use the same box model */ + box-sizing: inherit; } header { - background-color: #2c3e50; - color: white; + background-color: var(--header-bg); /* USE VAR */ + color: var(--header-text); /* USE VAR */ padding: 1rem 2rem; display: flex; justify-content: space-between; @@ -23,19 +87,40 @@ header { header h1 { margin: 0; - font-size: 1.8rem; + font-size: 1.66rem; +} + +header nav{ + display:flex; /* put the links and the toggle in one row */ + align-items:center; /* vertically centre them */ + gap:1.5rem; /* space between the links and the toggle */ } header nav a { - color: white; + color: var(--header-text); /* USE VAR */ text-decoration: none; - margin-left: 1.5rem; - font-size: 1.1rem; + margin-left: 0; + font-size: 1.33rem; transition: color 0.2s ease-in-out; } header nav a:hover { - color: #1abc9c; + color: var(--header-link-hover); /* USE VAR */ +} + +/* Theme Toggle Button Style */ +.theme-toggle-button { + background: none; + border: 1px solid var(--header-text); + color: var(--header-text); + padding: 0.4rem 0.8rem; + border-radius: 4px; + cursor: pointer; + font-size: 1rem; + margin-left: 0; +} +body.dark-mode .theme-toggle-button { + border-color: var(--header-text); /* Or a specific dark mode border color */ } main { @@ -47,46 +132,57 @@ main { footer { text-align: center; padding: 1.5rem; - background-color: #34495e; - color: #ecf0f1; + background-color: var(--footer-bg); /* USE VAR */ + color: var(--footer-text); /* USE VAR */ margin-top: 2rem; } /* Search Bar Styles - Desktop First */ .search-bar-container { - background-color: #ffffff; + background-color: var(--search-bar-bg); /* USE VAR */ padding: 1.5rem; border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 10px var(--card-box-shadow); /* USE VAR for consistency with cards */ margin-bottom: 2rem; display: flex; flex-wrap: wrap; gap: 1rem; - align-items: center; /* Aligns items vertically if they have different heights on one line */ + align-items: center; } .search-bar-container input[type="text"], .search-bar-container input[type="number"], .search-bar-container select { + background-color: var(--bg-color); /* Match page bg or use specific input bg */ + color: var(--search-bar-text); /* USE VAR */ padding: 0.75rem; - border: 1px solid #ddd; + border: 1px solid var(--search-bar-border); /* USE VAR */ border-radius: 4px; font-size: 1rem; - line-height: 1.4; /* Ensure consistent line height */ + line-height: 1.4; flex-grow: 1; flex-shrink: 1; - /* min-width helps with wrapping on desktop */ +} +/* Handle select dropdown arrow color for dark mode (can be tricky cross-browser) */ +/* For modern browsers, accent-color can influence form controls */ +.search-bar-container select { + accent-color: var(--accent-color); +} +/* Placeholder color for inputs */ +.search-bar-container input::placeholder { + color: var(--placeholder-text); + opacity: 0.7; } .search-bar-container input[type="text"] { - flex-basis: 300px; /* Ideal width on desktop */ - min-width: 250px; /* Minimum it should shrink to on desktop before wrapping */ + flex-basis: 300px; + min-width: 250px; } .search-bar-container select, .search-bar-container input[type="number"] { - flex-basis: 200px; /* Ideal width for these filters on desktop */ - min-width: 150px; /* Minimum they should shrink to */ + flex-basis: 200px; + min-width: 150px; } @@ -98,34 +194,41 @@ footer { } header nav { margin-top: 0.5rem; + width: 100%; /* Ensure nav takes full width for button alignment */ + display: flex; + justify-content: space-between; /* Align nav items and toggle button */ + align-items: center; + } + header nav div { /* Assuming nav links are wrapped in a div */ + display: flex; } header nav a { margin-left: 0; margin-right: 1rem; } + .theme-toggle-button { + margin-left: auto; /* Push toggle to the right */ + } - /* === Search Bar Mobile Styles === */ + .search-bar-container { - flex-direction: column; /* Stack items vertically */ - align-items: stretch; /* Make items take up full available width */ - padding: 1rem; /* Adjust padding for mobile */ - gap: 0.75rem; /* Adjust gap between stacked items */ + flex-direction: column; + align-items: stretch; + padding: 1rem; + gap: 0.75rem; } .search-bar-container input[type="text"], .search-bar-container input[type="number"], .search-bar-container select { - width: 100%; /* Make each item take full width */ - font-size: 0.9rem; /* Slightly smaller font for better fit */ - padding: 0.65rem 0.75rem; /* Adjust padding (vertical, horizontal) */ - /* Remove flex-basis, min-width for mobile as width: 100% takes precedence */ + width: 100%; + font-size: 0.9rem; + padding: 0.65rem 0.75rem; flex-basis: auto; min-width: 0; - flex-grow: 0; /* Not needed when width is 100% in a column */ - flex-shrink: 0; /* Not needed when width is 100% in a column */ + flex-grow: 0; + flex-shrink: 0; } - /* No specific overrides needed for input[type="text"] or input[type="number"] here - as they will follow the general rule above for mobile. */ } @@ -138,27 +241,32 @@ footer { /* Card Styles */ .card { - background-color: white; + background-color: var(--card-bg); /* USE VAR */ + color: var(--text-color); /* Inherit text color from body or set specific */ border-radius: 8px; - box-shadow: 0 4px 6px rgba(0,0,0,0.1); + box-shadow: 0 4px 6px var(--card-box-shadow); /* USE VAR */ overflow: hidden; - transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out, background-color 0.3s ease, color 0.3s ease; display: flex; flex-direction: column; } .card:hover { transform: translateY(-5px); - box-shadow: 0 8px 12px rgba(0,0,0,0.15); + box-shadow: 0 8px 12px var(--card-box-shadow-hover); /* USE VAR */ } .card-photo-container { width: 100%; aspect-ratio: 16 / 9; - background-color: #e0e0e0; + background-color: var(--placeholder-text); /* Or a darker placeholder for dark mode */ overflow: hidden; display: block; } +body.dark-mode .card-photo-container { + background-color: #4a4a4a; /* Darker placeholder */ +} + .card-photo { display: block; @@ -178,7 +286,7 @@ footer { margin-top: 0; margin-bottom: 0.33rem; font-size: 1.33rem; - color: #333; + color: var(--text-color); /* USE VAR */ } .card-content p { @@ -188,19 +296,24 @@ footer { margin-right: 0; font-size: 1rem; line-height: 1.5; + color: var(--text-color); /* USE VAR */ } +.card-content p strong { + color: var(--strong-text-color); /* USE VAR for strong tags inside paragraphs */ +} + .card-info-placeholder { font-style: italic; - color: #888; + color: var(--placeholder-text); /* USE VAR */ font-size: 0.9rem; min-height: 1.2em; } -.card-details-section { +.card-details-section { /* This class is not currently used in ClubCard.tsx for the modal */ margin-top: 0.75rem; padding-top: 0.75rem; - border-top: 1px solid #eee; + border-top: 1px solid var(--card-border); /* USE VAR */ } .card-details-section p { @@ -209,12 +322,12 @@ footer { } .card-details-section strong { - color: #555; + color: var(--strong-text-color); /* USE VAR */ } .card-button { - background-color: #1abc9c; - color: white; + background-color: var(--button-bg); /* USE VAR */ + color: var(--button-text); /* USE VAR */ border: none; padding: 0.6rem 1rem; border-radius: 4px; @@ -226,7 +339,7 @@ footer { } .card-button:hover { - background-color: #16a085; + background-color: var(--button-bg-hover); /* USE VAR */ } /* Loading and Error Messages */ @@ -234,24 +347,33 @@ footer { text-align: center; font-size: 1.2rem; padding: 2rem; - color: #555; + color: var(--strong-text-color); /* USE VAR */ } .error-message { - color: #e74c3c; + color: #e74c3c; /* Keep specific error color, or make it a variable too */ +} +body.dark-mode .error-message { + color: #ff6b6b; /* Lighter red for dark mode */ } + /* Staff Card Specifics */ -.staff-card { +.staff-card { /* Staff card inherits .card styles, so it gets dark mode too */ padding: 1.5rem; } .staff-card h3 { font-size: 1.2rem; + color: var(--text-color); /* USE VAR */ } .staff-card p { font-size: 1rem; - color: #555; + color: var(--text-color); /* USE VAR */ } +.staff-card p strong { + color: var(--strong-text-color); +} + /* Modal Styles */ .modal-overlay { @@ -260,7 +382,7 @@ footer { left: 0; right: 0; bottom: 0; - background-color: rgba(0, 0, 0, 0.6); + background-color: var(--modal-overlay-bg); /* USE VAR */ display: flex; align-items: center; justify-content: center; @@ -269,10 +391,11 @@ footer { } .modal-content { - background-color: white; + background-color: var(--modal-content-bg); /* USE VAR */ + color: var(--text-color); /* USE VAR */ padding: 2rem; border-radius: 8px; - box-shadow: 0 5px 15px rgba(0,0,0,0.3); + box-shadow: 0 5px 15px var(--card-box-shadow); /* USE VAR */ width: 90%; max-width: 700px; max-height: 90vh; @@ -287,18 +410,18 @@ footer { padding-right: 1rem; } -.modal-content h2 { +.modal-content h2 { /* Main title in modal */ margin-top: 0; margin-bottom: 1rem; - color: #333; + color: var(--text-color); /* USE VAR */ padding-bottom: 1rem; - border-bottom: 1px solid #eee; + border-bottom: 1px solid var(--modal-header-border); /* USE VAR */ } -.modal-content h3 { +.modal-content h3 { /* Subheadings like "Meta Information" in modal */ margin-top: 1rem; margin-bottom: 0.5rem; - color: #1abc9c; + color: var(--accent-color); /* USE VAR */ } .modal-content p, .modal-content li { margin-top: 0.33rem; @@ -307,6 +430,10 @@ footer { margin-right: 0; font-size: 1rem; line-height: 1.5; + color: var(--text-color); /* USE VAR */ +} +.modal-content p strong { + color: var(--strong-text-color); } .modal-content ul { padding-left: 20px; @@ -328,10 +455,10 @@ footer { border: none; font-size: 2rem; font-weight: bold; - color: #888; + color: var(--modal-close-button-color); /* USE VAR */ cursor: pointer; line-height: 1; } .modal-close-button:hover { - color: #333; + color: var(--modal-close-button-hover-color); /* USE VAR */ } \ No newline at end of file