diff --git a/common/api.js b/common/api.js index 6402289..9e57c15 100644 --- a/common/api.js +++ b/common/api.js @@ -535,6 +535,12 @@ var default_api = 'https://api.global-interaction.com/'; method: 'GET', }); }, + updateContact: function (payload) { + return request('/api/v1/users/me/contact-info', { + method: 'POST', + body: payload || {}, + }); + }, resolveDisplayUserID: function (displayUserID) { return request( '/api/v1/users/by-display-user-id/' + diff --git a/common/locales/ar.json b/common/locales/ar.json index b3c6d5d..a3373de 100644 --- a/common/locales/ar.json +++ b/common/locales/ar.json @@ -670,5 +670,20 @@ "lalu_site.contactLead": "أرسل أسئلة المنتج أو الحساب أو التعاون إلى البريد الرسمي.", "lalu_site.emailSupport": "مراسلة الدعم", "lalu_site.footerCompany": "Global Interactive Technology Co., Limited", - "lalu_site.footerContact": "postmaster@haiyinet.com.cn" + "lalu_site.footerContact": "postmaster@haiyinet.com.cn", + "contact_card.open": "تعديل جهة اتصال WhatsApp", + "contact_card.title": "WhatsApp", + "contact_card.add_whatsapp": "إضافة WhatsApp", + "contact_card.add": "إضافة", + "contact_card.edit": "تعديل", + "contact_card.close": "إغلاق", + "contact_card.sheet_title": "جهة اتصال WhatsApp", + "contact_card.field_label": "رقم أو رابط WhatsApp", + "contact_card.placeholder": "+6512345678", + "contact_card.save": "حفظ", + "contact_card.saving": "جار الحفظ...", + "contact_card.required": "أدخل جهة اتصال WhatsApp.", + "contact_card.api_unavailable": "واجهة جهة الاتصال غير متاحة.", + "contact_card.saved": "تم الحفظ.", + "contact_card.save_failed": "فشل الحفظ." } diff --git a/common/locales/en.json b/common/locales/en.json index 9ccf3c1..45a30af 100644 --- a/common/locales/en.json +++ b/common/locales/en.json @@ -676,5 +676,20 @@ "lalu_site.contactLead": "Send product, account, or cooperation questions to the official email address.", "lalu_site.emailSupport": "Email support", "lalu_site.footerCompany": "Global Interactive Technology Co., Limited", - "lalu_site.footerContact": "postmaster@haiyinet.com.cn" + "lalu_site.footerContact": "postmaster@haiyinet.com.cn", + "contact_card.open": "Edit WhatsApp contact", + "contact_card.title": "WhatsApp", + "contact_card.add_whatsapp": "Add WhatsApp", + "contact_card.add": "Add", + "contact_card.edit": "Edit", + "contact_card.close": "Close", + "contact_card.sheet_title": "WhatsApp Contact", + "contact_card.field_label": "WhatsApp phone or link", + "contact_card.placeholder": "+6512345678", + "contact_card.save": "Save", + "contact_card.saving": "Saving...", + "contact_card.required": "Enter WhatsApp contact.", + "contact_card.api_unavailable": "Contact API unavailable.", + "contact_card.saved": "Saved.", + "contact_card.save_failed": "Save failed." } diff --git a/common/locales/es.json b/common/locales/es.json index 009be69..23b0a64 100644 --- a/common/locales/es.json +++ b/common/locales/es.json @@ -670,5 +670,20 @@ "lalu_site.contactLead": "Envía preguntas de producto, cuenta o cooperación al email oficial.", "lalu_site.emailSupport": "Enviar email a soporte", "lalu_site.footerCompany": "Global Interactive Technology Co., Limited", - "lalu_site.footerContact": "postmaster@haiyinet.com.cn" + "lalu_site.footerContact": "postmaster@haiyinet.com.cn", + "contact_card.open": "Editar contacto de WhatsApp", + "contact_card.title": "WhatsApp", + "contact_card.add_whatsapp": "Agregar WhatsApp", + "contact_card.add": "Agregar", + "contact_card.edit": "Editar", + "contact_card.close": "Cerrar", + "contact_card.sheet_title": "Contacto de WhatsApp", + "contact_card.field_label": "Teléfono o enlace de WhatsApp", + "contact_card.placeholder": "+6512345678", + "contact_card.save": "Guardar", + "contact_card.saving": "Guardando...", + "contact_card.required": "Ingresa el contacto de WhatsApp.", + "contact_card.api_unavailable": "API de contacto no disponible.", + "contact_card.saved": "Guardado.", + "contact_card.save_failed": "No se pudo guardar." } diff --git a/common/locales/id.json b/common/locales/id.json index e63d6d3..f575803 100644 --- a/common/locales/id.json +++ b/common/locales/id.json @@ -598,5 +598,20 @@ "achievement.notCollected": "Belum dikoleksi", "achievement.collected": "Dikoleksi", "achievement.collectedWithDate": "Dikoleksi pada {date}", - "achievement.ownerCount": "Hanya {count} orang yang memilikinya" + "achievement.ownerCount": "Hanya {count} orang yang memilikinya", + "contact_card.open": "Ubah kontak WhatsApp", + "contact_card.title": "WhatsApp", + "contact_card.add_whatsapp": "Tambahkan WhatsApp", + "contact_card.add": "Tambah", + "contact_card.edit": "Ubah", + "contact_card.close": "Tutup", + "contact_card.sheet_title": "Kontak WhatsApp", + "contact_card.field_label": "Nomor atau link WhatsApp", + "contact_card.placeholder": "+6512345678", + "contact_card.save": "Simpan", + "contact_card.saving": "Menyimpan...", + "contact_card.required": "Masukkan kontak WhatsApp.", + "contact_card.api_unavailable": "API kontak tidak tersedia.", + "contact_card.saved": "Tersimpan.", + "contact_card.save_failed": "Gagal menyimpan." } diff --git a/common/locales/tr.json b/common/locales/tr.json index 8702c4f..e8b9b93 100644 --- a/common/locales/tr.json +++ b/common/locales/tr.json @@ -637,5 +637,20 @@ "lalu_site.contactLead": "Ürün, hesap veya iş birliği sorularını resmi e-posta adresine gönder.", "lalu_site.emailSupport": "Desteğe e-posta gönder", "lalu_site.footerCompany": "Global Interactive Technology Co., Limited", - "lalu_site.footerContact": "postmaster@haiyinet.com.cn" + "lalu_site.footerContact": "postmaster@haiyinet.com.cn", + "contact_card.open": "WhatsApp iletişimini düzenle", + "contact_card.title": "WhatsApp", + "contact_card.add_whatsapp": "WhatsApp ekle", + "contact_card.add": "Ekle", + "contact_card.edit": "Düzenle", + "contact_card.close": "Kapat", + "contact_card.sheet_title": "WhatsApp İletişimi", + "contact_card.field_label": "WhatsApp telefonu veya bağlantısı", + "contact_card.placeholder": "+6512345678", + "contact_card.save": "Kaydet", + "contact_card.saving": "Kaydediliyor...", + "contact_card.required": "WhatsApp iletişimini gir.", + "contact_card.api_unavailable": "İletişim API kullanılamıyor.", + "contact_card.saved": "Kaydedildi.", + "contact_card.save_failed": "Kaydetme başarısız." } diff --git a/common/locales/zh.json b/common/locales/zh.json index 5ed6522..0176bd0 100644 --- a/common/locales/zh.json +++ b/common/locales/zh.json @@ -604,5 +604,20 @@ "achievement.notCollected": "未收集", "achievement.collected": "已收集", "achievement.collectedWithDate": "{date} 已收集", - "achievement.ownerCount": "仅 {count} 人拥有" + "achievement.ownerCount": "仅 {count} 人拥有", + "contact_card.open": "修改 WhatsApp 联系方式", + "contact_card.title": "WhatsApp", + "contact_card.add_whatsapp": "添加 WhatsApp", + "contact_card.add": "添加", + "contact_card.edit": "修改", + "contact_card.close": "关闭", + "contact_card.sheet_title": "WhatsApp 联系方式", + "contact_card.field_label": "WhatsApp 手机号或链接", + "contact_card.placeholder": "+6512345678", + "contact_card.save": "保存", + "contact_card.saving": "保存中...", + "contact_card.required": "请输入 WhatsApp 联系方式。", + "contact_card.api_unavailable": "联系方式接口不可用。", + "contact_card.saved": "已保存。", + "contact_card.save_failed": "保存失败。" } diff --git a/gonghui/agency-center/index.html b/gonghui/agency-center/index.html index 2c84310..d0abdb6 100644 --- a/gonghui/agency-center/index.html +++ b/gonghui/agency-center/index.html @@ -113,6 +113,8 @@ +
+
@@ -450,6 +452,7 @@ + diff --git a/gonghui/bd-center/index.html b/gonghui/bd-center/index.html index 24f873b..1155149 100644 --- a/gonghui/bd-center/index.html +++ b/gonghui/bd-center/index.html @@ -77,6 +77,8 @@
+
+

