feat: implement advanced reward management and wheel customization

- Add customizable background color
- Add wheel animations and sound effects
- Add reward description field and winner modal
- Change font to Dana
- Add configurable reward probabilities
- Support reward types (Empty, Discount Code, LiveCoin)
- Replace reward title with reward type selector
- Allow wheel page title customization from admin panel
This commit is contained in:
2026-06-10 14:55:07 +03:30
parent b0ff339525
commit ec86cdc528
26 changed files with 1166 additions and 533 deletions

View File

@@ -1,261 +1,68 @@
/* =========================
ADMIN PANEL
========================= */
.admin-container {
width: 100%;
max-width: 1200px;
padding: 30px;
@font-face {
font-family: 'Dana';
src: url('../fonts/DanaFaNum-Regular.ttf') format('truetype');
font-weight: 100 900;
font-style: normal;
}
.admin-header {
text-align: center;
margin-bottom: 30px;
}
.admin-header h1 {
color: #FFD700;
font-size: 38px;
text-shadow: 0 0 15px rgba(255,215,0,0.5);
}
.admin-header p {
color: #f5d6a0;
margin-top: 10px;
font-size: 18px;
}
.add-section {
background: rgba(0,0,0,0.25);
backdrop-filter: blur(8px);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 20px;
padding: 20px;
display: flex;
gap: 15px;
margin-bottom: 30px;
box-shadow:
0 10px 30px rgba(0,0,0,0.4),
inset 0 0 20px rgba(255,255,255,0.03);
}
.add-section input {
flex: 1;
padding: 14px;
border: none;
border-radius: 12px;
background: rgba(255,255,255,0.08);
color: white;
font-size: 16px;
outline: none;
}
.add-section input::placeholder {
color: rgba(255,255,255,0.5);
}
#add-btn {
padding: 14px 28px;
background: linear-gradient(
135deg,
#FFD700,
#D4AC0D
);
color: #4a0f0f;
border: none;
border-radius: 14px;
font-weight: bold;
cursor: pointer;
transition: 0.2s;
box-shadow:
0 4px 20px rgba(255,215,0,0.3);
}
#add-btn:hover {
transform: translateY(-2px);
box-shadow:
0 8px 25px rgba(255,215,0,0.45);
}
.table-wrapper {
background: rgba(0,0,0,0.25);
backdrop-filter: blur(10px);
border-radius: 22px;
overflow: hidden;
border: 1px solid rgba(255,255,255,0.08);
box-shadow:
0 10px 40px rgba(0,0,0,0.45);
}
table {
width: 100%;
border-collapse: collapse;
}
thead {
background:
linear-gradient(
135deg,
#FFD700,
#D4AC0D
);
color: #4a0f0f;
}
th {
padding: 18px;
font-size: 17px;
}
td {
padding: 18px;
text-align: center;
color: white;
}
tbody tr {
border-bottom:
1px solid rgba(255,255,255,0.06);
transition: 0.2s;
}
tbody tr:hover {
background:
rgba(255,255,255,0.05);
}
.action-buttons {
display: flex;
justify-content: center;
gap: 10px;
}
.edit-btn,
.delete-btn {
border: none;
padding: 10px 16px;
border-radius: 10px;
cursor: pointer;
font-weight: bold;
transition: 0.2s;
}
.edit-btn {
background:
linear-gradient(
135deg,
#9B59B6,
#7D3C98
);
color: white;
}
.delete-btn {
background:
linear-gradient(
135deg,
#E74C3C,
#922B21
);
color: white;
}
.edit-btn:hover,
.delete-btn:hover {
transform: scale(1.05);
}
@media (max-width: 768px) {
.add-section {
flex-direction: column;
}
table {
font-size: 14px;
}
th,
td {
padding: 12px;
}
}
/* =========================
WHEEL PAGE
========================= */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Dana' !important;
}
/* =========================
WHEEL PAGE
========================= */
body {
min-height: 100vh;
background: linear-gradient(135deg, #8B0000 0%, #4a0f0f 50%, #2d0000 100%);
background: radial-gradient(ellipse at center, #9B241CDD 0%, #7B241C 55%, #7B241CBB 100%);
display: flex;
justify-content: center;
align-items: center;
font-family: Tahoma, sans-serif;
direction: rtl;
}
.bg-rays {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 200vw;
height: 200vh;
background: repeating-conic-gradient(
rgba(255,255,255,0.03) 0deg,
rgba(255,255,255,0.03) 10deg,
transparent 10deg,
transparent 20deg
);
pointer-events: none;
z-index: 0;
}
.page {
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
gap: 28px;
padding: 30px;
}
.page h1 {
color: #FFD700;
font-size: 36px;
text-shadow: 0 0 20px rgba(255, 215, 0, 0.5);
color: #e9e3c0;
font-size: 42px;
font-weight: bold;
text-shadow: 0 0 20px rgba(255,215,0,0.5);
letter-spacing: 2px;
}
.wheel-wrapper {
position: relative;
width: 500px;
height: 500px;
width: 520px;
height: 520px;
}
.wheel-wrapper canvas {
@@ -265,22 +72,21 @@ body {
}
#spin-btn {
padding: 16px 48px;
font-size: 20px;
padding: 18px 56px;
font-size: 24px;
font-weight: bold;
font-family: Tahoma, sans-serif;
background: linear-gradient(135deg, #FFD700, #D4AC0D);
background: linear-gradient(135deg, #e7d78a, #f2dd9d);
color: #4a0f0f;
border: none;
border-radius: 50px;
cursor: pointer;
box-shadow: 0 6px 25px rgba(255, 215, 0, 0.4);
box-shadow: 0 6px 25px rgba(255,215,0,0.4);
transition: 0.2s;
}
#spin-btn:hover {
transform: translateY(-3px);
box-shadow: 0 10px 30px rgba(255, 215, 0, 0.55);
box-shadow: 0 10px 30px rgba(255,215,0,0.55);
}
#spin-btn:disabled {
@@ -295,10 +101,10 @@ body {
}
.winner-text {
font-size: 28px;
font-size: 32px;
font-weight: bold;
color: #FFD700;
text-shadow: 0 0 20px rgba(255, 215, 0, 0.7);
text-shadow: 0 0 20px rgba(255,215,0,0.7);
animation: pop 0.4s ease;
}
@@ -308,18 +114,380 @@ body {
100% { transform: scale(1); opacity: 1; }
}
/* =========================
مودال برنده
========================= */
.modal {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.75);
display: flex;
align-items: center;
justify-content: center;
z-index: 100;
}
.modal.hidden { display: none; }
.modal-content {
background: white;
border-radius: 20px;
padding: 44px 36px;
text-align: center;
max-width: 420px;
width: 90%;
animation: popIn 0.4s ease;
direction: rtl;
}
@keyframes popIn {
0% { transform: scale(0.5); opacity: 0; }
70% { transform: scale(1.05); }
100% { transform: scale(1); opacity: 1; }
}
.modal-icon { font-size: 70px; margin-bottom: 12px; }
.modal-content h2 {
color: #7B241C;
font-size: 30px;
font-weight: bold;
margin-bottom: 10px;
}
#modal-prize-type {
color: #888;
font-size: 17px;
margin-bottom: 8px;
}
#modal-prize {
color: #C0392B;
font-size: 26px;
font-weight: bold;
margin-bottom: 14px;
}
#modal-description {
color: #555;
font-size: 17px;
margin-bottom: 28px;
line-height: 2;
}
#modal-close {
padding: 14px 48px;
background: linear-gradient(135deg, #FFD700, #D4AC0D);
color: #4a0f0f;
border: none;
border-radius: 50px;
font-size: 18px;
font-weight: bold;
cursor: pointer;
}
/* =========================
ADMIN PANEL
========================= */
.admin-container {
width: 150%;
max-width: 1100px;
margin: 0 auto;
padding: 30px 20px;
display: flex;
flex-direction: column;
gap: 24px;
}
.admin-header {
text-align: center;
margin-bottom: 20px;
}
.admin-header h1 {
color: #e9e8df;
font-size: 40px;
font-weight: bold;
text-shadow: 0 0 15px rgba(255,215,0,0.5);
}
.admin-header p {
color: #f5d6a0;
margin-top: 8px;
font-size: 18px;
}
.card {
background: rgba(0,0,0,0.25);
backdrop-filter: blur(8px);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 20px;
padding: 24px;
box-shadow: 0 10px 30px rgba(0,0,0,0.4);
}
.card h2 {
color: #efede1;
font-size: 20px;
font-weight: bold;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
.color-section {
display: flex;
flex-direction: column;
gap: 16px;
}
.color-section label {
color: #f5d6a0;
font-size: 16px;
}
.color-presets {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.preset {
width: 44px;
height: 44px;
border-radius: 8px;
cursor: pointer;
border: 3px solid transparent;
transition: transform 0.2s, border-color 0.2s;
}
.preset:hover { transform: scale(1.15); }
.preset.active { border-color: #e5e3d5; }
.color-custom {
display: flex;
align-items: center;
gap: 12px;
}
.color-preview {
display: flex;
align-items: center;
gap: 12px;
color: #f5d6a0;
font-size: 16px;
}
#color-preview-box {
width: 120px;
height: 36px;
border-radius: 8px;
border: 2px solid rgba(255,255,255,0.2);
transition: background 0.3s;
}
input[type="color"] {
width: 50px;
height: 38px;
border: none;
border-radius: 6px;
cursor: pointer;
padding: 2px;
background: transparent;
}
#apply-color {
padding: 10px 20px;
background: rgba(255,255,255,0.15);
color: white;
border: 1px solid rgba(255,255,255,0.2);
border-radius: 8px;
cursor: pointer;
font-size: 15px;
transition: 0.2s;
}
#apply-color:hover { background: rgba(255,255,255,0.25); }
.form-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.form-group {
display: flex;
flex-direction: column;
gap: 6px;
}
.form-group.full-width { grid-column: 1 / -1; }
.form-group label {
font-size: 15px;
color: #f5d6a0;
font-weight: bold;
}
.form-group input,
.form-group select,
.form-group textarea {
padding: 12px 14px;
border: 1px solid rgba(255,255,255,0.15);
border-radius: 8px;
font-size: 15px;
background: rgba(255,255,255,0.08);
color: white;
transition: border-color 0.2s;
}
.form-group input::placeholder,
.form-group textarea::placeholder {
color: rgba(255,255,255,0.4);
}
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
outline: none;
border-color: #e4e2d7;
}
.form-group select option {
background: #4a0f0f;
color: white;
}
.form-group textarea { height: 90px; resize: vertical; }
.btn-primary {
padding: 13px 32px;
background: linear-gradient(135deg, #e3dfb7, #ebe5be);
color: #4a0f0f;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: bold;
cursor: pointer;
transition: 0.2s;
}
.btn-primary:hover { transform: translateY(-2px); }
.btn-secondary {
padding: 13px 32px;
background: rgba(255,255,255,0.1);
color: white;
border: 1px solid rgba(255,255,255,0.2);
border-radius: 8px;
font-size: 16px;
cursor: pointer;
transition: 0.2s;
}
.btn-secondary:hover { background: rgba(255,255,255,0.2); }
.table-wrapper {
overflow-x: auto;
border-radius: 12px;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 15px;
}
thead tr {
background: linear-gradient(135deg, #ebe3b9, #ebe1bc);
color: #0f374a;
}
th, td {
padding: 14px 16px;
text-align: right;
}
tbody tr {
border-bottom: 1px solid rgba(255,255,255,0.06);
color: white;
transition: 0.2s;
}
tbody tr:hover { background: rgba(255,255,255,0.05); }
.badge {
padding: 5px 12px;
border-radius: 20px;
font-size: 13px;
font-weight: bold;
}
.badge-pooch { background: rgba(255,255,255,0.1); color: #ccc; }
.badge-discount { background: rgba(46,125,50,0.3); color: #81C784; }
.badge-coin { background: rgba(245,127,23,0.3); color: #FFD700; }
.edit-btn {
padding: 7px 16px;
background: linear-gradient(135deg, #9B59B6, #7D3C98);
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 14px;
margin-left: 6px;
transition: 0.2s;
}
.delete-btn {
padding: 7px 16px;
background: linear-gradient(135deg, #E74C3C, #922B21);
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 14px;
transition: 0.2s;
}
.edit-btn:hover, .delete-btn:hover { transform: scale(1.05); }
.modal-content.admin-modal {
background: #2d0000;
color: white;
max-width: 600px;
max-height: 90vh;
overflow-y: auto;
}
.modal-content.admin-modal h2 {
color: #FFD700;
margin-bottom: 20px;
}
.modal-actions {
display: flex;
gap: 12px;
margin-top: 20px;
justify-content: flex-end;
}
@media (max-width: 550px) {
.wheel-wrapper {
width: 340px;
height: 340px;
}
.wheel-wrapper { width: 340px; height: 340px; }
.page h1 { font-size: 28px; }
#spin-btn { font-size: 18px; padding: 14px 40px; }
.form-grid { grid-template-columns: 1fr; }
}
.page h1 {
font-size: 26px;
}
.title-section {
margin-top: 20px;
padding-top: 20px;
border-top: 1px solid rgba(255,255,255,0.1);
}
#spin-btn {
font-size: 16px;
padding: 12px 36px;
}
.title-section h3 {
color: #f5d6a0;
font-size: 15px;
margin-bottom: 14px;
font-family: 'Dana', Tahoma, sans-serif;
}