diff --git a/frontend/src/components/common/DeviceErrorMessage/index.tsx b/frontend/src/components/common/DeviceErrorMessage/index.tsx index 356a7c3..63c59aa 100644 --- a/frontend/src/components/common/DeviceErrorMessage/index.tsx +++ b/frontend/src/components/common/DeviceErrorMessage/index.tsx @@ -1,8 +1,5 @@ import React from "react"; -import { Button } from "../Button"; import { errorConfigs } from "./errorConfigs"; -import { ErrorHeader } from "./ErrorHeader"; -import { InstructionsList } from "./InstructionsList"; interface DeviceErrorMessageProps { type: "access-denied" | "not-found" | "generic"; @@ -11,8 +8,7 @@ interface DeviceErrorMessageProps { } /** - * DeviceErrorMessage component displays user-friendly error messages - * for device access issues with actionable instructions + * DeviceErrorMessage - Modern dark modal for device access errors */ export const DeviceErrorMessage: React.FC = ({ type, @@ -23,28 +19,146 @@ export const DeviceErrorMessage: React.FC = ({ return (
- -

{content.message}

- -
- {onRetry && ( - + )} +
+ + {/* Instructions */} +
+

- Try Again - - )} + How to fix this +

+ {content.instructions.map((instruction: string, i: number) => ( +
+ + {i + 1} + + + {instruction} + +
+ ))} +
+ + {/* Actions */} +
+ {onRetry && ( + + )} + {onDismiss && ( + + )} +
); diff --git a/frontend/src/components/meeting/AdminControls/AdminControls.styles.css b/frontend/src/components/meeting/AdminControls/AdminControls.styles.css deleted file mode 100644 index 255272e..0000000 --- a/frontend/src/components/meeting/AdminControls/AdminControls.styles.css +++ /dev/null @@ -1,156 +0,0 @@ -.admin-controls-container { - display: flex; - flex-direction: column; - height: 100%; - overflow: hidden; -} - -.end-meeting-section { - padding: 16px; - border-bottom: 1px solid var(--lk-border-color); - flex-shrink: 0; -} - -.confirm-container { - display: flex; - flex-direction: column; - gap: 8px; -} - -.confirm-text { - font-size: 13px; - color: #fbbf24; - margin: 0; -} - -.confirm-buttons { - display: flex; - gap: 8px; -} - -.end-meeting-btn { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - padding: 8px 12px; - background-color: #dc2626; - color: white; - border: none; - border-radius: 6px; - cursor: pointer; - font-size: 14px; - font-weight: 500; -} - -.end-meeting-btn:disabled { - cursor: not-allowed; - opacity: 0.6; -} - -.end-meeting-btn-full { - width: 100%; - padding: 10px 12px; -} - -.cancel-btn { - flex: 1; - padding: 8px 12px; - background-color: var(--lk-bg3); - color: var(--lk-fg); - border: 1px solid var(--lk-border-color); - border-radius: 6px; - cursor: pointer; -} - -.participants-section { - flex: 1; - overflow-y: auto; - padding: 16px; -} - -.participants-header { - font-size: 13px; - color: var(--lk-fg2); - margin-bottom: 12px; - font-weight: 500; -} - -.participants-list { - display: flex; - flex-direction: column; - gap: 8px; -} - -.participant-item { - background-color: var(--lk-bg3); - border-radius: 6px; - padding: 12px; - display: flex; - flex-direction: column; - gap: 8px; -} - -.participant-header { - display: flex; - align-items: center; - justify-content: space-between; -} - -.participant-info { - flex: 1; - min-width: 0; -} - -.participant-name-row { - display: flex; - align-items: center; - gap: 6px; - margin-bottom: 2px; -} - -.participant-name { - color: var(--lk-fg); - font-size: 14px; - font-weight: 500; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - margin: 0; -} - -.badge { - font-size: 10px; - padding: 2px 6px; - border-radius: 4px; - font-weight: 500; -} - -.badge-you { - color: #4ade80; - background-color: rgba(34, 197, 94, 0.2); -} - -.badge-admin { - color: #60a5fa; - background-color: rgba(59, 130, 246, 0.2); -} - -.participant-role { - font-size: 11px; - color: var(--lk-fg2); - margin: 0; -} - -.kick-btn { - padding: 6px; - color: #f87171; - background-color: transparent; - border: none; - border-radius: 4px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; -} diff --git a/frontend/src/components/meeting/AdminControls/EndMeetingButton.tsx b/frontend/src/components/meeting/AdminControls/EndMeetingButton.tsx index afb4e68..54ae370 100644 --- a/frontend/src/components/meeting/AdminControls/EndMeetingButton.tsx +++ b/frontend/src/components/meeting/AdminControls/EndMeetingButton.tsx @@ -1,7 +1,6 @@ import React from "react"; import type { EndMeetingButtonProps } from "./types"; import { EndMeetingIcon } from "./icons"; -import "./AdminControls.styles.css"; export const EndMeetingButton: React.FC = ({ onEndMeeting, @@ -19,15 +18,15 @@ export const EndMeetingButton: React.FC = ({ if (showConfirm) { return ( -
-

+

+

Are you sure? This will disconnect all participants.

-
+
@@ -47,7 +51,7 @@ export const EndMeetingButton: React.FC = ({ return ( )} diff --git a/frontend/src/components/meeting/AdminControls/ParticipantsList.tsx b/frontend/src/components/meeting/AdminControls/ParticipantsList.tsx index 4c74149..fa8f5ef 100644 --- a/frontend/src/components/meeting/AdminControls/ParticipantsList.tsx +++ b/frontend/src/components/meeting/AdminControls/ParticipantsList.tsx @@ -1,7 +1,6 @@ import React from "react"; import type { ParticipantsListProps } from "./types"; import { ParticipantItem } from "./ParticipantItem"; -import "./AdminControls.styles.css"; export const ParticipantsList: React.FC = ({ participants, @@ -10,11 +9,17 @@ export const ParticipantsList: React.FC = ({ onMuteTrack, }) => { return ( -
-

+
+

Participants ({participants.length})

-
+
{participants.map((participant) => { const isLocal = participant.identity === localParticipantIdentity; const metadata = participant.metadata diff --git a/frontend/src/components/meeting/AdminControls/index.tsx b/frontend/src/components/meeting/AdminControls/index.tsx index a4f2e0e..a22abc4 100644 --- a/frontend/src/components/meeting/AdminControls/index.tsx +++ b/frontend/src/components/meeting/AdminControls/index.tsx @@ -11,7 +11,6 @@ import { import type { AdminControlsProps } from "./types"; import { EndMeetingButton } from "./EndMeetingButton"; import { ParticipantsList } from "./ParticipantsList"; -import "./AdminControls.styles.css"; export const AdminControls: React.FC = ({ meetingCode, @@ -60,8 +59,14 @@ export const AdminControls: React.FC = ({ }; return ( -
-
+
+