From 9716fe9f1d9e36b879072f58e339170e626d0333 Mon Sep 17 00:00:00 2001 From: Deco Vander Date: Fri, 4 Jul 2025 14:43:52 -0400 Subject: [PATCH] Configure CSS as generated asset, not committed to git MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added public/style.css to .gitignore - Removed style.css from git tracking (git rm --cached) - Enhanced package.json scripts for better CSS workflow: - postinstall: Auto-builds CSS on npm install - build-css:dev: Development build with source maps - start: Now builds CSS before starting server - dev: Builds CSS before development mode - Updated README with CSS development documentation - Explains SCSS organization and build process - Documents all CSS-related npm scripts Benefits: ✅ Cleaner repository (no generated files) ✅ Prevents merge conflicts in generated CSS ✅ Automatic CSS generation on new machine setup ✅ Source of truth is SCSS files only ✅ Consistent build process across environments --- .gitignore | 4 ++++ README.md | 23 +++++++++++++++++++++-- package.json | 10 ++++++---- public/style.css | 1 - 4 files changed, 31 insertions(+), 7 deletions(-) delete mode 100644 public/style.css diff --git a/.gitignore b/.gitignore index 26ba780..d91cf4c 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,7 @@ Thumbs.db # Temporary files *.tmp *.temp + +# Generated files +public/style.css +public/style.css.map diff --git a/README.md b/README.md index 2912966..f1ba479 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ A community-driven web application for tracking winter road conditions and icy h ```bash npm install ``` + *Note: CSS is automatically built via the `postinstall` script* 3. **Configure environment variables:** ```bash @@ -38,7 +39,9 @@ A community-driven web application for tracking winter road conditions and icy h 4. **Start the server:** ```bash - npm start + npm start # Production mode + npm run dev # Development mode + npm run dev-with-css # Development with CSS watching ``` 5. **Visit the application:** @@ -46,6 +49,22 @@ A community-driven web application for tracking winter road conditions and icy h http://localhost:3000 ``` +### CSS Development + +This project uses SCSS for styling. The CSS is **generated** and should not be committed to git. + +- **Build CSS once:** `npm run build-css` +- **Build CSS (dev mode):** `npm run build-css:dev` +- **Watch CSS changes:** `npm run watch-css` +- **Dev with CSS watching:** `npm run dev-with-css` + +SCSS files are organized in `src/scss/`: +- `main.scss` - Main entry point +- `_variables.scss` - Theme variables and colors +- `_mixins.scss` - Reusable SCSS mixins +- `pages/` - Page-specific styles +- `components/` - Component-specific styles + ## Environment Variables ```bash @@ -72,7 +91,7 @@ PORT=3000 ```bash git clone git@github.com:deco/ice.git /opt/ice cd /opt/ice - npm install + npm install # This automatically builds CSS via postinstall ``` 3. **Configure environment:** diff --git a/package.json b/package.json index 2c68656..a370751 100644 --- a/package.json +++ b/package.json @@ -4,14 +4,16 @@ "description": "Great Lakes Ice Report - Community-driven winter road conditions tracker for Michigan", "main": "server.js", "scripts": { - "start": "node server.js", - "dev": "nodemon server.js", + "start": "npm run build && node server.js", + "dev": "npm run build-css && nodemon server.js", "build-css": "sass src/scss/main.scss public/style.css --style=compressed", - "watch-css": "sass src/scss/main.scss public/style.css --watch", + "build-css:dev": "sass src/scss/main.scss public/style.css --style=expanded --source-map", + "watch-css": "sass src/scss/main.scss public/style.css --watch --style=expanded --source-map", "dev-with-css": "concurrently \"npm run watch-css\" \"npm run dev\"", "build": "npm run build-css", "test": "jest --runInBand --forceExit", - "test:coverage": "jest --coverage" + "test:coverage": "jest --coverage", + "postinstall": "npm run build-css" }, "dependencies": { "cors": "^2.8.5", diff --git a/public/style.css b/public/style.css deleted file mode 100644 index 246721e..0000000 --- a/public/style.css +++ /dev/null @@ -1 +0,0 @@ -footer{margin-top:32px;padding:24px;background-color:var(--bg-secondary);border-top:1px solid var(--border-color);border-radius:8px 8px 0 0}footer p{margin:8px 0;color:var(--text-color);text-align:center;font-size:16px;line-height:1.6}footer p:first-child{margin-top:0}footer p:last-child{margin-bottom:0}footer a{color:var(--link-color);text-decoration:underline}footer a:hover{color:var(--link-hover)}footer .disclaimer{margin-top:16px;text-align:center}footer .disclaimer small{color:var(--text-secondary);font-size:16px;line-height:1.5;display:block}@media(max-width: 768px){footer{padding:16px}footer p{font-size:14px}footer .disclaimer small{font-size:14px}}.admin-container{max-width:1200px;margin:0 auto;padding:24px}.login-section{background:var(--card-bg);color:var(--text-color);padding:32px;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);max-width:400px;margin:50px auto}.login-section .login-header{display:flex;align-items:center;justify-content:space-between;align-items:center;margin-bottom:24px}.login-section .login-header h2{margin:0}.admin-section{display:none}.admin-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px}.header-buttons{display:flex;gap:8px;align-items:center}.header-btn{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#6c757d;color:#fff}.header-btn:hover{opacity:.9;transform:translateY(-1px)}.header-btn:active{transform:translateY(0)}.header-btn.btn-refresh{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#2196f3;color:#fff}.header-btn.btn-refresh:hover{opacity:.9;transform:translateY(-1px)}.header-btn.btn-refresh:active{transform:translateY(0)}.header-btn.btn-home{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#28a745;color:#fff}.header-btn.btn-home:hover{opacity:.9;transform:translateY(-1px)}.header-btn.btn-home:active{transform:translateY(0)}.header-btn.btn-logout{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#dc3545;color:#fff}.header-btn.btn-logout:hover{opacity:.9;transform:translateY(-1px)}.header-btn.btn-logout:active{transform:translateY(0)}.theme-toggle-admin{background:var(--card-bg) !important;color:var(--text-color) !important;border:2px solid var(--border-color) !important;width:40px;height:40px;border-radius:50% !important;display:flex;align-items:center;justify-content:center;padding:0 !important}.stats{display:grid;grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));gap:24px;margin-bottom:24px}.stat-card{background:var(--card-bg);color:var(--text-color);padding:24px;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);text-align:center}.stat-number{font-size:2em;font-weight:bold;color:#2196f3}.locations-table{width:100%;border-collapse:collapse;background:var(--card-bg);color:var(--text-color);border-radius:8px;overflow:hidden;box-shadow:0 2px 4px rgba(0,0,0,.1);margin-top:24px}.locations-table th,.locations-table td{padding:8px 16px;text-align:left;border-bottom:1px solid var(--border-color);color:var(--text-color)}.locations-table th{background-color:var(--table-header-bg);font-weight:bold}.locations-table tr:hover{background-color:var(--table-hover)}.action-buttons{display:flex;gap:5px}.btn{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:4px 8px;font-size:14px;background-color:#2196f3;color:#fff}.btn:hover{opacity:.9;transform:translateY(-1px)}.btn:active{transform:translateY(0)}.btn-edit{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:4px 8px;font-size:14px;background-color:#2196f3;color:#fff}.btn-edit:hover{opacity:.9;transform:translateY(-1px)}.btn-edit:active{transform:translateY(0)}.btn-delete{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:4px 8px;font-size:14px;background-color:#dc3545;color:#fff}.btn-delete:hover{opacity:.9;transform:translateY(-1px)}.btn-delete:active{transform:translateY(0)}.btn-save{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:4px 8px;font-size:14px;background-color:#28a745;color:#fff}.btn-save:hover{opacity:.9;transform:translateY(-1px)}.btn-save:active{transform:translateY(0)}.btn-cancel{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:4px 8px;font-size:14px;background-color:#6c757d;color:#fff}.btn-cancel:hover{opacity:.9;transform:translateY(-1px)}.btn-cancel:active{transform:translateY(0)}.edit-row{background-color:#fff3cd !important}.edit-input{padding:8px 16px;border:1px solid var(--input-border);border-radius:4px;font-size:16px;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background-color:var(--input-bg);color:var(--text-color);transition:border-color .2s ease;width:100%;font-size:14px}.edit-input:focus{outline:none;border-color:#2196f3;box-shadow:0 0 0 2px rgba(33,150,243,.2)}.status-indicator{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:rgba(0,0,0,0);color:inherit}.status-active{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:#d4edda;color:#155724}.status-expired{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:#f8d7da;color:#721c24}.tab-navigation{display:flex;margin-bottom:24px;border-bottom:2px solid var(--border-color)}.tab-btn{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:rgba(0,0,0,0);color:var(--text-color);border-bottom:3px solid rgba(0,0,0,0);border-radius:0}.tab-btn:hover{opacity:.9;transform:translateY(-1px)}.tab-btn:active{transform:translateY(0)}.tab-btn.active{border-bottom-color:#2196f3;color:#2196f3}.tab-btn:hover{background-color:var(--table-hover);transform:none}.tab-content{display:none}.tab-content.active{display:block}.profanity-management .management-section{background:var(--card-bg);color:var(--text-color);padding:24px;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);margin-bottom:24px}.profanity-management .management-section h4{margin-top:0;color:#2196f3}.profanity-management .profanity-form{display:grid;grid-template-columns:2fr 1fr 1fr auto;gap:8px;align-items:end;margin-bottom:24px}.profanity-management .profanity-form input,.profanity-management .profanity-form select{padding:8px 16px;border:1px solid var(--input-border);border-radius:4px;font-size:16px;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background-color:var(--input-bg);color:var(--text-color);transition:border-color .2s ease}.profanity-management .profanity-form input:focus,.profanity-management .profanity-form select:focus{outline:none;border-color:#2196f3;box-shadow:0 0 0 2px rgba(33,150,243,.2)}.profanity-management .test-section .test-form{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:end}.profanity-management .test-section .test-form textarea{padding:8px 16px;border:1px solid var(--input-border);border-radius:4px;font-size:16px;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background-color:var(--input-bg);color:var(--text-color);transition:border-color .2s ease;resize:vertical;min-height:60px}.profanity-management .test-section .test-form textarea:focus{outline:none;border-color:#2196f3;box-shadow:0 0 0 2px rgba(33,150,243,.2)}.test-results{margin-top:16px;padding:16px;border-radius:4px}.test-results.profane{background-color:#f8d7da;color:#721c24;border:1px solid #f5c6cb}.test-results.clean{background-color:#d4edda;color:#155724;border:1px solid #c3e6cb}.test-results.empty{background-color:#f8f9fa;color:#6c757d;border:1px solid #dee2e6}.severity-low{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:#d1ecf1;color:#0c5460}.severity-medium{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:#fff3cd;color:#856404}.severity-high{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:#f8d7da;color:#721c24}.action-btn{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:4px 8px;font-size:14px;background-color:#2196f3;color:#fff}.action-btn:hover{opacity:.9;transform:translateY(-1px)}.action-btn:active{transform:translateY(0)}.action-btn.danger{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:4px 8px;font-size:14px;background-color:#dc3545;color:#fff}.action-btn.danger:hover{opacity:.9;transform:translateY(-1px)}.action-btn.danger:active{transform:translateY(0)}.persistent-toggle.active{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#ffc107;color:#000}.persistent-toggle.active:hover{opacity:.9;transform:translateY(-1px)}.persistent-toggle.active:active{transform:translateY(0)}.persistent-toggle.inactive{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#6c757d;color:#fff}.persistent-toggle.inactive:hover{opacity:.9;transform:translateY(-1px)}.persistent-toggle.inactive:active{transform:translateY(0)}@media(max-width: 768px){.admin-container{padding:16px}.admin-header{flex-direction:column;gap:16px;align-items:stretch}.header-buttons{justify-content:center;flex-wrap:wrap}.stats{grid-template-columns:1fr 1fr}.locations-table{font-size:14px}.locations-table th,.locations-table td{padding:4px 4px}.locations-table .address-cell{max-width:100px}.btn{padding:3px 4px;font-size:9px}.profanity-form{grid-template-columns:1fr;gap:8px}}.container{max-width:1200px;margin:0 auto;padding:24px}.header{margin-bottom:24px;padding:16px 0;border-bottom:1px solid var(--border-color)}.header-content{display:flex;align-items:center;justify-content:space-between;align-items:flex-start;gap:24px}.header-text{flex:1}.header-text h1{color:var(--text-color);font-size:28px;margin:0 0 4px 0}.header-text p{color:var(--text-color);opacity:.8;margin:0;font-size:16px}@media(max-width: 768px){.header-content{flex-direction:column;align-items:stretch;gap:16px}.header-text{text-align:center}.header-text h1{font-size:20px}.header-text p{font-size:14px}.theme-toggle{align-self:center}}.title{color:var(--text-color);font-size:28px;margin:0}.subtitle{color:var(--text-color);opacity:.8;margin:4px 0}.view-controls{display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:24px}.view-btn{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#2196f3;color:#fff}.view-btn:hover{opacity:.9;transform:translateY(-1px)}.view-btn:active{transform:translateY(0)}.view-btn.active{background-color:#2196f3;color:#fff}.view-btn:not(.active){background-color:rgba(0,0,0,0);color:var(--text-color);border:1px solid var(--border-color)}.map-view{width:100%;height:500px;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px rgba(0,0,0,.1)}@media(max-width: 768px){.map-view{height:400px}}#map{height:500px;width:100%;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);margin:24px 0}@media(max-width: 768px){#map{height:400px}}.reports-table{width:100%;border-collapse:collapse;background:var(--card-bg);color:var(--text-color);border-radius:8px;overflow:hidden;box-shadow:0 2px 4px rgba(0,0,0,.1)}.reports-table th,.reports-table td{padding:8px 16px;text-align:left;border-bottom:1px solid var(--border-color);color:var(--text-color)}.reports-table th{background-color:var(--table-header-bg);font-weight:bold}.reports-table tr:hover{background-color:var(--table-hover)}.reports-table th{background-color:var(--bg-secondary, var(--card-bg));color:var(--text-color);font-weight:600;padding:1rem;border-bottom:2px solid var(--border-color)}.reports-table th:first-child{border-top-left-radius:8px}.reports-table th:last-child{border-top-right-radius:8px}.reports-table td{padding:1rem;border-bottom:1px solid var(--border-color);color:var(--text-color) !important;vertical-align:top}.reports-table td:first-child{padding-left:1.5rem}.reports-table td:last-child{padding-right:1.5rem}.reports-table tbody tr{transition:background-color .2s ease}.reports-table tbody tr:hover{background-color:var(--bg-hover, var(--table-hover))}.reports-table tbody tr:last-child td{border-bottom:none}.reports-table .location-cell{color:var(--text-color) !important;font-size:14px;font-weight:500;max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reports-table .details-cell{color:var(--text-color) !important;font-size:14px;font-weight:400;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:italic}.reports-table .time-cell{color:var(--text-color) !important;font-size:12px;font-weight:400}.reports-table .remaining-cell{color:var(--text-color) !important;font-size:12px;font-weight:500}.reports-table .remaining-cell.urgent{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:var(--status-danger, #dc3545);color:#fff;text-transform:uppercase;letter-spacing:.025em}.reports-table .remaining-cell.warning{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:var(--status-warning, #ffc107);color:#fff;text-transform:uppercase;letter-spacing:.025em}.reports-table .remaining-cell.normal{padding:4px 8px;border-radius:12px;font-size:14px;font-weight:bold;background-color:var(--status-info, #17a2b8);color:#fff}@media(max-width: 768px){.reports-table{display:block;overflow-x:auto;white-space:nowrap}.reports-table th,.reports-table td{min-width:120px}}.form-section{background:var(--card-bg);color:var(--text-color);padding:24px;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);margin-bottom:24px}.form-section h3{margin-top:0;margin-bottom:16px;color:var(--text-color)}.map-section{background:var(--card-bg);color:var(--text-color);padding:24px;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);margin-bottom:24px}.map-section h2{margin-top:0;margin-bottom:16px;color:var(--text-color)}.reports-header{display:flex;align-items:center;justify-content:space-between;align-items:center;margin-bottom:24px}.reports-header h2{margin:0}.view-toggle{display:flex;gap:4px}.toggle-btn{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:4px 8px;font-size:14px;background-color:#2196f3;color:#fff}.toggle-btn:hover{opacity:.9;transform:translateY(-1px)}.toggle-btn:active{transform:translateY(0)}.toggle-btn.active{background-color:#2196f3;color:#fff}.toggle-btn:not(.active){background-color:rgba(0,0,0,0);color:var(--text-color);border:1px solid var(--border-color)}.view-container{margin-top:16px}.map-info{margin-top:16px;padding:16px;background-color:var(--bg-secondary);border-radius:4px;border:1px solid var(--border-color)}.map-info p{margin:4px 0;font-size:14px;color:var(--text-color)}.map-info p:last-child{margin-bottom:0}.table-controls{margin-bottom:16px}.table-info{text-align:center}.table-info p{margin:0;color:var(--text-color);font-size:16px}.table-container{overflow-x:auto}.add-location-form{display:grid;grid-template-columns:1fr auto;gap:16px;align-items:end}@media(max-width: 768px){.add-location-form{grid-template-columns:1fr}}.add-location-form .location-input{padding:8px 16px;border:1px solid var(--input-border);border-radius:4px;font-size:16px;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background-color:var(--input-bg);color:var(--text-color);transition:border-color .2s ease;min-width:300px}.add-location-form .location-input:focus{outline:none;border-color:#2196f3;box-shadow:0 0 0 2px rgba(33,150,243,.2)}@media(max-width: 768px){.add-location-form .location-input{min-width:unset}}.add-location-form .add-btn{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#28a745;color:#fff}.add-location-form .add-btn:hover{opacity:.9;transform:translateY(-1px)}.add-location-form .add-btn:active{transform:translateY(0)}.location-count{color:var(--text-color);font-size:16px;margin-bottom:16px;text-align:center}.error-message{background:var(--card-bg);color:var(--text-color);padding:16px;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);background-color:#f8d7da;color:#721c24;border:1px solid #f5c6cb;margin:16px 0}.error-message.success{background-color:#d4edda;color:#155724;border-color:#c3e6cb}.loading{text-align:center;color:var(--text-color);opacity:.7;padding:24px}.theme-section{position:fixed;top:24px;right:24px;z-index:100}@media(max-width: 768px){.theme-section{position:static;margin-bottom:24px;text-align:center}}.privacy-container{max-width:800px;margin:0 auto;padding:20px}.privacy-header{text-align:center;margin-bottom:40px}.privacy-header__title-wrapper{position:relative;margin-bottom:20px}.privacy-header__title-content{text-align:center}.privacy-header__theme-toggle{position:absolute;top:0;right:0;background:var(--card-bg);border:2px solid var(--border-color);border-radius:50%;width:50px;height:50px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .3s ease;box-shadow:0 2px 4px var(--shadow)}.privacy-header__theme-toggle .theme-icon{font-size:20px}.privacy-content{background:var(--card-bg);padding:30px;border-radius:8px;box-shadow:0 2px 4px var(--shadow);line-height:1.6}.privacy-content h2{color:var(--text-color);margin-top:30px;margin-bottom:15px;border-bottom:1px solid var(--border-color);padding-bottom:10px}.privacy-content h2:first-child{margin-top:0}.privacy-content ul{margin:15px 0;padding-left:30px}.privacy-content li{margin-bottom:8px}.privacy-content a:not(.back-link){color:var(--link-color) !important;text-decoration:underline !important;font-weight:500}.privacy-content a:not(.back-link):hover{color:var(--link-hover) !important;text-decoration:underline !important}.privacy-content .back-link{display:inline-block !important;margin-top:30px !important;padding:10px 20px !important;color:#fff !important;background-color:var(--primary-color, #2196F3) !important;border:none !important;border-radius:4px !important;text-decoration:none !important;transition:background-color .2s ease !important;font-weight:500 !important}.privacy-content .back-link:hover{background-color:var(--primary-hover, #1976D2) !important;color:#fff !important;text-decoration:none !important}.effective-date{color:#666;font-size:.9em;text-align:center;margin-bottom:30px}.contact-info{background:var(--toggle-bg);padding:20px;border-radius:6px;margin-top:20px;border:1px solid var(--border-color)}.contact-info a{color:var(--link-color) !important;text-decoration:underline !important;font-weight:500}.contact-info a:hover{color:var(--link-hover) !important}a.back-link{display:inline-block !important;margin-top:30px !important;padding:10px 20px !important;color:#fff !important;background-color:var(--primary-color, #2196F3) !important;border:none !important;border-radius:4px !important;text-decoration:none !important;transition:background-color .2s ease !important;font-weight:500 !important}a.back-link:hover{background-color:var(--primary-hover, #1976D2) !important;color:#fff !important;text-decoration:none !important}:root{--background-color: #ffffff;--text-color: #1f2937;--card-bg: #f3f4f6;--border-color: #d1d5db;--input-bg: #ffffff;--input-border: #d1d5db;--table-header-bg: #e9ecef;--table-hover: #f5f5f5;--shadow: rgba(0, 0, 0, 0.1);--bg-secondary: #f3f4f6;--bg-hover: #f1f5f9;--status-active: #10b981;--status-warning: #f59e0b;--status-danger: #ef4444;--status-info: #3b82f6;--link-color: #007bff;--link-hover: #0056b3;--text-secondary: #6c757d;--primary-color: #2196F3;--primary-hover: #1976D2}[data-theme=dark]{--background-color: #111827;--text-color: #f9fafb;--card-bg: #1f2937;--border-color: #374151;--input-bg: #1f2937;--input-border: #374151;--table-header-bg: #3d3d3d;--table-hover: #3d3d3d;--shadow: rgba(0, 0, 0, 0.3);--bg-secondary: #1f2937;--bg-hover: #4b5563;--link-color: #60a5fa;--link-hover: #93c5fd;--text-secondary: #9ca3af;--primary-color: #2196F3;--primary-hover: #1976D2}*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:16px;background-color:var(--background-color);color:var(--text-color);line-height:1.6;min-height:100vh;transition:background-color .3s ease,color .3s ease}.form-group{margin-bottom:16px}.form-group label{display:block;margin-bottom:4px;font-weight:500}.form-group input,.form-group select,.form-group textarea{padding:8px 16px;border:1px solid var(--input-border);border-radius:4px;font-size:16px;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background-color:var(--input-bg);color:var(--text-color);transition:border-color .2s ease;width:100%}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{outline:none;border-color:#2196f3;box-shadow:0 0 0 2px rgba(33,150,243,.2)}button{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:#2196f3;color:#fff}button:hover{opacity:.9;transform:translateY(-1px)}button:active{transform:translateY(0)}button:disabled{opacity:.6;cursor:not-allowed}.message{padding:16px;border-radius:4px;margin:16px 0;display:none}.message.error{background-color:#f8d7da;color:#721c24;border:1px solid #f5c6cb}.message.success{background-color:#d4edda;color:#155724;border:1px solid #c3e6cb}.message.info{background-color:#d1ecf1;color:#0c5460;border:1px solid #bee5eb}.theme-toggle{border:none;border-radius:4px;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;text-decoration:none;display:inline-block;transition:all .2s ease;padding:8px 16px;font-size:16px;background-color:rgba(0,0,0,0);color:#fff;border:2px solid var(--border-color);border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center}.theme-toggle:hover{opacity:.9;transform:translateY(-1px)}.theme-toggle:active{transform:translateY(0)}.theme-toggle:hover{background-color:var(--table-hover);transform:none}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.mb-sm{margin-bottom:8px}.mb-md{margin-bottom:16px}.mb-lg{margin-bottom:24px}.mt-sm{margin-top:8px}.mt-md{margin-top:16px}.mt-lg{margin-top:24px}.p-sm{padding:8px}.p-md{padding:16px}.p-lg{padding:24px}.d-flex{display:flex}.flex-center{display:flex;align-items:center;justify-content:center}.flex-between{display:flex;align-items:center;justify-content:space-between}.flex-column{display:flex;flex-direction:column}.w-100{width:100%}.h-100{height:100%}/*# sourceMappingURL=style.css.map */