Надёжность main-процесса: - глобальные uncaughtException/unhandledRejection (лог + flushNow) - safeHandle/safeOn вокруг всех IPC-хендлеров (не падаем молча, generic-ошибка наружу) - таймаут 4s на tasklist, Atomics.wait вместо busy-spin на exit-записи - единый log.error для фоновых сбоев вместо console.error/тишины Тесты (178 -> 203): meeting-detect, scheduler-gating, store (миграции/карантин/cap). UI/UX: - prefers-reduced-motion через MotionConfig + CSS media-блок - Spinner/Skeleton примитивы, loading-состояния вместо пустых заглушек - aria-live анонсы достижений и выполнения (useAnnounce) - оформленные пустые состояния, клавиатура в меню ExerciseCard Лицензия: проприетарный LICENSE + правка README/CLAUDE.md, счётчик тестов. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
24 lines
973 B
TypeScript
24 lines
973 B
TypeScript
import React from 'react'
|
|
import ReactDOM from 'react-dom/client'
|
|
import { MotionConfig } from 'framer-motion'
|
|
import './styles/globals.css'
|
|
import App from './App'
|
|
import ReminderApp from './ReminderApp'
|
|
import { ThemeProvider } from './providers/ThemeProvider'
|
|
|
|
const params = new URLSearchParams(window.location.search)
|
|
const which = params.get('window') ?? 'main'
|
|
|
|
// reducedMotion="user" — framer-motion сам читает системную настройку
|
|
// «уменьшить движение» и глушит transform/layout-анимации (оставляя opacity).
|
|
// Один источник истины для обоих окон и всех motion-компонентов.
|
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
<React.StrictMode>
|
|
<MotionConfig reducedMotion="user">
|
|
<ThemeProvider>
|
|
{which === 'reminder' ? <ReminderApp /> : <App />}
|
|
</ThemeProvider>
|
|
</MotionConfig>
|
|
</React.StrictMode>
|
|
)
|