Compare commits

...

8 Commits

Author SHA1 Message Date
king a85322da58 chore: push-gitea.bat / run-local.bat를 .gitignore에 추가
로컬 전용 스크립트(자격증명 포함 가능)가 Gitea에 올라가지 않도록 제외.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 02:10:34 +09:00
king c4ae1ab3e6 UI: King 텍스트 움직임 범위 확장, 별 도형 제거, 도형 밝기 조정
- kingFloat 애니메이션 translate 범위를 ±16px → ±70px 로 확장
- login.html / denied.html 에서 shape-7(별) div 제거
- shape-1~6 도형 밝기 은은하게 감소 (이전 수준으로 복구)
- .shape-king text-transform: none → "King" 으로 표시

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 02:04:54 +09:00
king 672a99ef80 design: shape-8 삭제, 별 위치 우측 이동, King 반짝 텍스트 추가 2026-05-22 01:19:19 +09:00
king d2b145576b design: 브랜드 패널 도형 강화 — 세모·별 추가, 두께·밝기 증가, 모션 가속 2026-05-22 01:15:23 +09:00
king e1af7285a1 design: DBX Corporation 명칭 수정, 폰트 확대, 브랜드 패널 애니메이션 도형 추가
- 모든 페이지 'DBX Corp' → 'DBX Corporation' 통일
- 브랜드 패널 좌측에 천천히 움직이는 도형 5개 추가 (CSS 애니메이션)
- 전체 기본 폰트 15px → 16px, 제목/카드 크기 확대
- 'Google Workspace 계정...' 문장 한 줄 표시 처리
2026-05-22 01:05:47 +09:00
king 6993ab9397 chore: Pretendard 폰트를 로컬 TTF에서 jsDelivr CDN으로 교체 (저장소 -8MB) 2026-05-22 00:51:00 +09:00
king 280ed02790 chore: 불필요 파일 삭제 (nginx conf, Windows 스크립트) 2026-05-22 00:48:24 +09:00
king a128207762 fix: 운영 포트를 8080으로 변경 2026-05-22 00:40:17 +09:00
13 changed files with 213 additions and 261 deletions
+4
View File
@@ -2,6 +2,10 @@
.env
.env.local
# 로컬 전용 스크립트 (자격증명 포함 가능)
push-gitea.bat
run-local.bat
# Python
__pycache__/
*.py[cod]
Binary file not shown.
Binary file not shown.
Binary file not shown.
+175 -35
View File
@@ -1,25 +1,5 @@
/* ── Pretendard 폰트 ─────────────────────────────── */
@font-face {
font-family: "Pretendard";
src: url("/static/fonts/Pretendard-Thin.ttf") format("truetype");
font-weight: 100;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Pretendard";
src: url("/static/fonts/Pretendard-Regular.ttf") format("truetype");
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Pretendard";
src: url("/static/fonts/Pretendard-Bold.ttf") format("truetype");
font-weight: 700;
font-style: normal;
font-display: swap;
}
/* ── Pretendard 폰트 (CDN) ───────────────────────── */
@import url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard/packages/pretendard/dist/web/static/pretendard.css");
/* ── 디자인 토큰 ─────────────────────────────────── */
:root {
@@ -44,7 +24,7 @@
body {
font-family: "Pretendard", "Segoe UI", "Apple SD Gothic Neo", system-ui, sans-serif;
font-size: 15px;
font-size: 16px;
color: var(--text);
background: var(--bg);
min-height: 100vh;
@@ -108,7 +88,7 @@ a { color: inherit; text-decoration: none; }
.brand-logo-mark svg { color: #fff; }
.brand-name {
font-size: 20px;
font-size: 22px;
font-weight: 700;
color: #fff;
letter-spacing: -.3px;
@@ -134,19 +114,25 @@ a { color: inherit; text-decoration: none; }
}
.brand-headline {
font-size: clamp(28px, 3.2vw, 42px);
font-size: clamp(32px, 3.6vw, 48px);
font-weight: 700;
color: #fff;
line-height: 1.25;
line-height: 1.2;
letter-spacing: -.5px;
margin-bottom: 16px;
margin-bottom: 20px;
}
.brand-desc {
font-size: 15px;
color: rgba(255,255,255,.55);
line-height: 1.7;
max-width: 380px;
line-height: 1.8;
}
.brand-desc-nowrap {
font-size: 14px;
color: rgba(255,255,255,.55);
white-space: nowrap;
margin-top: 4px;
}
.brand-divider {
@@ -186,16 +172,16 @@ a { color: inherit; text-decoration: none; }
}
.form-title {
font-size: clamp(22px, 2.8vw, 30px);
font-size: clamp(24px, 3vw, 32px);
font-weight: 700;
color: var(--navy);
letter-spacing: -.4px;
line-height: 1.2;
margin-bottom: 8px;
margin-bottom: 10px;
}
.form-subtitle {
font-size: 14px;
font-size: 15px;
color: var(--muted);
line-height: 1.6;
margin-bottom: 36px;
@@ -561,16 +547,16 @@ a { color: inherit; text-decoration: none; }
}
.card-title {
font-size: 17px;
font-size: 19px;
font-weight: 700;
color: var(--navy);
letter-spacing: -.3px;
line-height: 1.35;
margin-bottom: 8px;
margin-bottom: 10px;
}
.card-desc {
font-size: 13px;
font-size: 14px;
color: var(--muted);
line-height: 1.6;
flex: 1;
@@ -598,6 +584,160 @@ a { color: inherit; text-decoration: none; }
.menu-card:hover .card-link { gap: 8px; }
/* ════════════════════════════════════════════════════
브랜드 패널 — 움직이는 도형
════════════════════════════════════════════════════ */
.brand-shapes {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
}
.shape { position: absolute; }
/* 1. 큰 원 테두리 — 우측 상단 */
.shape-1 {
width: 360px;
height: 360px;
border: 3px solid rgba(30, 86, 160, .28);
border-radius: 50%;
top: -90px;
right: -70px;
animation: shapeFloat1 16s ease-in-out infinite;
}
/* 2. 다이아몬드 — 좌측 하단 */
.shape-2 {
width: 130px;
height: 130px;
background: rgba(30, 86, 160, .12);
border: 3px solid rgba(30, 86, 160, .3);
border-radius: 20px;
bottom: 90px;
left: -45px;
animation: shapeFloat2 13s ease-in-out infinite;
}
/* 3. 중간 원 — 중앙 우측 */
.shape-3 {
width: 80px;
height: 80px;
border: 3px solid rgba(255, 255, 255, .14);
border-radius: 50%;
top: 40%;
right: 12%;
animation: shapeFloat3 11s ease-in-out infinite;
}
/* 4. 둥근 사각형 테두리 — 하단 */
.shape-4 {
width: 200px;
height: 200px;
border: 3px solid rgba(30, 86, 160, .22);
border-radius: 36px;
bottom: -60px;
right: 16%;
animation: shapeFloat4 15s ease-in-out infinite;
}
/* 5. 작은 원 채움 — 상단 좌측 */
.shape-5 {
width: 44px;
height: 44px;
background: rgba(30, 86, 160, .2);
border: 2px solid rgba(30, 86, 160, .35);
border-radius: 50%;
top: 20%;
left: 16%;
animation: shapeFloat5 9s ease-in-out infinite;
}
/* 6. 세모 — 우측 중하단 */
.shape-6 {
width: 90px;
height: 90px;
background: rgba(30, 86, 160, .14);
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
bottom: 28%;
right: 6%;
animation: shapeFloat6 12s ease-in-out infinite;
}
/* King 텍스트 — 반짝이며 유동 */
.shape-king {
font-size: 30px;
font-weight: 700;
color: rgba(255, 255, 255, .9);
letter-spacing: 4px;
text-transform: none;
top: 28%;
right: 7%;
animation: kingFloat 13s ease-in-out infinite, kingSparkle 2.4s ease-in-out infinite;
white-space: nowrap;
user-select: none;
}
@keyframes shapeFloat1 {
0%, 100% { transform: translate(0, 0); }
25% { transform: translate(-22px, 32px); }
50% { transform: translate(16px, 22px); }
75% { transform: translate(-10px, -18px); }
}
@keyframes shapeFloat2 {
0%, 100% { transform: rotate(45deg) translate(0, 0); }
33% { transform: rotate(68deg) translate(22px, -26px); }
66% { transform: rotate(28deg) translate(-18px, 22px); }
}
@keyframes shapeFloat3 {
0%, 100% { transform: translate(0, 0); }
50% { transform: translate(28px, -34px); }
}
@keyframes shapeFloat4 {
0%, 100% { transform: rotate(12deg) translate(0, 0); }
40% { transform: rotate(24deg) translate(-22px, -14px); }
80% { transform: rotate(2deg) translate(18px, 10px); }
}
@keyframes shapeFloat5 {
0%, 100% { transform: translate(0, 0) scale(1); }
33% { transform: translate(16px, -20px) scale(1.2); }
66% { transform: translate(-12px, 14px) scale(0.85); }
}
@keyframes shapeFloat6 {
0%, 100% { transform: translate(0, 0) rotate(0deg); }
33% { transform: translate(-18px, -22px) rotate(20deg); }
66% { transform: translate(14px, 10px) rotate(-15deg); }
}
@keyframes shapeFloat7 {
0%, 100% { transform: translate(0, 0) rotate(0deg) scale(1); }
33% { transform: translate(-20px, -18px) rotate(36deg) scale(1.15); }
66% { transform: translate(14px, 16px) rotate(-18deg) scale(0.9); }
}
@keyframes kingFloat {
0%, 100% { transform: translate(0, 0); }
20% { transform: translate(-65px, 50px); }
40% { transform: translate(55px, -40px); }
60% { transform: translate(-45px, -60px); }
80% { transform: translate(70px, 30px); }
}
@keyframes kingSparkle {
0%, 100% {
text-shadow:
0 0 8px rgba(255, 255, 255, .6),
0 0 18px rgba(99, 179, 237, .5);
opacity: .75;
}
50% {
text-shadow:
0 0 16px rgba(255, 255, 255, 1),
0 0 36px rgba(99, 179, 237, 1),
0 0 56px rgba(147, 197, 253, .9),
0 0 80px rgba(59, 130, 246, .6);
opacity: 1;
}
}
/* ════════════════════════════════════════════════════
반응형
════════════════════════════════════════════════════ */
+14 -5
View File
@@ -11,6 +11,17 @@
<!-- 좌측: 브랜드 패널 -->
<aside class="brand-panel">
<!-- 움직이는 배경 도형 -->
<div class="brand-shapes" aria-hidden="true">
<div class="shape shape-1"></div>
<div class="shape shape-2"></div>
<div class="shape shape-3"></div>
<div class="shape shape-4"></div>
<div class="shape shape-5"></div>
<div class="shape shape-6"></div>
<div class="shape shape-king">King</div>
</div>
<div class="brand-logo">
<div class="brand-logo-mark">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none"
@@ -21,19 +32,17 @@
<rect x="14" y="14" width="7" height="7" rx="1"/>
</svg>
</div>
<span class="brand-name">DBX Corp</span>
<span class="brand-name">DBX Corporation</span>
</div>
<div class="brand-body">
<p class="brand-tag">Internal Portal</p>
<h1 class="brand-headline">업무 포털<br>시스템</h1>
<p class="brand-desc">
DBX Corp 임직원 전용 업무 통합 포털입니다.
</p>
<p class="brand-desc">DBX Corporation 임직원 전용 업무 통합 포털입니다.</p>
<div class="brand-divider"></div>
</div>
<p class="brand-footer">© 2026 DBX Corp. All rights reserved.</p>
<p class="brand-footer">© 2026 DBX Corporation. All rights reserved.</p>
</aside>
<!-- 우측: 오류 패널 -->
+16 -7
View File
@@ -11,6 +11,17 @@
<!-- 좌측: 브랜드 패널 -->
<aside class="brand-panel">
<!-- 움직이는 배경 도형 -->
<div class="brand-shapes" aria-hidden="true">
<div class="shape shape-1"></div>
<div class="shape shape-2"></div>
<div class="shape shape-3"></div>
<div class="shape shape-4"></div>
<div class="shape shape-5"></div>
<div class="shape shape-6"></div>
<div class="shape shape-king">King</div>
</div>
<div class="brand-logo">
<div class="brand-logo-mark">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none"
@@ -21,26 +32,24 @@
<rect x="14" y="14" width="7" height="7" rx="1"/>
</svg>
</div>
<span class="brand-name">DBX Corp</span>
<span class="brand-name">DBX Corporation</span>
</div>
<div class="brand-body">
<p class="brand-tag">Internal Portal</p>
<h1 class="brand-headline">업무 포털<br>시스템</h1>
<p class="brand-desc">
DBX Corp 임직원 전용 업무 통합 포털입니다.<br>
회사 Google Workspace 계정으로 인증 후 이용하실 수 있습니다.
</p>
<p class="brand-desc">DBX Corporation 임직원 전용 업무 통합 포털입니다.</p>
<p class="brand-desc-nowrap">회사 Google Workspace 계정으로 인증 후 이용하실 수 있습니다.</p>
<div class="brand-divider"></div>
</div>
<p class="brand-footer">© 2026 DBX Corp. All rights reserved.</p>
<p class="brand-footer">© 2026 DBX Corporation. All rights reserved.</p>
</aside>
<!-- 우측: 로그인 폼 -->
<main class="form-panel">
<div class="form-box">
<p class="form-eyebrow">DBX Corp</p>
<p class="form-eyebrow">DBX Corporation</p>
<h2 class="form-title">업무 포털 로그인</h2>
<p class="form-subtitle">
회사 Google Workspace 계정으로 로그인하세요.<br>
+2 -2
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>업무 포털 — DBX Corp</title>
<title>업무 포털 — DBX Corporation</title>
<link rel="stylesheet" href="/static/styles.css" />
</head>
<body>
@@ -21,7 +21,7 @@
</svg>
</div>
<div class="header-brand-text">
<span class="header-company">DBX Corp</span>
<span class="header-company">DBX Corporation</span>
<span class="header-portal">업무 포털</span>
</div>
</div>
+2 -2
View File
@@ -5,7 +5,7 @@ services:
container_name: dbx-main
restart: unless-stopped
ports:
# NPM이 192.168.0.194:8000 으로 프록시 → 컨테이너 8000으로 전달
- "8000:8000"
# NPM이 192.168.0.194:8080 으로 프록시 → 컨테이너 8000으로 전달
- "8080:8000"
env_file:
- .env
-23
View File
@@ -1,23 +0,0 @@
server {
listen 80;
server_name dbx.no1king.freeddns.org;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name dbx.no1king.freeddns.org;
ssl_certificate /etc/letsencrypt/live/dbx.no1king.freeddns.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dbx.no1king.freeddns.org/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
-72
View File
@@ -1,72 +0,0 @@
@echo off
cd /d "%~dp0"
echo.
echo [1/2] Checking for sensitive files...
echo.
set FOUND=0
:: git? ??? ??(tracked)?? ?? ?? ??
for %%F in (
.env
.env.local
.env.production
.env.secret
) do (
git ls-files --error-unmatch "%%F" >nul 2>&1
if not errorlevel 1 (
echo [ERROR] Sensitive file is tracked by git: %%F
set FOUND=1
)
)
:: ??? ?? ?? ??? git? ????? ??
for %%P in (
*.pem *.key *.p12 *.pfx id_rsa id_ed25519
*secret* *password* *credential* *token* *apikey* *api_key*
db.conf database.conf
) do (
git ls-files "%%P" 2>nul | findstr /r "." >nul 2>&1
if not errorlevel 1 (
echo [ERROR] Sensitive file pattern tracked by git: %%P
set FOUND=1
)
)
if %FOUND%==1 (
echo.
echo ============================================================
echo PUSH BLOCKED: Sensitive file found in git.
echo.
echo Remove it with:
echo git rm --cached ^<filename^>
echo git commit -m "remove sensitive file"
echo.
echo Then add it to .gitignore to prevent future accidents.
echo ============================================================
echo.
pause
exit /b 1
)
echo No sensitive files detected. Safe to push.
echo.
echo [2/2] Pushing to Gitea...
echo https://gitea.no1king.freeddns.org/king/dbx-main.git
echo.
git push -u origin master
if %errorlevel%==0 (
echo.
echo [OK] Push complete.
echo https://gitea.no1king.freeddns.org/king/dbx-main
echo.
) else (
echo.
echo [ERROR] Push failed. Check your credentials or network.
echo.
)
pause
-63
View File
@@ -1,63 +0,0 @@
@echo off
cd /d "%~dp0"
set PROJECT=dbx-main
set COMPOSE=docker compose -p %PROJECT% -f docker-compose.local.yml
if "%1"=="stop" goto STOP
if "%1"=="logs" goto LOGS
if "%1"=="ps" goto PS
if "%1"=="restart" goto RESTART
:START
if not exist ".env.local" (
echo.
echo [ERROR] .env.local not found.
echo Copy .env.local.example and fill in the values:
echo.
echo copy .env.local.example .env.local
echo.
pause
exit /b 1
)
echo.
echo Starting DBX Main Page (local)...
echo.
%COMPOSE% up --build -d
if %errorlevel%==0 (
echo.
echo [OK] Running at http://localhost:8080
echo.
echo Logs : run-local.bat logs
echo Stop : run-local.bat stop
echo.
)
pause
exit /b
:STOP
echo.
echo Stopping container...
%COMPOSE% down
echo.
pause
exit /b
:LOGS
%COMPOSE% logs -f
exit /b
:PS
echo.
%COMPOSE% ps
echo.
pause
exit /b
:RESTART
echo.
echo Restarting...
%COMPOSE% restart
echo.
pause
exit /b
-52
View File
@@ -1,52 +0,0 @@
# DBX 메인 페이지 — 로컬 실행 스크립트
# 사용법: .\run-local.ps1 [명령어]
#
# .\run-local.ps1 → 시작 (코드 변경 시 자동 재빌드)
# .\run-local.ps1 stop → 중지
# .\run-local.ps1 logs → 로그 보기
# .\run-local.ps1 ps → 상태 확인
# .\run-local.ps1 restart → 재시작
$PROJECT = "dbx-main"
$COMPOSE = "docker compose -p $PROJECT -f docker-compose.local.yml"
switch ($args[0]) {
"stop" {
Write-Host "컨테이너 중지 중..." -ForegroundColor Yellow
Invoke-Expression "$COMPOSE down"
}
"logs" {
Invoke-Expression "$COMPOSE logs -f"
}
"ps" {
Invoke-Expression "$COMPOSE ps"
}
"restart" {
Write-Host "재시작 중..." -ForegroundColor Yellow
Invoke-Expression "$COMPOSE restart"
}
default {
# .env.local 없으면 안내 후 종료
if (-not (Test-Path ".env.local")) {
Write-Host ""
Write-Host "❌ .env.local 파일이 없습니다." -ForegroundColor Red
Write-Host " .env.local.example 을 복사하여 값을 채워주세요:" -ForegroundColor Yellow
Write-Host " copy .env.local.example .env.local" -ForegroundColor Cyan
Write-Host ""
exit 1
}
Write-Host ""
Write-Host "🚀 DBX 메인 페이지 로컬 시작..." -ForegroundColor Cyan
Invoke-Expression "$COMPOSE up --build -d"
if ($LASTEXITCODE -eq 0) {
Write-Host ""
Write-Host "✅ 실행 중 → http://localhost:8080" -ForegroundColor Green
Write-Host ""
Write-Host " 로그 보기 : .\run-local.ps1 logs" -ForegroundColor Gray
Write-Host " 중지 : .\run-local.ps1 stop" -ForegroundColor Gray
Write-Host ""
}
}
}