尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
One plan, every country.
An identity-led, iPhone-first eSIM travel app. Built as a real, buildable
Vite + React + TypeScript project, ported from the Claude Design HTML/CSS
prototype with the visuals preserved 1:1.
Ringo leads with identity (your numbers), not data — the home screen opens
on a membership tier and your numbers, the way Revolut/Cash App lead with the
wallet. Warm light palette, no black/grey, Poppins throughout, and the sunset
gradient (#F08038 → #F25F77 → #ED4D8E) used surgically on the hero moments.檢視完整 README ↗One plan, every country.
An identity-led, iPhone-first eSIM travel app. Built as a real, buildable Vite + React + TypeScript project, ported from the Claude Design HTML/CSS prototype with the visuals preserved 1:1.
Ringo leads with identity (your numbers), not data — the home screen opens
on a membership tier and your numbers, the way Revolut/Cash App lead with the
wallet. Warm light palette, no black/grey, Poppins throughout, and the sunset
gradient (#F08038 → #F25F77 → #ED4D8E) used surgically on the hero moments.
npm install
npm run dev # start the dev server (Vite)
npm run build # type-check + production build to dist/
npm run preview # preview the production build
Open the printed local URL. The app renders inside a scaled iPhone frame that letterboxes to fit any viewport.
The UI is fully reactive and backend-ready. Screens never touch fetch() or
fixtures directly — they read from a small store and route every mutation
through a single API seam.
src/
main.tsx app entry
Host.tsx scales the iPhone frame to the viewport
App.tsx stack-based navigation + tab bar
theme.ts warm design tokens (mirrors index.css variables)
navigation.ts shared navigation contract
api/ringoApi.ts the single backend seam (mock today, live with one call)
store/store.ts reactive store + useRingoState() hook (optimistic UI)
data/ typed fixtures: countries, numbers, plans, tiers
components/ Device frame, TabBar, Header, Button, Card, shared UI
screens/ one file per screen
Everything talks only to RingoAPI, which ships in mock mode (in-memory
fixtures, simulated latency). Flip to a real REST backend with one call at
boot — no screen changes:
import { RingoAPI } from './api/ringoApi';
RingoAPI.configure({
mode: 'live',
baseUrl: 'https://api.ringoesim.com/v1',
getToken: () => localStorage.getItem('ringo_jwt'),
onUnauthorized: () => location.assign('/login'),
});
Each method documents the HTTP endpoint it maps to; request/response shapes are identical in mock and live mode.
| Token | Value |
|---|---|
| Background | #FEF8F4 |
| Paper | #FFFDFB |
| Body text | #5C2A0E (warm brown — never black/grey) |
| Emphasis | #D05000 (deep orange) |
| Gradient | #F08038 → #F25F77 → #ED4D8E |
| Typeface | Poppins |