尚未检测到更新。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 |