AvanzaCast/shared/components/Modal.module.css
Cesar Mendivil e43686e36d feat(modal-parts): add modular components for modal UI
- Introduced ModalDestinationButton for destination selection with customizable icons and labels.
- Added ModalInput for text input with optional character counter.
- Implemented ModalLink for reusable links styled as underlined text.
- Created ModalPlatformCard for platform selection with badges.
- Developed ModalRadioGroup for radio button groups with custom styling.
- Added ModalSection for grouping modal content with optional labels.
- Implemented ModalSelect for dropdown selections with custom styling.
- Created ModalShareButtons for sharing options via Gmail, Email, and Messenger.
- Developed ModalTextarea for multi-line text input with character counter.
- Introduced ModalToggle for toggle switches with optional help text and links.
- Updated README.md with component descriptions, usage examples, and design guidelines.
- Added index.ts for centralized exports of modal components.
2025-11-06 00:32:08 -07:00

159 lines
2.7 KiB
CSS

/* Modal base styles - StreamYard/Google Material inspired */
.modal {
position: fixed;
inset: 0;
margin: auto;
padding: 0;
border: none;
border-radius: 8px;
background: transparent;
box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2);
max-height: 90vh;
overflow: hidden;
}
.modal::backdrop {
background-color: rgba(0, 0, 0, 0.32);
backdrop-filter: blur(2px);
}
/* Modal widths */
.modal-sm { width: 90%; max-width: 400px; }
.modal-md { width: 90%; max-width: 520px; }
.modal-lg { width: 90%; max-width: 720px; }
.modal-xl { width: 90%; max-width: 960px; }
.modalContent {
background-color: #ffffff;
color: #202124;
border-radius: 8px;
overflow: hidden;
display: flex;
flex-direction: column;
max-height: 90vh;
}
/* Header */
.modalHeader {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 24px;
border-bottom: 1px solid #e8eaed;
}
.modalTitle {
font-size: 16px;
font-weight: 400;
margin: 0;
color: #202124;
letter-spacing: 0.1px;
}
.closeButton {
background: transparent;
border: none;
font-size: 24px;
line-height: 1;
color: #5f6368;
cursor: pointer;
padding: 8px;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: background-color 0.2s ease, color 0.2s ease;
margin: -8px -8px -8px 0;
}
.closeButton:hover {
background-color: #f1f3f4;
color: #202124;
}
/* Modal body */
.modalBody {
padding: 20px 24px;
overflow-y: auto;
overflow-x: hidden;
flex: 1;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
/* Footer */
.modalFooter {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 12px;
padding: 16px 24px;
border-top: 1px solid #e8eaed;
}
/* Responsive */
@media (max-width: 768px) {
.modal-sm,
.modal-md,
.modal-lg,
.modal-xl {
width: 95%;
max-width: none;
}
.modalBody {
padding: 20px;
}
.modalHeader,
.modalFooter {
padding: 16px 20px;
}
}
/* Animation */
@keyframes modalFadeIn {
from {
opacity: 0;
transform: scale(0.95);
}
to {
opacity: 1;
transform: scale(1);
}
}
.modal[open] .modalContent {
animation: modalFadeIn 0.15s cubic-bezier(0.4, 0.0, 0.2, 1);
}
/* Dark mode */
[data-theme="dark"] .modalContent {
background-color: #2d2e30;
color: #e8eaed;
}
[data-theme="dark"] .modalHeader {
border-bottom-color: #5f6368;
}
[data-theme="dark"] .modalTitle {
color: #e8eaed;
}
[data-theme="dark"] .closeButton {
color: #9aa0a6;
}
[data-theme="dark"] .closeButton:hover {
background-color: #3c4043;
color: #e8eaed;
}
[data-theme="dark"] .modalFooter {
border-top-color: #5f6368;
}