diff --git a/public/pages/birthdays.js b/public/pages/birthdays.js index 9d04eb7..70e8c79 100644 --- a/public/pages/birthdays.js +++ b/public/pages/birthdays.js @@ -275,23 +275,30 @@ function openBirthdayModal({ mode, birthday = null }) { title: isEdit ? t('birthdays.editTitle') : t('birthdays.newTitle'), content: `
-
${birthdayPreviewHtml(birthday?.name || '', photoData)}
-
- - -
-
- - -
-
- - -
${t('birthdays.photoOptional')}
-
- +
+ +
+
+ + +
+
+ + +
+ +
+ + +
@@ -310,18 +317,15 @@ function openBirthdayModal({ mode, birthday = null }) { onSave(panel) { const nameInput = panel.querySelector('#bd-name'); const preview = panel.querySelector('#birthday-preview'); + const fileInput = panel.querySelector('#bd-photo'); + const photoEdit = panel.querySelector('#bd-photo-edit'); const renderPreview = () => { - preview.replaceChildren(); - preview.insertAdjacentHTML('beforeend', birthdayPreviewHtml(nameInput.value.trim(), photoData)); + preview.innerHTML = birthdayPreviewHtml(nameInput.value.trim(), photoData); }; nameInput.addEventListener('input', renderPreview); - panel.querySelectorAll('.js-date-input').forEach((input) => { - input.addEventListener('blur', () => { - const parsed = parseDateInput(input.value); - if (parsed) input.value = formatDateInput(parsed); - }); - }); - panel.querySelector('#bd-photo').addEventListener('change', async (e) => { + preview.addEventListener('click', () => fileInput?.click()); + photoEdit?.addEventListener('click', () => fileInput?.click()); + fileInput?.addEventListener('change', async (e) => { const file = e.target.files?.[0]; if (!file) return; try { @@ -333,7 +337,7 @@ function openBirthdayModal({ mode, birthday = null }) { }); panel.querySelector('#bd-remove-photo').addEventListener('click', () => { photoData = null; - panel.querySelector('#bd-photo').value = ''; + if (fileInput) fileInput.value = ''; renderPreview(); }); panel.querySelector('#bd-cancel').addEventListener('click', closeModal); diff --git a/public/styles/birthdays.css b/public/styles/birthdays.css index fec9324..05c48e7 100644 --- a/public/styles/birthdays.css +++ b/public/styles/birthdays.css @@ -287,6 +287,21 @@ background: color-mix(in srgb, var(--module-accent) 16%, white); } +.birthday-avatar-editor { + width: 84px; + height: 84px; + margin: 0 auto var(--space-3); + padding: 0; + border: none; + border-radius: var(--radius-full); + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + background: color-mix(in srgb, var(--module-accent) 16%, white); + cursor: pointer; +} + .birthday-preview__image { width: 100%; height: 100%; @@ -300,7 +315,43 @@ } .birthday-modal__photo-actions { - margin-top: var(--space-2); + display: flex; + gap: var(--space-2); + justify-content: center; + margin-top: calc(var(--space-1) * -1); + margin-bottom: var(--space-2); +} + +.birthday-modal__photo-action { + width: 30px; + height: 30px; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: var(--radius-full); + border: 1px solid var(--color-border); + background: var(--color-surface); + color: var(--color-text-secondary); +} + +.birthday-modal__photo-action svg { + width: 14px; + height: 14px; +} + +.birthday-modal__photo-action--danger { + color: var(--color-danger); +} + +.birthday-modal__identity { + display: flex; + align-items: flex-start; + gap: var(--space-4); +} + +.birthday-modal__fields { + flex: 1; + min-width: 0; } .birthday-modal__hint { @@ -308,6 +359,16 @@ font-size: var(--text-sm); } +@media (max-width: 640px) { + .birthday-modal__identity { + flex-direction: column; + } + + .birthday-modal__photo-actions { + justify-content: flex-start; + } +} + @media (max-width: 960px) { .birthdays-grid { grid-template-columns: 1fr;