Salary

@@ -357,6 +359,7 @@ + diff --git a/gonghui/coinseller-center/index.html b/gonghui/coinseller-center/index.html index dea4487..e6060f9 100644 --- a/gonghui/coinseller-center/index.html +++ b/gonghui/coinseller-center/index.html @@ -74,6 +74,8 @@
+
+
@@ -434,6 +436,7 @@ + diff --git a/gonghui/common/center.css b/gonghui/common/center.css index f5826d9..8403955 100644 --- a/gonghui/common/center.css +++ b/gonghui/common/center.css @@ -218,6 +218,129 @@ input:focus-visible { box-shadow: var(--shadow); } +.contact-card { + overflow: hidden; +} + +.contact-card .contact-row { + display: grid; + grid-template-columns: 46px minmax(0, 1fr) auto; + gap: 12px; + align-items: center; + width: 100%; + min-height: 70px; + padding: 14px 18px; + text-align: left; +} + +.contact-card .contact-icon { + display: flex; + align-items: center; + justify-content: center; + width: 46px; + height: 46px; + border-radius: 50%; + background: rgba(49, 198, 168, 0.14); + color: var(--success); +} + +.contact-card .contact-icon svg { + width: 24px; + height: 24px; +} + +.contact-card .contact-icon path, +.contact-card .contact-icon circle { + fill: none; + stroke: currentColor; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2.2; +} + +.contact-card .contact-copy { + display: grid; + gap: 4px; + min-width: 0; +} + +.contact-card .contact-title { + color: var(--text); + font-size: 15px; + font-weight: 900; + line-height: 1.1; +} + +.contact-card .contact-value { + overflow: hidden; + color: var(--muted); + font-size: 13px; + font-weight: 800; + line-height: 1.25; + text-overflow: ellipsis; + white-space: nowrap; +} + +.contact-card .contact-action { + color: var(--primary-deep); + font-size: 13px; + font-weight: 950; + white-space: nowrap; +} + +.contact-sheet .contact-field { + display: grid; + gap: 8px; + margin-top: 6px; +} + +.contact-sheet .contact-field span { + color: var(--muted); + font-size: 13px; + font-weight: 850; +} + +.contact-sheet .contact-input { + width: 100%; + height: 52px; + border: 1px solid var(--line); + border-radius: 8px; + padding: 0 14px; + background: rgba(255, 255, 255, 0.9); + color: var(--text); + font-size: 15px; + font-weight: 850; +} + +.contact-sheet .contact-input::placeholder { + color: rgba(141, 135, 154, 0.72); +} + +.contact-sheet .contact-save { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 52px; + margin-top: 14px; + border-radius: 8px; + background: var(--button); + color: #fff; + font-size: 16px; + font-weight: 950; +} + +.contact-sheet .contact-save:disabled { + background: var(--button-disabled); +} + +.contact-sheet .contact-status { + margin-top: 10px; + color: var(--danger); + font-size: 13px; + font-weight: 850; +} + .profile-card { display: flex; align-items: center; diff --git a/gonghui/common/contact-card.js b/gonghui/common/contact-card.js new file mode 100644 index 0000000..2c3fdda --- /dev/null +++ b/gonghui/common/contact-card.js @@ -0,0 +1,215 @@ +(function () { + var mounted = false; + + function t(key, fallback) { + return window.HyAppI18n && window.HyAppI18n.t + ? window.HyAppI18n.t(key, fallback) + : fallback; + } + + function toast(message) { + if (window.HyAppToast && window.HyAppToast.show) { + window.HyAppToast.show(message); + } + } + + function contactFrom(value) { + if (!value || typeof value !== 'object') return ''; + var source = value.profile || value.user || value; + var keys = [ + 'contact_info', + 'contactInfo', + 'whatsapp_phone', + 'whatsappPhone', + 'contact', + ]; + for (var i = 0; i < keys.length; i += 1) { + var text = String(source[keys[i]] || '').trim(); + if (text) return text; + } + return ''; + } + + function render(mount) { + mount.innerHTML = + '
' + + ' ' + + '
' + + ''; + if (window.HyAppI18n && window.HyAppI18n.apply) { + window.HyAppI18n.apply(mount); + } + } + + function setModalOpen(root, open) { + var modal = root.querySelector('[data-contact-modal]'); + if (!modal) return; + modal.hidden = !open; + modal.setAttribute('aria-hidden', open ? 'false' : 'true'); + document.body.classList.toggle('modal-open', open); + if (open) { + var input = root.querySelector('[data-contact-input]'); + if (input) input.focus(); + } + } + + function setContact(root, value) { + var contact = String(value || '').trim(); + var valueNode = root.querySelector('[data-contact-value]'); + var actionNode = root.querySelector('[data-contact-action]'); + if (valueNode) { + valueNode.textContent = + contact || t('contact_card.add_whatsapp', 'Add WhatsApp'); + if (contact) { + valueNode.removeAttribute('data-i18n'); + } else { + valueNode.setAttribute('data-i18n', 'contact_card.add_whatsapp'); + } + } + if (actionNode) { + actionNode.textContent = contact + ? t('contact_card.edit', 'Edit') + : t('contact_card.add', 'Add'); + if (contact) { + actionNode.removeAttribute('data-i18n'); + } else { + actionNode.setAttribute('data-i18n', 'contact_card.add'); + } + } + root.dataset.contactValue = contact; + } + + function setStatus(root, message) { + var status = root.querySelector('[data-contact-status]'); + if (!status) return; + status.textContent = message || ''; + status.hidden = !message; + } + + function setSaving(root, saving) { + var button = root.querySelector('[data-contact-save]'); + if (!button) return; + button.disabled = saving; + button.textContent = saving + ? t('contact_card.saving', 'Saving...') + : t('contact_card.save', 'Save'); + } + + function loadCurrentContact(root) { + var api = window.HyAppAPI && window.HyAppAPI.user; + if (!api || !api.me) return; + api.me() + .then(function (profile) { + setContact(root, contactFrom(profile)); + }) + .catch(function () { + setContact(root, ''); + }); + } + + function bind(root) { + root.addEventListener('click', function (event) { + if (event.target.closest('[data-contact-open]')) { + var input = root.querySelector('[data-contact-input]'); + if (input) input.value = root.dataset.contactValue || ''; + setStatus(root, ''); + setModalOpen(root, true); + return; + } + if (event.target.closest('[data-contact-close]')) { + setModalOpen(root, false); + } + }); + + var form = root.querySelector('[data-contact-form]'); + if (!form) return; + form.addEventListener('submit', function (event) { + event.preventDefault(); + var api = window.HyAppAPI && window.HyAppAPI.user; + var input = root.querySelector('[data-contact-input]'); + var contact = input ? String(input.value || '').trim() : ''; + if (!contact) { + setStatus( + root, + t('contact_card.required', 'Enter WhatsApp contact.') + ); + return; + } + if (!api || !api.updateContact) { + setStatus( + root, + t('contact_card.api_unavailable', 'Contact API unavailable.') + ); + return; + } + + // 联系方式是用户主资料,不依赖当前中心页身份;保存成功后用后端返回值刷新展示,避免本地输入和服务端裁剪值不一致。 + setSaving(root, true); + setStatus(root, ''); + api.updateContact({ contact_info: contact }) + .then(function (response) { + setContact(root, contactFrom(response) || contact); + setModalOpen(root, false); + toast(t('contact_card.saved', 'Saved.')); + }) + .catch(function () { + setStatus( + root, + t('contact_card.save_failed', 'Save failed.') + ); + }) + .finally(function () { + setSaving(root, false); + }); + }); + } + + function init() { + if (mounted) return; + var mounts = document.querySelectorAll('[data-contact-card]'); + if (!mounts.length) return; + mounted = true; + mounts.forEach(function (mount) { + render(mount); + bind(mount); + loadCurrentContact(mount); + }); + } + + window.addEventListener('hyapp:i18n-ready', function () { + document.querySelectorAll('[data-contact-card]').forEach(function (root) { + setContact(root, root.dataset.contactValue || ''); + }); + }); + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})(); diff --git a/gonghui/host-center/index.html b/gonghui/host-center/index.html index 8cccbac..96f1506 100644 --- a/gonghui/host-center/index.html +++ b/gonghui/host-center/index.html @@ -75,6 +75,8 @@
+
+

@@ -270,6 +272,7 @@ + diff --git a/gonghui/superadmin-center/index.html b/gonghui/superadmin-center/index.html index 8943b88..d075c07 100644 --- a/gonghui/superadmin-center/index.html +++ b/gonghui/superadmin-center/index.html @@ -80,6 +80,8 @@

+
+

Salary

@@ -310,6 +312,7 @@ + diff --git a/gonghui/withdraw-exchange/index.html b/gonghui/withdraw-exchange/index.html index a265ce4..ace9edd 100644 --- a/gonghui/withdraw-exchange/index.html +++ b/gonghui/withdraw-exchange/index.html @@ -368,6 +368,70 @@
+ + @@ -376,6 +440,6 @@ - + diff --git a/gonghui/withdraw-exchange/script.js b/gonghui/withdraw-exchange/script.js index d4b53ee..7f9181b 100644 --- a/gonghui/withdraw-exchange/script.js +++ b/gonghui/withdraw-exchange/script.js @@ -14,7 +14,9 @@ selectedPayee: null, isSearching: false, isSaving: false, + isSavingContact: false, isSubmitting: false, + contactInfo: '', historyItems: [], transferRateTiers: [], }; @@ -123,6 +125,12 @@ : null; } + function userApi() { + if (window.HyAppAPI && window.HyAppAPI.user) + return window.HyAppAPI.user; + return window.HyApp && window.HyApp.api ? window.HyApp.api.user : null; + } + function commandId(prefix) { return prefix + '-' + Date.now() + '-' + Math.random().toString(16).slice(2); } @@ -246,6 +254,20 @@ return ''; } + function contactFrom(value) { + if (!value || typeof value !== 'object') return ''; + var source = value.profile || value.user || value; + return String( + firstValue(source, [ + 'contact_info', + 'contactInfo', + 'whatsapp_phone', + 'whatsappPhone', + 'contact', + ]) || '' + ).trim(); + } + function timeLabelFromMS(value) { var number = Number(value || 0); if (!Number.isFinite(number) || number <= 0) return ''; @@ -498,6 +520,10 @@ button.disabled = disabled; } + function needsContactForSubmit() { + return currentMode === 'exchange' || currentMode === 'transfer'; + } + function normalizeAmount(event) { var input = event.target; var raw = String(input.value || '').replace(/[^\d.]/g, ''); @@ -543,6 +569,75 @@ document.body.classList.remove('modal-open'); } + function setContactStatus(message) { + var node = $('contactStatus'); + node.textContent = message || ''; + node.hidden = !message; + } + + function setContactSaving(saving) { + state.isSavingContact = saving; + $('saveContactButton').disabled = saving; + $('saveContactButton').textContent = saving + ? t('contact_card.saving', 'Saving...') + : t('contact_card.save', 'Save'); + } + + function openContactModal() { + $('contactInput').value = state.contactInfo || ''; + setContactStatus(''); + $('contactModal').hidden = false; + $('contactModal').setAttribute('aria-hidden', 'false'); + document.body.classList.add('modal-open'); + window.setTimeout(function () { + $('contactInput').focus(); + }, 0); + } + + function closeContactModal() { + $('contactModal').hidden = true; + $('contactModal').setAttribute('aria-hidden', 'true'); + document.body.classList.remove('modal-open'); + } + + function saveContact(event) { + if (event) event.preventDefault(); + var contact = String($('contactInput').value || '').trim(); + if (!contact) { + setContactStatus( + t('contact_card.required', 'Enter WhatsApp contact.') + ); + return; + } + var apiClient = userApi(); + if (!apiClient || !apiClient.updateContact) { + setContactStatus( + t('contact_card.api_unavailable', 'Contact API unavailable.') + ); + return; + } + + // Exchange/Transfer 需要运营联系方式用于后台跟进;联系方式是用户主资料,保存成功后才允许继续提交工资兑换或转账请求。 + setContactSaving(true); + setContactStatus(''); + apiClient + .updateContact({ contact_info: contact }) + .then(function (response) { + state.contactInfo = contactFrom(response) || contact; + closeContactModal(); + updateSubmit(); + toast(t('contact_card.saved', 'Saved.')); + }) + .catch(function () { + setContactStatus( + t('contact_card.save_failed', 'Save failed.') + ); + }) + .finally(function () { + setContactSaving(false); + }); + } + function saveAddress() { var address = String($('trc20Address').value || '').trim(); if (!isValidTrc20(address)) { @@ -681,6 +776,10 @@ toast(error); return; } + if (needsContactForSubmit() && !state.contactInfo) { + openContactModal(); + return; + } if (!isMock && currentMode === 'withdraw') { toast( t( @@ -824,6 +923,9 @@ bindTap('salaryHistoryButton', openHistory); bindTap('salaryHistoryBackdrop', closeHistory); bindTap('salaryHistoryCloseButton', closeHistory); + bindTap('contactBackdrop', closeContactModal); + bindTap('contactCloseButton', closeContactModal); + $('contactForm').addEventListener('submit', saveContact); } function renderStaticDynamicText() { @@ -832,6 +934,9 @@ '1$ = {amount} golds' ).replace('{amount}', EXCHANGE_RATE.toLocaleString('en-US')); if (!$('salaryHistoryModal').hidden) renderHistory(); + if (!$('contactModal').hidden && !state.isSavingContact) { + $('saveContactButton').textContent = t('contact_card.save', 'Save'); + } updateSubmit(); renderPayee(); } @@ -843,6 +948,7 @@ renderStaticDynamicText(); loadOverview(); loadPaymentInfo(); + loadContactInfo(); if (window.HyAppBridge) { window.HyAppBridge.ready({ page: 'withdraw-exchange', @@ -909,6 +1015,30 @@ renderPaymentInfo(); } + function loadContactInfo() { + if (isMock) { + state.contactInfo = String(params.get('contact') || '').trim(); + updateSubmit(); + return; + } + var apiClient = userApi(); + if (!apiClient || !apiClient.me) { + state.contactInfo = ''; + updateSubmit(); + return; + } + apiClient + .me() + .then(function (profile) { + state.contactInfo = contactFrom(profile); + updateSubmit(); + }) + .catch(function () { + state.contactInfo = ''; + updateSubmit(); + }); + } + document.addEventListener('DOMContentLoaded', init); window.addEventListener('hyapp:i18n-ready', renderStaticDynamicText); })(); diff --git a/gonghui/withdraw-exchange/style.css b/gonghui/withdraw-exchange/style.css index b20a007..3174e91 100644 --- a/gonghui/withdraw-exchange/style.css +++ b/gonghui/withdraw-exchange/style.css @@ -655,6 +655,21 @@ input { background: rgba(14, 19, 24, 0.44); } +.contact-modal { + position: fixed; + inset: 0; + z-index: 70; + display: flex; + align-items: flex-end; + justify-content: center; +} + +.contact-backdrop { + position: absolute; + inset: 0; + background: rgba(14, 19, 24, 0.44); +} + .salary-history-dialog { position: relative; z-index: 1; @@ -669,6 +684,16 @@ input { box-shadow: 0 -14px 36px rgba(26, 35, 44, 0.16); } +.contact-dialog { + position: relative; + z-index: 1; + width: min(100%, 430px); + padding: 18px 18px calc(20px + env(safe-area-inset-bottom)); + border-radius: 18px 18px 0 0; + background: #fff; + box-shadow: 0 -14px 36px rgba(26, 35, 44, 0.16); +} + .salary-history-head { display: flex; align-items: center; @@ -677,6 +702,14 @@ input { padding: 18px 18px 12px; } +.contact-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 14px; +} + .salary-history-head h2 { min-width: 0; margin: 0; @@ -689,6 +722,18 @@ input { white-space: nowrap; } +.contact-head h2 { + min-width: 0; + margin: 0; + overflow: hidden; + color: #24282e; + font-size: 18px; + font-weight: 950; + line-height: 1.2; + text-overflow: ellipsis; + white-space: nowrap; +} + .salary-history-close { display: flex; align-items: center; @@ -703,6 +748,44 @@ input { line-height: 1; } +.contact-close { + display: flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + flex: 0 0 34px; + border-radius: 50%; + background: #f3f5f5; + color: #676b72; + font-size: 28px; + line-height: 1; +} + +.contact-form { + display: grid; + gap: 12px; +} + +.contact-field input { + min-height: 52px; + padding: 0 14px; + border-radius: 8px; + background: var(--hy-theme-surface-soft, #fdfaff); + font-size: 15px; + font-weight: 850; +} + +.contact-status { + color: var(--hy-theme-danger, #d95d72); + font-size: 13px; + font-weight: 850; +} + +.contact-save-button { + margin-top: 0; +} + .salary-history-summary { display: flex; align-items: center;