mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 09:33:46 +00:00
Phase 1-6 Complete
This commit is contained in:
@@ -169,11 +169,15 @@ interface BentoCardProps {
|
||||
### Этап 6: Модалки
|
||||
> Обновить модальные окна в bento-стиле
|
||||
|
||||
| # | Компонент | Заметки |
|
||||
|---|-----------|---------|
|
||||
| 6.1 | ConnectionModal | QR-код, кнопки подключения |
|
||||
| 6.2 | TopUpModal | Форма пополнения |
|
||||
| 6.3 | InsufficientBalancePrompt | Промпт о недостатке средств |
|
||||
| # | Компонент | Статус | Заметки |
|
||||
|---|-----------|--------|---------|
|
||||
| 6.1 | ConnectionModal | `[x]` | ✅ z-[60], rounded-3xl, backdrop-blur-xl (desktop + mobile) |
|
||||
| 6.2 | TopUpModal | `[x]` | ✅ z-[60], rounded-3xl, backdrop-blur-xl |
|
||||
| 6.3 | InsufficientBalancePrompt | `[x]` | ✅ z-[60], rounded-3xl, backdrop-blur-xl (PaymentMethodModal тоже) |
|
||||
| 6.4 | Wheel Result Modal | `[x]` | ✅ z-[60] |
|
||||
| 6.5 | Contests Modal | `[x]` | ✅ z-[60], bento-card, backdrop-blur-sm |
|
||||
|
||||
**Выборка модалок (select/close overlap):** Не найдено — все селекты в Subscription.tsx используют кнопки вместо `<select>` элемента.
|
||||
|
||||
### Этап 7: Header
|
||||
> Обновить шапку (опционально)
|
||||
@@ -224,3 +228,18 @@ interface BentoCardProps {
|
||||
- ✅ **Support.tsx**: 3 карточки → `bento-card`, tickets list items → `rounded-bento`
|
||||
- ✅ **Profile.tsx**: 3 карточки → `bento-card`
|
||||
- ✅ **Info.tsx**: FAQ items, rules, privacy, offer → `bento-card`
|
||||
|
||||
### 2026-01-20 — Phase 6 Complete (Модальные окна)
|
||||
- ✅ **ConnectionModal.tsx**: z-[60], rounded-3xl, backdrop-blur-xl (desktop + mobile wrapper)
|
||||
- ✅ **TopUpModal.tsx**: z-[60], rounded-3xl, backdrop-blur-xl
|
||||
- ✅ **InsufficientBalancePrompt.tsx**: z-[60], rounded-3xl, backdrop-blur-xl (PaymentMethodModal тоже)
|
||||
- ✅ **Wheel.tsx**: Result modal z-[60]
|
||||
- ✅ **Contests.tsx**: Game modal z-[60], bento-card, backdrop-blur-sm
|
||||
|
||||
**Z-Index Hierarchy (фиксировано):**
|
||||
- z-[9999]: ConnectionModal mobile view
|
||||
- z-[9998]: ConnectionModal mobile backdrop
|
||||
- z-[100]: Toast, MaintenanceScreen, ChannelSubscriptionScreen
|
||||
- z-[60]: Все модальные окна (TopUpModal, InsufficientBalancePrompt, ConnectionModal desktop, Wheel, Contests)
|
||||
- z-50: Header, dropdowns
|
||||
- z-40: TabBar (bottom nav)
|
||||
|
||||
@@ -215,11 +215,11 @@ export default function ConnectionModal({ onClose }: ConnectionModalProps) {
|
||||
// Desktop modal wrapper - compact centered modal with max height
|
||||
const DesktopWrapper = ({ children }: { children: React.ReactNode }) => (
|
||||
<div
|
||||
className="fixed inset-0 backdrop-blur-sm z-[60] flex items-center justify-center p-4 animate-fade-in"
|
||||
className="fixed inset-0 bg-black/70 backdrop-blur-sm z-[60] flex items-center justify-center p-4 animate-fade-in"
|
||||
onClick={onClose}
|
||||
>
|
||||
<div
|
||||
className="relative w-full max-w-md max-h-[85vh] bg-dark-900 rounded-2xl border border-dark-700/50 shadow-2xl flex flex-col overflow-hidden animate-scale-in"
|
||||
className="relative w-full max-w-md max-h-[85vh] bg-dark-900/95 backdrop-blur-xl rounded-3xl border border-dark-700/50 shadow-2xl flex flex-col overflow-hidden animate-scale-in"
|
||||
onClick={e => e.stopPropagation()}
|
||||
>
|
||||
{/* Desktop close button */}
|
||||
@@ -243,7 +243,7 @@ export default function ConnectionModal({ onClose }: ConnectionModalProps) {
|
||||
<div className="fixed inset-0 z-[9998] bg-black/50 animate-fade-in" onClick={onClose} />
|
||||
{/* Modal - fullscreen overlay */}
|
||||
<div
|
||||
className="fixed inset-0 z-[9999] bg-dark-900 flex flex-col animate-slide-up"
|
||||
className="fixed inset-0 z-[9999] bg-dark-900/95 backdrop-blur-xl flex flex-col animate-slide-up"
|
||||
style={{
|
||||
paddingTop: safeTop ? `${safeTop}px` : 'env(safe-area-inset-top, 0px)',
|
||||
paddingBottom: safeBottom ? `${safeBottom}px` : 'env(safe-area-inset-bottom, 0px)'
|
||||
|
||||
@@ -145,10 +145,10 @@ function PaymentMethodModal({ paymentMethods, onSelect, onClose }: PaymentMethod
|
||||
const { formatAmount, currencySymbol } = useCurrency()
|
||||
|
||||
return (
|
||||
<div className="fixed inset-0 bg-black/70 z-50 flex items-center justify-center px-4 pt-14 pb-28 sm:pt-0 sm:pb-0">
|
||||
<div className="fixed inset-0 bg-black/70 backdrop-blur-sm z-[60] flex items-center justify-center px-4 pt-14 pb-28 sm:pt-0 sm:pb-0">
|
||||
<div className="absolute inset-0" onClick={onClose} />
|
||||
|
||||
<div className="relative w-full max-w-sm bg-dark-900 rounded-2xl border border-dark-700/50 shadow-2xl overflow-hidden max-h-full flex flex-col">
|
||||
<div className="relative w-full max-w-sm bg-dark-900/95 backdrop-blur-xl rounded-3xl border border-dark-700/50 shadow-2xl overflow-hidden max-h-full flex flex-col">
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between px-4 py-3 bg-dark-800/50">
|
||||
<span className="font-semibold text-dark-100">{t('balance.selectPaymentMethod')}</span>
|
||||
|
||||
@@ -172,7 +172,7 @@ export default function TopUpModal({ method, onClose, initialAmountRubles }: Top
|
||||
|
||||
const modalContent = (
|
||||
<div
|
||||
className="fixed inset-0 bg-black/70 z-[60] flex items-start justify-center p-4 pt-4 overflow-hidden"
|
||||
className="fixed inset-0 bg-black/70 backdrop-blur-sm z-[60] flex items-center justify-center p-4 overflow-hidden"
|
||||
style={{
|
||||
paddingBottom: `max(1rem, env(safe-area-inset-bottom, 0px))`,
|
||||
}}
|
||||
@@ -180,7 +180,7 @@ export default function TopUpModal({ method, onClose, initialAmountRubles }: Top
|
||||
>
|
||||
<div
|
||||
data-modal-content
|
||||
className="w-full max-w-sm bg-dark-900 rounded-2xl border border-dark-700/50 shadow-2xl overflow-hidden animate-scale-in"
|
||||
className="w-full max-w-sm bg-dark-900/95 backdrop-blur-xl rounded-3xl border border-dark-700/50 shadow-2xl overflow-hidden animate-scale-in"
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
{/* Header */}
|
||||
|
||||
@@ -86,8 +86,8 @@ export default function Contests() {
|
||||
|
||||
{/* Game Modal */}
|
||||
{selectedContest && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60">
|
||||
<div className="card max-w-lg w-full max-h-[80vh] overflow-y-auto">
|
||||
<div className="fixed inset-0 z-[60] bg-black/70 backdrop-blur-sm flex items-center justify-center p-4">
|
||||
<div className="bento-card max-w-lg w-full max-h-[80vh] overflow-y-auto" onClick={e => e.stopPropagation()}>
|
||||
<div className="flex justify-between items-center mb-4">
|
||||
<h2 className="text-xl font-bold">{selectedContest.name}</h2>
|
||||
<button onClick={handleCloseGame} className="text-dark-400 hover:text-dark-200">
|
||||
|
||||
@@ -692,7 +692,7 @@ export default function Wheel() {
|
||||
|
||||
{/* Result Modal */}
|
||||
{showResultModal && spinResult && (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/80 backdrop-blur-md animate-fade-in">
|
||||
<div className="fixed inset-0 z-[60] flex items-center justify-center p-4 bg-black/80 backdrop-blur-md animate-fade-in">
|
||||
<div
|
||||
className={`relative w-full max-w-md rounded-3xl p-8 text-center overflow-hidden ${
|
||||
spinResult.success
|
||||
|
||||
Reference in New Issue
Block a user