ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Приложение для изучения с помощью флеш-карточек с системой интервальных повторений (SRS). 1. Zustand + Immer - минимальные ре-рендеры, иммутабельность 2. MMKV Storage - самое быстрое локальное хранилище для RN 3. React.memo - мемоизация компонентов 4. FlatList с оптимизациями: • removeClippedSubviews • maxToRenderPerBatch • windowSize 5. Reanimated 2 - анимации на UI потоке (60 FPS) 6. O(1) доступ - данные хранятся в объектах, не массивах檢視完整 README ↗
Приложение для изучения с помощью флеш-карточек с системой интервальных повторений (SRS).
npm install
cd ios && pod install && cd ..
npm run ios
npm run android
src/
├── components/ # UI компоненты
│ ├── common/ # Переиспользуемые компоненты (Button, Input, Text)
│ └── cards/ # Компоненты карточек (FlashCard, SetCard)
│
├── screens/ # Экраны приложения
│ ├── HomeScreen # Главный экран со списком наборов
│ ├── StudyScreen # Экран изучения карточек
│ ├── SetDetailScreen # Детали набора
│ └── ...
│
├── navigation/ # Навигация (React Navigation)
│
├── store/ # Состояние приложения (Zustand)
│ ├── cardsStore # Управление карточками
│ ├── setsStore # Управление наборами
│ ├── studyStore # Сессия изучения
│ └── settingsStore # Настройки и тема
│
├── services/ # Бизнес-логика
│ ├── SRSService # Алгоритм интервальных повторений
│ ├── StorageService # Локальное хранилище (MMKV)
│ └── DatabaseService # Персистентность данных
│
├── types/ # TypeScript типы
├── constants/ # Константы (цвета, отступы, конфиг)
├── hooks/ # Кастомные хуки
└── utils/ # Утилиты
removeClippedSubviewsmaxToRenderPerBatchwindowSizeВесь интерфейс следует брендбуку: plan/done/brandbook.md — цвета, шрифты, отступы, иконки, компоненты, тексты.
Создание:
npm run new:screen -- Achievements # → src/screens/AchievementsScreen.tsx из шаблона
Шаблон — src/screens/templates/ScreenTemplate.tsx: каркас, состояния загрузки, ошибки и пустого экрана, закреплённая кнопка. Дальше:
src/types/navigation.tssrc/navigation/AppNavigator.tsxsrc/screens/index.tsЧек-лист перед коммитом:
Screen + ScreenHeader; кнопки, поля, списки, окна — только из @/components/uiuseThemeColors(): никаких '#…', rgba, isDark ? …; кнопки с текстом — primaryFill + onPrimary<Text variant="…">: размеры шкалы (12–40), не меньше 12, веса 400 / 600 / 700spacing и borderRadius (только s / m / l / xl / full)lucide-react-native, без эмодзи (исключения — флаги языков и панель вкладок на Ionicons)Skeleton; ошибка — ErrorState; пусто — EmptyState с подсказкой, что сделать дальшеtoast; опасное подтверждение — confirmDialog; системный Alert — только для вопросов с выборомaccessibilityLabel, у выбора — accessibilityState, зона нажатия ≥ 44 (hitSlop)pluralize из @/utilsАвтопроверка: npm run brand:check — таблица нарушений (-- --details <путь> — по строкам). Перед коммитом и в CI (Codemagic, GitHub Actions) запускается --fail-on-new: коммит и сборка не проходят, если нарушений стало больше, чем в снимке scripts/brand-baseline.json. Хук ставится сам на npm install (или npm run hooks:install). Когда нарушений стало меньше — обновите снимок: npm run brand:check -- --update-baseline.
src/components/[category]/index.tssrc/store/src/store/index.tsГотовые наборы по учебникам: Книга → Юнит → Набор. Книги загружаются локальными скриптами из scripts/ напрямую в Neon. Скрипты не входят в приложение. План: plan/book_catalog_plan.md.
В .env.local должны быть:
DATABASE_URL_UNPOOLED — строка подключения к Neon.ADMIN_USER_ID — UUID пользователя с users.is_admin = true. Он будет владельцем официальных наборов.npx tsx scripts/create-book-template.ts # → templates/book_template.xlsx
Один файл = одна книга. В шаблоне есть лист «Инструкция».
Лист «Книга» — одна строка:
| title | edition | level | subject | language_from | language_to | publisher |
|---|---|---|---|---|---|---|
| Solutions Pre-Intermediate | 3rd | A2 | English | en | ru | Oxford |
Обязательные поля: title, language_from (язык изучения) и language_to (язык перевода: ru, ky).
Лист «Карточки» — одна строка на одно слово:
| unit | unit_title | pages | term | translation | example |
|---|---|---|---|---|---|
| 1 | Feelings | 8–17 | happy | счастливый | I'm happy to see you. |
unit, unit_title и pages повторяйте в каждой строке юнита одинаково.term и translation обязательны.translation и example можно менять когда угодно, прогресс учеников сохранится. Если исправить term, получится новая карточка.npx tsx scripts/import-book.ts book.xlsx --dry-run # проверка + отчёт, база не меняется
npx tsx scripts/import-book.ts book.xlsx # импорт (новая книга — черновик)
--prune удаляет их после подтверждения y. Вместе с карточками удаляется прогресс учеников по ним.npx tsx scripts/publish-book.ts "Solutions Pre-Intermediate" "3rd" # видна всем
npx tsx scripts/publish-book.ts "Solutions Pre-Intermediate" "3rd" --unpublish # снова черновик
Опубликовать можно и сразу при импорте, флагом --publish.
keystore_credentials переменные: CM_KEYSTORE_BASE64 (base64 от release keystore), CM_KEYSTORE_PASSWORD, CM_KEY_ALIAS, CM_KEY_PASSWORD.base64 my-release-key.keystore > keystore.b64 и вставьте содержимое в CM_KEYSTORE_BASE64.codemagic.yaml, workflow android-apk использует Node 18 / Java 17, декодирует keystore и запускает ./gradlew clean assembleRelease.android/app/build/outputs/apk/release/app-release.apk.