feat: integrate Sensei Spook mascot in 4 stances, speech bubbles, and style updates
This commit is contained in:
commit
e04672db2a
104 files changed
+8262
No files matched your search
+462
@@ -0,0 +1,462 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
/* Local Standalone Self-Hosted Fonts (Zero 3rd-party dependencies) */
|
||||
@font-face {
|
||||
font-family: 'CinzelTitle';
|
||||
src: url('/fonts/Cinzel.ttf') format('truetype');
|
||||
font-weight: 700 900;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'DojoFun';
|
||||
src: url('/fonts/ZCOOLKuaiLe.ttf') format('truetype');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
.font-cinzel {
|
||||
font-family: 'CinzelTitle', 'Georgia', serif;
|
||||
}
|
||||
|
||||
.font-dojo {
|
||||
font-family: 'DojoFun', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
||||
}
|
||||
|
||||
/* Fantasy Game UI & Spooky UI Elements */
|
||||
.game-panel {
|
||||
background: linear-gradient(180deg, #1f1438 0%, #120a22 100%);
|
||||
border: 2px solid #5b358a;
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.15),
|
||||
inset 0 -2px 0 rgba(0, 0, 0, 0.6),
|
||||
0 8px 24px rgba(0, 0, 0, 0.7),
|
||||
0 0 15px rgba(168, 85, 247, 0.2);
|
||||
border-radius: 16px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.game-panel-amber {
|
||||
background: linear-gradient(180deg, #241432 0%, #150920 100%);
|
||||
border: 2px solid #9a531e;
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(251, 191, 36, 0.25),
|
||||
inset 0 -2px 0 rgba(0, 0, 0, 0.7),
|
||||
0 8px 24px rgba(0, 0, 0, 0.8),
|
||||
0 0 20px rgba(249, 115, 22, 0.25);
|
||||
border-radius: 18px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.game-btn-gold {
|
||||
background: linear-gradient(180deg, #ff9d00 0%, #ea580c 45%, #c2410c 100%);
|
||||
border-top: 2px solid #fef08a;
|
||||
border-left: 2px solid #f59e0b;
|
||||
border-right: 2px solid #f59e0b;
|
||||
border-bottom: 3px solid #7c2d12;
|
||||
box-shadow:
|
||||
0 6px 0 #431407,
|
||||
0 10px 25px rgba(234, 88, 12, 0.5),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.4);
|
||||
color: #ffffff;
|
||||
text-shadow: 0 2px 2px rgba(0, 0, 0, 0.8);
|
||||
border-radius: 14px;
|
||||
transition: all 0.15s ease;
|
||||
}
|
||||
|
||||
.game-btn-gold:hover {
|
||||
filter: brightness(1.1);
|
||||
}
|
||||
|
||||
.game-btn-gold:active {
|
||||
transform: translateY(4px);
|
||||
box-shadow:
|
||||
0 2px 0 #431407,
|
||||
0 4px 10px rgba(234, 88, 12, 0.3),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.game-btn-dark {
|
||||
background: linear-gradient(180deg, #2d1a4d 0%, #1b0e32 100%);
|
||||
border-top: 1.5px solid #a855f7;
|
||||
border-left: 1.5px solid #7e22ce;
|
||||
border-right: 1.5px solid #7e22ce;
|
||||
border-bottom: 2.5px solid #3b0764;
|
||||
box-shadow:
|
||||
0 4px 0 #090314,
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||
color: #f3e8ff;
|
||||
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.9);
|
||||
border-radius: 14px;
|
||||
transition: all 0.15s ease;
|
||||
}
|
||||
|
||||
.game-btn-dark:active {
|
||||
transform: translateY(2px);
|
||||
box-shadow: 0 2px 0 #090314;
|
||||
}
|
||||
|
||||
/* Ornate RPG Ribbon Banner Header */
|
||||
.game-ribbon {
|
||||
background: linear-gradient(180deg, #7c3aed 0%, #581c87 100%);
|
||||
border: 1.5px solid #f59e0b;
|
||||
box-shadow:
|
||||
0 4px 12px rgba(0, 0, 0, 0.6),
|
||||
0 0 12px rgba(245, 158, 11, 0.3),
|
||||
inset 0 1px 0 rgba(255, 255, 255, 0.35);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
:root {
|
||||
--brand-primary: #ff6d00;
|
||||
--brand-accent: #22c55e;
|
||||
--brand-bg: #0f091f;
|
||||
--brand-surface: #1e1136;
|
||||
--brand-text: #ffffff;
|
||||
--brand-muted: rgba(238, 230, 255, 0.75);
|
||||
--sat: env(safe-area-inset-top, 0px);
|
||||
--sab: env(safe-area-inset-bottom, 0px);
|
||||
--sal: env(safe-area-inset-left, 0px);
|
||||
--sar: env(safe-area-inset-right, 0px);
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: var(--brand-bg);
|
||||
color: var(--brand-text);
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||
overflow: hidden;
|
||||
height: 100vh;
|
||||
height: 100dvh;
|
||||
width: 100vw;
|
||||
width: 100dvw;
|
||||
overscroll-behavior: none;
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
/* Kiosk and Responsive Container */
|
||||
.kiosk-viewport {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
height: 100dvh;
|
||||
max-width: 540px; /* Optimal vertical kiosk aspect on desktop */
|
||||
max-height: 960px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 25px 60px -10px rgba(0, 0, 0, 0.7), 0 0 40px rgba(168, 85, 247, 0.15);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.kiosk-viewport {
|
||||
width: 100vw;
|
||||
width: 100dvw;
|
||||
height: 100vh;
|
||||
height: 100dvh;
|
||||
max-width: 100vw;
|
||||
max-height: 100dvh;
|
||||
border-radius: 0 !important;
|
||||
border-width: 0 !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fullscreen Mode URL parameter reset (?mode=fullscreen) */
|
||||
body:has([data-fullscreen="true"]) {
|
||||
padding: 0 !important;
|
||||
background-color: var(--brand-bg);
|
||||
}
|
||||
|
||||
/* Subtle border vignette */
|
||||
.bg-radial-vignette {
|
||||
background: radial-gradient(circle at center, transparent 60%, rgba(10, 4, 20, 0.6) 100%);
|
||||
}
|
||||
|
||||
/* Spooky Halloween Animations */
|
||||
@keyframes auroraWave {
|
||||
0%, 100% {
|
||||
transform: translateX(-5%) skewY(-2deg) scaleY(0.9);
|
||||
opacity: 0.35;
|
||||
}
|
||||
50% {
|
||||
transform: translateX(5%) skewY(2deg) scaleY(1.15);
|
||||
opacity: 0.55;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes auroraPulse {
|
||||
0%, 100% {
|
||||
transform: scale(0.95);
|
||||
opacity: 0.25;
|
||||
}
|
||||
50% {
|
||||
transform: scale(1.05);
|
||||
opacity: 0.45;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes cloudDrift {
|
||||
0% {
|
||||
transform: translateX(-15px);
|
||||
opacity: 0.4;
|
||||
}
|
||||
50% {
|
||||
transform: translateX(20px);
|
||||
opacity: 0.7;
|
||||
}
|
||||
100% {
|
||||
transform: translateX(-15px);
|
||||
opacity: 0.4;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes batFlutter {
|
||||
0%, 100% {
|
||||
transform: translate(0, 0) rotate(0deg) scale(1);
|
||||
}
|
||||
25% {
|
||||
transform: translate(6px, -8px) rotate(6deg) scale(1.05);
|
||||
}
|
||||
50% {
|
||||
transform: translate(-4px, -12px) rotate(-4deg) scale(0.95);
|
||||
}
|
||||
75% {
|
||||
transform: translate(8px, -4px) rotate(4deg) scale(1.02);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes ghostFloat {
|
||||
0%, 100% {
|
||||
transform: translateY(0) rotate(0deg);
|
||||
}
|
||||
50% {
|
||||
transform: translateY(-12px) rotate(3deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes leafDrift {
|
||||
0% {
|
||||
transform: translateY(-20px) translateX(0) rotate(0deg);
|
||||
opacity: 0;
|
||||
}
|
||||
15% {
|
||||
opacity: 0.85;
|
||||
}
|
||||
50% {
|
||||
transform: translateY(400px) translateX(30px) rotate(180deg);
|
||||
opacity: 0.8;
|
||||
}
|
||||
85% {
|
||||
opacity: 0.7;
|
||||
}
|
||||
100% {
|
||||
transform: translateY(960px) translateX(-20px) rotate(360deg);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.animate-aurora-wave {
|
||||
animation: auroraWave 12s ease-in-out infinite alternate;
|
||||
}
|
||||
|
||||
.animate-aurora-pulse {
|
||||
animation: auroraPulse 8s ease-in-out infinite alternate;
|
||||
}
|
||||
|
||||
.animate-cloud-drift {
|
||||
animation: cloudDrift 18s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.bat-1 {
|
||||
animation: batFlutter 6s ease-in-out infinite;
|
||||
}
|
||||
.bat-2 {
|
||||
animation: batFlutter 8s ease-in-out 1.5s infinite;
|
||||
}
|
||||
.bat-3 {
|
||||
animation: batFlutter 7s ease-in-out 3s infinite;
|
||||
}
|
||||
|
||||
.spooky-ghost {
|
||||
animation: ghostFloat 4.5s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.leaf-1 {
|
||||
animation: leafDrift 14s linear infinite;
|
||||
}
|
||||
.leaf-2 {
|
||||
animation: leafDrift 18s linear 4s infinite;
|
||||
}
|
||||
.leaf-3 {
|
||||
animation: leafDrift 16s linear 8s infinite;
|
||||
}
|
||||
|
||||
/* Accessible Reduced Motion Settings */
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.animate-aurora-wave,
|
||||
.animate-aurora-pulse,
|
||||
.animate-cloud-drift,
|
||||
.bat-1,
|
||||
.bat-2,
|
||||
.bat-3,
|
||||
.spooky-ghost,
|
||||
.leaf-1,
|
||||
.leaf-2,
|
||||
.leaf-3 {
|
||||
animation: none !important;
|
||||
transform: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Pulsing loader dots */
|
||||
@keyframes dotPulse {
|
||||
0%, 100% {
|
||||
transform: scale(0.8);
|
||||
opacity: 0.4;
|
||||
}
|
||||
50% {
|
||||
transform: scale(1.3);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.animate-dot-1 {
|
||||
animation: dotPulse 1.4s ease-in-out infinite;
|
||||
}
|
||||
.animate-dot-2 {
|
||||
animation: dotPulse 1.4s ease-in-out 0.2s infinite;
|
||||
}
|
||||
.animate-dot-3 {
|
||||
animation: dotPulse 1.4s ease-in-out 0.4s infinite;
|
||||
}
|
||||
|
||||
/* Cartoon UI Utilities (Tactile, chunky, playful) */
|
||||
.btn-cartoon-orange {
|
||||
background: linear-gradient(180deg, #ff9100 0%, #ff6d00 50%, #ea580c 100%);
|
||||
border: 3px solid #1a0826;
|
||||
box-shadow: 0 6px 0 #9a3412, 0 10px 15px rgba(0, 0, 0, 0.4);
|
||||
transition: all 0.12s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
}
|
||||
.btn-cartoon-orange:hover {
|
||||
filter: brightness(1.08);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 0 #9a3412, 0 14px 20px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.btn-cartoon-orange:active {
|
||||
transform: translateY(4px);
|
||||
box-shadow: 0 2px 0 #9a3412, 0 4px 6px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.btn-cartoon-purple {
|
||||
background: linear-gradient(180deg, #a855f7 0%, #7e22ce 50%, #581c87 100%);
|
||||
border: 3px solid #1a0826;
|
||||
box-shadow: 0 6px 0 #3b0764, 0 10px 15px rgba(0, 0, 0, 0.4);
|
||||
transition: all 0.12s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
}
|
||||
.btn-cartoon-purple:hover {
|
||||
filter: brightness(1.08);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 0 #3b0764, 0 14px 20px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.btn-cartoon-purple:active {
|
||||
transform: translateY(4px);
|
||||
box-shadow: 0 2px 0 #3b0764, 0 4px 6px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.btn-cartoon-instagram {
|
||||
background: linear-gradient(135deg, #833ab4 0%, #c13584 30%, #e1306c 60%, #fd1d1d 80%, #f77737 100%);
|
||||
border: 3px solid #1a0826;
|
||||
box-shadow: 0 6px 0 #4c0519, 0 10px 15px rgba(0, 0, 0, 0.4);
|
||||
transition: all 0.12s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
}
|
||||
.btn-cartoon-instagram:hover {
|
||||
filter: brightness(1.08);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 8px 0 #4c0519, 0 14px 20px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.btn-cartoon-instagram:active {
|
||||
transform: translateY(4px);
|
||||
box-shadow: 0 2px 0 #4c0519, 0 4px 6px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.btn-cartoon-dark {
|
||||
background: linear-gradient(180deg, #2e1065 0%, #1e0e38 100%);
|
||||
border: 3px solid #090314;
|
||||
box-shadow: 0 5px 0 #090314, 0 8px 12px rgba(0, 0, 0, 0.4);
|
||||
transition: all 0.12s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
}
|
||||
.btn-cartoon-dark:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 7px 0 #090314, 0 12px 16px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.btn-cartoon-dark:active {
|
||||
transform: translateY(3px);
|
||||
box-shadow: 0 2px 0 #090314, 0 4px 6px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.card-cartoon {
|
||||
border: 3px solid #1a0826;
|
||||
box-shadow: 0 6px 0 rgba(10, 4, 20, 0.8), 0 12px 20px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
.card-cartoon-selected {
|
||||
border: 3px solid #ff9100;
|
||||
box-shadow: 0 6px 0 #9a3412, 0 0 24px rgba(255, 145, 0, 0.5);
|
||||
}
|
||||
|
||||
@keyframes cartoonWobble {
|
||||
0%, 100% {
|
||||
transform: rotate(0deg) scale(1);
|
||||
}
|
||||
25% {
|
||||
transform: rotate(-3deg) scale(1.03);
|
||||
}
|
||||
75% {
|
||||
transform: rotate(3deg) scale(1.03);
|
||||
}
|
||||
}
|
||||
|
||||
.animate-cartoon-wobble {
|
||||
animation: cartoonWobble 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* Media Print Optimization */
|
||||
@media print {
|
||||
body {
|
||||
background: #ffffff !important;
|
||||
color: #000000 !important;
|
||||
}
|
||||
|
||||
.no-print {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.print-only-container {
|
||||
display: flex !important;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.print-photo {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
object-fit: contain;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user