ui: full header toolbar redesign + theme-aware event card stat boxes

This commit is contained in:
dvirlabs 2026-03-01 19:41:47 +02:00
parent e589792137
commit 586bd7c030
3 changed files with 171 additions and 163 deletions

View File

@ -138,23 +138,24 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
background: var(--color-background); background: var(--color-background-tertiary);
border: 1px solid var(--color-border); border: 1px solid var(--color-border);
border-radius: 8px; border-radius: 8px;
padding: 0.5rem 0.25rem; padding: 0.6rem 0.25rem;
} }
.stat-label { .stat-label {
font-size: 0.75rem; font-size: 0.72rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
text-transform: uppercase; text-transform: uppercase;
margin-bottom: 0.25rem; letter-spacing: 0.04em;
margin-bottom: 0.2rem;
text-align: center; text-align: center;
} }
.stat-value { .stat-value {
font-size: 1.4rem; font-size: 1.35rem;
font-weight: bold; font-weight: 700;
color: var(--color-text); color: var(--color-text);
} }
@ -181,17 +182,20 @@
.btn-delete { .btn-delete {
padding: 0.5rem 0.75rem; padding: 0.5rem 0.75rem;
background: #ecf0f1; background: var(--color-background-tertiary);
border: none; border: 1px solid var(--color-border);
border-radius: 4px; border-radius: 4px;
cursor: pointer; cursor: pointer;
font-size: 1.1rem; font-size: 1.1rem;
transition: background 0.3s ease; color: var(--color-text-secondary);
transition: background 0.2s ease, color 0.2s ease;
} }
.btn-delete:hover { .btn-delete:hover {
background: #e74c3c; background: var(--color-danger);
transform: scale(1.1); border-color: var(--color-danger);
color: #fff;
transform: scale(1.05);
} }
.event-list-loading { .event-list-loading {

View File

@ -15,151 +15,156 @@
.guest-list-header { .guest-list-header {
display: flex; display: flex;
justify-content: space-between; flex-direction: column;
align-items: center; gap: 0.75rem;
margin-bottom: 2rem; margin-bottom: 2rem;
gap: 1rem;
flex-wrap: wrap;
} }
[dir="rtl"] .guest-list-header { [dir="rtl"] .guest-list-header-top {
flex-direction: row-reverse; flex-direction: row-reverse;
} }
.btn-back { [dir="rtl"] .guest-list-header-actions {
padding: 0.75rem 1.5rem; flex-direction: row-reverse;
background: var(--color-text-secondary);
color: white;
border: none;
border-radius: 4px;
font-size: 1rem;
cursor: pointer;
transition: background 0.3s ease;
} }
.btn-back:hover { [dir="rtl"] .btn-group {
background: var(--color-text-light); flex-direction: row-reverse;
} }
.guest-list-header h2 { /*
margin: 0; HEADER two-row layout
color: var(--color-text); Row 1: back button + title block
font-size: 1.8rem; Row 2: secondary tools | primary actions
*/
.guest-list-header {
display: flex;
flex-direction: column;
gap: 0.75rem;
margin-bottom: 2rem;
} }
.header-event-title { /* Row 1 */
margin: 0; .guest-list-header-top {
color: var(--color-text); display: flex;
font-size: 1.8rem; align-items: center;
font-weight: 700; gap: 1rem;
line-height: 1.2;
}
.header-event-subtitle {
font-size: 0.85rem;
color: var(--color-text-secondary);
font-weight: 500;
letter-spacing: 0.03em;
text-transform: uppercase;
} }
.header-title { .header-title {
flex: 1; flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center;
gap: 0.1rem; gap: 0.1rem;
} }
/* keep old .header-event-name as fallback */ .header-event-title {
.header-event-name { margin: 0;
font-size: 1rem; color: var(--color-text);
color: var(--color-primary); font-size: 1.75rem;
font-weight: 600; font-weight: 700;
line-height: 1.2;
} }
.header-actions { .header-event-subtitle {
font-size: 0.78rem;
color: var(--color-text-secondary);
font-weight: 500;
letter-spacing: 0.06em;
text-transform: uppercase;
}
/* Row 2 */
.guest-list-header-actions {
display: flex; display: flex;
gap: 1rem; align-items: center;
justify-content: space-between;
gap: 0.75rem;
flex-wrap: wrap; flex-wrap: wrap;
} }
[dir="rtl"] .header-actions { .btn-group {
flex-direction: row-reverse; display: flex;
align-items: center;
gap: 0.5rem;
flex-wrap: wrap;
} }
.btn-members, /* ── shared button base ── */
.btn-back,
.btn-tool,
.btn-add-guest,
.btn-whatsapp,
.btn-export,
.btn-duplicate {
display: inline-flex;
align-items: center;
gap: 0.35em;
height: 38px;
padding: 0 1rem;
border: none;
border-radius: 6px;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
white-space: nowrap;
transition: background 0.2s ease, opacity 0.2s ease, box-shadow 0.2s ease;
}
/* back */
.btn-back {
background: transparent;
color: var(--color-text-secondary);
border: 1px solid var(--color-border);
}
.btn-back:hover {
background: var(--color-background-tertiary);
color: var(--color-text);
}
/* secondary tool buttons */
.btn-tool,
.btn-export,
.btn-duplicate {
background: var(--color-background-tertiary);
color: var(--color-text);
border: 1px solid var(--color-border);
}
.btn-tool:hover,
.btn-export:hover,
.btn-duplicate:hover {
background: var(--color-border);
border-color: var(--color-text-secondary);
}
/* primary: add guest */
.btn-add-guest { .btn-add-guest {
padding: 0.75rem 1.5rem;
background: var(--color-primary);
color: white;
border: none;
border-radius: 4px;
font-size: 1rem;
cursor: pointer;
font-weight: 500;
transition: background 0.3s ease;
}
.btn-members:hover,
.btn-add-guest:hover {
background: var(--color-primary-hover);
}
.btn-export {
padding: 0.75rem 1.5rem;
background: var(--color-success); background: var(--color-success);
color: white; color: #fff;
border: none;
border-radius: 4px;
font-size: 1rem;
cursor: pointer;
font-weight: 500;
transition: background 0.3s ease;
} }
.btn-add-guest:hover {
.btn-export:hover {
background: var(--color-success-hover); background: var(--color-success-hover);
} }
.btn-duplicate { /* whatsapp */
padding: 0.75rem 1.5rem;
background: var(--color-warning);
color: white;
border: none;
border-radius: 4px;
font-size: 1rem;
cursor: pointer;
font-weight: 500;
transition: background 0.3s ease;
}
.btn-duplicate:hover {
background: var(--color-warning-hover);
}
.btn-whatsapp { .btn-whatsapp {
padding: 0.75rem 1.5rem;
background: #25d366; background: #25d366;
color: white; color: #fff;
border: none;
border-radius: 4px;
font-size: 1rem;
cursor: pointer;
font-weight: 500;
transition: all 0.3s ease;
white-space: nowrap;
} }
.btn-whatsapp:hover { .btn-whatsapp:hover {
background: #20ba5e; background: #1eba58;
box-shadow: 0 2px 8px rgba(37, 211, 102, 0.3); box-shadow: 0 2px 8px rgba(37, 211, 102, 0.35);
} }
.btn-whatsapp:disabled { .btn-whatsapp:disabled {
opacity: 0.6; opacity: 0.6;
cursor: not-allowed; cursor: not-allowed;
} }
/* ── legacy class aliases kept for any remaining refs ── */
.header-actions { display: flex; gap: 0.5rem; flex-wrap: wrap; }
.btn-members { display: none; }
.pagination-controls { .pagination-controls {
display: flex; display: flex;
gap: 12px; gap: 12px;
@ -476,35 +481,30 @@ td {
background: var(--color-danger-hover); background: var(--color-danger-hover);
} }
/* Responsive */
@media (max-width: 768px) { @media (max-width: 768px) {
.guest-list-header { .guest-list-header-top {
flex-direction: column; flex-wrap: wrap;
align-items: stretch;
}
[dir="rtl"] .guest-list-header {
flex-direction: column-reverse;
} }
.btn-back { .btn-back {
width: 100%; width: 100%;
} }
.guest-list-header h2 { .header-title {
width: 100%; width: 100%;
} }
.header-actions { .guest-list-header-actions {
width: 100%; flex-direction: column;
flex-wrap: wrap; align-items: stretch;
} }
.btn-members, .btn-group {
.btn-add-guest, justify-content: stretch;
.btn-export { }
.btn-group > * {
flex: 1; flex: 1;
min-width: 120px;
} }
.guest-stats { .guest-stats {

View File

@ -329,44 +329,48 @@ function GuestList({ eventId, onBack, onShowMembers }) {
return ( return (
<div className="guest-list-container"> <div className="guest-list-container">
<div className="guest-list-header"> <div className="guest-list-header">
<button className="btn-back" onClick={onBack}>{he.backToEvents}</button> {/* ── Row 1: back + title ── */}
<div className="header-title"> <div className="guest-list-header-top">
{eventData?.name ? ( <button className="btn-back" onClick={onBack}>{he.backToEvents}</button>
<> <div className="header-title">
<h2 className="header-event-title">{eventData.name}</h2> <h2 className="header-event-title">
{eventData?.name || he.guestManagement}
</h2>
{eventData?.name && (
<span className="header-event-subtitle">{he.guestManagement}</span> <span className="header-event-subtitle">{he.guestManagement}</span>
</> )}
) : ( </div>
<h2>{he.guestManagement}</h2>
)}
</div> </div>
<div className="header-actions">
{/* <button className="btn-members" onClick={onShowMembers}> {/* ── Row 2: toolbar ── */}
{he.manageMembers} <div className="guest-list-header-actions">
</button> */} <div className="btn-group btn-group-tools">
<button className="btn-duplicate" onClick={() => setShowDuplicateManager(true)}> <button className="btn-tool" onClick={() => setShowDuplicateManager(true)}>
🔍 חיפוש כפולויות 🔍 כפולויות
</button>
<GoogleImport eventId={eventId} onImportComplete={loadGuests} />
<ImportContacts eventId={eventId} onImportComplete={loadGuests} />
<button className="btn-export" onClick={exportToExcel}>
{he.exportExcel}
</button>
{selectedGuestIds.size > 0 && (
<button
className="btn-whatsapp"
onClick={() => setShowWhatsAppModal(true)}
title={he.selectGuestsFirst}
>
{he.sendWhatsApp} ({selectedGuestIds.size})
</button> </button>
)} <GoogleImport eventId={eventId} onImportComplete={loadGuests} />
<button className="btn-add-guest" onClick={() => { <ImportContacts eventId={eventId} onImportComplete={loadGuests} />
setEditingGuest(null) <button className="btn-tool" onClick={exportToExcel}>
setShowGuestForm(true) 📥 אקסל
}}> </button>
{he.addGuest} </div>
</button> <div className="btn-group btn-group-primary">
{selectedGuestIds.size > 0 && (
<button
className="btn-whatsapp"
onClick={() => setShowWhatsAppModal(true)}
title={he.selectGuestsFirst}
>
{he.sendWhatsApp} ({selectedGuestIds.size})
</button>
)}
<button className="btn-add-guest" onClick={() => {
setEditingGuest(null)
setShowGuestForm(true)
}}>
{he.addGuest}
</button>
</div>
</div> </div>
</div> </div>