THEME-STYLE / app.py
seawolf2357's picture
Update app.py
93ef132 verified
import gradio as gr
# ============================================================
# 🎨 18가지 비주얼 스타일 Gradio 데모 (최종 통합)
# ============================================================
# 원래 13개: Pop Art, Glassmorphism, Neumorphism, Claymorphism,
# Aurora, Liquid Metal, Paper Cut, Holographic,
# Frosted Crystal, Soft Neon, CRT Terminal, Origami, Bioluminescence
# 추가 5개: Ink Wash, Soap Bubble, Chalkboard, Pixel Art, Candy Pop
# ============================================================
# ============================================================
# 각 스타일별 CSS 코드 및 설정값 정의
# ============================================================
STYLE_CODES = {
"POP_ART": """
/* ═══════════════════════════════════════════════════════════
🦸 POP ART / COMIC 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--pop-red: #FF6B6B;
--pop-yellow: #FFE66D;
--pop-cyan: #4ECDC4;
--pop-blue: #45B7D1;
--pop-black: #000000;
--pop-white: #FFFFFF;
}
/* 📍 벤데이 도트 패턴 배경 */
.popart-container {
background:
radial-gradient(circle at 20% 20%, var(--pop-yellow) 2px, transparent 2px),
radial-gradient(circle at 80% 40%, var(--pop-red) 2px, transparent 2px),
radial-gradient(circle at 40% 80%, var(--pop-cyan) 2px, transparent 2px),
var(--pop-white);
background-size: 30px 30px, 40px 40px, 35px 35px, 100% 100%;
}
/* 🔲 굵은 윤곽선 박스 */
.comic-box {
border: 4px solid var(--pop-black);
box-shadow: 6px 6px 0 var(--pop-black);
background: var(--pop-yellow);
}
/* 💬 말풍선 스타일 */
.speech-bubble {
position: relative;
background: var(--pop-white);
border: 3px solid var(--pop-black);
border-radius: 20px;
padding: 15px;
}
.speech-bubble::after {
content: '';
position: absolute;
bottom: -20px;
left: 30px;
border: 10px solid transparent;
border-top-color: var(--pop-black);
}
/* ✨ 효과음 텍스트 */
.comic-effect {
font-family: 'Bangers', cursive;
font-size: 3rem;
color: var(--pop-red);
text-shadow:
4px 4px 0 var(--pop-black),
-2px -2px 0 var(--pop-yellow);
text-transform: uppercase;
letter-spacing: 3px;
}
/* 🎯 버튼 호버 효과 */
.comic-button {
transition: all 0.1s ease;
}
.comic-button:hover {
transform: translate(3px, 3px);
box-shadow: 3px 3px 0 var(--pop-black);
}
/* 📊 핵심 설정값 */
/*
* 테두리: 4px solid black
* 그림자: 6px 6px 0 (하드 쉐도우)
* 도트 크기: 2px
* 도트 간격: 30-40px
* 폰트: Bangers (Google Fonts)
* 호버: translate(3px, 3px)
*/
""",
"GLASSMORPHISM": """
/* ═══════════════════════════════════════════════════════════
🪟 GLASSMORPHISM 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--glass-bg-start: #667eea;
--glass-bg-mid: #764ba2;
--glass-bg-end: #f093fb;
--glass-white: rgba(255, 255, 255, 0.15);
--glass-border: rgba(255, 255, 255, 0.3);
}
/* 🌈 그라데이션 배경 */
.glass-container {
background: linear-gradient(
135deg,
var(--glass-bg-start) 0%,
var(--glass-bg-mid) 50%,
var(--glass-bg-end) 100%
);
}
/* 🔲 유리 효과 카드 */
.glass-card {
background: var(--glass-white);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid var(--glass-border);
border-radius: 20px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}
/* ✨ 유리 버튼 */
.glass-button {
background: rgba(255, 255, 255, 0.25);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.4);
border-radius: 50px;
color: #fff;
padding: 15px 50px;
transition: all 0.3s ease;
}
.glass-button:hover {
background: rgba(255, 255, 255, 0.35);
transform: translateY(-3px);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
}
/* 💡 빛 반사 효과 */
.glass-highlight {
position: relative;
}
.glass-highlight::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 50%;
background: linear-gradient(
180deg,
rgba(255,255,255,0.2) 0%,
transparent 100%
);
border-radius: 20px 20px 0 0;
pointer-events: none;
}
/* 📊 핵심 설정값 */
/*
* 블러: backdrop-filter: blur(20px)
* 투명도: rgba(255,255,255, 0.15-0.25)
* 테두리: 1px solid rgba(255,255,255,0.3)
* 라운드: border-radius: 20px
* 그림자: 0 8px 32px rgba(0,0,0,0.1)
*/
""",
"NEUMORPHISM": """
/* ═══════════════════════════════════════════════════════════
🔘 NEUMORPHISM 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--neu-bg: #e0e5ec;
--neu-shadow-dark: #b8bec5;
--neu-shadow-light: #ffffff;
--neu-text: #6d7b8d;
--neu-text-dark: #5a6677;
}
/* 📦 기본 배경 */
.neu-container {
background: var(--neu-bg);
}
/* 🔲 볼록 효과 (Raised) */
.neu-raised {
background: var(--neu-bg);
border-radius: 20px;
box-shadow:
8px 8px 16px var(--neu-shadow-dark),
-8px -8px 16px var(--neu-shadow-light);
}
/* 🔳 오목 효과 (Inset/Pressed) */
.neu-inset {
background: var(--neu-bg);
border-radius: 15px;
box-shadow:
inset 6px 6px 12px var(--neu-shadow-dark),
inset -6px -6px 12px var(--neu-shadow-light);
}
/* 🔘 버튼 스타일 */
.neu-button {
background: var(--neu-bg);
border: none;
border-radius: 50px;
padding: 18px 50px;
color: var(--neu-text);
font-weight: 700;
box-shadow:
8px 8px 16px var(--neu-shadow-dark),
-8px -8px 16px var(--neu-shadow-light);
transition: all 0.2s ease;
}
.neu-button:hover {
box-shadow:
4px 4px 8px var(--neu-shadow-dark),
-4px -4px 8px var(--neu-shadow-light);
}
.neu-button:active {
box-shadow:
inset 4px 4px 8px var(--neu-shadow-dark),
inset -4px -4px 8px var(--neu-shadow-light);
}
/* 📝 텍스트 스타일 */
.neu-text {
color: var(--neu-text);
text-shadow:
2px 2px 4px var(--neu-shadow-light),
-1px -1px 3px rgba(0,0,0,0.1);
}
/* 📊 핵심 설정값 */
/*
* 베이스 색상: #e0e5ec
* 어두운 그림자: #b8bec5
* 밝은 그림자: #ffffff
* 그림자 거리: 8px (볼록), 6px (오목)
* 블러: 16px (볼록), 12px (오목)
* 라운드: 15-50px
*/
""",
"CLAYMORPHISM": """
/* ═══════════════════════════════════════════════════════════
🧸 CLAYMORPHISM 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--clay-bg-start: #ffecd2;
--clay-bg-end: #fcb69f;
--clay-surface: #f8b595;
--clay-shadow: rgba(180, 100, 60, 0.4);
--clay-highlight: rgba(255, 255, 255, 0.7);
--clay-text: #7f3300;
}
/* 🎨 그라데이션 배경 */
.clay-container {
background: linear-gradient(
145deg,
var(--clay-bg-start) 0%,
var(--clay-bg-end) 100%
);
}
/* 🔲 클레이 카드 (3D 점토 느낌) */
.clay-card {
background: var(--clay-surface);
border: none;
border-radius: 30px;
box-shadow:
12px 12px 24px var(--clay-shadow),
-8px -8px 20px var(--clay-highlight),
inset 2px 2px 6px rgba(255, 255, 255, 0.6),
inset -2px -2px 6px rgba(180, 100, 60, 0.2);
}
/* 🔘 클레이 버튼 */
.clay-button {
background: linear-gradient(145deg, #ff9a6c, #e07b4c);
border: none;
border-radius: 50px;
padding: 18px 55px;
color: #fff;
font-weight: 600;
box-shadow:
10px 10px 20px var(--clay-shadow),
-6px -6px 15px var(--clay-highlight),
inset 2px 2px 4px rgba(255, 255, 255, 0.4);
transition: all 0.2s ease;
}
.clay-button:hover {
transform: translateY(-3px) scale(1.02);
box-shadow:
14px 14px 28px var(--clay-shadow),
-8px -8px 20px var(--clay-highlight),
inset 2px 2px 4px rgba(255, 255, 255, 0.4);
}
/* 📊 핵심 설정값 */
/*
* 베이스: 따뜻한 파스텔 (피치, 코랄)
* 라운드: 30-50px (더 둥글게)
* 외부 그림자: 12px 거리, 24px 블러
* 내부 하이라이트: inset 2px 2px
* 호버: scale(1.02) 추가
*/
""",
"AURORA": """
/* ═══════════════════════════════════════════════════════════
🌌 AURORA BOREALIS 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--aurora-green: rgba(0, 255, 150, 0.3);
--aurora-purple: rgba(100, 0, 255, 0.25);
--aurora-cyan: rgba(0, 200, 255, 0.3);
--aurora-pink: rgba(255, 0, 150, 0.15);
--aurora-bg: #0a0a20;
}
/* 🌌 배경 */
.aurora-container {
background: linear-gradient(
180deg,
#0a0a20 0%,
#1a0a30 50%,
#0a1a25 100%
);
position: relative;
overflow: hidden;
}
/* 🌈 오로라 효과 레이어 */
.aurora-layer {
position: absolute;
top: 0;
left: -50%;
right: -50%;
bottom: 50%;
background:
radial-gradient(ellipse at 30% 80%, var(--aurora-green) 0%, transparent 50%),
radial-gradient(ellipse at 50% 70%, var(--aurora-purple) 0%, transparent 45%),
radial-gradient(ellipse at 70% 85%, var(--aurora-cyan) 0%, transparent 50%),
radial-gradient(ellipse at 40% 60%, var(--aurora-pink) 0%, transparent 40%);
filter: blur(40px);
animation: aurora-flow 8s ease-in-out infinite;
}
@keyframes aurora-flow {
0%, 100% {
transform: translateX(0) translateY(0) scale(1);
}
25% {
transform: translateX(5%) translateY(-5%) scale(1.05);
}
50% {
transform: translateX(-3%) translateY(3%) scale(0.98);
}
75% {
transform: translateX(3%) translateY(-3%) scale(1.02);
}
}
/* ✨ 텍스트 그라데이션 */
.aurora-text {
background: linear-gradient(
90deg,
#00ff88, #00ccff, #cc00ff, #00ff88
);
background-size: 300% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: aurora-text-flow 6s linear infinite;
}
@keyframes aurora-text-flow {
0% { background-position: 0% 50%; }
100% { background-position: 300% 50%; }
}
/* 📊 핵심 설정값 */
/*
* 배경: #0a0a20 (딥 네이비)
* 오로라 블러: 40px
* 색상: 그린, 시안, 퍼플, 핑크
* 애니메이션: 8초 주기 흐름
* 텍스트: 그라데이션 애니메이션
*/
""",
"LIQUID_METAL": """
/* ═══════════════════════════════════════════════════════════
🪞 LIQUID METAL 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--metal-dark: #2c3e50;
--metal-bg: #1a1a2e;
--metal-silver-1: #c0c0c0;
--metal-silver-2: #f8f8f8;
--metal-silver-3: #a0a0a0;
}
/* 🔲 메탈 배경 */
.metal-container {
background: linear-gradient(
135deg,
var(--metal-dark) 0%,
var(--metal-bg) 50%,
var(--metal-dark) 100%
);
}
/* ✨ 메탈 텍스트 */
.metal-text {
background: linear-gradient(
135deg,
#c0c0c0 0%,
#f8f8f8 20%,
#a0a0a0 40%,
#f0f0f0 60%,
#c0c0c0 80%,
#e0e0e0 100%
);
background-size: 200% 200%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: metal-shine 4s linear infinite;
}
@keyframes metal-shine {
0% { background-position: 0% 50%; }
100% { background-position: 200% 50%; }
}
/* 🔘 메탈 버튼 */
.metal-button {
background: linear-gradient(
135deg,
#707080 0%,
#b0b0c0 25%,
#606070 50%,
#c0c0d0 75%,
#707080 100%
);
background-size: 200% 200%;
border: 2px solid rgba(200, 200, 220, 0.5);
color: #1a1a2a;
animation: metal-shine 3s linear infinite;
}
/* 📊 핵심 설정값 */
/*
* 베이스: #1a1a2e (다크)
* 메탈: #c0c0c0 ~ #f8f8f8 그라데이션
* 애니메이션: 3-4초 shine 효과
* 테두리: 메탈릭 실버
*/
""",
"PAPER_CUT": """
/* ═══════════════════════════════════════════════════════════
📄 PAPER CUT / LAYERED 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--paper-bg: #f5f5f0;
--paper-white: #ffffff;
--paper-cream: #f8f8f5;
--paper-shadow: rgba(0, 0, 0, 0.08);
--paper-text: #5d4e37;
--paper-border: #e0ddd5;
}
/* 📜 배경 */
.paper-container {
background: linear-gradient(
180deg,
var(--paper-bg) 0%,
#ebebdf 100%
);
}
/* 📄 레이어드 카드 */
.paper-card {
background: var(--paper-white);
border-radius: 4px;
position: relative;
box-shadow:
0 1px 1px var(--paper-shadow),
0 2px 2px var(--paper-shadow),
0 4px 4px var(--paper-shadow),
0 8px 8px var(--paper-shadow),
0 16px 16px var(--paper-shadow);
}
/* 📑 겹친 종이 효과 */
.paper-stack::before {
content: '';
position: absolute;
bottom: -8px;
left: 8px;
right: 8px;
height: 100%;
background: #f8f8f5;
border-radius: 4px;
z-index: -1;
box-shadow: 0 2px 4px var(--paper-shadow);
}
.paper-stack::after {
content: '';
position: absolute;
bottom: -14px;
left: 14px;
right: 14px;
height: 100%;
background: #f0f0eb;
border-radius: 4px;
z-index: -2;
}
/* 📊 핵심 설정값 */
/*
* 베이스: #f5f5f0 (크림 화이트)
* 그림자: 다단계 (1px, 2px, 4px, 8px, 16px)
* 레이어 간격: 8px, 14px
* 라운드: 4px (작은 값)
*/
""",
"HOLOGRAPHIC": """
/* ═══════════════════════════════════════════════════════════
🌈 HOLOGRAPHIC IRIDESCENT 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--holo-pink: #ff0080;
--holo-orange: #ff8c00;
--holo-yellow: #ffff00;
--holo-green: #00ff80;
--holo-cyan: #00ffff;
--holo-blue: #0080ff;
--holo-purple: #8000ff;
}
/* 🌌 배경 */
.holo-container {
background: linear-gradient(
135deg,
#1a1a2e 0%,
#16213e 100%
);
position: relative;
overflow: hidden;
}
/* 🌈 회전 무지개 배경 */
.holo-bg-rotate::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
right: -50%;
bottom: -50%;
background: conic-gradient(
from 0deg,
var(--holo-pink),
var(--holo-orange),
var(--holo-yellow),
var(--holo-green),
var(--holo-cyan),
var(--holo-blue),
var(--holo-purple),
var(--holo-pink)
);
opacity: 0.15;
animation: holo-rotate 10s linear infinite;
}
@keyframes holo-rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* ✨ 홀로그래픽 텍스트 */
.holo-text {
background: linear-gradient(
90deg,
var(--holo-pink), var(--holo-orange), var(--holo-yellow),
var(--holo-green), var(--holo-cyan), var(--holo-purple), var(--holo-pink)
);
background-size: 400% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: holo-shift 5s linear infinite;
}
@keyframes holo-shift {
0% { background-position: 0% 50%; }
100% { background-position: 400% 50%; }
}
/* 📊 핵심 설정값 */
/*
* 배경: conic-gradient (원형 무지개)
* 회전: 10초 주기
* 텍스트: 400% 이동 애니메이션
* 투명도: 0.15 (배경), 1.0 (텍스트)
*/
""",
"FROSTED_CRYSTAL": """
/* ═══════════════════════════════════════════════════════════
❄️ FROSTED CRYSTAL 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--frost-bg-top: #e8f4fc;
--frost-bg-mid: #c5dff8;
--frost-bg-bottom: #a8d4f0;
--frost-white: rgba(255, 255, 255, 0.4);
--frost-border: rgba(255, 255, 255, 0.6);
--frost-text: #4a7c9b;
--frost-glow: rgba(200, 230, 255, 0.3);
}
/* ❄️ 배경 */
.frost-container {
background: linear-gradient(
180deg,
var(--frost-bg-top) 0%,
var(--frost-bg-mid) 50%,
var(--frost-bg-bottom) 100%
);
}
/* 🔲 프로스트 카드 */
.frost-card {
background: var(--frost-white);
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
border: 1px solid var(--frost-border);
border-radius: 20px;
box-shadow:
inset 0 0 30px rgba(255, 255, 255, 0.5),
0 8px 32px rgba(100, 150, 200, 0.2);
}
/* 🔘 프로스트 버튼 */
.frost-button {
background: rgba(255, 255, 255, 0.6);
backdrop-filter: blur(15px);
border: 2px solid rgba(255, 255, 255, 0.8);
border-radius: 50px;
color: var(--frost-text);
box-shadow:
0 8px 32px rgba(100, 150, 200, 0.3),
inset 0 2px 10px rgba(255, 255, 255, 0.8);
}
/* 📊 핵심 설정값 */
/*
* 블러: blur(20px) saturate(180%)
* 배경: rgba(255,255,255,0.4-0.6)
* 내부 글로우: inset 0 0 30px
* 색상: 차가운 블루 계열
*/
""",
"SOFT_NEON": """
/* ═══════════════════════════════════════════════════════════
💡 SOFT NEON GLOW 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--neon-pink: #ffb6c1;
--neon-mint: #98fb98;
--neon-lavender: #dda0dd;
--neon-aqua: #b0e0e6;
--neon-bg: #1a1a2e;
}
/* 🌙 배경 */
.softneon-container {
background: linear-gradient(
135deg,
var(--neon-bg) 0%,
#0f0f1a 100%
);
}
/* ✨ 소프트 글로우 텍스트 */
.softneon-text {
color: var(--neon-pink);
text-shadow:
0 0 10px rgba(255, 182, 193, 0.5),
0 0 20px rgba(255, 182, 193, 0.3),
0 0 40px rgba(255, 182, 193, 0.2);
}
/* 🔲 소프트 네온 카드 */
.softneon-card {
background: rgba(255, 182, 193, 0.08);
border: 1px solid rgba(255, 182, 193, 0.2);
border-radius: 20px;
box-shadow:
0 0 20px rgba(255, 182, 193, 0.1),
inset 0 0 20px rgba(255, 182, 193, 0.05);
}
/* 🔘 소프트 네온 버튼 */
.softneon-button {
background: rgba(30, 30, 50, 0.8);
border: 2px solid rgba(221, 160, 221, 0.5);
border-radius: 50px;
color: var(--neon-lavender);
box-shadow:
0 0 20px rgba(221, 160, 221, 0.2),
0 0 40px rgba(221, 160, 221, 0.1);
transition: all 0.4s ease;
}
.softneon-button:hover {
box-shadow:
0 0 30px rgba(221, 160, 221, 0.4),
0 0 60px rgba(221, 160, 221, 0.2),
0 0 90px rgba(221, 160, 221, 0.1);
}
/* 📊 핵심 설정값 */
/*
* 글로우 단계: 10px, 20px, 40px
* 투명도: 0.5, 0.3, 0.2 (점점 감소)
* 색상: 파스텔 네온 (핑크, 민트, 라벤더)
* 호버: 글로우 강도 2배
*/
""",
"CRT_TERMINAL": """
/* ═══════════════════════════════════════════════════════════
🖥️ RETRO CRT TERMINAL 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--crt-bg: #0a0a0a;
--crt-green: #33ff33;
--crt-green-dark: #00aa00;
--crt-amber: #ffb000;
--crt-scanline: rgba(0, 0, 0, 0.3);
}
/* 🖥️ CRT 배경 */
.crt-container {
background: var(--crt-bg);
position: relative;
}
/* 📺 스캔라인 오버레이 */
.crt-scanlines::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
var(--crt-scanline) 2px,
var(--crt-scanline) 4px
);
pointer-events: none;
}
/* 🔲 비네트 효과 */
.crt-vignette::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(
ellipse at center,
transparent 0%,
rgba(0,0,0,0.4) 100%
);
pointer-events: none;
}
/* ✨ 인광 텍스트 */
.crt-text {
font-family: 'VT323', monospace;
color: var(--crt-green);
text-shadow:
0 0 5px var(--crt-green),
0 0 10px var(--crt-green),
0 0 20px var(--crt-green),
0 0 40px var(--crt-green-dark);
animation: crt-flicker 0.1s infinite;
}
@keyframes crt-flicker {
0%, 100% { opacity: 1; }
92% { opacity: 0.95; }
94% { opacity: 1; }
97% { opacity: 0.9; }
}
/* 📊 핵심 설정값 */
/*
* 배경: #0a0a0a (순수 블랙)
* 인광색: #33ff33 (그린) 또는 #ffb000 (앰버)
* 스캔라인: 2px 간격
* 글로우: 4단계 (5px, 10px, 20px, 40px)
* 플리커: 0.1초 간격
*/
""",
"ORIGAMI": """
/* ═══════════════════════════════════════════════════════════
🦢 ORIGAMI / GEOMETRIC FOLD 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--origami-bg: #f0f0f0;
--origami-light: #ffffff;
--origami-mid: #f8f8f8;
--origami-dark: #e8e8e8;
--origami-darker: #d0d0d0;
--origami-text: #4a4a5a;
}
/* 📐 배경 */
.origami-container {
background: linear-gradient(
135deg,
var(--origami-bg) 0%,
var(--origami-dark) 100%
);
}
/* 🔺 접힌 카드 */
.origami-card {
background: linear-gradient(
135deg,
var(--origami-light) 0%,
var(--origami-mid) 50%,
var(--origami-dark) 50%,
var(--origami-darker) 100%
);
clip-path: polygon(
0 0,
100% 0,
100% calc(100% - 20px),
calc(100% - 20px) 100%,
0 100%
);
box-shadow:
4px 4px 0 rgba(0,0,0,0.1),
8px 8px 0 rgba(0,0,0,0.05);
}
/* 🔷 기하학 버튼 */
.origami-button {
background: linear-gradient(
135deg,
#5a5a6a 0%,
#4a4a5a 50%,
#3a3a4a 50%,
#2a2a3a 100%
);
clip-path: polygon(
15px 0,
100% 0,
100% calc(100% - 15px),
calc(100% - 15px) 100%,
0 100%,
0 15px
);
color: #fff;
}
/* 📊 핵심 설정값 */
/*
* 그라데이션: 50%에서 색상 분리 (접힌 효과)
* clip-path: polygon()으로 모서리 컷
* 그림자: 하드 쉐도우 (4px, 8px)
* 색상: 접힌 면 명암 차이
*/
""",
"BIOLUMINESCENCE": """
/* ═══════════════════════════════════════════════════════════
🦑 BIOLUMINESCENCE 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--bio-bg: #000810;
--bio-cyan: rgba(0, 255, 200, 0.3);
--bio-blue: rgba(100, 200, 255, 0.2);
--bio-purple: rgba(150, 100, 255, 0.2);
--bio-text-cyan: #00ffc8;
--bio-text-blue: #a0e0ff;
}
/* 🌊 심해 배경 */
.bio-container {
background: linear-gradient(
180deg,
var(--bio-bg) 0%,
#001020 50%,
#000815 100%
);
position: relative;
}
/* 🔮 발광 오브 */
.bio-orb {
position: absolute;
border-radius: 50%;
filter: blur(30px);
animation: bio-float 6s ease-in-out infinite;
}
.bio-orb-cyan {
background: radial-gradient(
ellipse,
var(--bio-cyan) 0%,
transparent 70%
);
}
@keyframes bio-float {
0%, 100% {
transform: translate(0, 0) scale(1);
opacity: 0.6;
}
50% {
transform: translate(30px, -20px) scale(1.2);
opacity: 1;
}
}
/* ✨ 발광 텍스트 */
.bio-text {
color: var(--bio-text-cyan);
text-shadow:
0 0 10px rgba(0, 255, 200, 0.7),
0 0 20px rgba(0, 255, 200, 0.5),
0 0 40px rgba(0, 255, 200, 0.3);
animation: bio-pulse 3s ease-in-out infinite;
}
@keyframes bio-pulse {
0%, 100% {
text-shadow:
0 0 10px rgba(0,255,200,0.7),
0 0 20px rgba(0,255,200,0.5);
}
50% {
text-shadow:
0 0 20px rgba(0,255,200,0.9),
0 0 40px rgba(0,255,200,0.7),
0 0 60px rgba(0,255,200,0.4);
}
}
/* 📊 핵심 설정값 */
/*
* 배경: #000810 (거의 블랙)
* 발광색: 시안, 블루, 퍼플
* 오브 블러: 30px
* 펄스: 3초 주기
* 플로트: 6초 주기
*/
""",
"INK_WASH": """
/* ═══════════════════════════════════════════════════════════
🖌️ INK WASH / SUMI-E (수묵화) 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--ink-black: #1a1a1a;
--ink-dark: #2d2d2d;
--ink-medium: #5a5a5a;
--ink-light: #8a8a8a;
--ink-wash: #b5b5b5;
--paper-cream: #f5f2e8;
--paper-warm: #ebe6d6;
--accent-vermillion: #c73e1d;
--accent-gold: #b8860b;
}
/* 📜 한지 배경 */
.ink-container {
background:
radial-gradient(ellipse at 20% 10%,
rgba(26, 26, 26, 0.15) 0%,
transparent 50%),
radial-gradient(ellipse at 80% 90%,
rgba(45, 45, 45, 0.1) 0%,
transparent 40%),
var(--paper-cream);
}
/* 🖌️ 붓터치 보더 */
.ink-border {
border: none;
border-left: 4px solid var(--ink-black);
border-image: linear-gradient(
to bottom,
transparent 0%,
var(--ink-black) 10%,
var(--ink-dark) 50%,
var(--ink-medium) 80%,
transparent 100%
) 1;
}
/* 💧 먹물 번짐 애니메이션 */
@keyframes ink-spread {
0% { filter: blur(0px); opacity: 0.8; }
50% { filter: blur(8px); opacity: 0.4; }
100% { filter: blur(4px); opacity: 0.6; }
}
/* 🔴 낙관 스타일 */
.ink-stamp {
background: var(--accent-vermillion);
color: var(--paper-cream);
padding: 8px 12px;
border-radius: 4px;
}
/* 📊 핵심 설정값 */
/*
* 여백 비율: 콘텐츠 40% / 여백 60%
* 그라데이션 블러: 4-8px
* 폰트: Noto Serif KR
* 색상: 흑백 모노톤 + 주홍 악센트
*/
""",
"SOAP_BUBBLE": """
/* ═══════════════════════════════════════════════════════════
🫧 SOAP BUBBLE (비눗방울) 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--bubble-pink: rgba(255, 150, 200, 0.3);
--bubble-cyan: rgba(100, 255, 255, 0.3);
--bubble-yellow: rgba(255, 255, 150, 0.3);
--bubble-purple: rgba(200, 150, 255, 0.3);
--bubble-green: rgba(150, 255, 200, 0.3);
--surface-shine: rgba(255, 255, 255, 0.8);
}
/* 🌈 배경 */
.bubble-container {
background: linear-gradient(
135deg,
#e8f4ff 0%,
#f5e8ff 50%,
#e8fff4 100%
);
}
/* 🫧 비눗방울 */
.bubble {
border-radius: 50%;
background: conic-gradient(
from 0deg at 30% 30%,
var(--bubble-pink),
var(--bubble-cyan),
var(--bubble-yellow),
var(--bubble-purple),
var(--bubble-green),
var(--bubble-pink)
);
opacity: 0.8;
backdrop-filter: blur(2px);
border: 1px solid rgba(255, 255, 255, 0.5);
box-shadow:
inset 10px 10px 30px var(--surface-shine),
0 10px 40px rgba(100, 150, 255, 0.2);
}
/* 🌊 떠다니는 애니메이션 */
@keyframes bubble-float {
0%, 100% { transform: translateY(0) scale(1); }
50% { transform: translateY(-15px) scale(1.02); }
}
/* 🎨 색상 시프트 */
@keyframes iridescent-shift {
0% { filter: hue-rotate(0deg); }
100% { filter: hue-rotate(360deg); }
}
/* 📊 핵심 설정값 */
/*
* 형태: border-radius: 50%
* 색상: conic-gradient (무지개)
* 블러: backdrop-filter: blur(2px)
* 애니메이션: 6초 float, 10초 hue-rotate
*/
""",
"CHALKBOARD": """
/* ═══════════════════════════════════════════════════════════
📝 CHALKBOARD (칠판) 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--board-green: #2a4a2a;
--board-dark: #1e3a1e;
--chalk-white: #f0f0e8;
--chalk-yellow: #f5e6a3;
--chalk-pink: #f0a0a0;
--wood-frame: #5c4033;
}
/* 📗 칠판 배경 */
.chalk-container {
background: linear-gradient(180deg,
var(--board-dark) 0%,
var(--board-green) 50%,
var(--board-dark) 100%);
border: 15px solid var(--wood-frame);
box-shadow:
inset 0 0 50px rgba(0,0,0,0.4),
0 10px 30px rgba(0,0,0,0.3);
}
/* ✏️ 분필 텍스트 */
.chalk-text {
font-family: 'Gaegu', cursive;
color: var(--chalk-white);
text-shadow:
0 0 5px rgba(240, 240, 232, 0.8),
0 0 10px rgba(240, 240, 232, 0.4);
}
/* 📊 핵심 설정값 */
/*
* 칠판: #2a4a2a (다크 그린)
* 분필: #f0f0e8 (크림 화이트)
* 프레임: #5c4033, 15px 두께
* 폰트: Gaegu (손글씨)
*/
""",
"PIXEL_ART": """
/* ═══════════════════════════════════════════════════════════
👾 PIXEL ART (픽셀아트) 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 16색 팔레트 */
:root {
--pixel-black: #000000;
--pixel-dark-blue: #1d2b53;
--pixel-purple: #7e2553;
--pixel-dark-green: #008751;
--pixel-brown: #ab5236;
--pixel-dark-gray: #5f574f;
--pixel-light-gray: #c2c3c7;
--pixel-white: #fff1e8;
--pixel-red: #ff004d;
--pixel-orange: #ffa300;
--pixel-yellow: #ffec27;
--pixel-green: #00e436;
--pixel-blue: #29adff;
--pixel-indigo: #83769c;
--pixel-pink: #ff77a8;
--pixel-peach: #ffccaa;
}
/* 🎮 픽셀 배경 */
.pixel-container {
background-color: var(--pixel-dark-blue);
image-rendering: pixelated;
background-image:
linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);
background-size: 4px 4px;
}
/* 🔲 픽셀 박스 */
.pixel-box {
border: 4px solid var(--pixel-black);
box-shadow: 4px 4px 0 var(--pixel-black);
}
/* 📝 픽셀 폰트 */
.pixel-text {
font-family: 'Press Start 2P', monospace;
text-shadow: 2px 2px 0 var(--pixel-black);
}
/* 📊 핵심 설정값 */
/*
* 렌더링: image-rendering: pixelated
* 그리드: 4px 단위
* 팔레트: 16색 제한
* 그림자: 하드 쉐도우 (blur 없음)
* 폰트: Press Start 2P
*/
""",
"CANDY_POP": """
/* ═══════════════════════════════════════════════════════════
🍬 CANDY POP (캔디팝) 스타일
═══════════════════════════════════════════════════════════ */
/* 🎨 핵심 색상 팔레트 */
:root {
--candy-pink: #ff9ec4;
--candy-mint: #98e8c1;
--candy-lavender: #c4b5fd;
--candy-peach: #ffc09f;
--candy-yellow: #fcf6bd;
--candy-blue: #a0e7e5;
--candy-coral: #ff8fab;
}
/* 🍭 캔디 배경 */
.candy-container {
background: linear-gradient(
135deg,
var(--candy-pink) 0%,
var(--candy-lavender) 25%,
var(--candy-blue) 50%,
var(--candy-mint) 75%,
var(--candy-yellow) 100%
);
background-size: 400% 400%;
animation: candy-gradient 10s ease infinite;
}
@keyframes candy-gradient {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
/* 🔮 캔디 버튼 */
.candy-button {
background: linear-gradient(145deg, var(--candy-pink), var(--candy-coral));
border-radius: 50px;
box-shadow:
inset 0 -8px 20px rgba(0,0,0,0.1),
inset 0 8px 20px rgba(255,255,255,0.6),
0 15px 35px rgba(255, 158, 196, 0.4);
}
/* ✨ 광택 하이라이트 */
.candy-shine::before {
content: '';
position: absolute;
top: 10%;
left: 15%;
width: 70%;
height: 30%;
background: linear-gradient(
180deg,
rgba(255,255,255,0.8) 0%,
transparent 100%
);
border-radius: 50%;
}
/* 📊 핵심 설정값 */
/*
* 색상: 고채도 파스텔 (70-90%)
* 라운드: 25-50px
* 광택: inset shadow (위 밝음, 아래 어두움)
* 하이라이트: 30% 높이 상단
* 애니메이션: 10초 gradient shift
*/
"""
}
# ============================================================
# CSS 스타일 정의
# ============================================================
MAIN_CSS = """
/* ========== 폰트 임포트 ========== */
@import url('https://fonts.googleapis.com/css2?family=Bangers&family=Poppins:wght@300;400;600&family=Nunito:wght@400;700&family=Quicksand:wght@400;600;700&family=Orbitron:wght@400;700&family=Share+Tech+Mono&family=VT323&family=Rajdhani:wght@400;600;700&family=Fredoka:wght@400;500;600&family=Noto+Serif+KR:wght@400;700&family=Gaegu:wght@400;700&family=Press+Start+2P&display=swap');
/* ========== 공통 ========== */
.gradio-container { max-width: 100% !important; }
.code-output textarea {
font-family: 'Share Tech Mono', monospace !important;
font-size: 0.8rem !important;
line-height: 1.4 !important;
white-space: pre !important;
}
/* ========== 1. POP ART ========== */
#tab-popart {
background: radial-gradient(circle at 20% 20%, #FFE66D 2px, transparent 2px),
radial-gradient(circle at 80% 40%, #FF6B6B 2px, transparent 2px),
radial-gradient(circle at 40% 80%, #4ECDC4 2px, transparent 2px), #FFF !important;
background-size: 30px 30px, 40px 40px, 35px 35px, 100% 100%;
padding: 30px !important;
border: 5px solid #000 !important;
}
#tab-popart .style-title { font-family: 'Bangers', cursive !important; font-size: 2.8rem !important; color: #FF6B6B !important; text-shadow: 4px 4px 0 #000, -2px -2px 0 #FFE66D !important; }
#tab-popart .style-desc { background: #FFE66D !important; border: 4px solid #000 !important; padding: 15px !important; box-shadow: 6px 6px 0 #000 !important; }
#tab-popart .input-box textarea { border: 4px solid #000 !important; background: #FFF !important; box-shadow: 5px 5px 0 #FF6B6B !important; }
#tab-popart .generate-btn { background: #FF6B6B !important; border: 4px solid #000 !important; color: #FFF !important; font-family: 'Bangers', cursive !important; font-size: 1.4rem !important; box-shadow: 6px 6px 0 #000 !important; }
#tab-popart .generate-btn:hover { transform: translate(3px, 3px) !important; box-shadow: 3px 3px 0 #000 !important; }
#tab-popart .code-output { border: 4px solid #000 !important; background: #4ECDC4 !important; box-shadow: 6px 6px 0 #000 !important; }
#tab-popart .code-output textarea { color: #000 !important; background: transparent !important; }
/* ========== 2. GLASSMORPHISM ========== */
#tab-glass {
background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%) !important;
padding: 30px !important;
}
#tab-glass .style-title { font-family: 'Poppins', sans-serif !important; font-size: 2.5rem !important; font-weight: 300 !important; color: #fff !important; }
#tab-glass .style-desc { background: rgba(255,255,255,0.15) !important; backdrop-filter: blur(20px) !important; border: 1px solid rgba(255,255,255,0.3) !important; border-radius: 20px !important; padding: 20px !important; color: #fff !important; }
#tab-glass .input-box textarea { background: rgba(255,255,255,0.2) !important; backdrop-filter: blur(10px) !important; border: 1px solid rgba(255,255,255,0.3) !important; border-radius: 15px !important; color: #fff !important; }
#tab-glass .generate-btn { background: rgba(255,255,255,0.25) !important; backdrop-filter: blur(10px) !important; border: 1px solid rgba(255,255,255,0.4) !important; border-radius: 50px !important; color: #fff !important; }
#tab-glass .generate-btn:hover { background: rgba(255,255,255,0.35) !important; transform: translateY(-3px) !important; }
#tab-glass .code-output { background: rgba(255,255,255,0.15) !important; backdrop-filter: blur(20px) !important; border: 1px solid rgba(255,255,255,0.3) !important; border-radius: 20px !important; }
#tab-glass .code-output textarea { color: #fff !important; background: transparent !important; }
/* ========== 3. NEUMORPHISM ========== */
#tab-neumorph {
background: #e0e5ec !important;
padding: 35px !important;
}
#tab-neumorph .style-title { font-family: 'Nunito', sans-serif !important; font-size: 2.5rem !important; font-weight: 700 !important; color: #6d7b8d !important; text-shadow: 2px 2px 4px #fff, -1px -1px 3px rgba(0,0,0,0.1) !important; }
#tab-neumorph .style-desc { background: #e0e5ec !important; border-radius: 20px !important; padding: 20px !important; color: #6d7b8d !important; box-shadow: 8px 8px 16px #b8bec5, -8px -8px 16px #fff !important; }
#tab-neumorph .input-box textarea { background: #e0e5ec !important; border: none !important; border-radius: 15px !important; color: #5a6677 !important; box-shadow: inset 6px 6px 12px #b8bec5, inset -6px -6px 12px #fff !important; }
#tab-neumorph .generate-btn { background: #e0e5ec !important; border: none !important; border-radius: 50px !important; color: #6d7b8d !important; font-weight: 700 !important; box-shadow: 8px 8px 16px #b8bec5, -8px -8px 16px #fff !important; }
#tab-neumorph .generate-btn:hover { box-shadow: 4px 4px 8px #b8bec5, -4px -4px 8px #fff !important; }
#tab-neumorph .code-output { background: #e0e5ec !important; border-radius: 20px !important; box-shadow: 8px 8px 16px #b8bec5, -8px -8px 16px #fff !important; }
#tab-neumorph .code-output textarea { color: #5a6677 !important; background: transparent !important; }
/* ========== 4. CLAYMORPHISM ========== */
#tab-clay {
background: linear-gradient(145deg, #ffecd2 0%, #fcb69f 100%) !important;
padding: 35px !important;
}
#tab-clay .style-title { font-family: 'Fredoka', sans-serif !important; font-size: 2.6rem !important; font-weight: 600 !important; color: #d35400 !important; }
#tab-clay .style-desc { background: #f8b595 !important; border-radius: 30px !important; padding: 25px !important; color: #7f3300 !important; box-shadow: 12px 12px 24px rgba(180,100,60,0.4), -8px -8px 20px rgba(255,255,255,0.7), inset 2px 2px 6px rgba(255,255,255,0.6) !important; }
#tab-clay .input-box textarea { background: #ffe4d4 !important; border: none !important; border-radius: 25px !important; color: #7f3300 !important; box-shadow: inset 8px 8px 16px rgba(180,100,60,0.2), inset -8px -8px 16px rgba(255,255,255,0.9) !important; }
#tab-clay .generate-btn { background: linear-gradient(145deg, #ff9a6c, #e07b4c) !important; border: none !important; border-radius: 50px !important; color: #fff !important; font-family: 'Fredoka', sans-serif !important; font-weight: 600 !important; box-shadow: 10px 10px 20px rgba(180,100,60,0.4), -6px -6px 15px rgba(255,255,255,0.6) !important; }
#tab-clay .generate-btn:hover { transform: translateY(-3px) scale(1.02) !important; }
#tab-clay .code-output { background: #ffd9c4 !important; border-radius: 30px !important; box-shadow: 12px 12px 24px rgba(180,100,60,0.35), -8px -8px 20px rgba(255,255,255,0.8) !important; }
#tab-clay .code-output textarea { color: #7f3300 !important; background: transparent !important; }
/* ========== 5. AURORA ========== */
#tab-aurora {
background: linear-gradient(180deg, #0a0a20 0%, #1a0a30 50%, #0a1a25 100%) !important;
padding: 30px !important;
position: relative;
overflow: hidden;
}
#tab-aurora::before {
content: '';
position: absolute;
top: 0; left: -50%; right: -50%; bottom: 50%;
background: radial-gradient(ellipse at 30% 80%, rgba(0,255,150,0.3) 0%, transparent 50%),
radial-gradient(ellipse at 50% 70%, rgba(100,0,255,0.25) 0%, transparent 45%),
radial-gradient(ellipse at 70% 85%, rgba(0,200,255,0.3) 0%, transparent 50%);
filter: blur(40px);
animation: aurora-flow 8s ease-in-out infinite;
pointer-events: none;
}
@keyframes aurora-flow {
0%, 100% { transform: translateX(0) translateY(0) scale(1); }
50% { transform: translateX(-3%) translateY(3%) scale(1.05); }
}
#tab-aurora .style-title { font-family: 'Quicksand', sans-serif !important; font-size: 2.5rem !important; background: linear-gradient(90deg, #00ff88, #00ccff, #cc00ff, #00ff88) !important; background-size: 300% 100% !important; -webkit-background-clip: text !important; -webkit-text-fill-color: transparent !important; animation: aurora-text 6s linear infinite; position: relative; z-index: 10; }
@keyframes aurora-text { 0% { background-position: 0% 50%; } 100% { background-position: 300% 50%; } }
#tab-aurora .style-desc { background: rgba(0,255,150,0.08) !important; border: 1px solid rgba(0,255,150,0.3) !important; border-radius: 20px !important; padding: 20px !important; color: #a0ffcc !important; position: relative; z-index: 10; }
#tab-aurora .input-box textarea { background: rgba(10,20,30,0.8) !important; border: 1px solid rgba(0,200,255,0.3) !important; border-radius: 15px !important; color: #c0ffee !important; position: relative; z-index: 10; }
#tab-aurora .generate-btn { background: linear-gradient(135deg, rgba(0,255,150,0.3), rgba(0,200,255,0.3), rgba(200,0,255,0.3)) !important; border: 1px solid rgba(0,255,150,0.4) !important; border-radius: 30px !important; color: #fff !important; position: relative; z-index: 10; }
#tab-aurora .code-output { background: rgba(10,20,30,0.8) !important; border: 1px solid rgba(100,0,255,0.3) !important; border-radius: 20px !important; position: relative; z-index: 10; }
#tab-aurora .code-output textarea { color: #c0ffee !important; background: transparent !important; }
/* ========== 6. LIQUID METAL ========== */
#tab-metal {
background: linear-gradient(135deg, #2c3e50 0%, #1a1a2e 50%, #2c3e50 100%) !important;
padding: 30px !important;
}
#tab-metal .style-title { font-family: 'Orbitron', sans-serif !important; font-size: 2.3rem !important; background: linear-gradient(135deg, #c0c0c0 0%, #f8f8f8 20%, #a0a0a0 40%, #f0f0f0 60%, #c0c0c0 80%) !important; background-size: 200% 200% !important; -webkit-background-clip: text !important; -webkit-text-fill-color: transparent !important; animation: metal-shine 4s linear infinite; }
@keyframes metal-shine { 0% { background-position: 0% 50%; } 100% { background-position: 200% 50%; } }
#tab-metal .style-desc { background: linear-gradient(145deg, #3a3a4a, #2a2a3a) !important; border: 1px solid rgba(192,192,192,0.3) !important; border-radius: 15px !important; padding: 20px !important; color: #c0c0c0 !important; }
#tab-metal .input-box textarea { background: linear-gradient(145deg, #1a1a2a, #2a2a3a) !important; border: 1px solid rgba(192,192,192,0.2) !important; border-radius: 10px !important; color: #e0e0e0 !important; }
#tab-metal .generate-btn { background: linear-gradient(135deg, #707080 0%, #b0b0c0 25%, #606070 50%, #c0c0d0 75%, #707080 100%) !important; background-size: 200% 200% !important; border: 2px solid rgba(200,200,220,0.5) !important; border-radius: 10px !important; color: #1a1a2a !important; font-family: 'Orbitron', sans-serif !important; animation: metal-shine 3s linear infinite; }
#tab-metal .code-output { background: linear-gradient(145deg, #2a2a3a, #1a1a2a) !important; border: 1px solid rgba(192,192,192,0.2) !important; border-radius: 15px !important; }
#tab-metal .code-output textarea { color: #c0c0c0 !important; background: transparent !important; }
/* ========== 7. PAPER CUT ========== */
#tab-paper {
background: linear-gradient(180deg, #f5f5f0 0%, #ebebdf 100%) !important;
padding: 30px !important;
}
#tab-paper .style-title { font-family: 'Quicksand', sans-serif !important; font-size: 2.5rem !important; font-weight: 700 !important; color: #5d4e37 !important; }
#tab-paper .style-desc { background: #fff !important; border-radius: 4px !important; padding: 20px 25px !important; color: #5d4e37 !important; box-shadow: 0 1px 1px rgba(0,0,0,0.06), 0 2px 2px rgba(0,0,0,0.06), 0 4px 4px rgba(0,0,0,0.06), 0 8px 8px rgba(0,0,0,0.06), 0 16px 16px rgba(0,0,0,0.06) !important; }
#tab-paper .input-box textarea { background: #fff !important; border: 1px solid #e0ddd5 !important; border-radius: 4px !important; color: #5d4e37 !important; }
#tab-paper .generate-btn { background: #fff !important; border: 2px solid #5d4e37 !important; border-radius: 4px !important; color: #5d4e37 !important; font-weight: 700 !important; box-shadow: 0 2px 4px rgba(0,0,0,0.08), 0 4px 8px rgba(0,0,0,0.08) !important; }
#tab-paper .generate-btn:hover { transform: translateY(-4px) !important; box-shadow: 0 4px 8px rgba(0,0,0,0.1), 0 8px 16px rgba(0,0,0,0.1) !important; }
#tab-paper .code-output { background: #fff !important; border: 1px solid #e0ddd5 !important; border-radius: 4px !important; box-shadow: 0 1px 1px rgba(0,0,0,0.05), 0 2px 2px rgba(0,0,0,0.05), 0 4px 4px rgba(0,0,0,0.05), 0 8px 8px rgba(0,0,0,0.05) !important; }
#tab-paper .code-output textarea { color: #5d4e37 !important; background: transparent !important; }
/* ========== 8. HOLOGRAPHIC ========== */
#tab-holo {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%) !important;
padding: 30px !important;
position: relative;
overflow: hidden;
}
#tab-holo::before {
content: '';
position: absolute;
top: -50%; left: -50%; right: -50%; bottom: -50%;
background: conic-gradient(from 0deg, #ff0080, #ff8c00, #ffff00, #00ff80, #00ffff, #0080ff, #8000ff, #ff0080);
opacity: 0.15;
animation: holo-rotate 10s linear infinite;
pointer-events: none;
}
@keyframes holo-rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
#tab-holo .style-title { font-family: 'Rajdhani', sans-serif !important; font-size: 2.6rem !important; background: linear-gradient(90deg, #ff0080, #ff8c00, #ffff00, #00ff80, #00ffff, #8000ff, #ff0080) !important; background-size: 400% 100% !important; -webkit-background-clip: text !important; -webkit-text-fill-color: transparent !important; animation: holo-shift 5s linear infinite; position: relative; z-index: 10; }
@keyframes holo-shift { 0% { background-position: 0% 50%; } 100% { background-position: 400% 50%; } }
#tab-holo .style-desc { background: rgba(255,255,255,0.05) !important; border: 1px solid rgba(255,255,255,0.1) !important; border-radius: 15px !important; padding: 20px !important; color: #e0e0ff !important; position: relative; z-index: 10; }
#tab-holo .input-box textarea { background: rgba(20,20,40,0.8) !important; border: 1px solid rgba(255,140,0,0.3) !important; border-radius: 10px !important; color: #fff !important; position: relative; z-index: 10; }
#tab-holo .generate-btn { background: linear-gradient(135deg, rgba(255,0,128,0.6), rgba(255,140,0,0.6), rgba(0,255,128,0.6), rgba(0,255,255,0.6), rgba(128,0,255,0.6)) !important; background-size: 300% 300% !important; border: 1px solid rgba(255,255,255,0.3) !important; border-radius: 30px !important; color: #fff !important; animation: holo-btn 6s ease infinite; position: relative; z-index: 10; }
@keyframes holo-btn { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }
#tab-holo .code-output { background: rgba(20,20,40,0.8) !important; border: 1px solid rgba(128,0,255,0.3) !important; border-radius: 15px !important; position: relative; z-index: 10; }
#tab-holo .code-output textarea { color: #e0e0ff !important; background: transparent !important; }
/* ========== 9. FROSTED CRYSTAL ========== */
#tab-frost {
background: linear-gradient(180deg, #e8f4fc 0%, #c5dff8 50%, #a8d4f0 100%) !important;
padding: 30px !important;
}
#tab-frost .style-title { font-family: 'Quicksand', sans-serif !important; font-size: 2.5rem !important; font-weight: 700 !important; color: #4a7c9b !important; text-shadow: 0 2px 4px rgba(255,255,255,0.8) !important; }
#tab-frost .style-desc { background: rgba(255,255,255,0.4) !important; backdrop-filter: blur(20px) saturate(180%) !important; border: 1px solid rgba(255,255,255,0.6) !important; border-radius: 20px !important; padding: 20px !important; color: #3a6a8a !important; box-shadow: inset 0 0 30px rgba(255,255,255,0.5), 0 8px 32px rgba(100,150,200,0.2) !important; }
#tab-frost .input-box textarea { background: rgba(255,255,255,0.5) !important; backdrop-filter: blur(10px) !important; border: 1px solid rgba(255,255,255,0.7) !important; border-radius: 15px !important; color: #2a5a7a !important; }
#tab-frost .generate-btn { background: rgba(255,255,255,0.6) !important; backdrop-filter: blur(15px) !important; border: 2px solid rgba(255,255,255,0.8) !important; border-radius: 50px !important; color: #3a6a8a !important; font-weight: 700 !important; }
#tab-frost .generate-btn:hover { background: rgba(255,255,255,0.8) !important; transform: translateY(-3px) !important; }
#tab-frost .code-output { background: rgba(255,255,255,0.4) !important; backdrop-filter: blur(20px) !important; border: 1px solid rgba(255,255,255,0.6) !important; border-radius: 20px !important; }
#tab-frost .code-output textarea { color: #2a5a7a !important; background: transparent !important; }
/* ========== 10. SOFT NEON ========== */
#tab-softneon {
background: linear-gradient(135deg, #1a1a2e 0%, #0f0f1a 100%) !important;
padding: 30px !important;
}
#tab-softneon .style-title { font-family: 'Quicksand', sans-serif !important; font-size: 2.5rem !important; color: #ffb6c1 !important; text-shadow: 0 0 10px rgba(255,182,193,0.5), 0 0 20px rgba(255,182,193,0.3), 0 0 40px rgba(255,182,193,0.2) !important; }
#tab-softneon .style-desc { background: rgba(255,182,193,0.08) !important; border: 1px solid rgba(255,182,193,0.2) !important; border-radius: 20px !important; padding: 20px !important; color: #e6d0d5 !important; box-shadow: 0 0 20px rgba(255,182,193,0.1), inset 0 0 20px rgba(255,182,193,0.05) !important; }
#tab-softneon .input-box textarea { background: rgba(20,20,35,0.9) !important; border: 1px solid rgba(176,224,230,0.3) !important; border-radius: 15px !important; color: #b0e0e6 !important; }
#tab-softneon .generate-btn { background: rgba(30,30,50,0.8) !important; border: 2px solid rgba(221,160,221,0.5) !important; border-radius: 50px !important; color: #dda0dd !important; box-shadow: 0 0 20px rgba(221,160,221,0.2), 0 0 40px rgba(221,160,221,0.1) !important; }
#tab-softneon .generate-btn:hover { box-shadow: 0 0 30px rgba(221,160,221,0.4), 0 0 60px rgba(221,160,221,0.2) !important; }
#tab-softneon .code-output { background: rgba(20,20,35,0.9) !important; border: 1px solid rgba(152,251,152,0.2) !important; border-radius: 20px !important; }
#tab-softneon .code-output textarea { color: #98fb98 !important; background: transparent !important; }
/* ========== 11. CRT TERMINAL ========== */
#tab-crt {
background: #0a0a0a !important;
padding: 30px !important;
position: relative;
}
#tab-crt::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,0.3) 2px, rgba(0,0,0,0.3) 4px);
pointer-events: none;
z-index: 1;
}
#tab-crt::after {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: radial-gradient(ellipse at center, transparent 0%, rgba(0,0,0,0.4) 100%);
pointer-events: none;
z-index: 2;
}
#tab-crt .style-title { font-family: 'VT323', monospace !important; font-size: 2.8rem !important; color: #33ff33 !important; text-shadow: 0 0 5px #33ff33, 0 0 10px #33ff33, 0 0 20px #33ff33 !important; position: relative; z-index: 10; animation: crt-flicker 0.1s infinite; }
@keyframes crt-flicker { 0%, 100% { opacity: 1; } 92% { opacity: 0.95; } 97% { opacity: 0.9; } }
#tab-crt .style-desc { background: rgba(0,50,0,0.3) !important; border: 1px solid #33ff33 !important; padding: 20px !important; color: #33ff33 !important; font-family: 'VT323', monospace !important; font-size: 1.2rem !important; position: relative; z-index: 10; }
#tab-crt .input-box textarea { background: rgba(0,20,0,0.8) !important; border: 1px solid #33ff33 !important; color: #33ff33 !important; font-family: 'VT323', monospace !important; font-size: 1.1rem !important; position: relative; z-index: 10; }
#tab-crt .generate-btn { background: #0a0a0a !important; border: 2px solid #33ff33 !important; color: #33ff33 !important; font-family: 'VT323', monospace !important; font-size: 1.3rem !important; position: relative; z-index: 10; }
#tab-crt .generate-btn:hover { background: #33ff33 !important; color: #0a0a0a !important; }
#tab-crt .code-output { background: rgba(0,20,0,0.8) !important; border: 1px solid #33ff33 !important; position: relative; z-index: 10; }
#tab-crt .code-output textarea { color: #33ff33 !important; background: transparent !important; font-family: 'VT323', monospace !important; text-shadow: 0 0 5px #33ff33 !important; }
/* ========== 12. ORIGAMI ========== */
#tab-origami {
background: linear-gradient(135deg, #f0f0f0 0%, #e8e8e8 100%) !important;
padding: 30px !important;
}
#tab-origami .style-title { font-family: 'Rajdhani', sans-serif !important; font-size: 2.5rem !important; font-weight: 700 !important; color: #4a4a5a !important; letter-spacing: 5px !important; }
#tab-origami .style-desc { background: linear-gradient(135deg, #fff 0%, #f8f8f8 50%, #f0f0f0 50%, #e8e8e8 100%) !important; padding: 25px !important; color: #4a4a5a !important; clip-path: polygon(0 0, 100% 0, 100% calc(100% - 20px), calc(100% - 20px) 100%, 0 100%) !important; box-shadow: 4px 4px 0 rgba(0,0,0,0.1), 8px 8px 0 rgba(0,0,0,0.05) !important; }
#tab-origami .input-box textarea { background: #fff !important; border: 2px solid #d0d0d8 !important; color: #4a4a5a !important; clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 10px, 100% 100%, 0 100%) !important; }
#tab-origami .generate-btn { background: linear-gradient(135deg, #5a5a6a 0%, #4a4a5a 50%, #3a3a4a 50%, #2a2a3a 100%) !important; color: #fff !important; font-family: 'Rajdhani', sans-serif !important; font-weight: 700 !important; clip-path: polygon(15px 0, 100% 0, 100% calc(100% - 15px), calc(100% - 15px) 100%, 0 100%, 0 15px) !important; box-shadow: 4px 4px 0 rgba(0,0,0,0.2) !important; }
#tab-origami .generate-btn:hover { transform: translate(-2px, -2px) !important; box-shadow: 8px 8px 0 rgba(0,0,0,0.15) !important; }
#tab-origami .code-output { background: linear-gradient(135deg, #fff 0%, #f8f8f8 50%, #f4f4f4 50%, #f0f0f0 100%) !important; clip-path: polygon(0 0, 100% 0, 100% 100%, 15px 100%, 0 calc(100% - 15px)) !important; box-shadow: 3px 3px 0 rgba(0,0,0,0.08), 6px 6px 0 rgba(0,0,0,0.04) !important; }
#tab-origami .code-output textarea { color: #4a4a5a !important; background: transparent !important; }
/* ========== 13. BIOLUMINESCENCE ========== */
#tab-bio {
background: linear-gradient(180deg, #000810 0%, #001020 50%, #000815 100%) !important;
padding: 30px !important;
position: relative;
overflow: hidden;
}
#tab-bio::before {
content: '';
position: absolute;
top: 20%; left: 10%;
width: 150px; height: 150px;
background: radial-gradient(ellipse, rgba(0,255,200,0.2) 0%, transparent 70%);
filter: blur(30px);
animation: bio-float-1 6s ease-in-out infinite;
pointer-events: none;
}
#tab-bio::after {
content: '';
position: absolute;
bottom: 30%; right: 15%;
width: 120px; height: 120px;
background: radial-gradient(ellipse, rgba(100,200,255,0.2) 0%, transparent 70%);
filter: blur(25px);
animation: bio-float-2 8s ease-in-out infinite;
pointer-events: none;
}
@keyframes bio-float-1 { 0%, 100% { transform: translate(0,0) scale(1); opacity: 0.6; } 50% { transform: translate(30px,-20px) scale(1.2); opacity: 1; } }
@keyframes bio-float-2 { 0%, 100% { transform: translate(0,0) scale(1); opacity: 0.5; } 50% { transform: translate(-20px,30px) scale(1.1); opacity: 0.9; } }
#tab-bio .style-title { font-family: 'Quicksand', sans-serif !important; font-size: 2.5rem !important; color: #00ffc8 !important; text-shadow: 0 0 10px rgba(0,255,200,0.7), 0 0 20px rgba(0,255,200,0.5), 0 0 40px rgba(0,255,200,0.3) !important; animation: bio-pulse 3s ease-in-out infinite; position: relative; z-index: 10; }
@keyframes bio-pulse { 0%, 100% { text-shadow: 0 0 10px rgba(0,255,200,0.7), 0 0 20px rgba(0,255,200,0.5); } 50% { text-shadow: 0 0 20px rgba(0,255,200,0.9), 0 0 40px rgba(0,255,200,0.7), 0 0 60px rgba(0,255,200,0.4); } }
#tab-bio .style-desc { background: rgba(0,255,200,0.05) !important; border: 1px solid rgba(0,255,200,0.2) !important; border-radius: 30px !important; padding: 20px !important; color: #80ffdc !important; position: relative; z-index: 10; }
#tab-bio .input-box textarea { background: rgba(0,20,30,0.8) !important; border: 1px solid rgba(100,200,255,0.3) !important; border-radius: 20px !important; color: #a0e0ff !important; position: relative; z-index: 10; }
#tab-bio .generate-btn { background: rgba(0,30,40,0.8) !important; border: 2px solid rgba(0,255,200,0.4) !important; border-radius: 50px !important; color: #00ffc8 !important; box-shadow: 0 0 20px rgba(0,255,200,0.2), 0 0 40px rgba(0,255,200,0.1) !important; animation: bio-btn-glow 3s ease-in-out infinite; position: relative; z-index: 10; }
@keyframes bio-btn-glow { 0%, 100% { box-shadow: 0 0 20px rgba(0,255,200,0.2), 0 0 40px rgba(0,255,200,0.1); } 50% { box-shadow: 0 0 30px rgba(0,255,200,0.4), 0 0 60px rgba(0,255,200,0.2); } }
#tab-bio .code-output { background: rgba(0,20,30,0.8) !important; border: 1px solid rgba(150,100,255,0.2) !important; border-radius: 25px !important; position: relative; z-index: 10; }
#tab-bio .code-output textarea { color: #c0a0ff !important; background: transparent !important; }
/* ========== 14. INK WASH ========== */
#tab-ink {
background: radial-gradient(ellipse at 20% 10%, rgba(26,26,26,0.15) 0%, transparent 50%),
radial-gradient(ellipse at 80% 90%, rgba(45,45,45,0.1) 0%, transparent 40%),
#f5f2e8 !important;
padding: 40px !important;
}
#tab-ink .style-title { font-family: 'Noto Serif KR', serif !important; font-size: 2.5rem !important; color: #1a1a1a !important; letter-spacing: 8px !important; border-bottom: 3px solid #1a1a1a !important; padding-bottom: 10px !important; display: inline-block !important; }
#tab-ink .style-desc { background: transparent !important; border-left: 4px solid #1a1a1a !important; padding: 15px 20px !important; color: #2d2d2d !important; font-family: 'Noto Serif KR', serif !important; }
#tab-ink .input-box textarea { background: rgba(255,255,255,0.7) !important; border: none !important; border-bottom: 2px solid #5a5a5a !important; border-radius: 0 !important; color: #1a1a1a !important; }
#tab-ink .generate-btn { background: #1a1a1a !important; border: none !important; border-radius: 0 !important; color: #f5f2e8 !important; font-family: 'Noto Serif KR', serif !important; letter-spacing: 5px !important; }
#tab-ink .generate-btn:hover { background: #c73e1d !important; }
#tab-ink .code-output { background: rgba(255,255,255,0.6) !important; border-left: 3px solid #8a8a8a !important; border-radius: 0 !important; }
#tab-ink .code-output textarea { color: #2d2d2d !important; background: transparent !important; }
/* ========== 15. SOAP BUBBLE ========== */
#tab-bubble {
background: linear-gradient(135deg, #e8f4ff 0%, #f5e8ff 50%, #e8fff4 100%) !important;
padding: 35px !important;
}
#tab-bubble .style-title { font-family: 'Quicksand', sans-serif !important; font-size: 2.5rem !important; background: linear-gradient(90deg, #ff9ec4, #a0e7e5, #c4b5fd, #ff9ec4) !important; background-size: 300% 100% !important; -webkit-background-clip: text !important; -webkit-text-fill-color: transparent !important; animation: bubble-text 5s linear infinite; }
@keyframes bubble-text { 0% { background-position: 0% 50%; } 100% { background-position: 300% 50%; } }
#tab-bubble .style-desc { background: conic-gradient(from 0deg at 30% 30%, rgba(255,150,200,0.3), rgba(100,255,255,0.3), rgba(255,255,150,0.3), rgba(200,150,255,0.3), rgba(150,255,200,0.3), rgba(255,150,200,0.3)) !important; border: 1px solid rgba(255,255,255,0.5) !important; border-radius: 50px !important; padding: 25px 30px !important; color: #5a5a7a !important; backdrop-filter: blur(5px) !important; box-shadow: inset 10px 10px 30px rgba(255,255,255,0.8), 0 10px 40px rgba(150,180,255,0.2) !important; }
#tab-bubble .input-box textarea { background: rgba(255,255,255,0.5) !important; border: 1px solid rgba(200,180,255,0.5) !important; border-radius: 25px !important; color: #4a4a6a !important; backdrop-filter: blur(5px) !important; }
#tab-bubble .generate-btn { background: conic-gradient(from 0deg, rgba(255,150,200,0.6), rgba(100,255,255,0.6), rgba(255,255,150,0.6), rgba(200,150,255,0.6), rgba(255,150,200,0.6)) !important; border: 1px solid rgba(255,255,255,0.6) !important; border-radius: 50px !important; color: #4a4a6a !important; box-shadow: inset 5px 5px 20px rgba(255,255,255,0.7), 0 10px 30px rgba(180,150,255,0.3) !important; animation: bubble-rotate 8s linear infinite; }
@keyframes bubble-rotate { 0% { filter: hue-rotate(0deg); } 100% { filter: hue-rotate(360deg); } }
#tab-bubble .generate-btn:hover { transform: scale(1.05) translateY(-3px) !important; }
#tab-bubble .code-output { background: rgba(255,255,255,0.4) !important; border: 1px solid rgba(200,180,255,0.4) !important; border-radius: 30px !important; backdrop-filter: blur(5px) !important; }
#tab-bubble .code-output textarea { color: #4a4a6a !important; background: transparent !important; }
/* ========== 16. CHALKBOARD ========== */
#tab-chalk {
background: linear-gradient(180deg, #1e3a1e 0%, #2a4a2a 50%, #1e3a1e 100%) !important;
padding: 20px !important;
border: 15px solid #5c4033 !important;
box-shadow: inset 0 0 50px rgba(0,0,0,0.4), 0 10px 30px rgba(0,0,0,0.3) !important;
}
#tab-chalk .style-title { font-family: 'Gaegu', cursive !important; font-size: 2.8rem !important; color: #f0f0e8 !important; text-shadow: 0 0 10px rgba(240,240,232,0.5), 2px 2px 4px rgba(0,0,0,0.3) !important; }
#tab-chalk .style-desc { background: transparent !important; border: 2px dashed rgba(240,240,232,0.5) !important; padding: 15px 20px !important; color: #f0f0e8 !important; font-family: 'Gaegu', cursive !important; font-size: 1.2rem !important; }
#tab-chalk .input-box textarea { background: rgba(30,58,30,0.5) !important; border: 2px solid rgba(240,240,232,0.4) !important; color: #f0f0e8 !important; font-family: 'Gaegu', cursive !important; font-size: 1.1rem !important; }
#tab-chalk .generate-btn { background: transparent !important; border: 3px solid #f0f0e8 !important; color: #f0f0e8 !important; font-family: 'Gaegu', cursive !important; font-size: 1.3rem !important; }
#tab-chalk .generate-btn:hover { background: rgba(240,240,232,0.15) !important; }
#tab-chalk .code-output { background: rgba(30,58,30,0.4) !important; border: 2px solid rgba(240,240,232,0.3) !important; }
#tab-chalk .code-output textarea { color: #f5e6a3 !important; background: transparent !important; font-family: 'Gaegu', cursive !important; text-shadow: 0 0 5px rgba(245,230,163,0.4) !important; }
/* ========== 17. PIXEL ART ========== */
#tab-pixel {
background: linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px),
#1d2b53 !important;
background-size: 4px 4px, 4px 4px, 100% 100%;
padding: 30px !important;
image-rendering: pixelated;
}
#tab-pixel .style-title { font-family: 'Press Start 2P', monospace !important; font-size: 1.6rem !important; color: #ffec27 !important; text-shadow: 4px 4px 0 #000 !important; }
#tab-pixel .style-desc { background: #c2c3c7 !important; border: 4px solid #000 !important; padding: 15px !important; color: #1d2b53 !important; font-family: 'Press Start 2P', monospace !important; font-size: 0.65rem !important; line-height: 1.8 !important; box-shadow: 4px 4px 0 #000 !important; }
#tab-pixel .input-box textarea { background: #fff1e8 !important; border: 4px solid #000 !important; color: #1d2b53 !important; font-family: 'Press Start 2P', monospace !important; font-size: 0.7rem !important; box-shadow: 4px 4px 0 #5f574f !important; }
#tab-pixel .generate-btn { background: #ff004d !important; border: 4px solid #000 !important; color: #fff1e8 !important; font-family: 'Press Start 2P', monospace !important; font-size: 0.75rem !important; box-shadow: inset -4px -4px 0 #7e2553, inset 4px 4px 0 #ff77a8, 4px 4px 0 #000 !important; }
#tab-pixel .generate-btn:hover { transform: translate(2px, 2px) !important; box-shadow: inset 4px 4px 0 #7e2553, inset -4px -4px 0 #ff77a8, 2px 2px 0 #000 !important; }
#tab-pixel .code-output { background: #fff1e8 !important; border: 4px solid #000 !important; box-shadow: 4px 4px 0 #5f574f !important; }
#tab-pixel .code-output textarea { color: #1d2b53 !important; background: transparent !important; font-family: 'Press Start 2P', monospace !important; font-size: 0.55rem !important; line-height: 1.5 !important; }
/* ========== 18. CANDY POP ========== */
#tab-candy {
background: linear-gradient(135deg, #ff9ec4 0%, #c4b5fd 25%, #a0e7e5 50%, #98e8c1 75%, #fcf6bd 100%) !important;
background-size: 400% 400% !important;
animation: candy-bg 10s ease infinite;
padding: 35px !important;
}
@keyframes candy-bg { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }
#tab-candy .style-title { font-family: 'Fredoka', cursive !important; font-size: 2.8rem !important; color: #fff !important; text-shadow: 3px 3px 0 #ff8fab, 6px 6px 0 rgba(0,0,0,0.1) !important; }
#tab-candy .style-desc { background: linear-gradient(145deg, rgba(255,255,255,0.9), rgba(255,220,230,0.9)) !important; border-radius: 30px !important; padding: 20px 25px !important; color: #ff6b8a !important; font-family: 'Quicksand', sans-serif !important; font-weight: 600 !important; box-shadow: inset 0 -6px 15px rgba(0,0,0,0.08), inset 0 6px 15px rgba(255,255,255,0.9), 0 10px 30px rgba(255,143,171,0.3) !important; }
#tab-candy .input-box textarea { background: rgba(255,255,255,0.9) !important; border: 3px solid #ffc09f !important; border-radius: 20px !important; color: #ff6b8a !important; font-family: 'Quicksand', sans-serif !important; }
#tab-candy .generate-btn { background: linear-gradient(145deg, #ff9ec4, #ff6b8a) !important; border: none !important; border-radius: 50px !important; color: #fff !important; font-family: 'Fredoka', cursive !important; font-size: 1.2rem !important; box-shadow: inset 0 -5px 15px rgba(0,0,0,0.15), inset 0 5px 15px rgba(255,255,255,0.4), 0 10px 30px rgba(255,107,138,0.4) !important; }
#tab-candy .generate-btn:hover { transform: translateY(-5px) scale(1.03) !important; }
#tab-candy .code-output { background: rgba(255,255,255,0.9) !important; border: 3px solid #a0e7e5 !important; border-radius: 25px !important; }
#tab-candy .code-output textarea { color: #5a8a88 !important; background: transparent !important; }
/* ========== 탭 스타일 ========== */
.tabs { background: transparent !important; }
.tab-nav {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%) !important;
border-radius: 15px 15px 0 0 !important;
padding: 10px !important;
flex-wrap: wrap !important;
gap: 5px !important;
}
.tab-nav button {
background: rgba(255,255,255,0.08) !important;
border: 1px solid rgba(255,255,255,0.15) !important;
border-radius: 8px !important;
color: #a0a0c0 !important;
padding: 8px 12px !important;
font-size: 0.8rem !important;
transition: all 0.3s !important;
}
.tab-nav button:hover { background: rgba(255,255,255,0.15) !important; color: #fff !important; }
.tab-nav button.selected { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important; border-color: transparent !important; color: #fff !important; }
"""
# ============================================================
# 출력 함수
# ============================================================
def show_style_code(style_key):
return STYLE_CODES.get(style_key, "스타일 코드를 찾을 수 없습니다.")
# ============================================================
# 탭 생성 함수
# ============================================================
def create_style_tab(tab_id, style_name, style_emoji, style_desc, style_key):
with gr.Column(elem_id=tab_id):
gr.HTML(f'<h1 class="style-title">{style_emoji} {style_name}</h1>')
gr.HTML(f'<div class="style-desc">{style_desc}</div>')
gr.Markdown("")
with gr.Row():
with gr.Column(scale=1):
prompt = gr.Textbox(label="", placeholder=f"{style_name} 스타일 체험...", lines=3, elem_classes=["input-box"])
btn = gr.Button(f"📜 CSS 코드 보기", elem_classes=["generate-btn"])
with gr.Column(scale=2):
output = gr.Textbox(label="", value=STYLE_CODES.get(style_key, ""), lines=20, elem_classes=["code-output"], interactive=False)
btn.click(fn=lambda: show_style_code(style_key), inputs=[], outputs=[output])
# ============================================================
# 메인 앱
# ============================================================
with gr.Blocks(css=MAIN_CSS, title="🎨 18 Visual Styles Gallery", theme=gr.themes.Base()) as demo:
gr.HTML("""
<div style="text-align:center; padding: 25px; background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%); border-radius: 20px; margin-bottom: 20px;">
<h1 style="font-size: 2.5rem; margin: 0; background: linear-gradient(135deg, #667eea 0%, #764ba2 30%, #f093fb 60%, #00d4ff 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">
🎨 18 Visual Styles Gallery
</h1>
<p style="color: #a0a0c0; margin-top: 10px;">원래 13개 + 신규 5개 스타일 | CSS 코드 포함</p>
</div>
""")
with gr.Tabs():
# 원래 13개
with gr.Tab("🦸 Pop Art"):
create_style_tab("tab-popart", "POP ART / COMIC", "💥", "만화풍 스타일! 벤데이 도트, 굵은 윤곽선, 원색의 강렬한 비주얼.", "POP_ART")
with gr.Tab("🪟 Glass"):
create_style_tab("tab-glass", "GLASSMORPHISM", "✨", "투명한 유리처럼 반투명하고 부드러운 UI. 블러 효과와 은은한 빛 반사.", "GLASSMORPHISM")
with gr.Tab("🔘 Neumorph"):
create_style_tab("tab-neumorph", "NEUMORPHISM", "🎛️", "부드러운 볼록/오목 효과. 실제 버튼을 누르는 듯한 촉각적 경험.", "NEUMORPHISM")
with gr.Tab("🧸 Clay"):
create_style_tab("tab-clay", "CLAYMORPHISM", "🎨", "점토처럼 부풀어 오른 3D 느낌! Neumorphism의 진화 버전.", "CLAYMORPHISM")
with gr.Tab("🌌 Aurora"):
create_style_tab("tab-aurora", "AURORA BOREALIS", "🌈", "북극 오로라처럼 유동적으로 흐르는 빛의 커튼.", "AURORA")
with gr.Tab("🪞 Metal"):
create_style_tab("tab-metal", "LIQUID METAL", "⚙️", "수은처럼 흐르는 액체 금속. 메탈릭 반사와 미래적 질감.", "LIQUID_METAL")
with gr.Tab("📄 Paper"):
create_style_tab("tab-paper", "PAPER CUT", "✂️", "종이를 오려 겹쳐놓은 입체 효과. 따뜻한 핸드메이드 감성.", "PAPER_CUT")
with gr.Tab("🌈 Holo"):
create_style_tab("tab-holo", "HOLOGRAPHIC", "💎", "보는 각도에 따라 색이 변하는 홀로그램. 무지개빛 효과.", "HOLOGRAPHIC")
with gr.Tab("❄️ Frost"):
create_style_tab("tab-frost", "FROSTED CRYSTAL", "🧊", "얼음과 서리가 낀 유리창. 차갑고 깨끗한 크리스탈 효과.", "FROSTED_CRYSTAL")
with gr.Tab("💡 Soft Neon"):
create_style_tab("tab-softneon", "SOFT NEON", "🌙", "은은한 네온 발광. 파스텔 네온의 몽환적 분위기.", "SOFT_NEON")
with gr.Tab("🖥️ CRT"):
create_style_tab("tab-crt", "CRT TERMINAL", "📟", "80년대 구형 모니터. 스캔라인과 인광 잔상 효과.", "CRT_TERMINAL")
with gr.Tab("🦢 Origami"):
create_style_tab("tab-origami", "ORIGAMI", "📐", "종이접기처럼 접힌 면의 명암. 기하학적 아름다움.", "ORIGAMI")
with gr.Tab("🦑 Bio"):
create_style_tab("tab-bio", "BIOLUMINESCENCE", "🌊", "심해 생물처럼 어둠 속 자체 발광. 신비로운 생명의 빛.", "BIOLUMINESCENCE")
# 신규 5개
with gr.Tab("🖌️ Ink"):
create_style_tab("tab-ink", "INK WASH / SUMI-E", "墨", "동양 수묵화의 여백과 번짐의 미학. 붓터치와 깊이감.", "INK_WASH")
with gr.Tab("🫧 Bubble"):
create_style_tab("tab-bubble", "SOAP BUBBLE", "🌈", "비눗방울 막의 무지개빛 반사. 환상적인 색채의 향연.", "SOAP_BUBBLE")
with gr.Tab("📝 Chalk"):
create_style_tab("tab-chalk", "CHALKBOARD", "✏️", "학교 칠판과 분필의 향수. 손글씨 느낌의 따뜻한 감성.", "CHALKBOARD")
with gr.Tab("👾 Pixel"):
create_style_tab("tab-pixel", "PIXEL ART", "🎮", "8비트 레트로 게임의 도트 그래픽. 클래식한 매력.", "PIXEL_ART")
with gr.Tab("🍬 Candy"):
create_style_tab("tab-candy", "CANDY POP", "🍭", "달콤한 사탕처럼 반짝이는 팝 컬러. 통통 튀는 에너지.", "CANDY_POP")
if __name__ == "__main__":
demo.launch()