diff --git a/h5/admin-center/index.back.html b/h5/admin-center/index.back.html new file mode 100644 index 0000000..04c7e47 --- /dev/null +++ b/h5/admin-center/index.back.html @@ -0,0 +1,67 @@ + + + + + + Admin Center + + + +
+ +
+
+
+
My available salary
+ +
+
$0
+
+
+
+
+ +
+ + + + diff --git a/h5/admin-center/index.html b/h5/admin-center/index.html index 04c7e47..193e957 100644 --- a/h5/admin-center/index.html +++ b/h5/admin-center/index.html @@ -1,67 +1,19 @@ - + - - - - Admin Center - - - -
- -
-
-
-
My available salary
- -
-
$0
-
-
-
-
- -
- - - + + + + Document + + + + diff --git a/h5/hyapp/manager-center/index.html b/h5/hyapp/manager-center/index.html index 4ebd888..07753fb 100644 --- a/h5/hyapp/manager-center/index.html +++ b/h5/hyapp/manager-center/index.html @@ -4,7 +4,7 @@ Manager Center - +
@@ -65,55 +65,140 @@
-
-
-

Gift Props

-
- -
- - -
- -
- -
- - + + + + + +
Loading...
- + diff --git a/h5/hyapp/manager-center/locales/ar.json b/h5/hyapp/manager-center/locales/ar.json index 8898ed2..0792318 100644 --- a/h5/hyapp/manager-center/locales/ar.json +++ b/h5/hyapp/manager-center/locales/ar.json @@ -4,6 +4,7 @@ "back": "رجوع", "title": "مركز المدير", "language_button_aria": "تغيير اللغة", + "close": "إغلاق", "current_manager": "المدير الحالي", "user": "المستخدم", "user_search_placeholder": "أدخل معرّف المستخدم أو الحساب", @@ -20,14 +21,18 @@ "no_giftable_props": "لا توجد عناصر قابلة للإهداء", "send": "إرسال", "sending": "جار الإرسال...", - "confirm_send": "هل تريد إرسال هذا العنصر؟", "send_success": "تم الإرسال بنجاح", "ban_user": "حظر المستخدم", "ban_reason": "سبب الحظر", "ban": "حظر", - "confirm_ban": "هل تريد حظر هذا المستخدم؟", "submitting": "جار الإرسال...", "ban_success": "تم حظر المستخدم", + "unban_user": "إلغاء حظر المستخدم", + "unban_reason": "سبب إلغاء الحظر", + "unban": "إلغاء الحظر", + "unban_success": "تم إلغاء حظر المستخدم", + "can_unban": "يمكن إلغاء الحظر", + "cannot_unban": "لا يمكن إلغاء الحظر", "loading": "جار التحميل...", "uid_label": "UID", "days": "{count} يوم", @@ -40,6 +45,8 @@ "not_manager": "الحساب الحالي ليس مديرًا", "user_not_found": "المستخدم غير موجود", "user_recharged": "لدى هذا المستخدم سجلات شحن ولا يمكن حظره", + "user_already_banned": "هذا المستخدم محظور بالفعل", + "user_not_banned": "هذا المستخدم غير محظور", "prop_not_giftable": "هذا العنصر غير متاح كهديّة من المدير", "vip_not_giftable": "لا يمكن إهداء عنصر VIP هذا", "request_failed": "فشل الطلب", diff --git a/h5/hyapp/manager-center/locales/en.json b/h5/hyapp/manager-center/locales/en.json index b3fe437..722d083 100644 --- a/h5/hyapp/manager-center/locales/en.json +++ b/h5/hyapp/manager-center/locales/en.json @@ -4,6 +4,7 @@ "back": "Back", "title": "Manager Center", "language_button_aria": "Change language", + "close": "Close", "current_manager": "Current Manager", "user": "User", "user_search_placeholder": "Enter user ID or account", @@ -20,14 +21,18 @@ "no_giftable_props": "No giftable props", "send": "Send", "sending": "Sending...", - "confirm_send": "Send this prop?", "send_success": "Sent successfully", "ban_user": "Ban User", "ban_reason": "Ban reason", "ban": "Ban", - "confirm_ban": "Ban this user?", "submitting": "Submitting...", "ban_success": "User banned", + "unban_user": "Unban User", + "unban_reason": "Unban reason", + "unban": "Unban", + "unban_success": "User unbanned", + "can_unban": "Can unban", + "cannot_unban": "Cannot unban", "loading": "Loading...", "uid_label": "UID", "days": "{count} days", @@ -40,6 +45,8 @@ "not_manager": "Current account is not a manager", "user_not_found": "User not found", "user_recharged": "This user has recharge records and cannot be banned", + "user_already_banned": "This user is already banned", + "user_not_banned": "This user is not banned", "prop_not_giftable": "This prop is not available for manager gifting", "vip_not_giftable": "This noble prop cannot be gifted", "request_failed": "Request failed", diff --git a/h5/hyapp/manager-center/locales/id.json b/h5/hyapp/manager-center/locales/id.json index f88ef44..52c6a98 100644 --- a/h5/hyapp/manager-center/locales/id.json +++ b/h5/hyapp/manager-center/locales/id.json @@ -4,6 +4,7 @@ "back": "Kembali", "title": "Pusat Manajer", "language_button_aria": "Ubah bahasa", + "close": "Tutup", "current_manager": "Manajer Saat Ini", "user": "Pengguna", "user_search_placeholder": "Masukkan ID pengguna atau akun", @@ -20,14 +21,18 @@ "no_giftable_props": "Tidak ada properti yang dapat dikirim", "send": "Kirim", "sending": "Mengirim...", - "confirm_send": "Kirim properti ini?", "send_success": "Berhasil dikirim", "ban_user": "Blokir Pengguna", "ban_reason": "Alasan blokir", "ban": "Blokir", - "confirm_ban": "Blokir pengguna ini?", "submitting": "Mengirim...", "ban_success": "Pengguna diblokir", + "unban_user": "Buka Blokir Pengguna", + "unban_reason": "Alasan buka blokir", + "unban": "Buka blokir", + "unban_success": "Blokir pengguna dibuka", + "can_unban": "Dapat dibuka", + "cannot_unban": "Tidak dapat dibuka", "loading": "Memuat...", "uid_label": "UID", "days": "{count} hari", @@ -40,6 +45,8 @@ "not_manager": "Akun saat ini bukan manajer", "user_not_found": "Pengguna tidak ditemukan", "user_recharged": "Pengguna ini memiliki riwayat isi ulang dan tidak dapat diblokir", + "user_already_banned": "Pengguna ini sudah diblokir", + "user_not_banned": "Pengguna ini tidak diblokir", "prop_not_giftable": "Properti ini tidak tersedia untuk hadiah manajer", "vip_not_giftable": "Properti noble ini tidak dapat dikirim", "request_failed": "Permintaan gagal", diff --git a/h5/hyapp/manager-center/locales/tr.json b/h5/hyapp/manager-center/locales/tr.json index 466b7f6..eb427a9 100644 --- a/h5/hyapp/manager-center/locales/tr.json +++ b/h5/hyapp/manager-center/locales/tr.json @@ -4,6 +4,7 @@ "back": "Geri", "title": "Yönetici Merkezi", "language_button_aria": "Dili değiştir", + "close": "Kapat", "current_manager": "Mevcut Yönetici", "user": "Kullanıcı", "user_search_placeholder": "Kullanıcı ID veya hesap gir", @@ -20,14 +21,18 @@ "no_giftable_props": "Gönderilebilir eşya yok", "send": "Gönder", "sending": "Gönderiliyor...", - "confirm_send": "Bu eşyayı göndermek istiyor musun?", "send_success": "Başarıyla gönderildi", "ban_user": "Kullanıcıyı Yasakla", "ban_reason": "Yasaklama nedeni", "ban": "Yasakla", - "confirm_ban": "Bu kullanıcıyı yasaklamak istiyor musun?", "submitting": "Gönderiliyor...", "ban_success": "Kullanıcı yasaklandı", + "unban_user": "Yasağı Kaldır", + "unban_reason": "Yasağı kaldırma nedeni", + "unban": "Yasağı kaldır", + "unban_success": "Kullanıcının yasağı kaldırıldı", + "can_unban": "Yasak kaldırılabilir", + "cannot_unban": "Yasak kaldırılamaz", "loading": "Yükleniyor...", "uid_label": "UID", "days": "{count} gün", @@ -40,6 +45,8 @@ "not_manager": "Mevcut hesap yönetici değil", "user_not_found": "Kullanıcı bulunamadı", "user_recharged": "Bu kullanıcının yükleme kaydı var, yasaklanamaz", + "user_already_banned": "Bu kullanıcı zaten yasaklı", + "user_not_banned": "Bu kullanıcı yasaklı değil", "prop_not_giftable": "Bu eşya yönetici hediyesi için açık değil", "vip_not_giftable": "Bu noble eşyası gönderilemez", "request_failed": "İstek başarısız", diff --git a/h5/hyapp/manager-center/script.js b/h5/hyapp/manager-center/script.js index 396a652..6fbc2cf 100644 --- a/h5/hyapp/manager-center/script.js +++ b/h5/hyapp/manager-center/script.js @@ -18,6 +18,7 @@ back: "Back", title: "Manager Center", language_button_aria: "Change language", + close: "Close", current_manager: "Current Manager", user: "User", user_search_placeholder: "Enter user ID or account", @@ -34,14 +35,18 @@ no_giftable_props: "No giftable props", send: "Send", sending: "Sending...", - confirm_send: "Send this prop?", send_success: "Sent successfully", ban_user: "Ban User", ban_reason: "Ban reason", ban: "Ban", - confirm_ban: "Ban this user?", submitting: "Submitting...", ban_success: "User banned", + unban_user: "Unban User", + unban_reason: "Unban reason", + unban: "Unban", + unban_success: "User unbanned", + can_unban: "Can unban", + cannot_unban: "Cannot unban", loading: "Loading...", uid_label: "UID", days: "{count} days", @@ -54,6 +59,8 @@ not_manager: "Current account is not a manager", user_not_found: "User not found", user_recharged: "This user has recharge records and cannot be banned", + user_already_banned: "This user is already banned", + user_not_banned: "This user is not banned", prop_not_giftable: "This prop is not available for manager gifting", vip_not_giftable: "This noble prop cannot be gifted", request_failed: "Request failed", @@ -65,6 +72,7 @@ back: "رجوع", title: "مركز المدير", language_button_aria: "تغيير اللغة", + close: "إغلاق", current_manager: "المدير الحالي", user: "المستخدم", user_search_placeholder: "أدخل معرّف المستخدم أو الحساب", @@ -81,14 +89,18 @@ no_giftable_props: "لا توجد عناصر قابلة للإهداء", send: "إرسال", sending: "جار الإرسال...", - confirm_send: "هل تريد إرسال هذا العنصر؟", send_success: "تم الإرسال بنجاح", ban_user: "حظر المستخدم", ban_reason: "سبب الحظر", ban: "حظر", - confirm_ban: "هل تريد حظر هذا المستخدم؟", submitting: "جار الإرسال...", ban_success: "تم حظر المستخدم", + unban_user: "إلغاء حظر المستخدم", + unban_reason: "سبب إلغاء الحظر", + unban: "إلغاء الحظر", + unban_success: "تم إلغاء حظر المستخدم", + can_unban: "يمكن إلغاء الحظر", + cannot_unban: "لا يمكن إلغاء الحظر", loading: "جار التحميل...", uid_label: "UID", days: "{count} يوم", @@ -101,6 +113,8 @@ not_manager: "الحساب الحالي ليس مديرًا", user_not_found: "المستخدم غير موجود", user_recharged: "لدى هذا المستخدم سجلات شحن ولا يمكن حظره", + user_already_banned: "هذا المستخدم محظور بالفعل", + user_not_banned: "هذا المستخدم غير محظور", prop_not_giftable: "هذا العنصر غير متاح كهديّة من المدير", vip_not_giftable: "لا يمكن إهداء عنصر VIP هذا", request_failed: "فشل الطلب", @@ -112,6 +126,7 @@ back: "Geri", title: "Yönetici Merkezi", language_button_aria: "Dili değiştir", + close: "Kapat", current_manager: "Mevcut Yönetici", user: "Kullanıcı", user_search_placeholder: "Kullanıcı ID veya hesap gir", @@ -128,14 +143,18 @@ no_giftable_props: "Gönderilebilir eşya yok", send: "Gönder", sending: "Gönderiliyor...", - confirm_send: "Bu eşyayı göndermek istiyor musun?", send_success: "Başarıyla gönderildi", ban_user: "Kullanıcıyı Yasakla", ban_reason: "Yasaklama nedeni", ban: "Yasakla", - confirm_ban: "Bu kullanıcıyı yasaklamak istiyor musun?", submitting: "Gönderiliyor...", ban_success: "Kullanıcı yasaklandı", + unban_user: "Yasağı Kaldır", + unban_reason: "Yasağı kaldırma nedeni", + unban: "Yasağı kaldır", + unban_success: "Kullanıcının yasağı kaldırıldı", + can_unban: "Yasak kaldırılabilir", + cannot_unban: "Yasak kaldırılamaz", loading: "Yükleniyor...", uid_label: "UID", days: "{count} gün", @@ -148,6 +167,8 @@ not_manager: "Mevcut hesap yönetici değil", user_not_found: "Kullanıcı bulunamadı", user_recharged: "Bu kullanıcının yükleme kaydı var, yasaklanamaz", + user_already_banned: "Bu kullanıcı zaten yasaklı", + user_not_banned: "Bu kullanıcı yasaklı değil", prop_not_giftable: "Bu eşya yönetici hediyesi için açık değil", vip_not_giftable: "Bu noble eşyası gönderilemez", request_failed: "İstek başarısız", @@ -159,6 +180,7 @@ back: "Kembali", title: "Pusat Manajer", language_button_aria: "Ubah bahasa", + close: "Tutup", current_manager: "Manajer Saat Ini", user: "Pengguna", user_search_placeholder: "Masukkan ID pengguna atau akun", @@ -175,14 +197,18 @@ no_giftable_props: "Tidak ada properti yang dapat dikirim", send: "Kirim", sending: "Mengirim...", - confirm_send: "Kirim properti ini?", send_success: "Berhasil dikirim", ban_user: "Blokir Pengguna", ban_reason: "Alasan blokir", ban: "Blokir", - confirm_ban: "Blokir pengguna ini?", submitting: "Mengirim...", ban_success: "Pengguna diblokir", + unban_user: "Buka Blokir Pengguna", + unban_reason: "Alasan buka blokir", + unban: "Buka blokir", + unban_success: "Blokir pengguna dibuka", + can_unban: "Dapat dibuka", + cannot_unban: "Tidak dapat dibuka", loading: "Memuat...", uid_label: "UID", days: "{count} hari", @@ -195,6 +221,8 @@ not_manager: "Akun saat ini bukan manajer", user_not_found: "Pengguna tidak ditemukan", user_recharged: "Pengguna ini memiliki riwayat isi ulang dan tidak dapat diblokir", + user_already_banned: "Pengguna ini sudah diblokir", + user_not_banned: "Pengguna ini tidak diblokir", prop_not_giftable: "Properti ini tidak tersedia untuk hadiah manajer", vip_not_giftable: "Properti noble ini tidak dapat dikirim", request_failed: "Permintaan gagal", @@ -261,7 +289,7 @@ if (window.location.protocol === "file:") return fallbackMessages[normalizedLang]; try { - const response = await fetch(`./locales/${normalizedLang}.json?v=20260511-0105`, { cache: "no-store" }); + const response = await fetch(`./locales/${normalizedLang}.json?v=20260511-0107`, { cache: "no-store" }); if (response.ok) return await response.json(); } catch (error) { return fallbackMessages[normalizedLang]; @@ -477,6 +505,10 @@ return "/app/h5/manager-center/users/ban"; } + function endpointUnbanUser() { + return "/app/h5/manager-center/users/unban"; + } + function setLoading(isLoading) { const root = $(".manager-center"); const mask = $("#loadingMask"); @@ -502,6 +534,58 @@ }, 2300); } + function syncModalState() { + document.body.classList.toggle("is-modal-open", Boolean(document.querySelector(".modal-mask:not([hidden])"))); + } + + function setModalOpen(selector, open) { + const modal = $(selector); + if (!modal) return; + modal.hidden = !open; + if (open) { + setLanguageMenuOpen(false); + setPropsTypeMenuOpen(false); + } + syncModalState(); + } + + function closeModals() { + document.querySelectorAll(".modal-mask").forEach((modal) => { + modal.hidden = true; + }); + setPropsTypeMenuOpen(false); + syncModalState(); + } + + function openGiftModal() { + if (!state.target) { + showToast(message("enter_user")); + return; + } + setModalOpen("#giftModal", true); + updateActionState(); + } + + function openBanModal() { + if (!state.target) { + showToast(message("enter_user")); + return; + } + setStatus($("#banStatus"), ""); + setModalOpen("#banModal", true); + updateActionState(); + } + + function openUnbanModal() { + if (!state.target) { + showToast(message("enter_user")); + return; + } + setStatus($("#unbanStatus"), ""); + setModalOpen("#unbanModal", true); + updateActionState(); + } + function closePage() { try { if (window.app && typeof window.app.closePage === "function") { @@ -554,7 +638,12 @@ } function canBanTarget(target) { - return Boolean(target) && target.canBan !== false && !target.hasRecharge; + return Boolean(target) && target.canBan !== false && !target.hasRecharge && !canUnbanTarget(target); + } + + function canUnbanTarget(target) { + const status = String(target?.accountStatus || "").trim().toUpperCase(); + return Boolean(target) && (status === "FREEZE" || status === "ARCHIVE" || status === "ARCHIVE_DEVICE"); } function userIDText(user) { @@ -578,24 +667,33 @@ function renderTarget() { const card = $("#targetCard"); - const banCard = $("#banCard"); + const actionCard = $("#actionCard"); if (!state.target) { if (card) card.hidden = true; - if (banCard) banCard.hidden = true; + if (actionCard) actionCard.hidden = true; + closeModals(); updateActionState(); return; } const target = state.target; - card.hidden = false; - banCard.hidden = false; + if (card) card.hidden = false; + if (actionCard) actionCard.hidden = false; $("#targetName").textContent = displayName(target); $("#targetUid").textContent = userIDText(target); $("#targetAccountStatus").textContent = target.accountStatus || "-"; const canBan = canBanTarget(target); const banEligibility = $("#banEligibility"); - banEligibility.textContent = canBan ? message("can_ban") : message("cannot_ban"); - banEligibility.classList.toggle("is-danger", !canBan); + if (banEligibility) { + banEligibility.textContent = canBan ? message("can_ban") : message("cannot_ban"); + banEligibility.classList.toggle("is-danger", !canBan); + } + const canUnban = canUnbanTarget(target); + const unbanEligibility = $("#unbanEligibility"); + if (unbanEligibility) { + unbanEligibility.textContent = canUnban ? message("can_unban") : message("cannot_unban"); + unbanEligibility.classList.toggle("is-danger", !canUnban); + } renderAvatar("#targetAvatar", "#targetAvatarFallback", target.userAvatar, displayName(target), "U"); updateActionState(); } @@ -659,10 +757,18 @@ } function updateActionState() { + const giftEntryButton = $("#giftEntryButton"); + const banEntryButton = $("#banEntryButton"); + const unbanEntryButton = $("#unbanEntryButton"); const sendButton = $("#sendPropsButton"); const banButton = $("#banButton"); + const unbanButton = $("#unbanButton"); + if (giftEntryButton) giftEntryButton.disabled = !state.target; + if (banEntryButton) banEntryButton.disabled = !state.target; + if (unbanEntryButton) unbanEntryButton.disabled = !state.target; if (sendButton) sendButton.disabled = !state.target || !state.selectedPropsId; if (banButton) banButton.disabled = !canBanTarget(state.target); + if (unbanButton) unbanButton.disabled = !canUnbanTarget(state.target); } async function loadProfile() { @@ -710,7 +816,6 @@ async function sendProps() { if (!state.target || !state.selectedPropsId) return; - if (!window.confirm(message("confirm_send"))) return; const button = $("#sendPropsButton"); button.disabled = true; @@ -722,6 +827,7 @@ propsId: state.selectedPropsId } }); + setModalOpen("#giftModal", false); showToast(message("send_success")); } catch (error) { showToast(friendlyError(error)); @@ -732,7 +838,6 @@ async function banUser() { if (!canBanTarget(state.target)) return; - if (!window.confirm(message("confirm_ban"))) return; const button = $("#banButton"); button.disabled = true; @@ -747,6 +852,7 @@ }); state.target.accountStatus = "ARCHIVE"; renderTarget(); + setModalOpen("#banModal", false); setStatus($("#banStatus"), ""); showToast(message("ban_success")); } catch (error) { @@ -756,12 +862,40 @@ } } + async function unbanUser() { + if (!canUnbanTarget(state.target)) return; + + const button = $("#unbanButton"); + button.disabled = true; + setStatus($("#unbanStatus"), message("submitting")); + try { + await requestGoJSON(endpointUnbanUser(), { + method: "POST", + body: { + userId: displayUserID(state.target), + reason: $("#unbanReason").value || "" + } + }); + state.target.accountStatus = "NORMAL"; + renderTarget(); + setModalOpen("#unbanModal", false); + setStatus($("#unbanStatus"), ""); + showToast(message("unban_success")); + } catch (error) { + setStatus($("#unbanStatus"), friendlyError(error), "error"); + } finally { + updateActionState(); + } + } + function friendlyError(error) { const code = error?.code || error?.response?.code || error?.response?.errorCodeName || ""; if (code === "missing_token") return message("missing_token"); if (code === "not_manager") return message("not_manager"); if (code === "user_not_found") return message("user_not_found"); if (code === "user_recharged") return message("user_recharged"); + if (code === "user_already_banned") return message("user_already_banned"); + if (code === "user_not_banned") return message("user_not_banned"); if (code === "prop_not_giftable") return message("prop_not_giftable"); if (code === "vip_not_giftable") return message("vip_not_giftable"); return error?.message || message("request_failed"); @@ -784,6 +918,17 @@ setLanguageMenuOpen(false); setPropsTypeMenuOpen(false); }); + $("#giftEntryButton")?.addEventListener("click", openGiftModal); + $("#banEntryButton")?.addEventListener("click", openBanModal); + $("#unbanEntryButton")?.addEventListener("click", openUnbanModal); + document.querySelectorAll("[data-modal-close]").forEach((button) => { + button.addEventListener("click", closeModals); + }); + document.querySelectorAll(".modal-mask").forEach((modal) => { + modal.addEventListener("click", (event) => { + if (event.target === modal) closeModals(); + }); + }); $("#propsTypeButton")?.addEventListener("click", (event) => { event.stopPropagation(); setLanguageMenuOpen(false); @@ -799,10 +944,12 @@ if (event.key !== "Escape") return; setLanguageMenuOpen(false); setPropsTypeMenuOpen(false); + closeModals(); }); $("#searchForm")?.addEventListener("submit", searchUser); $("#sendPropsButton")?.addEventListener("click", sendProps); $("#banButton")?.addEventListener("click", banUser); + $("#unbanButton")?.addEventListener("click", unbanUser); } async function init() { diff --git a/h5/hyapp/manager-center/style.css b/h5/hyapp/manager-center/style.css index 78d3e0b..66d8c91 100644 --- a/h5/hyapp/manager-center/style.css +++ b/h5/hyapp/manager-center/style.css @@ -34,6 +34,10 @@ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } +body.is-modal-open { + overflow: hidden; +} + button, input, textarea { @@ -268,12 +272,79 @@ button:disabled { color: var(--danger); } -.search-card, -.gift-card, -.ban-card { +.search-card { padding: 14px; } +.action-card { + display: grid; + gap: 4px; + padding: 6px; +} + +.action-item { + display: grid; + grid-template-columns: 42px minmax(0, 1fr) 24px; + gap: 10px; + align-items: center; + width: 100%; + min-height: 58px; + border-radius: 6px; + padding: 8px; + background: #fff; + color: var(--text); + text-align: left; +} + +.action-item:active { + background: #f4f7f8; +} + +.action-item-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 42px; + height: 42px; + border-radius: 8px; + background: #e7f8f4; + color: var(--primary-dark); +} + +.action-item.is-danger .action-item-icon { + background: var(--danger-bg); + color: var(--danger); +} + +.action-item-icon svg, +.action-item-arrow { + width: 22px; + height: 22px; + fill: none; + stroke: currentColor; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2.2; +} + +.action-item-copy { + display: grid; + min-width: 0; +} + +.action-item-title { + overflow: hidden; + font-size: 15px; + font-weight: 900; + text-overflow: ellipsis; + white-space: nowrap; +} + +.action-item-arrow { + justify-self: end; + color: #9aa4af; +} + .section-head { display: flex; align-items: center; @@ -560,6 +631,84 @@ textarea:focus { color: var(--danger); } +.modal-mask { + position: fixed; + z-index: 30; + inset: 0; + display: flex; + align-items: flex-end; + justify-content: center; + padding-top: 48px; + background: rgba(17, 24, 32, 0.48); +} + +.modal-sheet { + display: flex; + width: min(100%, 430px); + max-height: calc(100vh - 48px); + flex-direction: column; + overflow: hidden; + border-radius: 8px 8px 0 0; + background: var(--card-bg); + box-shadow: 0 -18px 44px rgba(17, 24, 32, 0.22); +} + +.modal-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 14px 14px 10px; + border-bottom: 1px solid var(--line); +} + +.modal-head h2 { + margin: 0; + font-size: 17px; + font-weight: 900; + letter-spacing: 0; +} + +.modal-close { + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 34px; + width: 34px; + height: 34px; + border-radius: 50%; + background: #f2f4f7; + color: #48525f; +} + +.modal-close svg { + width: 20px; + height: 20px; + fill: none; + stroke: currentColor; + stroke-linecap: round; + stroke-width: 2.4; +} + +.modal-body { + overflow-y: auto; + padding: 14px 14px calc(18px + env(safe-area-inset-bottom)); +} + +.modal-body .danger-chip { + display: flex; + width: fit-content; + margin-bottom: 10px; +} + +.modal-body textarea { + display: block; +} + +.modal-body .props-list { + max-height: min(42vh, 330px); +} + .loading-mask { position: absolute; z-index: 20; @@ -614,7 +763,8 @@ textarea:focus { [dir="rtl"] textarea, [dir="rtl"] .custom-select-button, [dir="rtl"] .custom-select-menu button, -[dir="rtl"] .prop-option { +[dir="rtl"] .prop-option, +[dir="rtl"] .action-item { text-align: right; } @@ -622,6 +772,10 @@ textarea:focus { padding: 0 14px 0 12px; } +[dir="rtl"] .action-item-arrow { + transform: rotate(180deg); +} + @keyframes spin { to { transform: rotate(360deg); diff --git a/h5/hyapp/recharge-center/index.html b/h5/hyapp/recharge-center/index.html index 40a3ecf..2187ab5 100644 --- a/h5/hyapp/recharge-center/index.html +++ b/h5/hyapp/recharge-center/index.html @@ -4,7 +4,7 @@ Recharge Center - +
@@ -105,6 +105,39 @@ + +