feat: nový vzhled Neon Genesis Evangelion
CI / Generate TypeScript types (push) Successful in 11s
CI / Server unit tests (push) Successful in 27s
CI / Build server (push) Successful in 30s
CI / Build client (push) Successful in 41s
CI / Playwright E2E tests (push) Successful in 1m54s
CI / Build and push Docker image (push) Successful in 45s
CI / Notify (push) Successful in 2s
CI / Generate TypeScript types (push) Successful in 11s
CI / Server unit tests (push) Successful in 27s
CI / Build server (push) Successful in 30s
CI / Build client (push) Successful in 41s
CI / Playwright E2E tests (push) Successful in 1m54s
CI / Build and push Docker image (push) Successful in 45s
CI / Notify (push) Successful in 2s
This commit is contained in:
10 files changed
+911
-6
No files matched your search
@@ -15,6 +15,7 @@ import './themes/mlp.scss';
|
||||
import './themes/hellgirl.scss';
|
||||
import './themes/kon.scss';
|
||||
import './themes/bocchi.scss';
|
||||
import './themes/evangelion.scss';
|
||||
import { faCircleCheck, faNoteSticky, faTrashCan, faComment } from '@fortawesome/free-regular-svg-icons';
|
||||
import { useSettings } from './context/settings';
|
||||
import Footer from './components/Footer';
|
||||
|
||||
@@ -68,6 +68,19 @@
|
||||
}
|
||||
}
|
||||
|
||||
// Styl Evangelion: emoji v oranžovém šestiúhelníku jako AT pole
|
||||
.eater-badge-evangelion {
|
||||
display: inline-grid;
|
||||
place-items: center;
|
||||
font-size: 15px;
|
||||
line-height: 1;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
clip-path: polygon(25% 3%, 75% 3%, 100% 50%, 75% 97%, 25% 97%, 0 50%);
|
||||
background: radial-gradient(circle, #ffe3c4 0 45%, #f26b00 46% 100%);
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
// Odznak a jméno drží na jednom řádku (úzký sloupec „Člen" na stránce objednávek)
|
||||
.user-info:has(.eater-badge) {
|
||||
display: inline-flex;
|
||||
|
||||
@@ -37,12 +37,19 @@ const BOCCHI_LEVELS = [
|
||||
{ minItems: 2, emoji: '🥭', title: 'Úroveň Bocchi — dvojitý oběd v klidu v krabici od manga' },
|
||||
];
|
||||
|
||||
/** Úrovně ve stylu Evangelion — emoji v oranžovém šestiúhelníku jako AT pole. Seřazeno od nejvyšší úrovně. */
|
||||
const EVA_LEVELS = [
|
||||
{ minItems: 3, emoji: '👹', title: 'Úroveň Unit-01 v berserku — sežere i S² motor Anděla' },
|
||||
{ minItems: 2, emoji: '🍛', title: 'Úroveň Misato — dvojitá porce jejího legendárního kari (na vlastní nebezpečí)' },
|
||||
];
|
||||
|
||||
/** Úrovně podle stylu pro odznaky s emoji. */
|
||||
const EMOJI_LEVELS: Partial<Record<StyleTheme, typeof MLP_LEVELS>> = {
|
||||
mlp: MLP_LEVELS,
|
||||
hellgirl: HG_LEVELS,
|
||||
kon: KON_LEVELS,
|
||||
bocchi: BOCCHI_LEVELS,
|
||||
evangelion: EVA_LEVELS,
|
||||
};
|
||||
|
||||
type Props = {
|
||||
@@ -50,7 +57,7 @@ type Props = {
|
||||
items: number,
|
||||
};
|
||||
|
||||
/** Odznak s postavou u strávníků s více jídly — jen ve stylech Umamusume, My Little Pony, Hell Girl, K-ON! a Bocchi the Rock!. */
|
||||
/** Odznak s postavou u strávníků s více jídly — jen ve stylech Umamusume, My Little Pony, Hell Girl, K-ON!, Bocchi the Rock! a Evangelion. */
|
||||
export default function EaterBadge({ items }: Readonly<Props>) {
|
||||
const styleTheme = useSettings()?.styleTheme;
|
||||
const isUma = styleTheme === 'umamusume';
|
||||
|
||||
@@ -473,3 +473,90 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// Konfety ve stylu Neon Genesis Evangelion
|
||||
// ============================================
|
||||
.confetti-eva {
|
||||
filter: drop-shadow(0 0 6px rgb(242 107 0 / 0.45)) drop-shadow(0 3px 3px rgb(0 0 0 / 0.3));
|
||||
}
|
||||
|
||||
// Štítky jako hlášení na monitorech NERV — ostré hrany, kondenzované verzálky
|
||||
.confetti-eva-badge {
|
||||
padding: 3px 14px;
|
||||
border: 1px solid #f26b00;
|
||||
color: #fff;
|
||||
font-family: 'Barlow Condensed', 'Arial Narrow', sans-serif;
|
||||
font-weight: 700;
|
||||
font-size: 1.15rem;
|
||||
letter-spacing: 0.12em;
|
||||
text-transform: uppercase;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
// „おめでとう" z finále seriálu — title card: bílé mincho na černé, s výstražnými pruhy
|
||||
.confetti-eva-banner {
|
||||
position: absolute;
|
||||
top: 38%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
padding: 16px 48px 20px;
|
||||
font-family: 'Shippori Mincho', 'Noto Serif JP', serif;
|
||||
font-weight: 800;
|
||||
font-size: clamp(2rem, 7vw, 4.2rem);
|
||||
letter-spacing: 0.08em;
|
||||
white-space: nowrap;
|
||||
color: #fff;
|
||||
background:
|
||||
repeating-linear-gradient(-45deg, #f26b00 0 10px, #111214 10px 20px) top / 100% 6px no-repeat,
|
||||
repeating-linear-gradient(-45deg, #f26b00 0 10px, #111214 10px 20px) bottom / 100% 6px no-repeat,
|
||||
#0d0e10;
|
||||
box-shadow: 0 0 0 1px #f26b00, 0 0 40px rgb(242 107 0 / 0.35);
|
||||
animation: eva-banner 2.6s ease both;
|
||||
}
|
||||
|
||||
// Ostrý střih jako mezi title cardy, na konci rychlé zhasnutí monitoru
|
||||
@keyframes eva-banner {
|
||||
0%, 6% { opacity: 0; transform: translate(-50%, -50%) scaleY(0.04); }
|
||||
7% { opacity: 1; transform: translate(-50%, -50%) scaleY(1); }
|
||||
9% { opacity: 0.4; }
|
||||
11%, 82% { opacity: 1; transform: translate(-50%, -50%) scaleY(1); }
|
||||
92% { opacity: 1; transform: translate(-50%, -50%) scale(1.04, 0.04); }
|
||||
100% { opacity: 0; transform: translate(-50%, -50%) scale(0, 0.04); }
|
||||
}
|
||||
|
||||
// Postava s hláškou — šestiúhelníkový odznak a bublina jako okno velínu
|
||||
.confetti-evangelion-voice {
|
||||
.confetti-mlp-avatar {
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
clip-path: polygon(25% 3%, 75% 3%, 100% 50%, 75% 97%, 25% 97%, 0 50%);
|
||||
background: linear-gradient(135deg, var(--mlp-speaker, #f26b00), #111214);
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.confetti-mlp-bubble {
|
||||
background: #0d0e10;
|
||||
color: #f2efe6;
|
||||
border: 1px solid #f26b00;
|
||||
border-left: 4px solid var(--mlp-speaker, #f26b00);
|
||||
border-radius: 0;
|
||||
box-shadow: 0 0 18px rgb(242 107 0 / 0.3);
|
||||
font-family: 'Barlow Condensed', 'Arial Narrow', sans-serif;
|
||||
|
||||
p {
|
||||
font-weight: 600;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
small {
|
||||
color: #ff8a1f;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
&::before {
|
||||
border-right-color: #f26b00;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -76,6 +76,21 @@ const BOCCHI_SPEAKERS = [
|
||||
{ name: 'Seika Ijichi', emoji: '🎛️', color: '#7a4fc0', quote: 'Najezte se pořádně. Večer v STARRY neodfláknete zkoušku.' },
|
||||
{ name: 'Futari Gotoh', emoji: '🐕', color: '#f08fb4', quote: 'Ségra zase obědvá ve skříni! Jimihen, pojď se podívat!' },
|
||||
];
|
||||
const EVA_EMOJI = ['🟣', '🟢', '🔶', '⚠️', '🌙', '🍛', '🐧', '🎧', '💠', '🔴', '🛰️', '📐'];
|
||||
// Hlášky z Evangelionu (PATTERN BLUE, AT pole, MAGI, „Anta baka?!", „Nesmím utéct", Pen Pen...)
|
||||
const EVA_BADGES = ['PATTERN BLUE', 'EMERGENCY', 'MAGI: SCHVÁLENO', 'SYNC 400 %', 'AT FIELD', 'Nesmím utéct!', 'Anta baka?!', '使徒、襲来', 'NERV', 'Pen Pen!'];
|
||||
const EVA_BADGE_COLORS = ['#f26b00', '#d81e1e', '#5b2a86', '#111214', '#3f8a2a'];
|
||||
/** Piloti a velení NERV s „hláškou" po finálním výsledku. */
|
||||
const EVA_SPEAKERS = [
|
||||
{ name: 'Shinji Ikari', emoji: '🎧', color: '#5b2a86', quote: 'Nesmím utéct… nesmím utéct… dobře, jdu na oběd.' },
|
||||
{ name: 'Rei Ayanami', emoji: '🌙', color: '#6fa8d6', quote: 'Nevím, co na to říct. Ale maso jíst nebudu.' },
|
||||
{ name: 'Asuka Langley Sōryū', emoji: '🔴', color: '#d81e1e', quote: 'Anta baka?! Tohle je přece jasně nejlepší volba!' },
|
||||
{ name: 'Misato Katsuragi', emoji: '🍺', color: '#3b3b8f', quote: 'Výborně! A k tomu jedno vychlazené Yebisu… ááách!' },
|
||||
{ name: 'Gendō Ikari', emoji: '🕶️', color: '#111214', quote: 'Všechno probíhá podle scénáře.' },
|
||||
{ name: 'Ritsuko Akagi', emoji: '🧪', color: '#c9a227', quote: 'MAGI rozhodly jednomyslně: Melchior, Balthasar i Caspar.' },
|
||||
{ name: 'Kaworu Nagisa', emoji: '🎹', color: '#8c93a8', quote: 'Oběd je vrcholem lidské kultury. Nemyslíš, Shinji-kun?' },
|
||||
{ name: 'Pen Pen', emoji: '🐧', color: '#2f8fb3', quote: '(spokojeně zakváká a míří k lednici)' },
|
||||
];
|
||||
/** Styly, jejichž konfety tvoří emoji a samolepky s hláškami (a po finále promluví postava s emoji). */
|
||||
const EMOJI_CONFETTI: Partial<Record<WheelTheme, {
|
||||
prefix: string, badges: string[], colors: string[], emoji: string[],
|
||||
@@ -86,6 +101,7 @@ const EMOJI_CONFETTI: Partial<Record<WheelTheme, {
|
||||
hellgirl: { prefix: 'confetti-hg', badges: HG_BADGES, colors: HG_BADGE_COLORS, emoji: HG_EMOJI, speakers: HG_SPEAKERS, banner: '🏮 地獄流し 🏮' },
|
||||
kon: { prefix: 'confetti-kon', badges: KON_BADGES, colors: KON_BADGE_COLORS, emoji: KON_EMOJI, speakers: KON_SPEAKERS, banner: '🎸 放課後ティータイム 🍰' },
|
||||
bocchi: { prefix: 'confetti-bocchi', badges: BOCCHI_BADGES, colors: BOCCHI_BADGE_COLORS, emoji: BOCCHI_EMOJI, speakers: BOCCHI_SPEAKERS, banner: '🎸 結束バンド 🎸' },
|
||||
evangelion: { prefix: 'confetti-eva', badges: EVA_BADGES, colors: EVA_BADGE_COLORS, emoji: EVA_EMOJI, speakers: EVA_SPEAKERS, banner: '👏 おめでとう 👏' },
|
||||
};
|
||||
const DURATION_MS = 6400;
|
||||
|
||||
@@ -239,7 +255,7 @@ export default function WheelConfetti({ theme, burstKey, big = false }: Readonly
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [burstKey]);
|
||||
|
||||
// Ostatní tematické styly: hlášku pronese náhodná postava (Mane 6, Ai Enma, Houkago Tea Time, Kessoku Band...)
|
||||
// Ostatní tematické styly: hlášku pronese náhodná postava (Mane 6, Ai Enma, Houkago Tea Time, Kessoku Band, piloti NERV...)
|
||||
const emojiConfetti = EMOJI_CONFETTI[theme];
|
||||
const emojiSpeaker = useMemo(
|
||||
() => big && emojiConfetti ? pick(emojiConfetti.speakers) : undefined,
|
||||
|
||||
@@ -1536,6 +1536,270 @@
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// STYL NEON GENESIS EVANGELION kola štěstí (dle stylu zvoleného v nastavení).
|
||||
// Výseče v barvách NERV a Evangelionů (oranžová, rudá, Unit-01 fialová a zelená,
|
||||
// Unit-00 modrá), ostré hrany a výstražné pruhy, střed kola jako jádro Anděla.
|
||||
// ============================================
|
||||
.spin-wheel-modal.spin-theme-evangelion {
|
||||
--eva-font: 'Barlow Condensed', 'Arial Narrow', sans-serif;
|
||||
--eva-display: 'Shippori Mincho', 'Noto Serif JP', serif;
|
||||
--eva-orange: #f26b00;
|
||||
--eva-orange-text: #b84d00;
|
||||
--eva-red: #d81e1e;
|
||||
--eva-line: #c9c6bd;
|
||||
--eva-panel: #ffffff;
|
||||
--eva-text: #111214;
|
||||
// NERV oranžová, Unit-01 fialová a zelená, Unit-02 rudá, Unit-00 modrá a černá velína
|
||||
--wheel-c0: #f26b00;
|
||||
--wheel-c1: #5b2a86;
|
||||
--wheel-c2: #d81e1e;
|
||||
--wheel-c3: #3f8a2a;
|
||||
--wheel-c4: #2f6fb3;
|
||||
--wheel-c5: #111214;
|
||||
--wheel-rim: #111214;
|
||||
--wheel-hub: #d81e1e;
|
||||
|
||||
font-family: var(--eva-font);
|
||||
|
||||
.modal-content {
|
||||
border: 1px solid var(--eva-orange);
|
||||
border-radius: 0;
|
||||
overflow: hidden;
|
||||
background: #f1efe9;
|
||||
color: var(--eva-text);
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
background:
|
||||
repeating-linear-gradient(-45deg, #f26b00 0 10px, #111214 10px 20px) bottom / 100% 5px no-repeat,
|
||||
#0d0e10;
|
||||
border-bottom: none;
|
||||
border-radius: 0;
|
||||
|
||||
h2 {
|
||||
color: #fff;
|
||||
font-family: var(--eva-display);
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.btn-close {
|
||||
filter: invert(1) grayscale(1) brightness(2);
|
||||
opacity: 0.9;
|
||||
}
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
border-top: 1px solid var(--eva-line);
|
||||
}
|
||||
|
||||
.spin-steps span {
|
||||
font-family: var(--eva-font);
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
background: #e3e0d8;
|
||||
color: #75777e;
|
||||
border-radius: 0;
|
||||
padding: 4px 16px;
|
||||
|
||||
&.active {
|
||||
background: var(--eva-orange);
|
||||
color: #000;
|
||||
}
|
||||
|
||||
&.done {
|
||||
background: #111214;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.btn {
|
||||
font-family: var(--eva-font);
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: var(--eva-orange);
|
||||
border: 1px solid var(--eva-orange);
|
||||
color: #000;
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: #ff8a1f;
|
||||
border-color: #ff8a1f;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
background: #c9c6bd;
|
||||
border-color: #c9c6bd;
|
||||
color: #5f6168;
|
||||
}
|
||||
}
|
||||
|
||||
// Tlačítko roztočení — aktivační spínač s výstražnými pruhy kolem
|
||||
.spin-button {
|
||||
font-size: 1.2rem;
|
||||
letter-spacing: 0.2em;
|
||||
padding: 12px 36px;
|
||||
box-shadow: 0 0 0 3px #111214;
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
box-shadow: 0 0 0 3px #111214, 0 0 0 4px var(--eva-red), 0 0 16px rgb(216 30 30 / 0.5);
|
||||
}
|
||||
|
||||
&:active:not(:disabled) {
|
||||
background: var(--eva-red);
|
||||
border-color: var(--eva-red);
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-outline-primary {
|
||||
background: transparent;
|
||||
border: 1px solid var(--eva-orange);
|
||||
color: var(--eva-orange-text);
|
||||
|
||||
&:hover {
|
||||
background: var(--eva-orange);
|
||||
color: #000;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: #2b2d31;
|
||||
border: 1px solid #2b2d31;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.spin-source {
|
||||
background: #e3e0d8;
|
||||
border-radius: 0;
|
||||
|
||||
> .btn {
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
|
||||
> .btn-primary {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
> .btn-outline-primary {
|
||||
border-color: transparent;
|
||||
color: var(--eva-text);
|
||||
|
||||
&:hover {
|
||||
background: #fff;
|
||||
color: var(--eva-text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.spin-result {
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.03em;
|
||||
|
||||
strong {
|
||||
color: var(--eva-orange-text);
|
||||
}
|
||||
}
|
||||
|
||||
.spin-options {
|
||||
background: var(--eva-panel);
|
||||
border: 1px solid var(--eva-line);
|
||||
border-top: 3px solid var(--eva-orange);
|
||||
border-radius: 0;
|
||||
|
||||
li:hover {
|
||||
background: #fff3e6;
|
||||
}
|
||||
}
|
||||
|
||||
.spin-options-header {
|
||||
border-bottom: 1px solid var(--eva-line);
|
||||
color: var(--eva-orange-text);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.1em;
|
||||
}
|
||||
|
||||
.spin-empty {
|
||||
border-color: var(--eva-line);
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.spin-wheel-pointer {
|
||||
border-top-color: var(--eva-red);
|
||||
filter: drop-shadow(0 0 4px rgb(216 30 30 / 0.6));
|
||||
}
|
||||
|
||||
.spin-seg {
|
||||
stroke: #111214;
|
||||
stroke-width: 2;
|
||||
}
|
||||
|
||||
.spin-seg-label {
|
||||
font-family: var(--eva-font);
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
}
|
||||
|
||||
// Tmavý režim — velín Central Dogma
|
||||
[data-bs-theme="dark"] .spin-wheel-modal.spin-theme-evangelion {
|
||||
--eva-orange: #ff8a1f;
|
||||
--eva-orange-text: #ff8a1f;
|
||||
--eva-red: #ff3b3b;
|
||||
--eva-line: #4a2c10;
|
||||
--eva-panel: #111317;
|
||||
--eva-text: #f2efe6;
|
||||
--wheel-c5: #2b2d31;
|
||||
--wheel-rim: #000000;
|
||||
|
||||
.modal-content {
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgb(255 255 255 / 0.025) 0 1px, transparent 1px 3px),
|
||||
radial-gradient(ellipse 70% 45% at 50% 110%, rgb(216 30 30 / 0.18), transparent 70%),
|
||||
#08090b;
|
||||
box-shadow: 0 0 30px rgb(255 138 31 / 0.18);
|
||||
}
|
||||
|
||||
.spin-steps span:not(.active):not(.done) {
|
||||
background: #1a1d22;
|
||||
color: #8a8780;
|
||||
}
|
||||
|
||||
.spin-steps span.done {
|
||||
background: #2b2d31;
|
||||
}
|
||||
|
||||
.btn-primary:disabled {
|
||||
background: #2b2d31;
|
||||
border-color: #2b2d31;
|
||||
color: #8a8780;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: #1f2227;
|
||||
border-color: #3a3c41;
|
||||
}
|
||||
|
||||
.spin-source {
|
||||
background: #1a1d22;
|
||||
|
||||
> .btn-outline-primary:hover {
|
||||
background: #111317;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.spin-options li:hover {
|
||||
background: #1f1408;
|
||||
}
|
||||
}
|
||||
|
||||
// Ikona kola se při najetí pootočí
|
||||
.spin-wheel-icon {
|
||||
transition: transform 0.4s ease !important;
|
||||
|
||||
@@ -13,7 +13,7 @@ const AUTO_ORDER_CHOICE_KEY = 'auto_order_choice';
|
||||
export type ThemePreference = 'system' | 'light' | 'dark';
|
||||
|
||||
/** Vizuální styl aplikace (nezávislý na světlém/tmavém režimu). */
|
||||
export type StyleTheme = 'simple' | 'umamusume' | 'mlp' | 'hellgirl' | 'kon' | 'bocchi';
|
||||
export type StyleTheme = 'simple' | 'umamusume' | 'mlp' | 'hellgirl' | 'kon' | 'bocchi' | 'evangelion';
|
||||
|
||||
export const STYLE_THEMES: { value: StyleTheme, label: string }[] = [
|
||||
{ value: 'simple', label: 'Jednoduchý' },
|
||||
@@ -22,6 +22,7 @@ export const STYLE_THEMES: { value: StyleTheme, label: string }[] = [
|
||||
{ value: 'hellgirl', label: 'Hell Girl' },
|
||||
{ value: 'kon', label: 'K-ON!' },
|
||||
{ value: 'bocchi', label: 'Bocchi the Rock!' },
|
||||
{ value: 'evangelion', label: 'Neon Genesis Evangelion' },
|
||||
];
|
||||
|
||||
export type SettingsContextProps = {
|
||||
@@ -253,7 +254,7 @@ function useProvideSettings(): SettingsContextProps {
|
||||
}, [autoOrderChoice]);
|
||||
|
||||
// Aplikuje accent barvy při změně hue nebo přepnutí světlý/tmavý.
|
||||
// Tematické styly (Umamusume, My Little Pony, Hell Girl, K-ON!, Bocchi the Rock!) mají vlastní pevnou paletu, accent barvu proto uplatňuje jen jednoduchý styl.
|
||||
// Tematické styly (Umamusume, My Little Pony, Hell Girl, K-ON!, Bocchi the Rock!, Evangelion) mají vlastní pevnou paletu, accent barvu proto uplatňuje jen jednoduchý styl.
|
||||
useEffect(() => {
|
||||
localStorage.setItem(ACCENT_HUE_KEY, String(accentHue));
|
||||
if (styleTheme === 'simple') {
|
||||
|
||||
@@ -15,6 +15,8 @@ const ICONS: Record<StyleTheme, Record<GameId, string>> = {
|
||||
kon: { drawing: '🎼' },
|
||||
// Kessoku Band: sešit s texty Bocchi
|
||||
bocchi: { drawing: '📝' },
|
||||
// NERV: technické výkresy Evangelionu od Ritsuko
|
||||
evangelion: { drawing: '📐' },
|
||||
};
|
||||
|
||||
/** Styl z <html data-luncher-theme> — pro místa mimo React kontext nastavení. */
|
||||
|
||||
@@ -0,0 +1,514 @@
|
||||
// ============================================
|
||||
// STYL "NEON GENESIS EVANGELION" (volitelný, výchozí je jednoduchý styl)
|
||||
// Inspirováno anime Shin Seiki Evangelion (新世紀エヴァンゲリオン).
|
||||
// Utajovaný briefingový dokument NERV: papír, černá tuš, oranžová a výstražná
|
||||
// červená, šestiúhelníková mřížka, výstražné pruhy a zkosené rohy HUD panelů.
|
||||
// Nadpisy jako title card epizod (těžké mincho), ostatní text kondenzovaný.
|
||||
// Tmavý režim = velín Central Dogma — černá, oranžové HUD linky a scanlines.
|
||||
// Aktivní, pokud má <html> atribut data-luncher-theme="evangelion".
|
||||
// ============================================
|
||||
|
||||
$eva: 'html[data-luncher-theme="evangelion"]';
|
||||
|
||||
// Výstražné pruhy (oranžová / černá) jako na hangáru Evangelionů
|
||||
$eva-stripes: repeating-linear-gradient(-45deg, #f26b00 0 10px, #111214 10px 20px);
|
||||
|
||||
// Šestiúhelníková mřížka (honeycomb) — jedna dlaždice = šestiúhelník s „nožkou" k dalšímu řádku
|
||||
$eva-hex-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='48'%3E%3Cpath d='M14 0L28 8V24L14 32L0 24V8ZM14 32V48' fill='none' stroke='%23f26b00' stroke-opacity='.16'/%3E%3C/svg%3E");
|
||||
$eva-hex-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='48'%3E%3Cpath d='M14 0L28 8V24L14 32L0 24V8ZM14 32V48' fill='none' stroke='%23ff8a1f' stroke-opacity='.11'/%3E%3C/svg%3E");
|
||||
|
||||
#{$eva} {
|
||||
--eva-font: 'Barlow Condensed', 'Arial Narrow', sans-serif;
|
||||
--eva-display: 'Shippori Mincho', 'Noto Serif JP', 'Times New Roman', serif;
|
||||
--eva-orange: #f26b00; // HUD a výstrahy NERV
|
||||
--eva-orange-text: #b84d00; // oranžová čitelná na papíře
|
||||
--eva-red: #d81e1e; // EMERGENCY
|
||||
--eva-purple: #5b2a86; // Evangelion Unit-01
|
||||
--eva-green: #7ac143;
|
||||
--eva-ink: #111214;
|
||||
--eva-line: #c9c6bd;
|
||||
|
||||
--luncher-primary: var(--eva-orange-text);
|
||||
--luncher-primary-hover: #9a4000;
|
||||
--luncher-primary-light: #ffeedd;
|
||||
--luncher-bg: #f1efe9;
|
||||
--luncher-bg-card: #ffffff;
|
||||
--luncher-bg-hover: #fff5ea;
|
||||
--luncher-text: var(--eva-ink);
|
||||
--luncher-text-secondary: #3d3f45;
|
||||
--luncher-text-muted: #75777e;
|
||||
--luncher-border: var(--eva-line);
|
||||
--luncher-border-light: #e3e0d8;
|
||||
--luncher-navbar-bg: #0d0e10;
|
||||
--luncher-navbar-text: #ffffff;
|
||||
--luncher-action-icon: var(--eva-orange-text);
|
||||
--luncher-buyer-icon: var(--eva-purple);
|
||||
--luncher-success: #2f8f3a;
|
||||
--luncher-warning: #d99a00;
|
||||
--luncher-danger: var(--eva-red);
|
||||
// Ostré, technické tvary
|
||||
--luncher-radius-sm: 0;
|
||||
--luncher-radius: 0;
|
||||
--luncher-radius-lg: 0;
|
||||
--luncher-radius-xl: 0;
|
||||
--luncher-shadow: 0 1px 0 rgb(17 18 20 / 0.08);
|
||||
--luncher-shadow-lg: 0 0 0 1px var(--eva-orange), 0 6px 18px rgb(242 107 0 / 0.18);
|
||||
|
||||
&[data-bs-theme="dark"] {
|
||||
// Central Dogma — tma velína, oranžové HUD a zelená Unit-01
|
||||
--eva-orange: #ff8a1f;
|
||||
--eva-orange-text: #ff8a1f;
|
||||
--eva-red: #ff3b3b;
|
||||
--eva-purple: #9b6ad1;
|
||||
--eva-green: #9fe05a;
|
||||
--eva-ink: #000000;
|
||||
--eva-line: #4a2c10;
|
||||
|
||||
--luncher-primary: #ff8a1f;
|
||||
--luncher-primary-hover: #ffa451;
|
||||
--luncher-primary-light: #2a1606;
|
||||
--luncher-bg: #08090b;
|
||||
--luncher-bg-card: #111317;
|
||||
--luncher-bg-hover: #1a1d22;
|
||||
--luncher-text: #f2efe6;
|
||||
--luncher-text-secondary: #c5c1b6;
|
||||
--luncher-text-muted: #8a8780;
|
||||
--luncher-border: var(--eva-line);
|
||||
--luncher-border-light: #24201a;
|
||||
--luncher-navbar-bg: #000000;
|
||||
--luncher-action-icon: #ff8a1f;
|
||||
--luncher-buyer-icon: var(--eva-green);
|
||||
--luncher-success: #7ddc5a;
|
||||
--luncher-warning: #ffb020;
|
||||
--luncher-danger: #ff3b3b;
|
||||
--luncher-shadow: none;
|
||||
--luncher-shadow-lg: 0 0 0 1px #ff8a1f, 0 0 18px rgb(255 138 31 / 0.25);
|
||||
}
|
||||
|
||||
::selection {
|
||||
background: var(--eva-orange);
|
||||
color: #000;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: var(--eva-font);
|
||||
font-weight: 500;
|
||||
font-size: 1.05rem;
|
||||
background-color: var(--luncher-bg);
|
||||
// Šestiúhelníková mřížka na papíře, nahoře oranžový nádech
|
||||
background-image:
|
||||
$eva-hex-light,
|
||||
linear-gradient(180deg, #ffe7cf 0, var(--luncher-bg) 320px);
|
||||
background-size: 28px 48px, 100% 100%;
|
||||
background-attachment: fixed;
|
||||
}
|
||||
|
||||
&[data-bs-theme="dark"] body {
|
||||
// Scanlines monitorů, mřížka a rudá záře z hlubin Terminal Dogma
|
||||
background-image:
|
||||
repeating-linear-gradient(0deg, rgb(255 255 255 / 0.025) 0 1px, transparent 1px 3px),
|
||||
$eva-hex-dark,
|
||||
radial-gradient(ellipse 70% 45% at 50% 110%, rgb(216 30 30 / 0.20), transparent 70%),
|
||||
linear-gradient(180deg, #160c04 0, var(--luncher-bg) 380px);
|
||||
background-size: 100% 3px, 28px 48px, 100% 100%, 100% 100%;
|
||||
}
|
||||
|
||||
.app-container {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
h1, h2, .navbar-brand {
|
||||
font-family: var(--eva-display);
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
h3, h4 {
|
||||
font-family: var(--eva-font);
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
|
||||
// ---------- Navbar: černý velín, pod ním výstražné pruhy ----------
|
||||
.navbar {
|
||||
background:
|
||||
#{$eva-stripes} bottom / 100% 6px no-repeat,
|
||||
var(--luncher-navbar-bg) !important;
|
||||
padding-bottom: calc(var(--bs-navbar-padding-y, 0.5rem) + 6px);
|
||||
|
||||
.navbar-brand {
|
||||
// Stav systému MAGI s blikající kontrolkou
|
||||
&::after {
|
||||
content: 'MAGI';
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
margin-right: 0.6em;
|
||||
padding: 1px 6px 1px 16px;
|
||||
vertical-align: middle;
|
||||
font-family: var(--eva-font);
|
||||
font-size: 0.5em;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.25em;
|
||||
color: var(--eva-orange);
|
||||
border: 1px solid var(--eva-orange);
|
||||
background: radial-gradient(circle at 7px 50%, var(--eva-green) 0 3px, transparent 3.5px);
|
||||
animation: eva-blink 2.4s steps(1, end) infinite;
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
border: 1px solid var(--eva-orange);
|
||||
border-radius: 0;
|
||||
font-family: var(--eva-font);
|
||||
}
|
||||
}
|
||||
|
||||
// ---------- Titulek dne: title card epizody — bílé mincho na černé ----------
|
||||
.day-navigator .title {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
padding: 8px 28px 12px 22px;
|
||||
font-family: var(--eva-display);
|
||||
font-weight: 800;
|
||||
font-size: 1.7rem;
|
||||
letter-spacing: -0.02em;
|
||||
color: #ffffff !important;
|
||||
background: #0d0e10;
|
||||
border-left: 6px solid var(--eva-orange);
|
||||
box-shadow: 0 0 0 1px var(--eva-line);
|
||||
text-align: left;
|
||||
|
||||
&::before {
|
||||
content: 'EPISODE';
|
||||
display: block;
|
||||
font-family: var(--eva-font);
|
||||
font-size: 0.72rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.4em;
|
||||
color: var(--eva-orange);
|
||||
}
|
||||
|
||||
&.text-muted {
|
||||
background: #3a3b3f;
|
||||
color: #d6d3cb !important;
|
||||
border-left-color: #7c7f87;
|
||||
|
||||
&::before {
|
||||
content: 'ZÁZNAM';
|
||||
color: #a8a69f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---------- Karty podniků: HUD panely s rohovou značkou ----------
|
||||
.restaurant-card {
|
||||
border: 1px solid var(--eva-line);
|
||||
border-radius: 0;
|
||||
box-shadow: var(--luncher-shadow);
|
||||
|
||||
&:hover {
|
||||
border-color: var(--eva-orange);
|
||||
box-shadow: var(--luncher-shadow-lg);
|
||||
}
|
||||
|
||||
.restaurant-header {
|
||||
background:
|
||||
linear-gradient(var(--eva-orange), var(--eva-orange)) bottom / 100% 3px no-repeat,
|
||||
#0d0e10;
|
||||
position: relative;
|
||||
|
||||
// Oranžový trojúhelník v rohu jako značka panelu na monitoru velínu
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: linear-gradient(225deg, var(--eva-orange) 50%, transparent 50%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
// Při najetí barvy Evangelionu Unit-01 — fialová se zelenou linkou
|
||||
&:hover {
|
||||
background:
|
||||
linear-gradient(var(--eva-green), var(--eva-green)) bottom / 100% 3px no-repeat,
|
||||
linear-gradient(90deg, #3d1c5c, #5b2a86);
|
||||
}
|
||||
|
||||
h3 {
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
small {
|
||||
color: rgb(255 255 255 / 0.75);
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&[data-bs-theme="dark"] .restaurant-card .restaurant-header:not(:hover) {
|
||||
background:
|
||||
linear-gradient(var(--eva-orange), var(--eva-orange)) bottom / 100% 2px no-repeat,
|
||||
#000000;
|
||||
}
|
||||
|
||||
.food-table tbody tr:hover > td {
|
||||
background: #fff3e6;
|
||||
}
|
||||
|
||||
&[data-bs-theme="dark"] .food-table tbody tr:hover > td {
|
||||
background: #1f1408;
|
||||
}
|
||||
|
||||
.food-price {
|
||||
color: var(--eva-orange-text);
|
||||
font-weight: 700;
|
||||
font-variant-numeric: tabular-nums;
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
|
||||
// ---------- Panely a tabulka voleb: oranžová linka nahoře jako na monitoru ----------
|
||||
.choice-section,
|
||||
.choices-table,
|
||||
.pizza-section,
|
||||
.no-votes {
|
||||
border: 1px solid var(--eva-line);
|
||||
border-top: 3px solid var(--eva-orange);
|
||||
border-radius: 0;
|
||||
box-shadow: var(--luncher-shadow);
|
||||
}
|
||||
|
||||
.choices-table {
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
// Sloupec s podnikem: štítek jako popisek v systému MAGI
|
||||
.choices-table > tbody > tr > td:first-child {
|
||||
background: #ffe9d6;
|
||||
color: var(--eva-ink);
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
border-right: 1px solid var(--eva-line);
|
||||
}
|
||||
|
||||
&[data-bs-theme="dark"] .choices-table > tbody > tr > td:first-child {
|
||||
background: #1f1408;
|
||||
color: var(--eva-orange);
|
||||
}
|
||||
|
||||
// Bootstrap karty (skupinové objednávky apod.) a seznamy — stejné linky jako ostatní panely
|
||||
.card {
|
||||
border: 1px solid var(--eva-line);
|
||||
border-radius: 0;
|
||||
box-shadow: var(--luncher-shadow);
|
||||
overflow: hidden;
|
||||
background: var(--luncher-bg-card);
|
||||
|
||||
// Rozbalovací výběr z nabídky nesmí karta oříznout
|
||||
&:has(.select-search-container) {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
> .card-header {
|
||||
background: var(--luncher-primary-light);
|
||||
border-bottom: 2px solid var(--eva-orange);
|
||||
border-radius: 0;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.table {
|
||||
--bs-table-bg: transparent;
|
||||
margin-bottom: 0;
|
||||
|
||||
> :last-child > tr:last-child > * {
|
||||
border-bottom-width: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.list-group {
|
||||
border-radius: 0;
|
||||
border: 1px solid var(--eva-line);
|
||||
}
|
||||
|
||||
.form-select, .form-control,
|
||||
input[type="text"], input[type="email"], input[type="password"] {
|
||||
border-radius: 0;
|
||||
border: 1px solid var(--eva-line);
|
||||
font-family: var(--eva-font);
|
||||
|
||||
&:focus {
|
||||
border-color: var(--eva-orange);
|
||||
box-shadow: 0 0 0 2px rgb(242 107 0 / 0.35);
|
||||
}
|
||||
}
|
||||
|
||||
// ---------- Tlačítka: ostré hrany, kondenzované verzálky ----------
|
||||
.btn {
|
||||
border-radius: 0;
|
||||
font-family: var(--eva-font);
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
transition: background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: var(--eva-orange);
|
||||
border: 1px solid var(--eva-orange);
|
||||
color: #000;
|
||||
|
||||
&:hover {
|
||||
background: #ff8a1f;
|
||||
border-color: #ff8a1f;
|
||||
color: #000;
|
||||
box-shadow: 0 0 0 2px rgb(242 107 0 / 0.35);
|
||||
}
|
||||
|
||||
// Stisk = aktivace, na okamžik výstražná červená
|
||||
&:active {
|
||||
background: var(--eva-red) !important;
|
||||
border-color: var(--eva-red) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
background: #c9c6bd;
|
||||
border-color: #c9c6bd;
|
||||
color: #5f6168;
|
||||
}
|
||||
}
|
||||
|
||||
&[data-bs-theme="dark"] .btn-primary:hover {
|
||||
box-shadow: 0 0 12px rgb(255 138 31 / 0.55);
|
||||
}
|
||||
|
||||
&[data-bs-theme="dark"] .btn-primary:disabled {
|
||||
background: #2b2d31;
|
||||
border-color: #2b2d31;
|
||||
color: #8a8780;
|
||||
}
|
||||
|
||||
.btn-outline-primary {
|
||||
background: transparent;
|
||||
border: 1px solid var(--eva-orange);
|
||||
color: var(--luncher-primary);
|
||||
|
||||
&:hover {
|
||||
background: var(--eva-orange);
|
||||
border-color: var(--eva-orange);
|
||||
color: #000;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: #2b2d31;
|
||||
border: 1px solid #2b2d31;
|
||||
color: #fff;
|
||||
|
||||
&:hover {
|
||||
background: #3d3f45;
|
||||
border-color: #3d3f45;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
&[data-bs-theme="dark"] .btn-secondary {
|
||||
background: #1f2227;
|
||||
border-color: #3a3c41;
|
||||
|
||||
&:hover {
|
||||
background: #2b2f36;
|
||||
}
|
||||
}
|
||||
|
||||
// Nebezpečné akce: při najetí výstražné rudé pruhy
|
||||
.btn-danger {
|
||||
background: var(--eva-red);
|
||||
border: 1px solid var(--eva-red);
|
||||
color: #fff;
|
||||
|
||||
&:hover {
|
||||
background: repeating-linear-gradient(-45deg, var(--eva-red) 0 8px, #9e1212 8px 16px);
|
||||
border-color: #9e1212;
|
||||
}
|
||||
}
|
||||
|
||||
.action-icon:hover {
|
||||
background: var(--luncher-primary-light);
|
||||
color: var(--luncher-primary);
|
||||
}
|
||||
|
||||
// ---------- Modaly: okno velínu s výstražnými pruhy ----------
|
||||
.modal-content {
|
||||
border: 1px solid var(--eva-orange);
|
||||
border-radius: 0;
|
||||
box-shadow: 0 12px 40px rgb(0 0 0 / 0.35);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
&[data-bs-theme="dark"] .modal-content {
|
||||
box-shadow: 0 0 0 1px #000, 0 0 30px rgb(255 138 31 / 0.18);
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
background:
|
||||
#{$eva-stripes} bottom / 100% 5px no-repeat,
|
||||
#0d0e10;
|
||||
border-bottom: none;
|
||||
border-radius: 0;
|
||||
padding-bottom: calc(var(--bs-modal-header-padding-y, 1rem) + 5px);
|
||||
|
||||
.modal-title, .modal-title h2 {
|
||||
color: #fff;
|
||||
font-family: var(--eva-display);
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.btn-close {
|
||||
filter: invert(1) grayscale(1) brightness(2);
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
border-top: none;
|
||||
font-family: var(--eva-font);
|
||||
letter-spacing: 0.04em;
|
||||
background-image: #{$eva-stripes};
|
||||
background-size: 100% 4px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: top;
|
||||
}
|
||||
}
|
||||
|
||||
// Kontrolka systému MAGI — občas „zabliká" jako při poplachu PATTERN BLUE
|
||||
@keyframes eva-blink {
|
||||
0%, 88%, 100% { opacity: 1; }
|
||||
90% { opacity: 0.25; }
|
||||
92% { opacity: 1; }
|
||||
94% { opacity: 0.25; }
|
||||
}
|
||||
|
||||
@media (max-width: 575.98px) {
|
||||
#{$eva} .day-navigator .title {
|
||||
font-size: 1.35rem;
|
||||
padding: 6px 18px 8px 14px;
|
||||
}
|
||||
|
||||
#{$eva} .navbar .navbar-brand::after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
#{$eva} .navbar .navbar-brand::after {
|
||||
animation: none;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user