feat(site): offer the real installer from the release center
The download section described a release as pending while the product was already installable, and its installer link pointed at a path the site build never ships, so a visitor would have reached a missing file. The section now states the released version and links the published update feed that the desktop client itself uses, with the release notes and hash metadata one click away. Repeated color literals behind the hero animation moved into named tokens.
This commit is contained in:
parent
94d8bb8ebe
commit
c2db1b2176
5 changed files with 93 additions and 41 deletions
|
|
@ -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() {
|
|||
<Container>
|
||||
<SectionHeader
|
||||
index="06 / DOWNLOAD"
|
||||
title={isKo ? 'D3RO Voice 릴리스 준비 센터' : 'D3RO Voice Release Preparation'}
|
||||
title={isKo ? 'D3RO Voice 릴리스 센터' : 'D3RO Voice Release Center'}
|
||||
subtitle={
|
||||
isKo
|
||||
? '다음 안정 버전 1.1.0의 설치 파일, 서명, 업데이트 경로를 검증하고 있습니다. 검증이 끝나기 전에는 바이너리를 제공하지 않습니다.'
|
||||
: 'Version 1.1.0 installers, signatures, and update paths are being verified. No binary is offered before verification completes.'
|
||||
? `공식 릴리스 v${DESKTOP_VERSION} 설치 파일을 게시된 피드에서 내려받을 수 있습니다. 설치 후 자동 업데이트로 이후 버전을 받습니다.`
|
||||
: `Download the official v${DESKTOP_VERSION} installer from the published update feed. Auto-update delivers later versions after install.`
|
||||
}
|
||||
/>
|
||||
|
||||
|
|
@ -82,49 +89,64 @@ export function Download() {
|
|||
<div>
|
||||
<div className="flex items-center gap-2.5 mb-1">
|
||||
<h3 className="text-xl sm:text-2xl font-medium text-neutral-50">
|
||||
D3RO Voice Desktop 1.1.0
|
||||
D3RO Voice Desktop {DESKTOP_VERSION}
|
||||
</h3>
|
||||
<span className="px-2.5 py-0.5 rounded-full text-xs font-medium bg-emerald-500/20 text-emerald-300 border border-emerald-500/35">
|
||||
{isKo ? '배포 준비 중' : 'RELEASE PENDING'}
|
||||
{isKo ? '공식 릴리스' : 'OFFICIAL STABLE RELEASE'}
|
||||
</span>
|
||||
</div>
|
||||
<p className="text-xs sm:text-sm text-neutral-300 font-normal">
|
||||
{isKo
|
||||
? 'Windows x64 및 macOS Apple Silicon 후보 빌드 검증 중'
|
||||
: 'Windows x64 and macOS Apple Silicon candidate builds under verification'}
|
||||
Windows 10 / 11 (x64) · NSIS standalone installer
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-2 bg-surface-700/80 px-3 py-1 rounded-full border border-white/10">
|
||||
<span className="w-2 h-2 rounded-full bg-amber-400" />
|
||||
<span className="text-xs font-medium text-neutral-200">v1.1.0 VERIFICATION</span>
|
||||
<span className="w-2 h-2 rounded-full bg-emerald-400" />
|
||||
<span className="text-xs font-medium text-neutral-200">v{DESKTOP_VERSION} RELEASE</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Primary Action Button */}
|
||||
<div className="mb-5">
|
||||
<div
|
||||
aria-disabled="true"
|
||||
className="w-full py-4.5 sm:py-5 px-8 sm:px-10 rounded-2xl bg-surface-700 text-neutral-300 text-base sm:text-lg font-medium flex items-center justify-center gap-3 leading-normal border border-white/10 cursor-not-allowed"
|
||||
<a
|
||||
href={DESKTOP_WINDOWS_INSTALLER_URL}
|
||||
className="glow-btn w-full py-4.5 sm:py-5 px-8 sm:px-10 rounded-2xl bg-brand-blue text-white text-base sm:text-lg font-medium flex items-center justify-center gap-3 leading-normal shadow-glow-sm hover:shadow-glow-md active:scale-[0.99] transition-all"
|
||||
>
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5">
|
||||
<path d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />
|
||||
</svg>
|
||||
<span>{isKo ? '설치 파일 검증 후 제공' : 'Installer available after verification'}</span>
|
||||
</div>
|
||||
<span>{isKo ? `Windows용 다운로드 (x64) - v${DESKTOP_VERSION}` : `Download for Windows (x64) - v${DESKTOP_VERSION}`}</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{/* SHA-256 Quick Verification Strip */}
|
||||
{/* Update Feed Verification Strip */}
|
||||
<div className="pt-3.5 border-t border-white/10 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 text-xs">
|
||||
<div className="flex items-center gap-2 text-neutral-300">
|
||||
<span className="font-medium text-neutral-400">{isKo ? '릴리스 증거:' : 'Release evidence:'}</span>
|
||||
<span className="text-neutral-200">{isKo ? '아티팩트 생성 전' : 'Artifact not yet published'}</span>
|
||||
<span className="font-medium text-neutral-400">SHA-512:</span>
|
||||
<a
|
||||
href={`${DESKTOP_FEED_URL}/latest.yml`}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="font-mono text-neutral-200 bg-surface-900/60 px-2 py-0.5 rounded border border-white/10 hover:text-brand-blue"
|
||||
>
|
||||
latest.yml
|
||||
</a>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<a
|
||||
href={DESKTOP_RELEASE_HUB_URL}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-brand-blue hover:underline"
|
||||
>
|
||||
{isKo ? '릴리스 노트' : 'Release notes'}
|
||||
</a>
|
||||
<span className="text-xs text-emerald-300 font-medium flex items-center gap-1.5">
|
||||
<span className="w-2 h-2 rounded-full bg-emerald-400" />
|
||||
{isKo ? '업데이트 피드 연결됨' : 'Update feed connected'}
|
||||
</span>
|
||||
</div>
|
||||
<span className="text-xs text-amber-300 font-medium flex items-center gap-1.5">
|
||||
<span className="w-2 h-2 rounded-full bg-amber-400" />
|
||||
{isKo ? '서명 및 업데이트 검증 대기' : 'Signing and update verification pending'}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -150,19 +172,19 @@ export function Download() {
|
|||
<h4 className="text-lg font-medium text-neutral-50 mb-1.5">Windows Setup</h4>
|
||||
<p className="text-xs sm:text-sm text-neutral-300 mb-5 leading-relaxed font-normal">
|
||||
{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.'}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<div
|
||||
aria-disabled="true"
|
||||
className="w-full py-2.5 px-3.5 rounded-xl bg-surface-900/60 border border-white/10 text-neutral-400 text-xs font-medium flex items-center justify-between"
|
||||
<a
|
||||
href={DESKTOP_WINDOWS_INSTALLER_URL}
|
||||
className="w-full py-2.5 px-3.5 rounded-xl bg-brand-blue/20 hover:bg-brand-blue/30 border border-brand-blue/40 text-brand-blue text-xs font-medium flex items-center justify-between transition-all"
|
||||
>
|
||||
<span>Windows x64 installer</span>
|
||||
<span>{isKo ? '검증 대기' : 'Verification pending'}</span>
|
||||
</div>
|
||||
<span>{DESKTOP_WINDOWS_INSTALLER_FILENAME}</span>
|
||||
<span>{isKo ? '다운로드 (.exe)' : 'Download (.exe)'}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -306,7 +328,7 @@ export function Download() {
|
|||
</h3>
|
||||
</div>
|
||||
<a
|
||||
href="https://git.chanpaca.net/yunchan/d3ro-voice/releases"
|
||||
href={DESKTOP_RELEASE_HUB_URL}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-xs text-brand-blue hover:text-brand-blue-light transition-colors font-medium flex items-center gap-1.5"
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ export function Hero() {
|
|||
|
||||
{/* Main Headline */}
|
||||
<h1
|
||||
className="text-3xl sm:text-4xl lg:text-[3.25rem] font-medium text-neutral-50 mb-5 tracking-tight leading-[1.18] break-keep"
|
||||
className="text-[1.875rem] sm:text-[2.25rem] lg:text-[3.25rem] font-medium text-neutral-50 mb-5 tracking-tight leading-[1.18] break-keep"
|
||||
style={{ wordBreak: 'keep-all', overflowWrap: 'break-word' }}
|
||||
>
|
||||
<span className="block text-neutral-100">{t.hero.title1}</span>
|
||||
|
|
@ -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',
|
||||
}}
|
||||
/>
|
||||
))}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue