aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/client
AgeCommit message (Collapse)Author
2026-02-13style(home): vertically center deck info in deck list itemsnsfisis
Add my-auto to the deck info container for vertical centering within the flex row.
2026-02-13feat(deck): add "Add Note" button to deck detail pagensfisis
Allow creating notes directly from the deck detail page without navigating through View Cards first. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12feat: 学習カード数の上限を撤廃Claude
REVIEW_CARDS_LIMIT(復習カード80枚制限)とnewCardsPerDay(1日の新規カード制限) を削除し、期日が来たすべてのカードを制限なく返すように変更。 削除した主な要素: - REVIEW_CARDS_LIMIT定数とカード取得時のlimitパラメータ - newCardsPerDayフィールド(DB schema, 型定義, Zod schema, sync, CRDT) - countDueNewCards, countDueReviewCards, findDueNewCardsForStudy, findDueReviewCardsForStudy(CardRepository) - countTodayNewCardReviews(ReviewLogRepository) - デッキルートからのReviewLogRepository依存 https://claude.ai/code/session_018hrEJ9vg3RPoeAPyEc17gS
2026-02-08refactor(study): remove legacy card fallback and commentsnsfisis
All cards now use note-based template rendering. The legacy front/back fallback path is no longer needed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08Merge pull request #13 from nsfisis/claude/clarify-deck-numbers-mg3d4nsfisis
Simplify deck stats to show due card count from server
2026-02-08feat(study): use seeded PRNG for deterministic card shuffle ordernsfisis
Shuffle order is now fixed within a study day by seeding mulberry32 with the study day boundary timestamp (3:00 AM rollover). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08fix(deck): change review card limit to 80 and simplify deck detail statsClaude
Review card limit is reduced from 100 to 80 across deck list, deck detail, and study routes. Deck detail page now shows only total card count and due card count (with budget limits applied), matching the deck list and study screen numbers. https://claude.ai/code/session_01NAj4waQhwSSXV9EbgioX2j
2026-02-05feat(study): display new card badge on study screennsfisis
Show a "New" badge in the top-right corner of cards when the card state is 0 (new), helping users identify cards they haven't seen before. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05feat(deck): display card counts by state on deck detail pagensfisis
Show separate counts for New, Learning, and Review cards instead of a single "Due Today" count. Uses FSRS CardState to categorize cards with color-coded display (blue/orange/green). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05feat(study): add undo support for card reviewsnsfisis
Defer API submission of reviews by storing them as pending. The previous pending review is flushed when the next card is rated, and on unmount via fire-and-forget. Undo discards the pending review and returns to the previous card without any API call. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04refactor(db): remove unused findNewCards from localCardRepositorynsfisis
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04feat(deps): migrate atomFamily from jotai/utils to jotai-familynsfisis
Replace built-in jotai atomFamily with jotai-family package for better parameter-based atom family support. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04refactor(ui): remove card count from note group headernsfisis
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04refactor(ui): replace LoadingSpinner with skeleton fallbacks in Suspensensfisis
Reduce layout shift during data loading by using content-shaped skeleton placeholders instead of generic spinners in DeckDetailPage, DeckCardsPage, and StudyPage. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02fix(study): use date-based comparison with 3 AM boundary for due cardsClaude
Instead of comparing due timestamps exactly (card.due <= now), compare against the next 3 AM boundary so all cards due within the current study day appear at once. This prevents new cards from trickling in throughout the day when FSRS fuzz spreads due times. https://claude.ai/code/session_01FeDztLcyGofd6nxh8ct7a3
2026-02-01fix(pwa): fix broken testsnsfisis
2026-02-01feat(study): add Space key as Good rating shortcut when card is flippednsfisis
Allow continuous study flow by pressing Space repeatedly - first to flip the card, then to rate as Good (3). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01refactor(atoms): migrate to jotai-tanstack-query from custom reloadable atomsnsfisis
Replace custom createReloadableAtom/createReloadableAtomFamily with atomWithSuspenseQuery from jotai-tanstack-query, leveraging TanStack Query's built-in caching, invalidation, and Suspense support. - Add @tanstack/query-core and jotai-tanstack-query dependencies - Create shared QueryClient instance (src/client/queryClient.ts) - Migrate all data atoms (decks, cards, study, noteTypes) to atomWithSuspenseQuery - Update page components to use .data destructuring and queryClient.invalidateQueries() - Update all test files to use QueryClient for data hydration - Remove src/client/atoms/utils.ts (no longer needed) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31feat(cards): add search filtering to deck cards pagensfisis
Add a debounced (500ms) search input using use-debounce that filters note groups by matching card front/back content (case-insensitive). Pagination resets to page 1 when the search query changes. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31feat(cards): add pagination to deck cards page (50 cards per page)nsfisis
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20feat(deck): separate card list from deck detail pageClaude
Separate the card list view from the deck learning page to prevent users from seeing cards they are about to study. The deck detail page now shows only study statistics with a "Study Now" button and a "View Cards" link. - Add new DeckCardsPage component at /decks/:deckId/cards for managing cards - Simplify DeckDetailPage to show deck stats and navigation buttons - Update routing in App.tsx with proper route ordering - Add comprehensive tests for both pages
2026-01-12feat(deck): show due card count on deck list pageClaude
Display a badge with the number of cards due for study today next to each deck name on the home page. The count is fetched along with deck data from the API to minimize additional network requests.
2026-01-04refactor(client): migrate state management from React Context to Jotainsfisis
Replace AuthProvider and SyncProvider with Jotai atoms for more granular state management and better performance. This migration: - Creates atoms for auth, sync, decks, cards, noteTypes, and study state - Uses atomFamily for parameterized state (e.g., cards by deckId) - Introduces StoreInitializer component for subscription initialization - Updates all components and pages to use useAtomValue/useSetAtom - Updates all tests to use Jotai Provider with createStore pattern 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03feat(study): shuffle cards when starting study sessionnsfisis
Cards are now randomized using Fisher-Yates algorithm to improve learning by preventing users from memorizing card order. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03feat(import): display expected CSV format dynamically per note typensfisis
Show actual note types and their fields in the expected format section instead of a hardcoded example. Fields are sorted by order. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02feat(import): simplify CSV format by removing deck columnnsfisis
Since import is initiated from deck context, the deck is already known via props. Simplifies CSV format to: note_type,Field1,Field2,... BREAKING CHANGE: CSV format changed from deck,note_type,... to note_type,... 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01refactor(client): migrate API calls to typed RPC clientnsfisis
Replace raw fetch() calls with apiClient.rpc typed client across all modal and page components. This provides better type safety and eliminates manual auth header handling. - Make handleResponse public for component usage - Update all component tests to mock RPC methods instead of fetch - Change POSTGRES_HOST default to kioku-db for Docker compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01feat(import): add CSV bulk import for notesnsfisis
Add client-side CSV parsing and bulk import API endpoint for importing notes from CSV files. Supports quoted fields, newlines in values, and escaped quotes. - New POST /api/decks/{deckId}/notes/import endpoint for bulk creation - CSV parser with RFC 4180 compliance - Multi-phase import modal (upload → validate → preview → import) - Client-side validation with per-row error reporting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01fix(ui): allow line-breaks in card templatesnsfisis
Change template input fields from single-line <input> to <textarea> elements to support multiline content in front/back templates. Fixes #5 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01fix(auth): redirect to login when session expiresnsfisis
When the refresh token fails (session expired), the ApiClient now notifies the AuthProvider via a callback. This triggers a logout and React state update, causing ProtectedRoute to redirect to /login. Closes #7 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01fix(auth): add automatic token refresh on 401 responsesnsfisis
The client session was too short because access tokens (15 min) weren't being automatically refreshed using the refresh token (7 days). Now the ApiClient intercepts 401 responses, attempts token refresh, and retries the original request. This extends effective session duration to 7 days. Closes #6 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31refactor(client): remove duplicate create buttons from empty statesnsfisis
The empty state sections already have create buttons in the page header, making these inline buttons redundant. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31refactor(client): use Hono InferResponseType for API response typesnsfisis
Replace manually defined AuthResponse and User types with Hono's InferResponseType to automatically derive types from server definitions. This ensures client types stay in sync with server responses. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31fix(client): parse nested error object in API responsesnsfisis
Server returns `{ error: { message, code } }` but client expected `{ error: string, code }`, causing "[object Object]" to display on login failure. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31refactor(sync): simplify ConflictResolutionResult to use string arraysnsfisis
Remove ConflictResolutionItem type since resolution field was always "server_wins" and provided no useful information. Resolution arrays now contain entity IDs directly instead of objects. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31refactor(sync): remove legacy conflict resolution strategiesnsfisis
Remove the unused "local_wins" strategy and ConflictResolverOptions interface from ConflictResolver. The CRDT-based conflict resolution now always uses Automerge merge with server_wins fallback when CRDT data is unavailable. This simplifies the codebase by removing configuration options that were never used in production. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31refactor(sync): remove legacy LWW conflict resolution strategynsfisis
Remove the deprecated "newer_wins" strategy from the conflict resolver as CRDT is now the default and validated approach. The system now uses only "crdt", "server_wins", and "local_wins" strategies. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(crdt): add client-side CRDT migration scriptnsfisis
Add one-time migration script to convert existing local IndexedDB entities to Automerge CRDT documents. Includes: - Migration with idempotency check (runs only once) - Batch processing option for large datasets - Progress callback for UI feedback - Unit tests for migration logic 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31test(crdt): add integration tests for concurrent edit scenariosnsfisis
Add comprehensive test suite covering multi-device concurrent editing: - Two devices editing different fields (no conflicts) - Two devices editing same field (deterministic resolution) - Concurrent edit and delete scenarios - Card FSRS field concurrent updates - Incremental sync simulation - Three-way merge scenarios - Serialization roundtrip with concurrent edits - Edge cases (null handling, rapid edits) - Offline queue simulation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(crdt): integrate CRDT sync flow into sync managernsfisis
- Store CRDT document binaries after successful push operations - Update CRDT sync metadata (lastSyncAt, syncVersionWatermark) after sync - Add getCrdtSyncStats(), clearCrdtState(), hasCrdtDocument() methods - Add crdt_documents_stored event and crdtDocumentsStored to SyncResult - Include all entity types in conflict resolution count 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(crdt): replace LWW conflict resolution with Automerge mergensfisis
The ConflictResolver now defaults to CRDT strategy which uses Automerge to merge local and server documents during sync conflicts. This provides conflict-free resolution that preserves changes from both sides. Key changes: - Add CRDT merge methods for all entity types (deck, card, note, etc.) - Update resolve methods to accept optional CRDT binary data - Fall back to server_wins when CRDT data is unavailable or invalid - Add comprehensive tests for CRDT conflict resolution scenarios 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(crdt): handle crdtChanges in sync pull responsensfisis
Add applyCrdtChanges function to process CRDT payloads received from the server during pull operations. The function merges remote documents with local ones using Automerge and stores the result in sync state. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(crdt): add crdtChanges to sync push payloadnsfisis
Add CRDT document generation to the sync push flow. Each pending entity is now converted to an Automerge CRDT document and included as base64- encoded binary in the push payload alongside the existing entity data. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(crdt): add CRDT repository layer and sync state managementnsfisis
Add Phase 2 of the CRDT implementation: - CRDT-aware repository wrappers for all entity types (Deck, Card, Note, etc.) - Sync state management with IndexedDB storage for CRDT document binaries - Base64 serialization utilities for network transport - Comprehensive test coverage (53 new tests)
2025-12-31feat(crdt): add Automerge document lifecycle managementnsfisis
Implement document-manager.ts with core CRDT operations: - Document creation, update, merge, save/load functions - Conversion functions between local entities and CRDT documents - Actor ID management for client identification - Conflict detection utilities Completes Phase 1 of CRDT implementation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(crdt): add Automerge document type definitionsnsfisis
Add CRDT document types for all entities (Deck, NoteType, NoteFieldType, Note, NoteFieldValue, Card, ReviewLog) with LWW Register pattern. Includes utility functions for document ID creation/parsing and metadata management. Part of Phase 1 for CRDT-based sync implementation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(card): cascade card deletion to note and sibling cardsnsfisis
When a card is deleted, now also soft-deletes its parent Note and all sibling cards (other cards generated from the same note). This matches the specified behavior in the roadmap where deleting any card from a note-based group should remove the entire note and all its cards. Also adds tests for deletion constraint behaviors: - NoteType deletion blocked when Notes exist - NoteFieldType deletion blocked when NoteFieldValues exist - Note deletion cascades to all related Cards - Card deletion cascades to Note and sibling Cards 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(schema): make note_id and is_reversed NOT NULLnsfisis
All cards now require note association - legacy card support removed. This aligns with the note-based card architecture introduced in Phase 8. - Add database migration for NOT NULL constraints - Update client Dexie schema to version 3 - Remove LegacyCardItem component and legacy card handling - Update sync schemas and type definitions - Update all tests to use note-based cards 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(client): group cards by note in DeckDetailPagensfisis
Display note-based cards as grouped items showing all cards generated from the same note, with note-level edit/delete actions. Legacy cards without note association are shown separately with a "Legacy" badge. - Add NoteGroupCard component for displaying note groups with card stats - Add LegacyCardItem component for backward-compatible card display - Add DeleteNoteModal for deleting notes and their cards - Show Normal/Reversed badges for cards within note groups 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31feat(client): add EditNoteModal for editing note-based cardsnsfisis
- Create EditNoteModal component that loads note and field values - Update DeckDetailPage to use EditNoteModal for cards with noteId - Keep EditCardModal for legacy cards without note association - Add visual indicator for reversed cards in card list - Add comprehensive tests for EditNoteModal 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>