ui-nyla/src/components/NotificationBell/NotificationBell.module.css
ValueOn AG 9865a32e99 fix(mobile): stabilize responsive layouts and action wrapping
Improve mobile and tablet usability by fixing viewport and scroll behavior, adding a mobile sidebar flow, and ensuring header action buttons wrap instead of clipping on narrow screens.

Made-with: Cursor
2026-03-01 13:46:21 +01:00

378 lines
6.6 KiB
CSS

/* NotificationBell Component Styles */
.notificationBell {
position: relative;
display: inline-flex;
align-items: center;
}
/* Bell Button */
.bellButton {
position: relative;
background: transparent;
border: none;
cursor: pointer;
padding: 8px;
border-radius: 8px;
color: var(--text-secondary, #6c757d);
transition: all 0.2s ease;
}
.bellButton:hover {
background: var(--hover-bg, rgba(0, 0, 0, 0.05));
color: var(--text-primary, #333);
}
.bellIcon {
font-size: 18px;
}
/* Badge */
.badge {
position: absolute;
top: 2px;
right: 2px;
min-width: 18px;
height: 18px;
padding: 0 5px;
font-size: 11px;
font-weight: 600;
line-height: 18px;
text-align: center;
color: white;
background: var(--danger-color, #dc3545);
border-radius: 10px;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
/* Dropdown */
.dropdown {
position: fixed;
bottom: 80px;
left: 290px;
width: 360px;
max-height: 480px;
background: var(--card-bg, white);
border-radius: 12px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);
overflow: hidden;
z-index: 9999;
animation: slideIn 0.2s ease;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* Header */
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px;
border-bottom: 1px solid var(--border-color, #eee);
}
.header h3 {
margin: 0;
font-size: 16px;
font-weight: 600;
color: var(--text-primary, #333);
}
.markAllRead {
background: none;
border: none;
color: var(--primary-color, #007bff);
font-size: 12px;
cursor: pointer;
padding: 4px 8px;
border-radius: 4px;
transition: background 0.2s;
}
.markAllRead:hover {
background: var(--primary-light, rgba(0, 123, 255, 0.1));
}
/* Content */
.content {
max-height: 400px;
overflow-y: auto;
}
.loading,
.error,
.empty {
padding: 32px;
text-align: center;
color: var(--text-secondary, #6c757d);
}
.error {
color: var(--danger-color, #dc3545);
}
.empty {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.emptyIcon {
font-size: 32px;
opacity: 0.3;
}
/* Notification Item */
.notification {
position: relative;
display: flex;
gap: 12px;
padding: 14px 16px;
border-bottom: 1px solid var(--border-color, #eee);
cursor: pointer;
transition: background 0.2s;
}
.notification:hover {
background: var(--hover-bg, rgba(0, 0, 0, 0.02));
}
.notification:last-child {
border-bottom: none;
}
.notification.unread {
background: var(--primary-light, rgba(0, 123, 255, 0.05));
}
.notification.unread::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
background: var(--primary-color, #007bff);
}
.notification.success {
background: var(--success-light, rgba(40, 167, 69, 0.1));
}
/* Success Overlay */
.successOverlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
background: var(--success-light, rgba(40, 167, 69, 0.95));
color: var(--success-color, #28a745);
font-weight: 500;
animation: fadeIn 0.3s ease;
z-index: 1;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
/* Icon */
.icon {
flex-shrink: 0;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: var(--bg-secondary, #f5f5f5);
color: var(--text-secondary, #6c757d);
font-size: 14px;
}
.icon_invitation {
background: var(--primary-light, rgba(0, 123, 255, 0.1));
color: var(--primary-color, #007bff);
}
.icon_system {
background: var(--info-light, rgba(23, 162, 184, 0.1));
color: var(--info-color, #17a2b8);
}
.icon_workflow {
background: var(--warning-light, rgba(255, 193, 7, 0.1));
color: var(--warning-color, #ffc107);
}
.icon_mention {
background: var(--purple-light, rgba(111, 66, 193, 0.1));
color: var(--purple-color, #6f42c1);
}
/* Notification Content */
.notificationContent {
flex: 1;
min-width: 0;
}
.title {
font-weight: 600;
font-size: 14px;
color: var(--text-primary, #333);
margin-bottom: 2px;
}
.message {
font-size: 13px;
color: var(--text-secondary, #6c757d);
line-height: 1.4;
margin-bottom: 4px;
/* Truncate long messages */
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.time {
font-size: 11px;
color: var(--text-muted, #999);
}
/* Actions */
.actions {
display: flex;
gap: 8px;
margin-top: 10px;
}
.actionButton {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 6px 12px;
font-size: 12px;
font-weight: 500;
border: none;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
}
.actionButton:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.action_primary {
background: var(--primary-color, #007bff);
color: white;
}
.action_primary:hover:not(:disabled) {
background: var(--primary-dark, #0056b3);
}
.action_danger {
background: transparent;
color: var(--danger-color, #dc3545);
border: 1px solid var(--danger-color, #dc3545);
}
.action_danger:hover:not(:disabled) {
background: var(--danger-light, rgba(220, 53, 69, 0.1));
}
.action_default {
background: var(--bg-secondary, #f5f5f5);
color: var(--text-primary, #333);
}
.action_default:hover:not(:disabled) {
background: var(--bg-tertiary, #e9e9e9);
}
/* Action Result */
.actionResult {
margin-top: 8px;
padding: 8px;
font-size: 12px;
background: var(--success-light, rgba(40, 167, 69, 0.1));
color: var(--success-color, #28a745);
border-radius: 4px;
}
/* Dismiss Button */
.dismissButton {
flex-shrink: 0;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: none;
color: var(--text-muted, #999);
cursor: pointer;
border-radius: 4px;
opacity: 0;
transition: all 0.2s;
}
.notification:hover .dismissButton {
opacity: 1;
}
.dismissButton:hover {
background: var(--danger-light, rgba(220, 53, 69, 0.1));
color: var(--danger-color, #dc3545);
}
/* Scrollbar */
.content::-webkit-scrollbar {
width: 6px;
}
.content::-webkit-scrollbar-track {
background: transparent;
}
.content::-webkit-scrollbar-thumb {
background: var(--border-color, #ddd);
border-radius: 3px;
}
.content::-webkit-scrollbar-thumb:hover {
background: var(--text-muted, #999);
}
@media (max-width: 1024px) {
.dropdown {
left: 0.75rem;
right: 0.75rem;
width: auto;
bottom: calc(76px + env(safe-area-inset-bottom));
max-height: min(70dvh, 520px);
}
}