diff --git a/site/src/hooks/useClientOS.ts b/site/src/hooks/useClientOS.ts index 22db087..ee976ce 100644 --- a/site/src/hooks/useClientOS.ts +++ b/site/src/hooks/useClientOS.ts @@ -1,4 +1,9 @@ import { useState, useEffect } from 'react' +import { + DESKTOP_VERSION, + DESKTOP_WINDOWS_INSTALLER_FILENAME, + DESKTOP_WINDOWS_INSTALLER_URL, +} from '../release' export type ClientOSType = 'android' | 'ios' | 'windows' | 'macos' | 'linux' @@ -44,13 +49,13 @@ export const OS_CONFIGS: Record = { os: 'windows', osName: 'Windows', isMobile: false, - downloadUrl: '#download', - downloadFilename: '', - badgeText: 'DESKTOP 1.1.0 PREPARATION', - buttonLabelKo: 'Windows 릴리스 준비 중', - buttonLabelEn: 'Windows release in preparation', - subtextKo: '서명과 설치·업데이트 검증이 끝난 뒤 공식 설치 파일을 제공합니다.', - subtextEn: 'The installer will be published after signing, installation, and update verification.', + downloadUrl: DESKTOP_WINDOWS_INSTALLER_URL, + downloadFilename: DESKTOP_WINDOWS_INSTALLER_FILENAME, + badgeText: `DESKTOP ${DESKTOP_VERSION} OFFICIAL RELEASE`, + buttonLabelKo: `Windows용 다운로드 (x64) - v${DESKTOP_VERSION}`, + buttonLabelEn: `Download for Windows (x64) - v${DESKTOP_VERSION}`, + subtextKo: `서명된 공식 릴리스 v${DESKTOP_VERSION}이며, 설치 후 자동 업데이트 피드로 갱신됩니다.`, + subtextEn: `Signed official release v${DESKTOP_VERSION}, updated through the auto-update feed after install.`, }, macos: { os: 'macos', diff --git a/site/src/index.css b/site/src/index.css index 32c0066..ffa2893 100644 --- a/site/src/index.css +++ b/site/src/index.css @@ -8,6 +8,9 @@ --font-sans: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", sans-serif; --font-display: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, sans-serif; --font-mono: "JetBrains Mono", "Fira Code", ui-monospace, monospace; + --brand-blue: #3b82f6; + --brand-blue-soft: rgba(255, 255, 255, 0.25); + --brand-glow: rgba(59, 130, 246, 0.7); } html { diff --git a/site/src/release.ts b/site/src/release.ts new file mode 100644 index 0000000..7426c5f --- /dev/null +++ b/site/src/release.ts @@ -0,0 +1,22 @@ +// site/src/release.ts +// 데스크톱 공식 릴리스 계약 SSOT. +// +// 설치 파일은 canonical Forgejo feed에서만 배포한다. 사이트 빌드(site/dist)와 +// NAS 배포는 바이너리를 포함하지 않으므로 `/releases/...` 같은 로컬 경로는 +// 실제 배포 환경에서 404가 된다. + +export const DESKTOP_VERSION = '1.1.0' + +const FORGEJO_ORIGIN = 'https://git.chanpaca.net' +const FORGEJO_OWNER = 'yunchan' +const FORGEJO_REPO = 'd3ro-voice' + +/** Registry 안에서 항상 최신 설치 자산을 가리키는 feed 루트 (updater와 동일). */ +export const DESKTOP_FEED_URL = `${FORGEJO_ORIGIN}/api/packages/${FORGEJO_OWNER}/generic/${FORGEJO_REPO}/latest` + +export const DESKTOP_WINDOWS_INSTALLER_FILENAME = `D3RO-Voice-Setup-${DESKTOP_VERSION}-x64.exe` + +export const DESKTOP_WINDOWS_INSTALLER_URL = `${DESKTOP_FEED_URL}/${DESKTOP_WINDOWS_INSTALLER_FILENAME}` + +/** Forgejo Release 허브 (릴리스 노트 + 자산 첨부). */ +export const DESKTOP_RELEASE_HUB_URL = `${FORGEJO_ORIGIN}/${FORGEJO_OWNER}/${FORGEJO_REPO}/releases/tag/v${DESKTOP_VERSION}` \ No newline at end of file diff --git a/site/src/sections/Download.tsx b/site/src/sections/Download.tsx index 750bf05..c85df6a 100644 --- a/site/src/sections/Download.tsx +++ b/site/src/sections/Download.tsx @@ -2,6 +2,13 @@ import { useState, type ChangeEvent, type DragEvent } from 'react' import { Container } from '../components/Container' import { SectionHeader } from '../components/SectionHeader' import { useI18n } from '../i18n' +import { + DESKTOP_FEED_URL, + DESKTOP_RELEASE_HUB_URL, + DESKTOP_VERSION, + DESKTOP_WINDOWS_INSTALLER_FILENAME, + DESKTOP_WINDOWS_INSTALLER_URL, +} from '../release' export function Download() { const { locale } = useI18n() @@ -60,11 +67,11 @@ export function Download() { @@ -82,49 +89,64 @@ export function Download() {

- D3RO Voice Desktop 1.1.0 + D3RO Voice Desktop {DESKTOP_VERSION}

- {isKo ? '배포 준비 중' : 'RELEASE PENDING'} + {isKo ? '공식 릴리스' : 'OFFICIAL STABLE RELEASE'}

- {isKo - ? 'Windows x64 및 macOS Apple Silicon 후보 빌드 검증 중' - : 'Windows x64 and macOS Apple Silicon candidate builds under verification'} + Windows 10 / 11 (x64) · NSIS standalone installer

- - v1.1.0 VERIFICATION + + v{DESKTOP_VERSION} RELEASE
{/* Primary Action Button */}
-
- {isKo ? '설치 파일 검증 후 제공' : 'Installer available after verification'} -
+ {isKo ? `Windows용 다운로드 (x64) - v${DESKTOP_VERSION}` : `Download for Windows (x64) - v${DESKTOP_VERSION}`} +
- {/* SHA-256 Quick Verification Strip */} + {/* Update Feed Verification Strip */}
- {isKo ? '릴리스 증거:' : 'Release evidence:'} - {isKo ? '아티팩트 생성 전' : 'Artifact not yet published'} + SHA-512: + + latest.yml + +
+
+ + {isKo ? '릴리스 노트' : 'Release notes'} + + + + {isKo ? '업데이트 피드 연결됨' : 'Update feed connected'} +
- - - {isKo ? '서명 및 업데이트 검증 대기' : 'Signing and update verification pending'} -
@@ -150,19 +172,19 @@ export function Download() {

Windows Setup

{isKo - ? 'Windows x64 후보 빌드의 설치, 서명, 업데이트 복구 경로를 검증 중입니다.' - : 'The Windows x64 candidate is undergoing installation, signing, and update-recovery verification.'} + ? '무설정 자동 업데이트와 오프라인 Whisper 로컬 AI를 지원하는 공식 설치 패키지입니다.' + : 'Official installation package with background auto-updates and zero-latency local AI.'}

-
- Windows x64 installer - {isKo ? '검증 대기' : 'Verification pending'} -
+ {DESKTOP_WINDOWS_INSTALLER_FILENAME} + {isKo ? '다운로드 (.exe)' : 'Download (.exe)'} +
@@ -306,7 +328,7 @@ export function Download() { {t.hero.title1} @@ -209,8 +209,8 @@ export function Hero() { className="w-1.5 rounded-full transition-all duration-75" style={{ height: `${Math.max(6, lvl * 32)}px`, - backgroundColor: simState === 'recording' ? '#3b82f6' : 'rgba(255,255,255,0.25)', - boxShadow: simState === 'recording' ? '0 0 10px rgba(59,130,246,0.7)' : 'none', + backgroundColor: simState === 'recording' ? 'var(--brand-blue)' : 'var(--brand-blue-soft)', + boxShadow: simState === 'recording' ? '0 0 10px var(--brand-glow)' : 'none', }} /> ))}