- Use :not(.back-link) selector to exclude back button from general link styling
- Add more specific CSS selectors for back-link to increase specificity
- Use both .privacy-content .back-link and a.back-link selectors
- Ensure white text color overrides the blue link color from general rules
- Prevent general link styling from interfering with button appearance
- Remove conflicting .back-link CSS rule that used undefined variables
- Consolidate all back-link styling into single comprehensive rule
- Add all necessary properties with !important to override conflicts
- Include display, margin, padding, border-radius for proper button appearance
- Ensure white text color on blue background for proper contrast
- Add font-weight and transition for better visual presentation
- Change back-link text color from blue to white for readability
- Remove text-decoration underline for cleaner button appearance
- Ensure white text shows clearly on blue button background
- Maintain white text color on hover for consistency
- Improve accessibility with proper color contrast ratio
- Add explicit link styling with proper color variables for readability
- Use !important declarations to override any conflicting inline styles
- Style all links in privacy-content and contact-info sections
- Add font-weight: 500 for better link visibility
- Fix back-link button with proper primary color styling
- Add CSS variables for primary colors in both light and dark themes
- Ensure links maintain proper contrast in both theme modes
- Change flexbox layout to relative positioning for header container
- Position theme toggle as absolute overlay in top-right corner
- Keep title and subtitle centered without interference from theme button
- Effective date now properly aligns with centered title text
- Theme toggle no longer displaces header text horizontally
- Add proper flexbox styling for .header-content to space items correctly
- Style .header-text with flex: 1 to take available space on left
- Position theme toggle button on the right side of header row
- Add responsive mobile layout that stacks header vertically
- Center header text and theme toggle on mobile devices
- Maintain proper spacing and visual hierarchy at all screen sizes
- Increase all typography scale by 2px for improved accessibility
- xs: 10px → 12px, sm: 12px → 14px, md: 14px → 16px
- lg: 16px → 18px, xl: 18px → 20px, xxl: 24px → 28px
- Set base body font-size to medium (16px) for default text
- All form inputs, buttons, tables, and content now more readable
- Maintains responsive design but with larger, more accessible text
- Increase footer font size from small to medium for better readability
- Ensure all footer text is properly centered including disclaimer
- Add explicit text-align: center and display: block for disclaimer small text
- Maintain responsive design with smaller font on mobile but still readable
- Update mobile disclaimer font size to small instead of extra small
- Add card styling to map-section with proper spacing and visual hierarchy
- Add reports-header with flexbox layout for title and view toggle buttons
- Add styling for view-toggle buttons, map-info, and table-controls
- Create shared footer component with consistent styling across pages
- Add footer to admin.html and privacy.html for consistency
- Add missing CSS variables for links, secondary text, and font-size-xs
- Ensure footer uses proper theme colors for light/dark modes
- Restore visual box around Current Reports section on main page
## Critical CSS Fixes
- ✅ Added missing index page styles (_index.scss) for main application
- ✅ Restored original CSS variables and color scheme compatibility
- ✅ Added comprehensive reports-table styles with proper cell formatting
- ✅ Fixed theme variables to match original design (updated colors)
- ✅ Added missing form, button, and layout components
## Enhanced Styles
- ✅ Proper table cell styling (.location-cell, .details-cell, .time-cell, .remaining-cell)
- ✅ Status indicators for urgent/warning/normal time remaining
- ✅ Enhanced responsive design for mobile tables
- ✅ Form and input styling consistency
- ✅ Theme toggle and header components
- ✅ Error/success message styling
## Architecture Improvements
- ✅ Modular imports: admin styles + index styles + shared components
- ✅ Better CSS variable organization with light/dark theme support
- ✅ Maintained backward compatibility with existing classes
- ✅ Compressed CSS output for production performance
The application now has full styling coverage with the new SCSS architecture.
## Major CSS/SCSS Improvements
- ✅ Set up modular SCSS architecture with variables, mixins, and components
- ✅ Created organized directory structure: src/scss/ with variables, mixins, pages/
- ✅ Removed ~300+ lines of inline CSS from admin.html
- ✅ Added comprehensive design system with consistent spacing, colors, typography
- ✅ Created reusable mixins for buttons, cards, tables, forms, and layouts
- ✅ Implemented responsive breakpoint mixins for mobile/tablet/desktop
- ✅ Added utility classes for common layouts and spacing
## Build System
- ✅ Added sass and concurrently as dev dependencies
- ✅ Created npm scripts: build-css, watch-css, dev-with-css
- ✅ Automated SCSS compilation to compressed CSS
- ✅ Set up development workflow with CSS watching
## Admin Panel Enhancements
- ✅ Added complete tab navigation system (Location Reports + Profanity Filter)
- ✅ Integrated profanity management UI with forms and tables
- ✅ Consistent styling across all components using SCSS mixins
- ✅ Improved responsive design for mobile devices
## Benefits
- 🎯 Maintainable: All styles centralized in modular SCSS files
- 📱 Responsive: Better mobile experience with consistent breakpoints
- 🎨 Consistent: Design system ensures visual consistency
- ⚡ Efficient: Compressed CSS output, no inline styles
- 🔧 Developer-friendly: Easy to extend and modify styles
The application now has professional-grade CSS architecture that's easy to maintain and extend.
- Updated clone commands to use correct repository name
- Fixed deployment directory paths to /opt/ice
- Updated systemctl service names to 'ice' from 'great-lakes-ice-report'
- Ensures documentation matches actual repository structure
- Add dark mode overrides for table cell text colors to ensure visibility
- Remove Google Maps API key exposure from /api/config endpoint (security fix)
- Update privacy policy to clarify international server hosting
- Switch from CDN resources to local files for better control
- Add SCSS build system for future styling improvements
Applied the exact same selector pattern as admin table:
- .reports-table th, .reports-table td { color: var(--text-color); }
This ensures both header and data cells explicitly inherit the correct
text color variable, matching the admin table behavior exactly.
Should resolve the white text visibility issue in dark mode.
Updated reports table to use the same robust styling as admin table:
✅ Added:
- border-radius: 8px and overflow: hidden for rounded corners
- box-shadow: 0 2px 4px var(--shadow) for elevation
- color: var(--text-color) on table element for inheritance
- Consistent border styling with 1px borders
- font-weight: bold for headers (matching admin)
✅ Improved:
- Better dark mode support with proper color inheritance
- Consistent visual appearance between admin and public tables
- Removed duplicate box-shadow from table-container
- Simplified header borders (removed 2px, sticky positioning complexity)
Both tables now share the same visual design language and dark mode behavior.
The admin table was working correctly because it explicitly sets 'color: var(--text-color)'
on all table cells, but the main reports table (Table View on homepage) was missing this.
Added 'color: var(--text-color)' to '.reports-table td' to ensure all table cells
use the proper text color in both light and dark modes.
This fixes the gray-on-gray readability issue in the details table view.
Problem: Text with opacity created gray-on-gray which was hard to read in dark mode.
Solution: Added dedicated color variables for text hierarchy:
- --text-color: Primary text (bright)
- --text-secondary: Secondary text (medium brightness)
- --text-tertiary: Tertiary text (dimmer but still readable)
Dark mode colors:
- Primary: #e0e0e0 (bright white-ish)
- Secondary: #b0b0b0 (medium gray)
- Tertiary: #909090 (dimmer gray)
Light mode colors:
- Primary: #333 (dark)
- Secondary: #666 (medium gray)
- Tertiary: #999 (light gray)
This provides much better contrast and readability in dark mode while maintaining the visual hierarchy.
- Updated table cell colors to use CSS variables instead of hardcoded values
- Fixed location-cell, details-cell, time-cell text colors for dark mode
- Improved contrast with opacity adjustments for secondary text
- Updated status colors (urgent/warning/normal) to work better in dark mode
- Fixed autocomplete, input-help, disclaimer, and table-info text colors
- All text now properly adapts to both light and dark themes
The public /api/locations endpoint was only returning locations within 48 hours,
but it should also include persistent locations regardless of their age.
Updated SQL query to: 'WHERE created_at > ? OR persistent = 1'
This ensures that:
- Regular reports show for 48 hours (as intended)
- Persistent reports show indefinitely (as intended)
- Both types appear on the public map and homepage
Security improvements:
- Auto-logout after 30 minutes of inactivity
- Session warning 5 minutes before expiry with option to extend
- Activity-based session extension on user interaction
- Session validation on page load and API calls
- Periodic session validity checks every minute
- Secure cleanup of tokens and timers on logout
- Protection against expired session usage
This prevents unauthorized access if admin leaves session open or if tokens are compromised.
- Updated all static asset URLs to use iceymi.b-cdn.net CDN
- Changed favicon, CSS, and JS file references in index.html, admin.html, and privacy.html
- API calls remain pointed to origin server for dynamic content
- Ready for CDN deployment with proper cache separation
- Created custom map markers with distinct colors and symbols:
- 🔒 Green circles with lock icon for persistent reports
- ⚠️ Red circles with warning icon for temporary reports
- Updated popup text to indicate persistent status
- Applied consistent styling to both MapBox and Nominatim versions
- Enhanced visual distinction between report types on the map
- Updated getTimeRemaining() to return 'Persistent' for persistent reports
- Modified getRemainingClass() to handle persistent report styling
- Table view now clearly indicates which reports are persistent vs. expiring
- Maintains color coding for non-persistent reports based on time remaining
- Enhanced mobile responsiveness across entire site and admin panel
- Optimized layouts, font sizes, and spacing for screens ≤768px and ≤480px
- Made forms, tables, maps, and buttons touch-friendly
- Added responsive breakpoints for better mobile experience
- Added persistent reports functionality
- Added 'persistent' column to database with automatic migration
- Updated cleanup logic to preserve persistent reports (no auto-expiration)
- Added admin panel toggle for marking reports as persistent
- Added persistent report count to admin dashboard stats
- Visual indicators with lock/unlock icons for persistent status
- Improved admin panel UI
- Standardized header button styling and sizing
- Added 'Return to Homepage' button for better navigation
- Enhanced mobile responsiveness for admin interface
- Fixed table layouts and button arrangements for mobile devices
- Backend API enhancements
- New PATCH endpoint for toggling persistent status
- Updated admin routes to include persistent field
- Backwards compatible database migration
✨ New Features:
- Toggle between map and table view for current reports
- Table view shows location, details, reported time, and time remaining
- Color-coded time remaining: urgent (red), warning (orange), normal (green)
- Responsive design with mobile-optimized table layout
- Real-time updates work in both map and table views
- Sorted by most recent reports first
🎨 UI Improvements:
- Professional toggle buttons with active state
- Clean table design with hover effects
- Accessibility-friendly with proper titles and tooltips
- Mobile-responsive layout adjustments
🚀 Better UX:
- Easy switching between visual map and detailed table
- Time remaining countdown helps prioritize urgent reports
- Searchable and scannable table format for quick review
- Maintains all existing functionality while adding new view
- Use proper rate_limit block syntax with key, rate, and window
- Rate 30 requests per minute for general API
- Rate 5 requests per minute for location submissions
- Should resolve 'wrong argument count' error
- Combined @submit matcher conditions into single block
- Fixed 'matcher is defined more than once' error
- Proper Caddyfile syntax for combining path and method matchers
- Simplified rate limiting syntax to use 30r/m and 5r/m format
- Fixed matcher syntax for submission rate limiting
- Should resolve 'wrong argument count' error in Caddy
- Compatible with caddy-ratelimit plugin syntax
- Install Go 1.21.5 for ARM64 architecture
- Use xcaddy to build Caddy with caddy-ratelimit plugin
- Create custom systemd service for plugin-enabled Caddy
- Restore rate limiting configuration in Caddyfile
- Production-ready setup with proper security and rate limiting
- Automatic SSL with enhanced protection against API abuse
- Added explicit HTTP to HTTPS redirects for clarity
- Improved security headers including CSP for MapBox/OSM
- Added health checks for reverse proxy
- Implemented rate limiting for API protection
- Added structured logging for security monitoring
- Enhanced compression with gzip and zstd
- Comprehensive www/non-www redirect handling
- Production-ready configuration for ICE Watch
- Changed all git clone URLs to use SSH (git@github.com:)
- Fixed repository name to derekslenk/ice (correct repo name)
- Updated both deployment script and README
- Provides better security for server deployments
- Created S3 bucket: ice-puremichigan-lol
- Updated all references to use correct bucket name
- Applied public access policy for scripts/* path
- Ready for automated deployment via GitHub Actions
- Changed deployment URLs from /icewatch to /scripts
- Added cache control headers for better performance
- Updated bucket policy for scripts/* public access
- All deployment files now use consistent scripts/ path
- Automated deployment script upload to public S3 bucket
- Uses GitHub OIDC for secure AWS authentication
- Updates README with current S3 URLs automatically
- Enables deployment from private repository
- Uploads systemd service and Caddyfile configurations