ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A modern web application for studying and preparing for US Amateur Radio license exams
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A modern web application for studying US Amateur Radio license exams. Open source, community-driven, born in North Carolina.查看完整 README ↗A modern web application for studying US Amateur Radio license exams. Open source, community-driven, born in North Carolina.
Live App: app.openhamprep.com
Supports all three license classes: Technician, General, and Extra.
Prerequisites: Node.js 20+, Docker Desktop
git clone https://github.com/sonyccd/openhamprep.git
cd openhamprep
npm install
npm run dev:full
See LOCAL_DEVELOPMENT.md for details.
Frontend: React 18, TypeScript, Vite, MUI (Material UI) with Emotion, MUI X Charts & Data Grid (Community), TanStack Query, React Router, Framer Motion, lucide icons, next-themes
Backend: Supabase (PostgreSQL, Auth, Edge Functions)
Tooling: Vitest + Testing Library (happy-dom), Playwright (e2e), ESLint, Amplitude & Pendo (product analytics), Sentry (error tracking), Vercel Analytics & Speed Insights
useAppNavigationuseAuth contextsrc/hooks/The app wraps components in this provider order, outermost → innermost (see App.tsx):
light/dark class on <html>colorSchemeNode={null} so it follows next-themes instead of competing with itsrc/
├── components/ # React components
│ ├── ohp/ # Shared presentational primitives (PageContainer, Icon, ScoreRing, …)
│ ├── admin/ # Admin-only components
│ ├── <feature>/ # Sub-components grouped by feature (dashboard/, question/, …)
│ └── *.tsx # Feature components
├── hooks/ # Custom React hooks
├── pages/ # Route page components
├── services/ # Service layer + centralized query keys
├── theme/ # MUI theme (palette, typography, component overrides)
├── lib/ # Utilities
├── integrations/ # Supabase client (auto-generated)
├── assets/ # Static assets
├── test/ # Test setup and helpers
└── types/ # TypeScript types
Outside src/: supabase/ (migrations, seed data, Edge Functions), e2e/ (Playwright tests), website/ (static marketing site), docs/ (guides and design specs).
The UI is built entirely with MUI, styled through the sx prop. Use the library's components rather than hand-rolling your own, and never use direct colors — always use the theme's palette tokens so light and dark mode both work:
// Correct - palette tokens follow light/dark
<Box sx={{ bgcolor: "background.default", color: "text.primary" }}>
// Wrong - a literal color breaks theme switching
<Box sx={{ bgcolor: "#fff", color: "#000" }}>
| what you want | sx path |
|---|---|
| page background | background.default |
| card / surface | background.paper |
| body text | text.primary / text.secondary |
| hairlines, borders | divider |
| subtle surface / green accent | muted / accent (flat keys, no .main) |
| brand | primary.main, secondary.main |
| states | error.main, warning.main, info.main, success.main |
Colors live in src/theme/muiTheme.ts, which is the source of truth. Icons come from lucide and are rendered through ohp/Icon, which hides decorative icons from screen readers.
npm run dev # Start dev server
npm run dev:full # Start Supabase + dev server
npm run supabase:stop # Stop Supabase
npm run supabase:reset # Reset database
npm run lint # Run ESLint
npm test # Run unit tests (watch mode)
npm run test:run # Run unit tests once (CI mode)
npm run e2e # Run Playwright end-to-end tests
npm run build # Production build
Uses local Supabase via Docker - no hosted account needed:
npm run dev:full # Start Supabase + dev server
For production or if you have Supabase project access:
cp .env.example .env.local
# Edit .env.local with your credentials
npm run dev
npm install && npm run dev:fullSee CONTRIBUTING.md for guidelines.
Licensed under the GNU General Public License v3.0. © Brad Bazemore