summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-06-03 19:45:41 +0100
committersoryu <soryu@soryu.co>2026-06-03 19:45:41 +0100
commit1a995e32c8468d35e88b4e9618458f0cb29ae3c5 (patch)
tree6b65796a244f0ddf4fc473607a9bfccd1f36d789
parentf13352a3a5860477957d16b7ce00169d385f56da (diff)
downloadsoryu-makima/directive-soryu---soryu-co-78ae2579.tar.gz
soryu-makima/directive-soryu---soryu-co-78ae2579.zip
-rw-r--r--frontend/package-lock.json8
-rw-r--r--frontend/src/App.tsx4
-rw-r--r--frontend/src/components/LandingPage.tsx104
3 files changed, 39 insertions, 77 deletions
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 230ed07..2114b2c 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -66,7 +66,6 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz",
"integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==",
"dev": true,
- "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1",
@@ -1060,7 +1059,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz",
"integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==",
"dev": true,
- "peer": true,
"dependencies": {
"undici-types": "~7.10.0"
}
@@ -1076,7 +1074,6 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz",
"integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==",
"dev": true,
- "peer": true,
"dependencies": {
"@types/prop-types": "*",
"csstype": "^3.0.2"
@@ -1159,7 +1156,6 @@
"url": "https://github.com/sponsors/ai"
}
],
- "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001737",
"electron-to-chromium": "^1.5.211",
@@ -1391,7 +1387,6 @@
"url": "https://github.com/sponsors/ai"
}
],
- "peer": true,
"engines": {
"node": "^20.0.0 || >=22.0.0"
}
@@ -1440,7 +1435,6 @@
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -1452,7 +1446,6 @@
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.2"
@@ -1626,7 +1619,6 @@
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz",
"integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
"dev": true,
- "peer": true,
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 0a0e008..9a84b3b 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -2,7 +2,7 @@ import React from 'react'
import { useStore } from '@nanostores/react'
import { LandingPage } from './components/LandingPage'
import { VNInterface } from './components/VNInterface'
-import { isLoggedInStore, login, logout } from './stores'
+import { isLoggedInStore, logout } from './stores'
export default function App() {
const isLoggedIn = useStore(isLoggedInStore)
@@ -12,7 +12,7 @@ export default function App() {
{isLoggedIn ? (
<VNInterface onLogout={logout} />
) : (
- <LandingPage onLogin={login} />
+ <LandingPage />
)}
</>
)
diff --git a/frontend/src/components/LandingPage.tsx b/frontend/src/components/LandingPage.tsx
index 2c543a6..3141556 100644
--- a/frontend/src/components/LandingPage.tsx
+++ b/frontend/src/components/LandingPage.tsx
@@ -1,5 +1,4 @@
import React, { useState, useEffect, useRef } from 'react'
-import { LoadingScreen } from './LoadingScreen'
import { HeartLogo } from './HeartLogo'
import { TypewriterRotator } from './TypewriterRotator'
@@ -11,18 +10,12 @@ const HERO_PHRASES = [
'安全な意思決定 · SECURE DECISIONS AT THE EDGE',
]
-interface LandingPageProps {
- onLogin: () => void
-}
-
-export function LandingPage({ onLogin }: LandingPageProps) {
- const [loading, setLoading] = useState(false)
+export function LandingPage() {
const [showLanding, setShowLanding] = useState(false)
const [isStandby, setIsStandby] = useState(true) // false = LIVE, true = STDBY
const [velocity, setVelocity] = useState(0)
const [energy, setEnergy] = useState(0)
const [ramped, setRamped] = useState(false)
- const [pendingAction, setPendingAction] = useState<null | 'makimaRedirect'>(null)
const [activePanel, setActivePanel] = useState<null | 'mission' | 'makima'>(null)
// Fade-in landing page content after mount
@@ -87,19 +80,6 @@ export function LandingPage({ onLogin }: LandingPageProps) {
}
}, [])
- const handleLoadingComplete = () => {
- if (pendingAction === 'makimaRedirect') {
- window.location.assign('https://makima.jp')
- return
- }
- onLogin()
- }
-
- const handleLogin = () => {
- setPendingAction('makimaRedirect')
- setLoading(true)
- }
-
const handleMission = () => {
setActivePanel((mode) => (mode === 'mission' ? null : 'mission'))
}
@@ -110,50 +90,46 @@ export function LandingPage({ onLogin }: LandingPageProps) {
return (
<div>
- {loading && <LoadingScreen onComplete={handleLoadingComplete} />}
-
- {!loading && (
- <div className={`floating-header ${showLanding ? 'fade-in' : 'hidden'}`}>
- <div className="header-content">
- <div className="brand">
- <img
- src="/logo/crane-logo-transparent.png"
- alt="Soryu"
- height={40}
- className="brand-mark"
- onError={(e) => {
- const img = e.currentTarget as HTMLImageElement
- img.onerror = null
- img.src = '/logo/crane-logo.png'
- }}
- />
- </div>
- <div className="header-center">
- <HeartLogo size="header-no-rays" className="header-heart" />
- </div>
+ <div className={`floating-header ${showLanding ? 'fade-in' : 'hidden'}`}>
+ <div className="header-content">
+ <div className="brand">
+ <img
+ src="/logo/crane-logo-transparent.png"
+ alt="Soryu"
+ height={40}
+ className="brand-mark"
+ onError={(e) => {
+ const img = e.currentTarget as HTMLImageElement
+ img.onerror = null
+ img.src = '/logo/crane-logo.png'
+ }}
+ />
+ </div>
+ <div className="header-center">
+ <HeartLogo size="header-no-rays" className="header-heart" />
+ </div>
- <div className="system-info">
- <div className="info-item">
- <span className="info-label">System:</span>
- <span
- className="info-value live-status clickable"
- onClick={() => setIsStandby(!isStandby)}
- title="Click to toggle between LIVE and STANDBY"
- >
- <span className={`status-dot ${isStandby ? 'standby' : 'live'}`}></span>
- {isStandby ? 'STDBY' : 'LIVE'}
- </span>
- </div>
- <div className="info-item">
- <span className="info-label">Version:</span>
- <span className="info-value">v1.0.0</span>
- </div>
+ <div className="system-info">
+ <div className="info-item">
+ <span className="info-label">System:</span>
+ <span
+ className="info-value live-status clickable"
+ onClick={() => setIsStandby(!isStandby)}
+ title="Click to toggle between LIVE and STANDBY"
+ >
+ <span className={`status-dot ${isStandby ? 'standby' : 'live'}`}></span>
+ {isStandby ? 'STDBY' : 'LIVE'}
+ </span>
+ </div>
+ <div className="info-item">
+ <span className="info-label">Version:</span>
+ <span className="info-value">v1.0.0</span>
</div>
</div>
</div>
- )}
+ </div>
- <div className={`modern-landing-page manga-style ${showLanding && !loading ? 'fade-in' : 'hidden'}`}>
+ <div className={`modern-landing-page manga-style ${showLanding ? 'fade-in' : 'hidden'}`}>
{/* Background GIF fills the main body */}
<div className="background-only" aria-hidden="true">
<img src="/background-animation.gif" alt="" className="background-gif" />
@@ -205,7 +181,7 @@ export function LandingPage({ onLogin }: LandingPageProps) {
</div>
)}
- {/* CTA row spanning full width: left Mission/MAKIMA, right Login */}
+ {/* CTA row spanning full width: left Mission/MAKIMA */}
<div className="cta-area">
<div className="cta-left">
<button
@@ -223,12 +199,6 @@ export function LandingPage({ onLogin }: LandingPageProps) {
<span className="cta-text">MAKIMA</span>
</button>
</div>
- <div className="cta-right">
- <button className="taisho-cta" onClick={handleLogin}>
- <span className="cta-icon">▶</span>
- <span className="cta-text">Login</span>
- </button>
- </div>
</div>
</div>
</div>