From aa155dd7a9f2c715473a2c2a5a455728b44bebe7 Mon Sep 17 00:00:00 2001 From: wilson Date: Fri, 17 Apr 2026 07:42:34 +0100 Subject: [PATCH] chore: [frontend] Move various docs and config files --- frontend/docs/architecture.md | 4 +- frontend/docs/openapi.json | 1 + frontend/openapi-ts.config.ts | 20 ++--- frontend/package.json | 2 + frontend/pnpm-lock.yaml | 127 ++++++++++++++++++++++++++++ frontend/script/download-openapi.sh | 2 +- frontend/svelte.config.js | 3 +- 7 files changed, 145 insertions(+), 14 deletions(-) create mode 100644 frontend/docs/openapi.json diff --git a/frontend/docs/architecture.md b/frontend/docs/architecture.md index 39c3b97..8eb13f0 100644 --- a/frontend/docs/architecture.md +++ b/frontend/docs/architecture.md @@ -2,7 +2,9 @@ This document describes the software architecture and aptterns for the web application for language learning application. -This is a web application built using Svelte Kit v5, running on the NodeJS adapter. +This is a web application built using Svelte Kit v5, running on the NodeJS adapter. It is written in TypeScript. + +Package management is with pnpm. Follow the svelte kit conventions where possible, e.g. in placing routes, authentication, code. diff --git a/frontend/docs/openapi.json b/frontend/docs/openapi.json new file mode 100644 index 0000000..2f86b41 --- /dev/null +++ b/frontend/docs/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"Language Learning API","version":"0.1.0"},"paths":{"/api/auth/register":{"post":{"tags":["api","auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["api","auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify-email":{"get":{"tags":["api","auth"],"summary":"Verify Email","operationId":"verify_email_api_auth_verify_email_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Verify Email Api Auth Verify Email Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/learnable-languages":{"post":{"tags":["api","account"],"summary":"Add Learnable Language","operationId":"add_learnable_language_api_account_learnable_languages_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddLearnableLanguageRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearnableLanguageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/account/onboarding":{"post":{"tags":["api","account"],"summary":"Complete Onboarding","operationId":"complete_onboarding_api_account_onboarding_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Complete Onboarding Api Account Onboarding Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/account/status":{"get":{"tags":["api","account"],"summary":"Get Account Status","operationId":"get_account_status_api_account_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/account/learnable-languages/{language_id}":{"delete":{"tags":["api","account"],"summary":"Remove Learnable Language","operationId":"remove_learnable_language_api_account_learnable_languages__language_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dictionary/wordforms":{"get":{"tags":["api","dictionary"],"summary":"Search Wordforms","description":"Search for a wordform by surface text within a language.\n\nReturns one entry per matching lemma, each with the lemma's senses. A single\nform (e.g. \"allons\") may resolve to more than one lemma when homographs exist.","operationId":"search_wordforms_api_dictionary_wordforms_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"lang_code","in":"query","required":true,"schema":{"type":"string","title":"Lang Code"}},{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WordformMatch"},"title":"Response Search Wordforms Api Dictionary Wordforms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vocab/{entry_id}/flashcards":{"post":{"tags":["api","flashcards"],"summary":"Generate Flashcards","operationId":"generate_flashcards_api_vocab__entry_id__flashcards_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateFlashcardsRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FlashcardResponse"},"title":"Response Generate Flashcards Api Vocab Entry Id Flashcards Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/flashcards":{"get":{"tags":["api","flashcards"],"summary":"List Flashcards","operationId":"list_flashcards_api_flashcards_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FlashcardResponse"},"type":"array","title":"Response List Flashcards Api Flashcards Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/flashcards/{flashcard_id}/events":{"post":{"tags":["api","flashcards"],"summary":"Record Event","operationId":"record_event_api_flashcards__flashcard_id__events_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flashcard_id","in":"path","required":true,"schema":{"type":"string","title":"Flashcard Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordEventRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlashcardEventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pos/":{"post":{"tags":["api","api","pos"],"summary":"Analyze Pos","operationId":"analyze_pos_api_pos__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POSRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/POSResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/translate":{"get":{"tags":["api","api","translate"],"summary":"Translate text to a target language","operationId":"translate_text_api_translate_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","title":"Text"}},{"name":"target_language","in":"query","required":true,"schema":{"type":"string","title":"Target Language"}},{"name":"context","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/generate":{"post":{"tags":["api","api"],"summary":"Create Generation Job","operationId":"create_generation_job_api_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/jobs/":{"get":{"tags":["api"],"summary":"Get Jobs","operationId":"get_jobs_api_jobs__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/jobs/{job_id}":{"get":{"tags":["api"],"summary":"Get Job","operationId":"get_job_api_jobs__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/regenerate-audio":{"post":{"tags":["api"],"summary":"Regenerate Audio","operationId":"regenerate_audio_api_jobs__job_id__regenerate_audio_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Regenerate Audio Api Jobs Job Id Regenerate Audio Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/learnable_languages":{"post":{"tags":["api","api"],"summary":"Upsert Learnable Language","operationId":"upsert_learnable_language_api_learnable_languages_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearnableLanguageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearnableLanguageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vocab":{"post":{"tags":["api","vocab"],"summary":"Add Word","operationId":"add_word_api_vocab_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddWordRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WordBankEntryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["api","vocab"],"summary":"List Entries","operationId":"list_entries_api_vocab_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"language_pair_id","in":"query","required":true,"schema":{"type":"string","title":"Language Pair Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WordBankEntryResponse"},"title":"Response List Entries Api Vocab Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vocab/from-token":{"post":{"tags":["api","vocab"],"summary":"Add From Token","operationId":"add_from_token_api_vocab_from_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddFromTokenRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FromTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vocab/pending-disambiguation":{"get":{"tags":["api","vocab"],"summary":"Pending Disambiguation","operationId":"pending_disambiguation_api_vocab_pending_disambiguation_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WordBankEntryResponse"},"type":"array","title":"Response Pending Disambiguation Api Vocab Pending Disambiguation Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vocab/{entry_id}/sense":{"patch":{"tags":["api","vocab"],"summary":"Resolve Sense","operationId":"resolve_sense_api_vocab__entry_id__sense_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSenseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WordBankEntryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/packs":{"get":{"tags":["api","packs"],"summary":"List Packs","operationId":"list_packs_api_packs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Lang"}},{"name":"target_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PackSummaryResponse"},"title":"Response List Packs Api Packs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/packs/{pack_id}":{"get":{"tags":["api","packs"],"summary":"Get Pack","operationId":"get_pack_api_packs__pack_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__api__packs__PackDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/packs/{pack_id}/add-to-bank":{"post":{"tags":["api","packs"],"summary":"Add Pack To Bank","operationId":"add_pack_to_bank_api_packs__pack_id__add_to_bank_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTobankRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTobankResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/packs":{"post":{"tags":["api","admin-packs"],"summary":"Create Pack","operationId":"create_pack_api_admin_packs_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePackRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["api","admin-packs"],"summary":"List Packs","operationId":"list_packs_api_admin_packs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Lang"}},{"name":"target_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PackResponse"},"title":"Response List Packs Api Admin Packs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/packs/{pack_id}":{"get":{"tags":["api","admin-packs"],"summary":"Get Pack","operationId":"get_pack_api_admin_packs__pack_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__api__admin__packs__PackDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api","admin-packs"],"summary":"Update Pack","operationId":"update_pack_api_admin_packs__pack_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/packs/{pack_id}/publish":{"post":{"tags":["api","admin-packs"],"summary":"Publish Pack","operationId":"publish_pack_api_admin_packs__pack_id__publish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/packs/{pack_id}/entries":{"post":{"tags":["api","admin-packs"],"summary":"Add Entry","operationId":"add_entry_api_admin_packs__pack_id__entries_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddEntryRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackEntryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/packs/{pack_id}/entries/{entry_id}":{"delete":{"tags":["api","admin-packs"],"summary":"Remove Entry","operationId":"remove_entry_api_admin_packs__pack_id__entries__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/packs/{pack_id}/entries/{entry_id}/flashcards":{"post":{"tags":["api","admin-packs"],"summary":"Add Flashcard Template","operationId":"add_flashcard_template_api_admin_packs__pack_id__entries__entry_id__flashcards_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddFlashcardTemplateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlashcardTemplateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/packs/{pack_id}/entries/{entry_id}/flashcards/{template_id}":{"delete":{"tags":["api","admin-packs"],"summary":"Remove Flashcard Template","operationId":"remove_flashcard_template_api_admin_packs__pack_id__entries__entry_id__flashcards__template_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"string","title":"Pack Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bff/account":{"get":{"tags":["bff","bff"],"summary":"Get Account","operationId":"get_account_bff_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/bff/account/onboarding":{"get":{"tags":["bff","bff"],"summary":"Get Onboarding","operationId":"get_onboarding_bff_account_onboarding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/bff/articles":{"get":{"tags":["bff","bff","articles"],"summary":"List Articles","operationId":"list_articles_bff_articles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"target_language","in":"query","required":false,"schema":{"type":"string","default":"fr","title":"Target Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bff/articles/{article_id}":{"get":{"tags":["bff","bff","articles"],"summary":"Get Article","operationId":"get_article_bff_articles__article_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bff/user_profile":{"get":{"tags":["bff","bff"],"summary":"Get User Profile","operationId":"get_user_profile_bff_user_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/bff/packs":{"get":{"tags":["bff","bff-packs"],"summary":"List Packs For Selection","operationId":"list_packs_for_selection_bff_packs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_lang","in":"query","required":true,"schema":{"type":"string","title":"Source Lang"}},{"name":"target_lang","in":"query","required":true,"schema":{"type":"string","title":"Target Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PackSelectionItem"},"title":"Response List Packs For Selection Bff Packs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/media/{filename}":{"get":{"tags":["media"],"summary":"Get Media File","operationId":"get_media_file_media__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}}},"components":{"schemas":{"AccountLanguagePair":{"properties":{"id":{"type":"string","title":"Id"},"source_language":{"type":"string","title":"Source Language"},"target_language":{"type":"string","title":"Target Language"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"}},"type":"object","required":["id","source_language","target_language","proficiencies"],"title":"AccountLanguagePair"},"AccountResponse":{"properties":{"email":{"type":"string","title":"Email"},"human_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Human Name"},"language_pairs":{"items":{"$ref":"#/components/schemas/AccountLanguagePair"},"type":"array","title":"Language Pairs"}},"type":"object","required":["email","human_name","language_pairs"],"title":"AccountResponse"},"AccountStatusResponse":{"properties":{"problem_flags":{"items":{"type":"string"},"type":"array","title":"Problem Flags"},"error_messages":{"items":{"type":"string"},"type":"array","title":"Error Messages"}},"type":"object","required":["problem_flags","error_messages"],"title":"AccountStatusResponse"},"AddEntryRequest":{"properties":{"sense_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sense Id"},"surface_text":{"type":"string","title":"Surface Text"}},"type":"object","required":["surface_text"],"title":"AddEntryRequest"},"AddFlashcardTemplateRequest":{"properties":{"prompt_text":{"type":"string","title":"Prompt Text"},"answer_text":{"type":"string","title":"Answer Text"},"prompt_context_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Context Text"},"answer_context_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer Context Text"}},"type":"object","required":["prompt_text","answer_text"],"title":"AddFlashcardTemplateRequest"},"AddFromTokenRequest":{"properties":{"language_pair_id":{"type":"string","title":"Language Pair Id"},"surface":{"type":"string","title":"Surface"},"spacy_lemma":{"type":"string","title":"Spacy Lemma"},"pos_ud":{"type":"string","title":"Pos Ud"},"language":{"type":"string","title":"Language"},"source_article_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Article Id"}},"type":"object","required":["language_pair_id","surface","spacy_lemma","pos_ud","language"],"title":"AddFromTokenRequest"},"AddLearnableLanguageRequest":{"properties":{"source_language":{"type":"string","title":"Source Language"},"target_language":{"type":"string","title":"Target Language"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"}},"type":"object","required":["source_language","target_language","proficiencies"],"title":"AddLearnableLanguageRequest"},"AddTobankRequest":{"properties":{"source_lang":{"type":"string","title":"Source Lang"},"target_lang":{"type":"string","title":"Target Lang"}},"type":"object","required":["source_lang","target_lang"],"title":"AddTobankRequest"},"AddTobankResponse":{"properties":{"added":{"items":{"type":"string"},"type":"array","title":"Added"}},"type":"object","required":["added"],"title":"AddTobankResponse"},"AddWordRequest":{"properties":{"language_pair_id":{"type":"string","title":"Language Pair Id"},"surface_text":{"type":"string","title":"Surface Text"},"entry_pathway":{"type":"string","title":"Entry Pathway","default":"manual"},"is_phrase":{"type":"boolean","title":"Is Phrase","default":false},"source_article_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Article Id"}},"type":"object","required":["language_pair_id","surface_text"],"title":"AddWordRequest"},"ArticleDetail":{"properties":{"id":{"type":"string","title":"Id"},"published_at":{"type":"string","format":"date-time","title":"Published At"},"source_language":{"type":"string","title":"Source Language"},"source_title":{"type":"string","title":"Source Title"},"source_body":{"type":"string","title":"Source Body"},"source_body_pos":{"additionalProperties":true,"type":"object","title":"Source Body Pos"},"target_language":{"type":"string","title":"Target Language"},"target_complexities":{"items":{"type":"string"},"type":"array","title":"Target Complexities"},"target_title":{"type":"string","title":"Target Title"},"target_body":{"type":"string","title":"Target Body"},"target_audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Audio Url"},"target_body_pos":{"additionalProperties":true,"type":"object","title":"Target Body Pos"},"target_body_transcript":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Target Body Transcript"}},"type":"object","required":["id","published_at","source_language","source_title","source_body","source_body_pos","target_language","target_complexities","target_title","target_body","target_audio_url","target_body_pos","target_body_transcript"],"title":"ArticleDetail"},"ArticleItem":{"properties":{"id":{"type":"string","title":"Id"},"published_at":{"type":"string","format":"date-time","title":"Published At"},"source_language":{"type":"string","title":"Source Language"},"source_title":{"type":"string","title":"Source Title"},"target_language":{"type":"string","title":"Target Language"},"target_complexities":{"items":{"type":"string"},"type":"array","title":"Target Complexities"},"target_title":{"type":"string","title":"Target Title"}},"type":"object","required":["id","published_at","source_language","source_title","target_language","target_complexities","target_title"],"title":"ArticleItem"},"ArticleListResponse":{"properties":{"articles":{"items":{"$ref":"#/components/schemas/ArticleItem"},"type":"array","title":"Articles"}},"type":"object","required":["articles"],"title":"ArticleListResponse"},"CreatePackRequest":{"properties":{"name":{"type":"string","title":"Name"},"name_target":{"type":"string","title":"Name Target"},"description":{"type":"string","title":"Description"},"description_target":{"type":"string","title":"Description Target"},"source_lang":{"type":"string","title":"Source Lang"},"target_lang":{"type":"string","title":"Target Lang"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies","default":[]}},"type":"object","required":["name","name_target","description","description_target","source_lang","target_lang"],"title":"CreatePackRequest"},"FlashcardEventResponse":{"properties":{"id":{"type":"string","title":"Id"},"flashcard_id":{"type":"string","title":"Flashcard Id"},"user_id":{"type":"string","title":"User Id"},"event_type":{"type":"string","title":"Event Type"},"user_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Response"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","flashcard_id","user_id","event_type","user_response","created_at"],"title":"FlashcardEventResponse"},"FlashcardResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"bank_entry_id":{"type":"string","title":"Bank Entry Id"},"source_lang":{"type":"string","title":"Source Lang"},"target_lang":{"type":"string","title":"Target Lang"},"prompt_text":{"type":"string","title":"Prompt Text"},"answer_text":{"type":"string","title":"Answer Text"},"prompt_context_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Context Text"},"answer_context_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer Context Text"},"prompt_modality":{"type":"string","title":"Prompt Modality"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","user_id","bank_entry_id","source_lang","target_lang","prompt_text","answer_text","prompt_context_text","answer_context_text","prompt_modality","created_at"],"title":"FlashcardResponse"},"FlashcardTemplateResponse":{"properties":{"id":{"type":"string","title":"Id"},"pack_entry_id":{"type":"string","title":"Pack Entry Id"},"prompt_text":{"type":"string","title":"Prompt Text"},"answer_text":{"type":"string","title":"Answer Text"},"prompt_context_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Context Text"},"answer_context_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer Context Text"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","pack_entry_id","prompt_text","answer_text","prompt_context_text","answer_context_text","created_at"],"title":"FlashcardTemplateResponse"},"FromTokenResponse":{"properties":{"entry":{"$ref":"#/components/schemas/WordBankEntryResponse"},"sense_candidates":{"items":{"$ref":"#/components/schemas/SenseCandidateResponse"},"type":"array","title":"Sense Candidates"},"matched_via":{"type":"string","title":"Matched Via"}},"type":"object","required":["entry","sense_candidates","matched_via"],"title":"FromTokenResponse"},"GenerateFlashcardsRequest":{"properties":{"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"}},"type":"object","title":"GenerateFlashcardsRequest"},"GenerationRequest":{"properties":{"target_language":{"type":"string","title":"Target Language"},"complexity_level":{"type":"string","title":"Complexity Level"},"input_texts":{"items":{"type":"string"},"type":"array","title":"Input Texts"},"source_language":{"type":"string","title":"Source Language","default":"en"}},"type":"object","required":["target_language","complexity_level","input_texts"],"title":"GenerationRequest"},"GenerationResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"}},"type":"object","required":["job_id"],"title":"GenerationResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JobListResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/JobSummary"},"type":"array","title":"Jobs"}},"type":"object","required":["jobs"],"title":"JobListResponse"},"JobResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","title":"Status"},"translated_article_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Translated Article Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["id","status","created_at"],"title":"JobResponse"},"JobSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["id","status","created_at"],"title":"JobSummary"},"LanguagePairOption":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"}},"type":"object","required":["value","label","description"],"title":"LanguagePairOption"},"LearnableLanguageItem":{"properties":{"id":{"type":"string","title":"Id"},"source_language":{"type":"string","title":"Source Language"},"target_language":{"type":"string","title":"Target Language"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"}},"type":"object","required":["id","source_language","target_language","proficiencies"],"title":"LearnableLanguageItem"},"LearnableLanguageRequest":{"properties":{"source_language":{"type":"string","title":"Source Language"},"target_language":{"type":"string","title":"Target Language"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"}},"type":"object","required":["source_language","target_language","proficiencies"],"title":"LearnableLanguageRequest"},"LearnableLanguageResponse":{"properties":{"id":{"type":"string","title":"Id"},"source_language":{"type":"string","title":"Source Language"},"target_language":{"type":"string","title":"Target Language"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"}},"type":"object","required":["id","source_language","target_language","proficiencies"],"title":"LearnableLanguageResponse"},"LemmaResponse":{"properties":{"id":{"type":"string","title":"Id"},"headword":{"type":"string","title":"Headword"},"language":{"type":"string","title":"Language"},"pos_raw":{"type":"string","title":"Pos Raw"},"pos_normalised":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pos Normalised"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"type":"object","required":["id","headword","language","pos_raw","pos_normalised","gender","tags"],"title":"LemmaResponse"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"OnboardingRequest":{"properties":{"human_name":{"type":"string","title":"Human Name"},"language_pairs":{"items":{"type":"string"},"type":"array","title":"Language Pairs"},"proficiencies":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"Proficiencies"}},"type":"object","required":["human_name","language_pairs","proficiencies"],"title":"OnboardingRequest"},"OnboardingResponse":{"properties":{"language_pairs":{"items":{"$ref":"#/components/schemas/LanguagePairOption"},"type":"array","title":"Language Pairs"},"proficiencies":{"items":{"$ref":"#/components/schemas/ProficiencyOption"},"type":"array","title":"Proficiencies"}},"type":"object","required":["language_pairs","proficiencies"],"title":"OnboardingResponse"},"POSRequest":{"properties":{"text":{"type":"string","title":"Text"},"language":{"type":"string","title":"Language"}},"type":"object","required":["text","language"],"title":"POSRequest"},"POSResponse":{"properties":{"language":{"type":"string","title":"Language"},"tokens":{"items":{"$ref":"#/components/schemas/TokenInfo"},"type":"array","title":"Tokens"}},"type":"object","required":["language","tokens"],"title":"POSResponse"},"PackEntryResponse":{"properties":{"id":{"type":"string","title":"Id"},"pack_id":{"type":"string","title":"Pack Id"},"sense_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sense Id"},"surface_text":{"type":"string","title":"Surface Text"},"created_at":{"type":"string","title":"Created At"},"flashcard_templates":{"items":{"$ref":"#/components/schemas/FlashcardTemplateResponse"},"type":"array","title":"Flashcard Templates","default":[]}},"type":"object","required":["id","pack_id","sense_id","surface_text","created_at"],"title":"PackEntryResponse"},"PackResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"name_target":{"type":"string","title":"Name Target"},"description":{"type":"string","title":"Description"},"description_target":{"type":"string","title":"Description Target"},"source_lang":{"type":"string","title":"Source Lang"},"target_lang":{"type":"string","title":"Target Lang"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"},"is_published":{"type":"boolean","title":"Is Published"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","name","name_target","description","description_target","source_lang","target_lang","proficiencies","is_published","created_at"],"title":"PackResponse"},"PackSelectionItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"name_target":{"type":"string","title":"Name Target"},"description":{"type":"string","title":"Description"},"description_target":{"type":"string","title":"Description Target"},"source_lang":{"type":"string","title":"Source Lang"},"target_lang":{"type":"string","title":"Target Lang"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"},"entry_count":{"type":"integer","title":"Entry Count"},"already_added":{"type":"boolean","title":"Already Added"}},"type":"object","required":["id","name","name_target","description","description_target","source_lang","target_lang","proficiencies","entry_count","already_added"],"title":"PackSelectionItem"},"PackSummaryResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"name_target":{"type":"string","title":"Name Target"},"description":{"type":"string","title":"Description"},"description_target":{"type":"string","title":"Description Target"},"source_lang":{"type":"string","title":"Source Lang"},"target_lang":{"type":"string","title":"Target Lang"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"},"entry_count":{"type":"integer","title":"Entry Count"}},"type":"object","required":["id","name","name_target","description","description_target","source_lang","target_lang","proficiencies","entry_count"],"title":"PackSummaryResponse"},"ProficiencyOption":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"}},"type":"object","required":["value","label","description"],"title":"ProficiencyOption"},"RecordEventRequest":{"properties":{"event_type":{"type":"string","title":"Event Type"},"user_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Response"}},"type":"object","required":["event_type"],"title":"RecordEventRequest"},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"RegisterResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["success"],"title":"RegisterResponse"},"SenseCandidateResponse":{"properties":{"id":{"type":"string","title":"Id"},"gloss":{"type":"string","title":"Gloss"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"type":"object","required":["id","gloss","topics","tags"],"title":"SenseCandidateResponse"},"SenseResponse":{"properties":{"id":{"type":"string","title":"Id"},"sense_index":{"type":"integer","title":"Sense Index"},"gloss":{"type":"string","title":"Gloss"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"type":"object","required":["id","sense_index","gloss","topics","tags"],"title":"SenseResponse"},"SetSenseRequest":{"properties":{"sense_id":{"type":"string","title":"Sense Id"}},"type":"object","required":["sense_id"],"title":"SetSenseRequest"},"TokenInfo":{"properties":{"text":{"type":"string","title":"Text"},"lemma":{"type":"string","title":"Lemma"},"pos":{"type":"string","title":"Pos"},"tag":{"type":"string","title":"Tag"},"dep":{"type":"string","title":"Dep"},"is_stop":{"type":"boolean","title":"Is Stop"}},"type":"object","required":["text","lemma","pos","tag","dep","is_stop"],"title":"TokenInfo"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"TokenResponse"},"TranslationResponse":{"properties":{"text":{"type":"string","title":"Text"},"target_language":{"type":"string","title":"Target Language"},"translated_text":{"type":"string","title":"Translated Text"}},"type":"object","required":["text","target_language","translated_text"],"title":"TranslationResponse"},"UpdatePackRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"name_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Target"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"description_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description Target"},"proficiencies":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Proficiencies"}},"type":"object","title":"UpdatePackRequest"},"UserProfileResponse":{"properties":{"learnable_languages":{"items":{"$ref":"#/components/schemas/LearnableLanguageItem"},"type":"array","title":"Learnable Languages"}},"type":"object","required":["learnable_languages"],"title":"UserProfileResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WordBankEntryResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"language_pair_id":{"type":"string","title":"Language Pair Id"},"sense_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sense Id"},"wordform_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wordform Id"},"surface_text":{"type":"string","title":"Surface Text"},"is_phrase":{"type":"boolean","title":"Is Phrase"},"entry_pathway":{"type":"string","title":"Entry Pathway"},"source_article_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Article Id"},"disambiguation_status":{"type":"string","title":"Disambiguation Status"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","user_id","language_pair_id","sense_id","wordform_id","surface_text","is_phrase","entry_pathway","source_article_id","disambiguation_status","created_at"],"title":"WordBankEntryResponse"},"WordformMatch":{"properties":{"lemma":{"$ref":"#/components/schemas/LemmaResponse"},"senses":{"items":{"$ref":"#/components/schemas/SenseResponse"},"type":"array","title":"Senses"}},"type":"object","required":["lemma","senses"],"title":"WordformMatch"},"app__routers__api__admin__packs__PackDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"name_target":{"type":"string","title":"Name Target"},"description":{"type":"string","title":"Description"},"description_target":{"type":"string","title":"Description Target"},"source_lang":{"type":"string","title":"Source Lang"},"target_lang":{"type":"string","title":"Target Lang"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"},"is_published":{"type":"boolean","title":"Is Published"},"created_at":{"type":"string","title":"Created At"},"entries":{"items":{"$ref":"#/components/schemas/PackEntryResponse"},"type":"array","title":"Entries","default":[]}},"type":"object","required":["id","name","name_target","description","description_target","source_lang","target_lang","proficiencies","is_published","created_at"],"title":"PackDetailResponse"},"app__routers__api__packs__PackDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"name_target":{"type":"string","title":"Name Target"},"description":{"type":"string","title":"Description"},"description_target":{"type":"string","title":"Description Target"},"source_lang":{"type":"string","title":"Source Lang"},"target_lang":{"type":"string","title":"Target Lang"},"proficiencies":{"items":{"type":"string"},"type":"array","title":"Proficiencies"},"entry_count":{"type":"integer","title":"Entry Count"},"surface_texts":{"items":{"type":"string"},"type":"array","title":"Surface Texts"}},"type":"object","required":["id","name","name_target","description","description_target","source_lang","target_lang","proficiencies","entry_count","surface_texts"],"title":"PackDetailResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}} \ No newline at end of file diff --git a/frontend/openapi-ts.config.ts b/frontend/openapi-ts.config.ts index 40e5a22..be300cb 100644 --- a/frontend/openapi-ts.config.ts +++ b/frontend/openapi-ts.config.ts @@ -1,14 +1,14 @@ import { defineConfig } from '@hey-api/openapi-ts'; export default defineConfig({ - input: 'src/lib/openapi.json', // sign up at app.heyapi.dev - output: { - path: 'src/client' - }, - plugins: [ - { - name: '@hey-api/client-fetch', - runtimeConfigPath: '../hey-api.ts', - }, - ], + input: './docs/openapi.json', // sign up at app.heyapi.dev + output: { + path: 'src/client' + }, + plugins: [ + { + name: '@hey-api/client-fetch', + runtimeConfigPath: '../hey-api.ts' + } + ] }); diff --git a/frontend/package.json b/frontend/package.json index a0bf68f..81a2f7f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,12 +21,14 @@ "@eslint/js": "latest", "@fontsource-variable/inter": "^5.2.8", "@hey-api/openapi-ts": "0.94.4", + "@internationalized/date": "^3.12.1", "@lucide/svelte": "^1.8.0", "@sveltejs/adapter-node": "^5.5.4", "@sveltejs/kit": "^2.50.2", "@sveltejs/vite-plugin-svelte": "^6.2.4", "@types/node": "^22", "@vitest/browser-playwright": "^4.1.0", + "bits-ui": "^2.17.3", "clsx": "^2.1.1", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 8a956a1..9ac9245 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -33,6 +33,9 @@ importers: '@hey-api/openapi-ts': specifier: 0.94.4 version: 0.94.4(typescript@5.9.3) + '@internationalized/date': + specifier: ^3.12.1 + version: 3.12.1 '@lucide/svelte': specifier: ^1.8.0 version: 1.8.0(svelte@5.54.1) @@ -51,6 +54,9 @@ importers: '@vitest/browser-playwright': specifier: ^4.1.0 version: 4.1.0(playwright@1.58.2)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1))(vitest@4.1.0) + bits-ui: + specifier: ^2.17.3 + version: 2.17.3(@internationalized/date@3.12.1)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -321,6 +327,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@fontsource-variable/inter@5.2.8': resolution: {integrity: sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ==} @@ -362,6 +377,9 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@internationalized/date@3.12.1': + resolution: {integrity: sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -612,6 +630,9 @@ packages: svelte: ^5.0.0 vite: ^6.3.0 || ^7.0.0 + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + '@testing-library/svelte-core@1.0.0': resolution: {integrity: sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==} engines: {node: '>=16'} @@ -794,6 +815,13 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + bits-ui@2.17.3: + resolution: {integrity: sha512-Bef41uY9U2jaBJHPhcPvmBNkGec5Wx2z6eioDsTmsaR2vH4QoaOcPi75gzCG3+/2TNr6v/qBwzgWNPYCxNtrEA==} + engines: {node: '>=20'} + peerDependencies: + '@internationalized/date': ^3.8.1 + svelte: ^5.33.0 + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -934,6 +962,10 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} @@ -1187,6 +1219,9 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -1281,6 +1316,10 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -1488,6 +1527,15 @@ packages: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + runed@0.35.1: + resolution: {integrity: sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==} + peerDependencies: + '@sveltejs/kit': ^2.21.0 + svelte: ^5.7.0 + peerDependenciesMeta: + '@sveltejs/kit': + optional: true + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -1540,6 +1588,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1565,10 +1616,19 @@ packages: svelte: optional: true + svelte-toolbelt@0.10.6: + resolution: {integrity: sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.30.2 + svelte@5.54.1: resolution: {integrity: sha512-ow8tncN097Ty8U1H+C3bM1xNlsCbnO2UZeN0lWBnv8f3jKho7QTTQ2LWbMXrPQDodLjH91n4kpNnLolyRhVE6A==} engines: {node: '>=18'} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tailwind-merge@3.5.0: resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} @@ -1610,6 +1670,9 @@ packages: peerDependencies: typescript: '>=4.8.4' + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} @@ -1918,6 +1981,17 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + '@fontsource-variable/inter@5.2.8': {} '@hey-api/codegen-core@0.7.4': @@ -1974,6 +2048,10 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@internationalized/date@3.12.1': + dependencies: + '@swc/helpers': 0.5.21 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2167,6 +2245,10 @@ snapshots: vite: 7.3.1(@types/node@22.19.15)(jiti@2.6.1) vitefu: 1.1.2(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)) + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + '@testing-library/svelte-core@1.0.0(svelte@5.54.1)': dependencies: svelte: 5.54.1 @@ -2397,6 +2479,19 @@ snapshots: balanced-match@4.0.4: {} + bits-ui@2.17.3(@internationalized/date@3.12.1)(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1): + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/dom': 1.7.6 + '@internationalized/date': 3.12.1 + esm-env: 1.2.2 + runed: 0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1) + svelte: 5.54.1 + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1) + tabbable: 6.4.0 + transitivePeerDependencies: + - '@sveltejs/kit' + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -2521,6 +2616,8 @@ snapshots: delayed-stream@1.0.0: {} + dequal@2.0.3: {} + destr@2.0.5: {} devalue@5.6.4: {} @@ -2808,6 +2905,8 @@ snapshots: imurmurhash@0.1.4: {} + inline-style-parser@0.2.7: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -2881,6 +2980,8 @@ snapshots: loglevel@1.9.2: {} + lz-string@1.5.0: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -3076,6 +3177,15 @@ snapshots: run-applescript@7.1.0: {} + runed@0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1): + dependencies: + dequal: 2.0.3 + esm-env: 1.2.2 + lz-string: 1.5.0 + svelte: 5.54.1 + optionalDependencies: + '@sveltejs/kit': 2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)) + sade@1.8.1: dependencies: mri: 1.2.0 @@ -3116,6 +3226,10 @@ snapshots: strip-json-comments@3.1.1: {} + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -3146,6 +3260,15 @@ snapshots: optionalDependencies: svelte: 5.54.1 + svelte-toolbelt@0.10.6(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1): + dependencies: + clsx: 2.1.1 + runed: 0.35.1(@sveltejs/kit@2.55.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)))(svelte@5.54.1) + style-to-object: 1.0.14 + svelte: 5.54.1 + transitivePeerDependencies: + - '@sveltejs/kit' + svelte@5.54.1: dependencies: '@jridgewell/remapping': 2.3.5 @@ -3165,6 +3288,8 @@ snapshots: magic-string: 0.30.21 zimmerframe: 1.1.4 + tabbable@6.4.0: {} + tailwind-merge@3.5.0: {} tailwind-variants@3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.2): @@ -3192,6 +3317,8 @@ snapshots: dependencies: typescript: 5.9.3 + tslib@2.8.1: {} + tw-animate-css@1.4.0: {} type-check@0.4.0: diff --git a/frontend/script/download-openapi.sh b/frontend/script/download-openapi.sh index f874d19..049c2db 100644 --- a/frontend/script/download-openapi.sh +++ b/frontend/script/download-openapi.sh @@ -1,3 +1,3 @@ # Makes a request to localhost:8000/openapi.json and saves the result in ./src/lib/openapi.json -curl -o ./src/lib/openapi.json http://localhost:8000/openapi.json +curl -o ./docs/openapi.json http://localhost:8000/openapi.json pnpm openapi-ts:gen \ No newline at end of file diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js index 31738ce..d406d31 100644 --- a/frontend/svelte.config.js +++ b/frontend/svelte.config.js @@ -8,8 +8,7 @@ const config = { remoteFunctions: true }, alias: { - '@client': 'src/client/client.gen.ts', - '@/**': './src/lib/*', + '@client': 'src/client/client.gen.ts' } }, compilerOptions: {