diff --git a/src/CiselnaVyprava/Components/CharacterSelect.razor b/src/CiselnaVyprava/Components/CharacterSelect.razor
index 0ce0526..eac5593 100644
--- a/src/CiselnaVyprava/Components/CharacterSelect.razor
+++ b/src/CiselnaVyprava/Components/CharacterSelect.razor
@@ -2,76 +2,71 @@
@inject ILocalStorageService Storage
-
-
🏰 ČÍSELNÁ VÝPRAVA
-
Záchrana Číselného Kráľovstva
-
-
-
-
1. Krok: Vyber si svoj ročník
-
-
-
-
-
-
+
+
-
-
-
2. Krok: Vyber si svojho hrdinu
-
- @foreach (var hero in DataLoader.Heroes)
- {
-
SelectHero(hero.Id)">
-
- @if (hero.Id == "knight")
- {
- ⚔️
- }
- else if (hero.Id == "mage")
- {
- 🧙♂️
- }
- else
- {
- 🏹
- }
-
-
@hero.Name
-
@hero.Title
-
@hero.Description
-
- ✨ Špeciál: @hero.SpecialAttackName
-
+
+
+
+
+
1. Tvoj ročník
+
+
+
+
- }
-
-
+
-
-
+
@code {
[Parameter] public EventCallback
OnProfileReady { get; set; }
diff --git a/src/CiselnaVyprava/wwwroot/css/app.css b/src/CiselnaVyprava/wwwroot/css/app.css
index e947d87..7496b0c 100644
--- a/src/CiselnaVyprava/wwwroot/css/app.css
+++ b/src/CiselnaVyprava/wwwroot/css/app.css
@@ -15,249 +15,357 @@
user-select: none;
}
-body, html {
+html, body {
margin: 0;
padding: 0;
+ width: 100vw;
+ height: 100vh;
+ max-height: 100dvh;
+ overflow: hidden !important;
font-family: var(--font-main);
background: #2c3e50;
background: radial-gradient(circle, #34495e 0%, #1a252f 100%);
color: #2c3e50;
- height: 100%;
- overflow-x: hidden;
}
-.game-viewport {
- max-width: 1024px;
- margin: 0 auto;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- padding: 16px;
-}
-
-/* ========================================================
- CHARACTER SELECT SCREEN
- ======================================================== */
-.character-select-screen {
+#app {
+ width: 100vw;
+ height: 100vh;
+ max-height: 100dvh;
+ overflow: hidden;
display: flex;
justify-content: center;
align-items: center;
- min-height: 90vh;
}
-.parchment-container {
+.game-viewport {
+ width: 100%;
+ max-width: 1024px;
+ height: 100vh;
+ max-height: 100dvh;
+ margin: 0 auto;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: clamp(6px, 1.5vh, 14px);
+ box-sizing: border-box;
+ overflow: hidden;
+}
+
+.viewport-fullscreen {
+ max-width: 100% !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+
+/* ========================================================
+ PC GAME MAIN MENU SCREEN (100% VIEWPORT FIT)
+ ======================================================== */
+.main-menu-fullscreen {
+ height: 100vh;
+ max-height: 100dvh;
+ width: 100vw;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ overflow: hidden;
+}
+
+.main-menu-overlay {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-between;
+ height: 100%;
+ max-height: 100dvh;
+ padding: clamp(14px, 3vh, 32px) 20px;
+ z-index: 2;
+ box-sizing: border-box;
+}
+
+.title-logo-box {
+ text-align: center;
+ animation: fadeIn 0.8s ease-out;
+}
+
+.title-crown {
+ font-size: clamp(2rem, 5vh, 3.2rem);
+ filter: drop-shadow(0 4px 10px rgba(0,0,0,0.4));
+ animation: bounce 1.5s infinite alternate;
+}
+
+.main-game-title {
+ font-size: clamp(2rem, 5.5vh, 3.4rem);
+ font-weight: 900;
+ color: #fff;
+ text-shadow:
+ 3px 3px 0px #8b5a2b,
+ -3px -3px 0px #8b5a2b,
+ 3px -3px 0px #8b5a2b,
+ -3px 3px 0px #8b5a2b,
+ 0 8px 16px rgba(0,0,0,0.6);
+ margin: 0;
+ letter-spacing: 2px;
+}
+
+.title-banner {
+ display: inline-block;
+ background: linear-gradient(135deg, #f39c12, #d68910);
+ color: white;
+ font-size: clamp(0.9rem, 2vh, 1.2rem);
+ font-weight: 700;
+ padding: 4px 22px;
+ border-radius: 20px;
+ border: 3px solid #fff;
+ box-shadow: 0 6px 14px rgba(0,0,0,0.3);
+ margin-top: 4px;
+}
+
+.menu-actions-parchment {
+ background: rgba(252, 246, 232, 0.95);
+ border: 4px solid var(--color-parchment-border);
+ border-radius: 20px;
+ padding: clamp(16px, 3vh, 28px) clamp(18px, 4vw, 36px);
+ display: flex;
+ flex-direction: column;
+ gap: clamp(8px, 1.5vh, 14px);
+ width: 100%;
+ max-width: 440px;
+ box-shadow: 0 12px 32px rgba(0,0,0,0.4);
+ backdrop-filter: blur(4px);
+}
+
+.pc-menu-btn {
+ background: #fff;
+ border: 3px solid #bdc3c7;
+ border-radius: 14px;
+ padding: clamp(8px, 1.8vh, 14px) 16px;
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ cursor: pointer;
+ font-family: var(--font-main);
+ transition: all 0.2s ease;
+ text-align: left;
+ box-shadow: 0 4px 0 #bdc3c7;
+}
+
+.pc-menu-btn:hover {
+ transform: translateY(-2px) scale(1.02);
+ border-color: var(--color-gold);
+}
+
+.pc-menu-btn.new-game-btn { background: #e8f8f5; border-color: #27ae60; box-shadow: 0 4px 0 #1e8449; }
+.pc-menu-btn.continue-btn { background: #fef9e7; border-color: var(--color-gold); box-shadow: 0 4px 0 var(--color-gold-dark); }
+.pc-menu-btn.reset-btn { background: transparent; border: 2px dashed #e74c3c; color: #c0392b; box-shadow: none; padding: 6px 12px; justify-content: center; }
+
+.btn-icon { font-size: clamp(1.4rem, 3.5vh, 2rem); }
+.btn-title { font-size: clamp(1.1rem, 2.5vh, 1.3rem); font-weight: 800; color: #2c3e50; }
+.btn-subtitle { font-size: clamp(0.75rem, 1.6vh, 0.85rem); color: #7f8c8d; }
+.btn-title-small { font-size: 0.85rem; font-weight: 700; }
+
+.main-menu-footer {
+ color: white;
+ font-weight: 600;
+ font-size: clamp(0.75rem, 1.6vh, 0.95rem);
+ background: rgba(0, 0, 0, 0.4);
+ padding: 4px 14px;
+ border-radius: 10px;
+}
+
+/* ========================================================
+ CHARACTER SELECT (100% VIEWPORT COMPACT 2-COLUMN)
+ ======================================================== */
+.character-select-screen {
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ overflow: hidden;
+}
+
+.select-card-compact {
background: var(--color-parchment);
border: 4px solid var(--color-parchment-border);
border-radius: 20px;
box-shadow: var(--shadow-storybook);
- padding: 32px;
+ padding: clamp(12px, 2vh, 22px);
width: 100%;
- max-width: 860px;
- text-align: center;
+ max-width: 900px;
+ max-height: 96vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
}
-.game-main-title {
- font-size: 2.6rem;
+.select-header {
+ text-align: center;
+ margin-bottom: clamp(6px, 1.2vh, 12px);
+}
+
+.select-header .game-main-title {
+ font-size: clamp(1.6rem, 3.8vh, 2.2rem);
color: var(--color-parchment-border);
margin: 0;
- text-shadow: 2px 2px 0px rgba(0,0,0,0.1);
+ text-shadow: none;
}
-.subtitle {
- font-size: 1.2rem;
+.select-header .subtitle {
+ font-size: clamp(0.85rem, 1.8vh, 1rem);
color: #7f8c8d;
- margin-top: 4px;
- margin-bottom: 24px;
+ margin: 2px 0 0 0;
+}
+
+.select-content-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: clamp(10px, 2vw, 20px);
+ align-items: start;
+}
+
+.select-col-left, .select-col-right {
+ display: flex;
+ flex-direction: column;
+ gap: clamp(8px, 1.5vh, 14px);
}
.selection-section {
- margin-bottom: 28px;
- text-align: left;
+ margin-bottom: 0;
}
.step-title {
- font-size: 1.3rem;
+ font-size: clamp(0.95rem, 2vh, 1.15rem);
color: #34495e;
- margin-bottom: 12px;
+ margin: 0 0 6px 0;
border-bottom: 2px dashed #d5dbdb;
- padding-bottom: 6px;
+ padding-bottom: 3px;
+ font-weight: 700;
}
.grade-toggle-group {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
}
-
.grade-btn {
background: #fff;
- border: 3px solid #bdc3c7;
- border-radius: 14px;
- padding: 16px;
+ border: 2px solid #bdc3c7;
+ border-radius: 10px;
+ padding: clamp(6px, 1vh, 10px) 12px;
cursor: pointer;
display: flex;
- flex-direction: column;
+ justify-content: space-between;
align-items: center;
- transition: all 0.2s ease;
font-family: var(--font-main);
-}
-
-.grade-btn:hover {
- transform: translateY(-2px);
- border-color: var(--color-gold);
+ transition: all 0.15s ease;
}
.grade-btn.active {
border-color: var(--color-gold);
background: #fef9e7;
- box-shadow: 0 4px 12px rgba(243, 156, 18, 0.3);
+ box-shadow: 0 2px 8px rgba(243, 156, 18, 0.3);
}
-.grade-badge {
- font-size: 1.3rem;
- font-weight: 700;
- color: #2c3e50;
-}
-
-.grade-desc {
- font-size: 0.95rem;
- color: #7f8c8d;
- margin-top: 4px;
-}
+.grade-badge { font-size: clamp(0.9rem, 2vh, 1.05rem); font-weight: 700; color: #2c3e50; }
+.grade-desc { font-size: 0.8rem; color: #7f8c8d; }
.heroes-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
- gap: 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
}
.hero-card {
background: #fff;
- border: 3px solid #bdc3c7;
- border-radius: 16px;
- padding: 16px;
- text-align: center;
+ border: 2px solid #bdc3c7;
+ border-radius: 12px;
+ padding: clamp(6px, 1.2vh, 10px) 12px;
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ align-items: center;
+ gap: 12px;
cursor: pointer;
- transition: all 0.25s ease;
-}
-
-.hero-card:hover {
- transform: translateY(-4px);
- border-color: var(--color-royal-blue);
+ transition: all 0.15s ease;
+ text-align: left;
}
.hero-card.selected-card {
border-color: var(--color-gold);
background: #fef9e7;
- box-shadow: 0 6px 16px rgba(243, 156, 18, 0.4);
+ box-shadow: 0 3px 10px rgba(243, 156, 18, 0.35);
}
-.hero-avatar {
- font-size: 3rem;
- margin-bottom: 8px;
-}
-
-.hero-name {
- margin: 4px 0;
- font-size: 1.2rem;
- color: #2c3e50;
-}
-
-.hero-title {
- font-size: 0.85rem;
- color: #95a5a6;
- font-weight: 600;
-}
-
-.hero-description {
- font-size: 0.85rem;
- color: #7f8c8d;
- margin: 8px 0;
-}
-
-.hero-skill {
- font-size: 0.8rem;
- background: #eaeded;
- padding: 4px 8px;
- border-radius: 8px;
- color: #34495e;
-}
+.hero-avatar { font-size: 1.8rem; }
+.hero-name { margin: 0; font-size: 1rem; color: #2c3e50; font-weight: 700; }
+.hero-title { font-size: 0.75rem; color: #95a5a6; display: block; }
+.hero-skill { font-size: 0.75rem; background: #eaeded; padding: 2px 6px; border-radius: 6px; }
.name-field-row {
display: flex;
- gap: 12px;
+ gap: 8px;
}
.hero-name-input {
flex: 1;
- padding: 14px 18px;
- font-size: 1.1rem;
+ padding: clamp(8px, 1.5vh, 12px);
+ font-size: clamp(0.9rem, 2vh, 1.05rem);
font-family: var(--font-main);
- border: 3px solid #bdc3c7;
- border-radius: 12px;
+ border: 2px solid #bdc3c7;
+ border-radius: 10px;
outline: none;
}
-.hero-name-input:focus {
- border-color: var(--color-royal-blue);
-}
-
.btn-start-quest {
background: var(--color-forest);
color: white;
- font-size: 1.2rem;
+ font-size: clamp(0.95rem, 2vh, 1.15rem);
font-weight: 700;
font-family: var(--font-main);
border: none;
- border-radius: 12px;
- padding: 14px 28px;
+ border-radius: 10px;
+ padding: clamp(8px, 1.5vh, 12px) clamp(12px, 2vw, 20px);
cursor: pointer;
- box-shadow: 0 4px 0 #1e8449;
- transition: all 0.15s ease;
-}
-
-.btn-start-quest:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 0 #1e8449;
-}
-
-.btn-start-quest:active {
- transform: translateY(2px);
- box-shadow: 0 2px 0 #1e8449;
+ box-shadow: 0 3px 0 #1e8449;
+ white-space: nowrap;
}
/* ========================================================
- WORLD MAP SCREEN
+ WORLD MAP (100% VIEWPORT FIT)
======================================================== */
.world-map-screen {
+ height: 100%;
display: flex;
flex-direction: column;
- gap: 20px;
+ gap: clamp(8px, 1.5vh, 14px);
+ overflow: hidden;
}
.map-top-bar {
background: var(--color-parchment);
border: 3px solid var(--color-parchment-border);
- border-radius: 14px;
- padding: 12px 20px;
+ border-radius: 12px;
+ padding: clamp(6px, 1vh, 10px) 16px;
display: flex;
justify-content: space-between;
align-items: center;
+ flex: 0 0 auto;
}
.player-pill {
display: flex;
align-items: center;
- gap: 10px;
+ gap: 8px;
font-weight: 700;
+ font-size: clamp(0.9rem, 2vh, 1.1rem);
}
.grade-tag {
background: var(--color-gold);
color: white;
- font-size: 0.8rem;
- padding: 2px 8px;
+ font-size: 0.75rem;
+ padding: 2px 6px;
border-radius: 6px;
}
@@ -265,96 +373,69 @@ body, html {
background: #ecf0f1;
border: 2px solid #bdc3c7;
border-radius: 8px;
- padding: 6px 12px;
+ padding: 4px 10px;
font-family: var(--font-main);
cursor: pointer;
font-weight: 600;
+ font-size: 0.85rem;
+}
+
+.worlds-carousel {
+ flex: 1 1 auto;
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+ gap: clamp(8px, 1.5vh, 14px);
+ padding-right: 4px;
}
.world-card {
background: var(--color-parchment);
- border: 4px solid var(--color-parchment-border);
- border-radius: 20px;
- padding: 24px;
+ border: 3px solid var(--color-parchment-border);
+ border-radius: 16px;
+ padding: clamp(10px, 2vh, 18px);
box-shadow: var(--shadow-storybook);
}
-.world-header h2 {
- margin: 0;
- color: #2c3e50;
-}
-
-.world-header p {
- color: #7f8c8d;
- margin: 4px 0 16px 0;
-}
+.world-header h2 { margin: 0; font-size: clamp(1.1rem, 2.5vh, 1.4rem); color: #2c3e50; }
+.world-header p { color: #7f8c8d; margin: 2px 0 clamp(8px, 1.5vh, 12px) 0; font-size: clamp(0.8rem, 1.8vh, 0.95rem); }
.levels-path {
display: flex;
- gap: 20px;
+ gap: clamp(8px, 1.5vw, 14px);
flex-wrap: wrap;
}
.level-node {
background: white;
- border: 3px solid #bdc3c7;
- border-radius: 16px;
- padding: 16px 20px;
+ border: 2px solid #bdc3c7;
+ border-radius: 12px;
+ padding: clamp(8px, 1.5vh, 12px) 14px;
display: flex;
flex-direction: column;
align-items: center;
- min-width: 140px;
+ min-width: 110px;
cursor: pointer;
font-family: var(--font-main);
- transition: all 0.2s ease;
+ transition: all 0.15s ease;
}
-.level-node.unlocked {
- border-color: var(--color-gold);
- box-shadow: 0 4px 8px rgba(0,0,0,0.1);
-}
-
-.level-node.unlocked:hover {
- transform: translateY(-4px) scale(1.03);
-}
-
-.level-node.completed {
- border-color: var(--color-forest);
- background: #e8f8f5;
-}
-
-.level-node.boss-node {
- border-color: var(--color-crimson);
- background: #fdedec;
-}
-
-.node-icon {
- font-size: 2rem;
- margin-bottom: 6px;
-}
-
-.level-title {
- font-weight: 700;
- font-size: 0.95rem;
-}
-
-.boss-tag {
- background: var(--color-crimson);
- color: white;
- font-size: 0.7rem;
- font-weight: 700;
- padding: 2px 6px;
- border-radius: 4px;
- margin-top: 4px;
-}
+.level-node.unlocked { border-color: var(--color-gold); box-shadow: 0 3px 6px rgba(0,0,0,0.1); }
+.level-node.completed { border-color: var(--color-forest); background: #e8f8f5; }
+.level-node.boss-node { border-color: var(--color-crimson); background: #fdedec; }
+.node-icon { font-size: clamp(1.3rem, 3vh, 1.8rem); margin-bottom: 2px; }
+.level-title { font-weight: 700; font-size: clamp(0.8rem, 1.8vh, 0.9rem); }
/* ========================================================
- BATTLE ARENA
+ BATTLE ARENA (100% VIEWPORT FIT - NO SCROLL)
======================================================== */
.battle-arena-wrapper {
+ height: 100%;
display: flex;
flex-direction: column;
- gap: 16px;
+ justify-content: space-between;
+ gap: clamp(4px, 1vh, 10px);
+ overflow: hidden;
}
.battle-header {
@@ -363,52 +444,35 @@ body, html {
align-items: center;
background: var(--color-parchment);
border: 3px solid var(--color-parchment-border);
- border-radius: 12px;
- padding: 8px 16px;
+ border-radius: 10px;
+ padding: clamp(4px, 0.8vh, 8px) 14px;
+ flex: 0 0 auto;
}
.btn-back {
background: #ecf0f1;
border: 2px solid #bdc3c7;
- border-radius: 8px;
- padding: 6px 14px;
+ border-radius: 6px;
+ padding: 3px 10px;
font-weight: 700;
cursor: pointer;
font-family: var(--font-main);
+ font-size: 0.85rem;
}
-.world-title {
- font-size: 1.2rem;
- font-weight: 700;
-}
-
-.boss-badge {
- background: var(--color-crimson);
- color: white;
- padding: 2px 8px;
- border-radius: 6px;
- font-size: 0.8rem;
- margin-left: 6px;
-}
-
-.combo-counter {
- font-size: 1rem;
- color: #7f8c8d;
-}
-
-.combo-counter.active-streak {
- color: var(--color-gold-dark);
- animation: bounce 0.5s infinite alternate;
-}
+.world-title { font-size: clamp(0.95rem, 2vh, 1.15rem); font-weight: 700; }
+.boss-badge { background: var(--color-crimson); color: white; padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; margin-left: 4px; }
+.combo-counter { font-size: clamp(0.85rem, 1.8vh, 1rem); color: #7f8c8d; }
+.combo-counter.active-streak { color: var(--color-gold-dark); animation: bounce 0.5s infinite alternate; }
.feedback-banner {
- padding: 10px 16px;
- border-radius: 10px;
+ padding: clamp(4px, 0.8vh, 8px) 12px;
+ border-radius: 8px;
text-align: center;
font-weight: 700;
- font-size: 1.1rem;
+ font-size: clamp(0.9rem, 2vh, 1.05rem);
color: white;
- animation: fadeIn 0.3s ease;
+ flex: 0 0 auto;
}
.feedback-critical { background: var(--color-gold); text-shadow: 1px 1px 2px black; }
@@ -420,14 +484,15 @@ body, html {
.arena-stage {
display: grid;
grid-template-columns: 1fr auto 1fr;
- gap: 20px;
+ gap: clamp(8px, 2vw, 16px);
align-items: center;
- background: radial-gradient(circle, #5d6d7e 0%, #34495e 100%);
- border: 4px solid var(--color-parchment-border);
- border-radius: 20px;
- padding: 20px;
- min-height: 280px;
+ border: 3px solid var(--color-parchment-border);
+ border-radius: 16px;
+ padding: clamp(6px, 1.2vh, 12px);
+ flex: 1 1 auto;
+ min-height: 0;
box-shadow: var(--shadow-storybook);
+ overflow: hidden;
}
.combatant {
@@ -435,56 +500,37 @@ body, html {
flex-direction: column;
align-items: center;
text-align: center;
+ justify-content: center;
+ height: 100%;
}
-.combatant-info {
- margin-bottom: 10px;
-}
-
+.combatant-info { margin-bottom: 4px; }
.combatant-name {
color: white;
font-weight: 700;
- font-size: 1.2rem;
+ font-size: clamp(0.95rem, 2.2vh, 1.15rem);
text-shadow: 1px 1px 3px black;
}
-.hp-hearts {
- display: flex;
- gap: 4px;
- margin-top: 4px;
- font-size: 1.4rem;
-}
+.hp-hearts { display: flex; gap: 3px; font-size: clamp(1rem, 2.2vh, 1.3rem); }
.hp-bar-wrapper {
- width: 140px;
- height: 18px;
+ width: clamp(100px, 15vw, 140px);
+ height: clamp(14px, 2vh, 18px);
background: #7f8c8d;
- border-radius: 10px;
+ border-radius: 8px;
border: 2px solid white;
position: relative;
overflow: hidden;
- margin-top: 4px;
}
-.hp-bar-fill {
- height: 100%;
- background: #e74c3c;
- transition: width 0.3s ease;
-}
-
-.hp-text {
- position: absolute;
- top: 0; left: 0; right: 0; bottom: 0;
- font-size: 0.75rem;
- color: white;
- font-weight: 700;
- line-height: 16px;
-}
+.hp-bar-fill { height: 100%; background: #e74c3c; transition: width 0.3s ease; }
+.hp-text { position: absolute; top: 0; left: 0; right: 0; bottom: 0; font-size: 0.7rem; color: white; font-weight: 700; line-height: 14px; }
.character-sprite-box {
position: relative;
- width: 160px;
- height: 200px;
+ width: clamp(90px, 16vw, 150px);
+ height: clamp(100px, 22vh, 180px);
display: flex;
justify-content: center;
align-items: center;
@@ -492,167 +538,143 @@ body, html {
.sprite-phase-indicator {
position: absolute;
- top: -10px;
+ top: -6px;
background: rgba(0, 0, 0, 0.6);
color: white;
- font-size: 0.75rem;
- padding: 2px 8px;
- border-radius: 10px;
+ font-size: 0.65rem;
+ padding: 1px 6px;
+ border-radius: 8px;
+ z-index: 3;
}
.character-image {
max-width: 100%;
max-height: 100%;
object-fit: contain;
- filter: drop-shadow(0 8px 16px rgba(0,0,0,0.35));
+ filter: drop-shadow(0 6px 12px rgba(0,0,0,0.35));
}
-
-
.timer-orb {
- width: 80px;
- height: 80px;
+ width: clamp(54px, 10vh, 74px);
+ height: clamp(54px, 10vh, 74px);
border-radius: 50%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: white;
- border: 4px solid white;
- box-shadow: 0 0 15px rgba(255, 255, 255, 0.4);
+ border: 3px solid white;
+ box-shadow: 0 0 12px rgba(255, 255, 255, 0.4);
}
.timer-green { background: var(--color-forest); }
.timer-yellow { background: var(--color-gold); }
.timer-red { background: var(--color-crimson); animation: pulse 0.5s infinite; }
-.timer-seconds { font-size: 1.2rem; font-weight: 700; }
-.timer-label { font-size: 0.7rem; font-weight: 600; }
+.timer-seconds { font-size: clamp(0.95rem, 2vh, 1.15rem); font-weight: 700; }
+.timer-label { font-size: 0.65rem; font-weight: 600; }
/* PARCHMENT ACTION BOARD */
.parchment-action-board {
background: var(--color-parchment);
- border: 4px solid var(--color-parchment-border);
- border-radius: 20px;
- padding: 20px;
+ border: 3px solid var(--color-parchment-border);
+ border-radius: 16px;
+ padding: clamp(6px, 1vh, 10px) clamp(8px, 1.5vw, 16px);
box-shadow: var(--shadow-storybook);
text-align: center;
+ flex: 0 0 auto;
}
-.equation-box {
- margin-bottom: 16px;
-}
-
-.equation-title {
- font-size: 1rem;
- font-weight: 700;
- color: #7f8c8d;
-}
-
+.equation-box { margin-bottom: clamp(4px, 0.8vh, 8px); }
+.equation-title { font-size: clamp(0.75rem, 1.6vh, 0.9rem); font-weight: 700; color: #7f8c8d; }
.equation-text {
- font-size: 2.8rem;
+ font-size: clamp(1.6rem, 4vh, 2.4rem);
color: #2c3e50;
- margin: 4px 0;
- letter-spacing: 2px;
+ margin: 2px 0;
+ letter-spacing: 1.5px;
}
/* KEYPAD */
.keypad-container {
- max-width: 300px;
+ max-width: 260px;
margin: 0 auto;
}
.keypad-display {
background: white;
- border: 3px solid #bdc3c7;
- border-radius: 12px;
- padding: 10px;
- font-size: 2rem;
+ border: 2px solid #bdc3c7;
+ border-radius: 8px;
+ padding: 4px;
+ font-size: clamp(1.3rem, 3vh, 1.6rem);
font-weight: 700;
- margin-bottom: 12px;
- min-height: 55px;
+ margin-bottom: 6px;
+ min-height: clamp(34px, 5vh, 42px);
+ display: flex;
+ justify-content: center;
+ align-items: center;
}
.keypad-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
- gap: 8px;
+ gap: clamp(4px, 0.8vh, 6px);
}
.key-btn {
background: white;
- border: 3px solid #bdc3c7;
- border-radius: 12px;
- font-size: 1.5rem;
+ border: 2px solid #bdc3c7;
+ border-radius: 8px;
+ font-size: clamp(1.1rem, 2.4vh, 1.3rem);
font-weight: 700;
font-family: var(--font-main);
- padding: 12px 0;
+ padding: clamp(4px, 0.9vh, 8px) 0;
cursor: pointer;
- box-shadow: 0 4px 0 #bdc3c7;
- transition: all 0.1s ease;
+ box-shadow: 0 3px 0 #bdc3c7;
}
-.key-btn:active {
- transform: translateY(3px);
- box-shadow: 0 1px 0 #bdc3c7;
-}
-
-.key-btn.action-key.backspace { background: #fadbd8; border-color: #e74c3c; box-shadow: 0 4px 0 #cb4335; }
-.key-btn.action-key.submit { background: #d4efdf; border-color: #27ae60; box-shadow: 0 4px 0 #1e8449; }
+.key-btn:active { transform: translateY(2px); box-shadow: 0 1px 0 #bdc3c7; }
+.key-btn.action-key.backspace { background: #fadbd8; border-color: #e74c3c; box-shadow: 0 3px 0 #cb4335; }
+.key-btn.action-key.submit { background: #d4efdf; border-color: #27ae60; box-shadow: 0 3px 0 #1e8449; }
/* CHOICES */
.choices-grid {
display: grid;
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
- gap: 16px;
- max-width: 500px;
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
+ gap: 10px;
+ max-width: 440px;
margin: 0 auto;
}
.choice-btn {
background: white;
- border: 4px solid var(--color-gold);
- border-radius: 16px;
- padding: 18px 0;
- font-size: 1.8rem;
+ border: 3px solid var(--color-gold);
+ border-radius: 12px;
+ padding: clamp(8px, 1.8vh, 14px) 0;
+ font-size: clamp(1.2rem, 2.8vh, 1.6rem);
font-weight: 700;
font-family: var(--font-main);
cursor: pointer;
- box-shadow: 0 5px 0 var(--color-gold-dark);
- transition: all 0.1s ease;
+ box-shadow: 0 4px 0 var(--color-gold-dark);
}
-.choice-btn:hover {
- background: #fef9e7;
- transform: translateY(-2px);
-}
-
-.choice-btn:active {
- transform: translateY(3px);
- box-shadow: 0 2px 0 var(--color-gold-dark);
-}
+.choice-btn:hover { background: #fef9e7; }
+.choice-btn:active { transform: translateY(2px); box-shadow: 0 2px 0 var(--color-gold-dark); }
/* VICTORY / DEFEAT CARDS */
-.battle-end-card {
- padding: 24px;
- border-radius: 16px;
-}
-
-.battle-end-card h2 { font-size: 2.2rem; margin: 0; }
-.battle-end-card p { font-size: 1.2rem; margin: 12px 0 24px 0; }
-
+.battle-end-card { padding: clamp(12px, 2vh, 20px); border-radius: 12px; }
+.battle-end-card h2 { font-size: clamp(1.5rem, 3.5vh, 2rem); margin: 0; }
+.battle-end-card p { font-size: clamp(0.95rem, 2vh, 1.1rem); margin: 6px 0 14px 0; }
.victory-card { background: #d4efdf; border: 3px solid #27ae60; color: #1e8449; }
.defeat-card { background: #fadbd8; border: 3px solid #e74c3c; color: #922b21; }
.action-btn {
- font-size: 1.2rem;
+ font-size: clamp(0.95rem, 2vh, 1.15rem);
font-weight: 700;
font-family: var(--font-main);
- padding: 12px 28px;
+ padding: 8px 22px;
border: none;
- border-radius: 12px;
+ border-radius: 10px;
cursor: pointer;
- box-shadow: 0 4px 0 rgba(0,0,0,0.2);
}
.next-level-btn { background: var(--color-forest); color: white; }
@@ -677,212 +699,31 @@ body, html {
.anim-hero-idle { animation: idleBreathe 3s infinite ease-in-out; }
.anim-enemy-idle { animation: idleBreathe 3s infinite ease-in-out 0.5s; }
-
.anim-hero-attack { animation: heroAttackDash 0.8s ease-out; }
.anim-enemy-attack { animation: enemyAttackDash 0.8s ease-out; }
.anim-hero-hurt, .anim-enemy-hurt { animation: hurtShake 0.5s ease-in-out; }
@keyframes idleBreathe {
0%, 100% { transform: scale(1) translateY(0); }
- 50% { transform: scale(1.02) translateY(-4px); }
+ 50% { transform: scale(1.02) translateY(-3px); }
}
@keyframes heroAttackDash {
0% { transform: translateX(0); }
- 30% { transform: translateX(40px) scale(1.1) rotate(5deg); }
+ 30% { transform: translateX(35px) scale(1.08) rotate(4deg); }
100% { transform: translateX(0); }
}
@keyframes enemyAttackDash {
0% { transform: translateX(0); }
- 30% { transform: translateX(-40px) scale(1.1) rotate(-5deg); }
+ 30% { transform: translateX(-35px) scale(1.08) rotate(-4deg); }
100% { transform: translateX(0); }
}
@keyframes hurtShake {
0%, 100% { transform: translateX(0); filter: brightness(1); }
- 20%, 60% { transform: translateX(-10px); filter: brightness(1.5) saturate(2); }
- 40%, 80% { transform: translateX(10px); }
-}
-
-/* ========================================================
- PC GAME MAIN MENU SCREEN
- ======================================================== */
-.viewport-fullscreen {
- max-width: 100% !important;
- padding: 0 !important;
- margin: 0 !important;
-}
-
-.main-menu-fullscreen {
- min-height: 100vh;
- width: 100vw;
- display: flex;
- justify-content: center;
- align-items: center;
- position: relative;
- overflow: hidden;
-}
-
-.main-menu-overlay {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: space-between;
- min-height: 90vh;
- padding: 40px 20px;
- z-index: 2;
-}
-
-.title-logo-box {
- text-align: center;
- margin-top: 20px;
- animation: fadeIn 0.8s ease-out;
-}
-
-.title-crown {
- font-size: 3.5rem;
- filter: drop-shadow(0 4px 10px rgba(0,0,0,0.4));
- animation: bounce 1.5s infinite alternate;
-}
-
-.main-game-title {
- font-size: 3.8rem;
- font-weight: 900;
- color: #fff;
- text-shadow:
- 3px 3px 0px #8b5a2b,
- -3px -3px 0px #8b5a2b,
- 3px -3px 0px #8b5a2b,
- -3px 3px 0px #8b5a2b,
- 0 8px 16px rgba(0,0,0,0.6);
- margin: 0;
- letter-spacing: 3px;
-}
-
-.title-banner {
- display: inline-block;
- background: linear-gradient(135deg, #f39c12, #d68910);
- color: white;
- font-size: 1.3rem;
- font-weight: 700;
- padding: 6px 28px;
- border-radius: 20px;
- border: 3px solid #fff;
- box-shadow: 0 6px 14px rgba(0,0,0,0.3);
- margin-top: 8px;
- text-shadow: 1px 1px 2px rgba(0,0,0,0.4);
-}
-
-.menu-actions-parchment {
- background: rgba(252, 246, 232, 0.95);
- border: 5px solid var(--color-parchment-border);
- border-radius: 24px;
- padding: 30px 36px;
- display: flex;
- flex-direction: column;
- gap: 16px;
- width: 100%;
- max-width: 480px;
- box-shadow: 0 12px 32px rgba(0,0,0,0.4);
- backdrop-filter: blur(4px);
- animation: fadeIn 1s ease-out;
-}
-
-.pc-menu-btn {
- background: #fff;
- border: 3px solid #bdc3c7;
- border-radius: 16px;
- padding: 14px 20px;
- display: flex;
- align-items: center;
- gap: 16px;
- cursor: pointer;
- font-family: var(--font-main);
- transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
- text-align: left;
- box-shadow: 0 4px 0 #bdc3c7;
-}
-
-.pc-menu-btn:hover {
- transform: translateY(-4px) scale(1.02);
- border-color: var(--color-gold);
-}
-
-.pc-menu-btn:active {
- transform: translateY(2px) scale(0.98);
-}
-
-.pc-menu-btn.new-game-btn {
- background: #e8f8f5;
- border-color: #27ae60;
- box-shadow: 0 5px 0 #1e8449;
-}
-
-.pc-menu-btn.new-game-btn:hover {
- background: #d4efdf;
- box-shadow: 0 8px 0 #1e8449;
-}
-
-.pc-menu-btn.continue-btn {
- background: #fef9e7;
- border-color: var(--color-gold);
- box-shadow: 0 5px 0 var(--color-gold-dark);
-}
-
-.pc-menu-btn.continue-btn:hover {
- background: #fdebd0;
- box-shadow: 0 8px 0 var(--color-gold-dark);
-}
-
-.pc-menu-btn.reset-btn {
- background: transparent;
- border: 2px dashed #e74c3c;
- color: #c0392b;
- box-shadow: none;
- padding: 8px 16px;
- justify-content: center;
-}
-
-.pc-menu-btn.reset-btn:hover {
- background: #fadbd8;
- transform: translateY(-2px);
-}
-
-.btn-icon {
- font-size: 2.2rem;
-}
-
-.btn-text-block {
- display: flex;
- flex-direction: column;
-}
-
-.btn-title {
- font-size: 1.4rem;
- font-weight: 800;
- color: #2c3e50;
-}
-
-.btn-subtitle {
- font-size: 0.85rem;
- color: #7f8c8d;
- margin-top: 2px;
-}
-
-.btn-title-small {
- font-size: 0.95rem;
- font-weight: 700;
-}
-
-.main-menu-footer {
- color: white;
- font-weight: 600;
- text-shadow: 1px 1px 3px rgba(0,0,0,0.8);
- font-size: 1rem;
- background: rgba(0, 0, 0, 0.4);
- padding: 6px 18px;
- border-radius: 12px;
+ 20%, 60% { transform: translateX(-8px); filter: brightness(1.4) saturate(1.8); }
+ 40%, 80% { transform: translateX(8px); }
}
/* ========================================================
@@ -892,49 +733,36 @@ body, html {
display: flex;
justify-content: center;
align-items: center;
- min-height: 100vh;
+ height: 100vh;
+ max-height: 100dvh;
width: 100vw;
background: radial-gradient(circle, #34495e 0%, #1a252f 100%);
font-family: var(--font-main, sans-serif);
+ overflow: hidden;
}
.wasm-loader-box {
background: #fcf6e8;
border: 4px solid #8b5a2b;
- border-radius: 24px;
- padding: 36px 48px;
+ border-radius: 20px;
+ padding: clamp(20px, 4vh, 32px) clamp(24px, 4vw, 44px);
text-align: center;
box-shadow: 0 12px 32px rgba(0,0,0,0.5);
- max-width: 420px;
+ max-width: 400px;
width: 90%;
}
-.wasm-crown {
- font-size: 3rem;
- animation: bounce 1.2s infinite alternate;
-}
-
-.wasm-title {
- font-size: 2.2rem;
- color: #8b5a2b;
- margin: 8px 0 4px 0;
- font-weight: 800;
-}
-
-.wasm-subtitle {
- color: #7f8c8d;
- font-size: 1rem;
- margin-bottom: 20px;
-}
+.wasm-crown { font-size: clamp(2rem, 5vh, 2.8rem); animation: bounce 1.2s infinite alternate; }
+.wasm-title { font-size: clamp(1.6rem, 4vh, 2rem); color: #8b5a2b; margin: 6px 0 2px 0; font-weight: 800; }
+.wasm-subtitle { color: #7f8c8d; font-size: 0.9rem; margin-bottom: 16px; }
.wasm-progress-bar {
width: 100%;
- height: 14px;
+ height: 12px;
background: #e0d7c6;
- border-radius: 10px;
+ border-radius: 8px;
overflow: hidden;
border: 2px solid #8b5a2b;
- position: relative;
}
.wasm-progress-fill {
@@ -942,7 +770,7 @@ body, html {
width: 100%;
background: linear-gradient(90deg, #f39c12, #27ae60, #f39c12);
background-size: 200% 100%;
- border-radius: 8px;
+ border-radius: 6px;
animation: progressShimmer 1.5s infinite linear;
}
@@ -958,7 +786,7 @@ body, html {
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
- padding: 0.8rem 1.25rem 0.8rem 1.25rem;
+ padding: 0.8rem 1.25rem;
position: fixed;
width: 100%;
z-index: 10000;
@@ -966,15 +794,5 @@ body, html {
font-weight: 700;
}
-#blazor-error-ui .reload {
- color: #1e8449;
- margin-left: 1rem;
- text-decoration: underline;
-}
-
-#blazor-error-ui .dismiss {
- cursor: pointer;
- position: absolute;
- right: 0.75rem;
- top: 0.5rem;
-}
+#blazor-error-ui .reload { color: #1e8449; margin-left: 1rem; text-decoration: underline; }
+#blazor-error-ui .dismiss { cursor: pointer; position: absolute; right: 0.75rem; top: 0.5rem; }
diff --git a/src/CiselnaVyprava/wwwroot/favicon.ico b/src/CiselnaVyprava/wwwroot/favicon.ico
new file mode 100644
index 0000000..54f4cc4
--- /dev/null
+++ b/src/CiselnaVyprava/wwwroot/favicon.ico
@@ -0,0 +1,35 @@
+
diff --git a/src/CiselnaVyprava/wwwroot/favicon.png b/src/CiselnaVyprava/wwwroot/favicon.png
new file mode 100644
index 0000000..54f4cc4
--- /dev/null
+++ b/src/CiselnaVyprava/wwwroot/favicon.png
@@ -0,0 +1,35 @@
+
diff --git a/src/CiselnaVyprava/wwwroot/favicon.svg b/src/CiselnaVyprava/wwwroot/favicon.svg
new file mode 100644
index 0000000..54f4cc4
--- /dev/null
+++ b/src/CiselnaVyprava/wwwroot/favicon.svg
@@ -0,0 +1,35 @@
+
diff --git a/src/CiselnaVyprava/wwwroot/index.html b/src/CiselnaVyprava/wwwroot/index.html
index d2a35ef..d17b325 100644
--- a/src/CiselnaVyprava/wwwroot/index.html
+++ b/src/CiselnaVyprava/wwwroot/index.html
@@ -9,10 +9,13 @@
+
+
+
diff --git a/src/CiselnaVyprava/wwwroot/web.config b/src/CiselnaVyprava/wwwroot/web.config
new file mode 100644
index 0000000..b9cf00e
--- /dev/null
+++ b/src/CiselnaVyprava/wwwroot/web.config
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+