diff --git a/.firebase/hosting.ZGlzdA.cache b/.firebase/hosting.ZGlzdA.cache
index 7b4a127..f9806b8 100644
--- a/.firebase/hosting.ZGlzdA.cache
+++ b/.firebase/hosting.ZGlzdA.cache
@@ -1,11 +1,11 @@
vite.svg,499162500000,699a02e0e68a579f687d364bbbe7633161244f35af068220aee37b1b33dfb3c7
-index.html,1752878330027,5f203c00faf9fcc6e4b55be0b7ffa09282fc25dc3a7624baf25b7f6b43a06595
-assets/swipe-back-g3JVbAcT.js,1752878330027,07abc4e68422342d6ba852b5cf93f08d37d594a29c0f8172471242ecbecacd47
-assets/status-tap-C7usLbRw.js,1752878330027,faeed28b943d98d69228f71c2de4d6d63c177dc89155e315f482c62bf188ab19
-assets/md.transition-B9W-8lgj.js,1752878330027,78652f50e41d7eff5a7fd00e89bb7e334a7374fa046174e39398a874d2c15fdc
-assets/input-shims-DVm_rrIi.js,1752878330027,541fc90a960a383cbfa6fd1a75c3c9f17455f20614e82362aa83aeb89ee1cad1
-assets/ios.transition-BIV5Z5Yc.js,1752878330027,b3510ecbd37d95bcce04934d72822d2f2b4d8c64fa0eff6262fa3b5bd20d4490
-assets/index7-CZh37Dt9.js,1752878330027,036646be1f60e2114fbfd8a091b9e395ffa6ebf3188331bf54f576e62b393e8d
-assets/index-B7vPvsG_.css,1752878330026,dbc57fb127dc9dde819d6ce6a258663f05013f29ec8905f282fe0087d44faaff
-assets/focus-visible-supuXXMI.js,1752878330028,df9266429356671847fa2c8123e1564bae645f75df3094f0055c365fa2beae28
-assets/index-D2b6SXwC.js,1752878330028,184886780ed3e8ccad54be62237fcb6fc9fefcec6110306d8f46184faebe69a9
+index.html,1752880425099,3a9ff00c2fe67bff1d22bcc3cc350fe57f13ce7d96e0a0b0831b810c3ae4f383
+assets/swipe-back-Cn4amxp6.js,1752880425099,293102efce4c0ebfa19f0113958fb5c5b38654c7e86ba695e2ab773ddf43825a
+assets/status-tap-oQwstaDy.js,1752880425099,7801b76a10c12c5e19d0aaf9ad8966e816479d4ac5ec10270999be4a7c2c6609
+assets/ios.transition-B2qy1sQZ.js,1752880425103,bc9e64075ed6cea888f669b0814ccc5b444a8e3c0e16e2faa2abc738c8bfe2f4
+assets/md.transition-BsNej5jc.js,1752880425102,7aa0dc9dabdd1b380bed881251283974f97b2579f3c291326ace89d21e44a9eb
+assets/input-shims-Do83niGH.js,1752880425099,6fe1bea0b42a375dccb36a672f85ce47ffba6269f2eff1d006e241c615733144
+assets/index7-Tu8W0Nty.js,1752880425099,b5ab642da21be8211c86d4d3711e683192a1e7c5abe533782aa2735277254993
+assets/focus-visible-supuXXMI.js,1752880425104,df9266429356671847fa2c8123e1564bae645f75df3094f0055c365fa2beae28
+assets/index-CIlFtBnY.css,1752880425099,8249b3e00a114a2826408f28ca203fd75157b2e0c376588cc30170ebb5c4cb18
+assets/index-C9D3R5Ik.js,1752880425100,e69e0e2e53eddc844e5f71df421c9bfd01f054468db1f97053cca0462591b178
diff --git a/src/components/Navigation/Navigation.tsx b/src/components/Navigation/Navigation.tsx
index 689a665..92f5e1c 100644
--- a/src/components/Navigation/Navigation.tsx
+++ b/src/components/Navigation/Navigation.tsx
@@ -64,16 +64,29 @@ const Navigation: React.FC = () => {
top: 0,
height: '100vh',
width: '256px',
- backgroundColor: 'white',
+ backgroundColor: 'var(--ion-background-color)',
boxShadow: '2px 0 8px rgba(0,0,0,0.1)',
zIndex: 1000,
- borderRight: '1px solid #e5e7eb',
+ borderRight: '1px solid var(--ion-border-color)',
overflowY: 'auto'
}}
>
-
-
Karaoke
-
Singer: Matt
+
);
@@ -135,9 +148,22 @@ const Navigation: React.FC = () => {
>
-
-
Karaoke
-
Singer: Matt
+
@@ -158,7 +184,7 @@ const Navigation: React.FC = () => {
{/* Player Controls for Mobile */}
diff --git a/src/components/common/PlayerControls.tsx b/src/components/common/PlayerControls.tsx
index dc49d38..4f127eb 100644
--- a/src/components/common/PlayerControls.tsx
+++ b/src/components/common/PlayerControls.tsx
@@ -1,25 +1,23 @@
import React from 'react';
import { IonCard, IonCardContent, IonChip, IonIcon } from '@ionic/react';
-import { playOutline, pauseOutline, stopOutline, play, pause, stop } from 'ionicons/icons';
-import ActionButton from './ActionButton';
+import { play, pause, stop } from 'ionicons/icons';
import { useAppSelector } from '../../redux';
-import { selectPlayerState, selectIsAdmin, selectQueueLength } from '../../redux';
+import { selectIsAdmin, selectPlayerState, selectQueueLength, selectControllerName } from '../../redux';
import { playerService } from '../../firebase/services';
-import { selectControllerName } from '../../redux';
-import { debugLog } from '../../utils/logger';
-import { useToast } from '../../hooks/useToast';
import { PlayerState } from '../../types';
+import ActionButton from './ActionButton';
+import { useToast } from '../../hooks/useToast';
+import { debugLog } from '../../utils/logger';
interface PlayerControlsProps {
className?: string;
- variant?: 'light' | 'dark';
}
-const PlayerControls: React.FC
= ({ className = '', variant = 'light' }) => {
- const playerState = useAppSelector(selectPlayerState);
+const PlayerControls: React.FC = ({ className = '' }) => {
const isAdmin = useAppSelector(selectIsAdmin);
- const controllerName = useAppSelector(selectControllerName);
+ const playerState = useAppSelector(selectPlayerState);
const queueLength = useAppSelector(selectQueueLength);
+ const controllerName = useAppSelector(selectControllerName);
const { showSuccess, showError } = useToast();
// Debug logging
@@ -85,92 +83,12 @@ const PlayerControls: React.FC = ({ className = '', variant
}
};
- const getStatusText = () => {
- switch (currentState) {
- case PlayerState.playing:
- return 'Currently Playing';
- case PlayerState.paused:
- return 'Currently Paused';
- default:
- return 'Currently Stopped';
- }
- };
-
- // Dark mode variant
- if (variant === 'dark') {
- return (
-
- {/* Status Text */}
-
{getStatusText()}
-
- {/* Control Buttons */}
-
- {currentState === PlayerState.playing ? (
-
-
- Pause
-
- ) : (
-
-
- Play
-
- )}
-
- {currentState !== PlayerState.stopped && (
-
-
- Stop
-
- )}
-
-
- {!hasSongsInQueue && (
-
- Add songs to queue to enable playback controls
-
- )}
-
- );
- }
-
- // Light mode variant (original)
return (
-
Player Controls
+
Player Controls
{currentState}
@@ -208,7 +126,7 @@ const PlayerControls: React.FC
= ({ className = '', variant
)}
-
+
Admin controls - Only visible to admin users
{!hasSongsInQueue && (
diff --git a/src/index.css b/src/index.css
index f62a8de..db3ea09 100644
--- a/src/index.css
+++ b/src/index.css
@@ -11,11 +11,26 @@
@import '@ionic/react/css/flex-utils.css';
@import '@ionic/react/css/display.css';
+/* Dark mode support - system preference */
+@import '@ionic/react/css/palettes/dark.system.css';
+
/* Tailwind CSS - comes after Ionic to avoid overriding essential Ionic styles */
@tailwind base;
@tailwind components;
@tailwind utilities;
+/* Dark mode detection */
+@media (prefers-color-scheme: dark) {
+ :root {
+ --ion-color-primary: #3880ff;
+ --ion-color-primary-rgb: 56, 128, 255;
+ --ion-color-primary-contrast: #ffffff;
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
+ --ion-color-primary-shade: #3171e0;
+ --ion-color-primary-tint: #4c8dff;
+ }
+}
+
/* Ensure menu button is visible */
ion-menu-button {
--color: var(--ion-color-primary);
@@ -36,7 +51,7 @@ ion-menu {
/* Ensure modal content is visible */
ion-modal ion-content {
- --background: var(--ion-background-color, #ffffff);
+ --background: var(--ion-background-color);
}
ion-modal ion-list {
@@ -45,7 +60,7 @@ ion-modal ion-list {
/* Ensure content is visible and properly styled */
ion-content {
- --background: var(--ion-background-color, #ffffff);
+ --background: var(--ion-background-color);
}
ion-list {
@@ -55,7 +70,7 @@ ion-list {
/* Ensure items are properly displayed */
ion-item {
--background: transparent;
- --color: var(--ion-text-color, #000000);
+ --color: var(--ion-text-color);
}
/* Settings page specific styling */
@@ -107,7 +122,7 @@ ion-modal .ion-input-label,
ion-modal ion-label {
font-weight: bold !important;
font-size: 1rem !important;
- color: #111827 !important;
+ color: var(--ion-text-color) !important;
margin-bottom: 0.5rem !important;
display: block !important;
}
@@ -123,7 +138,7 @@ ion-modal ion-button {
.bold-label {
font-weight: bold !important;
font-size: 1rem !important;
- color: #111827 !important;
+ color: var(--ion-text-color) !important;
margin-bottom: 0.5rem !important;
display: block !important;
}
@@ -131,27 +146,25 @@ ion-modal ion-button {
/* Bold song title styling */
.bold-title {
font-weight: bold !important;
- color: #111827 !important;
+ color: var(--ion-text-color) !important;
}
/* Override Ionic label text color for song titles */
ion-item ion-label .bold-title {
- color: #111827 !important;
+ color: var(--ion-text-color) !important;
}
-
-
/* Input field styling to match search box */
.visible-input {
- border: 1px solid #d1d5db !important;
+ border: 1px solid var(--ion-border-color, #d1d5db) !important;
border-radius: 8px !important;
padding: 0 12px !important;
- background: #ffffff !important;
+ background: var(--ion-background-color) !important;
}
.visible-input ion-input {
- border: 1px solid #d1d5db !important;
+ border: 1px solid var(--ion-border-color, #d1d5db) !important;
border-radius: 8px !important;
padding: 0 12px !important;
- background: #ffffff !important;
+ background: var(--ion-background-color) !important;
}
diff --git a/src/main.tsx b/src/main.tsx
index 7d86ffd..e097bf8 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -6,8 +6,15 @@ import App from './App.tsx'
import { Provider } from 'react-redux';
import { store } from './redux/store';
-// Initialize Ionic React
-setupIonicReact();
+// Initialize Ionic React with dark mode support
+setupIonicReact({
+ mode: 'ios', // Use iOS mode for consistent styling
+ innerHTMLTemplatesEnabled: true,
+ // Enable automatic dark mode detection
+ _forceStatusbarPadding: false,
+ // Enable dark mode
+ animated: true,
+});
createRoot(document.getElementById('root')!).render(