diff --git a/CLAUDE.md b/CLAUDE.md index ab73de3..98d8802 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,19 +13,73 @@ yarn lint # Run ESLint No test runner is configured yet. When adding tests, check `_specs/template.md` for the expected pattern — specs call for a `./tests` folder. +## Environment + +Create `.env.local` (gitignored) before running locally: +``` +VITE_PASSPHRASE= +``` +The app will not advance past the gate page without this variable set. + ## Architecture -This is a React 19 + Vite app (JavaScript, not TypeScript). Entry point is `src/main.jsx` → `src/App.jsx`. The app is in early/empty state — `App.jsx` currently renders nothing. +React 19 + Vite app (JavaScript, not TypeScript). Entry point: `src/main.jsx` → `src/App.jsx`. -**Key conventions:** -- `_specs/` — feature spec files (use `_specs/template.md` as the template for new specs) -- `_plans/` — implementation plans (currently empty) -- Feature branches follow the naming pattern `claude/feature/` (from the spec template) -- ESLint rule: unused vars are an error unless the name starts with a capital letter or underscore (`varsIgnorePattern: '^[A-Z_]'`) +### View flow + +`App.jsx` manages a single `view` state with three values: + +| View | Component | Notes | +|------|-----------|-------| +| `'gate'` | `PassphrasePage` | Initial view; skipped if `sessionStorage.asl-unlocked` is set | +| `'input'` | `LandingPage` → `TermInput` | Category selection | +| `'session'` | `FlashcardSession` | Flashcard practice | + +`PassphrasePage` and `FlashcardSession` each render `Footer` themselves. The outer `App` wrapper renders `Footer` and `Toaster` only for the `'input'`/`'session'` views. + +### Term data schema + +All term data lives in `src/data/*.json`. Each entry is: +```json +{ "term": "Hello", "code": "", "fix": true } +``` +- `code` — empty string means no video URL is confirmed yet +- `fix: true` — marks terms whose video URL is missing or unverified; displayed with a `[fix]` prefix and orange color in the term drawer select +- When `code` is empty at runtime, `FlashcardSession` falls back to a URL constructed from `https://media.signbsl.com/videos/asl/startasl/mp4/.mp4` + +### Category registration + +Categories are defined in `src/components/TermInput.jsx` as a `CATEGORIES` array. Each entry maps an icon, title, description, and a reference to a JSON data file. To add a new category, add a JSON file to `src/data/` and add an entry to this array. + +### Utilities + +- `src/utils/contrastColor.js` — given a hex background color, returns `#08060d` or `#ffffff` for legible text (used by `FlashcardSession` for card text color) +- `src/utils/shuffle.js` — Fisher-Yates shuffle +- `src/utils/parseTerms.js` — parses term arrays +- `src/data/card-colors.js` — palette of background colors for flashcards +- `src/data/checkData.js` — standalone audit script; reports duplicate terms and terms with `fix: true` across all JSON files + +### CSS conventions + +- **BEM naming**: `.block__element--modifier` (e.g. `.landing-hero__title`, `.carousel-dot--active`) +- **CSS variables** defined in `src/index.css`: `--text`, `--text-h`, `--bg`, `--code-bg`, `--border`, `--accent`, `--accent-bg`, `--accent-border`, `--color-needs-fix`, `--shadow`, `--sans`, `--heading`, `--mono` +- Dark mode overrides are in `src/index.css` under `@media (prefers-color-scheme: dark)` +- All component styles live in `src/App.css` (no per-component CSS files) ## Stack -- React 19, no router or state management library installed yet +- React 19, no router or state management library - Vite 8 with `@vitejs/plugin-react` (Babel/Oxc transform, not SWC) -- Plain CSS (`src/App.css`, `src/index.css`) — no CSS framework installed +- Plain CSS (`src/App.css`, `src/index.css`) — no CSS framework +- `react-hot-toast` — toast notifications (Toaster mounted in App) +- `react-player` — video playback in FlashcardSession (replaces iframe) +- `axios` — HTTP client (used in TermInput to fetch random words for Finger Spelling) +- `tippy.js` — tooltips - Yarn (use `yarn`, not `npm`) + +## Key conventions + +- `_specs/` — feature spec files (use `_specs/template.md` as the template) +- `_plans/` — implementation plans +- Feature branches: `claude/feature/` +- ESLint rule: unused vars are an error unless the name starts with a capital letter or underscore (`varsIgnorePattern: '^[A-Z_]'`) diff --git a/_plans/adjust-for-mobile.txt b/_plans/adjust-for-mobile.txt index efab492..c965181 100644 --- a/_plans/adjust-for-mobile.txt +++ b/_plans/adjust-for-mobile.txt @@ -1 +1 @@ -Adjust the contents of the app so it is responsive and will display well on phones and tablets. Ensure the video is always visible and hide the other controls as necessary. Shrink controls where possible but leave the video playback as the main feature. \ No newline at end of file +Adjust the layout for mobile use. When the screen width is less than 1024 and in horizontal orientation, remove the flashcard-session-header div and switch to 3 column display; controls, video, term list diff --git a/src/components/FlashcardSession.jsx b/src/components/FlashcardSession.jsx index 8afead5..ecbfca2 100644 --- a/src/components/FlashcardSession.jsx +++ b/src/components/FlashcardSession.jsx @@ -61,15 +61,16 @@ export function FlashcardSession({terms, cardColors, onBack, title, description} [localTerms] ); - function playbackError(event) { - console.log("Playback error", event); + function playbackError(error) { + console.error(error); + console.log("Playback error", error.nativeEvent.target.error); + console.log("Source: ", error.nativeEvent.target.src) toast.error("Playback error"); } const bg = localColors[currentIndex]; const fg = contrastColor(bg); const playbackUrl = getPlaybackUrl(); - console.log(sortedTerms); return (
@@ -89,8 +90,9 @@ export function FlashcardSession({terms, cardColors, onBack, title, description} className="flashcard-video-iframe" title="ASL sign video" src={playbackUrl} - // autoPlay={true} + autoPlay={true} controls={true} + muted={true} width="100%" height="100%" onError={playbackError} diff --git a/src/data/checkData.js b/src/data/checkData.js index b82dde3..ff9bf28 100644 --- a/src/data/checkData.js +++ b/src/data/checkData.js @@ -24,7 +24,7 @@ function checkData() { all_terms.forEach(term => { const ndx = terms_names.indexOf(term.term); - if(!terms_names.includes(term.term)) { + if(ndx === -1) { terms_names.push(term.term); } else { duplicates.push(term); @@ -50,6 +50,7 @@ function checkData() { console.log("Duplicates Count: ", duplicates.length); console.log("Terms Need Repair: ", needs_fixing.length); // console.log(duplicates); + console.log(needs_fixing); } checkData(); diff --git a/src/data/questions.json b/src/data/questions.json index 6f077f2..c7dcbc3 100644 --- a/src/data/questions.json +++ b/src/data/questions.json @@ -22,6 +22,8 @@ {"term": "How many siblings do you have?", "code": "https://www.youtube.com/embed/gPjmZURJgWg?rel=0;autoplay=1"}, {"term": "How much does it cost?", "code": "https://www.youtube.com/embed/wPwZpfA397c?rel=0;autoplay=1"}, {"term": "What is your phone number", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/what-is-your-phone-number.mp4"}, + {"term": "What is your name?", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/what-is-your-name.mp4"}, + {"term": "What Happened", "code": "https://www.signasl.org/sign/what-happened#8r4cbjhtns"}, {"term": "How old are you?", "code": "https://www.youtube.com/embed/yQD5HyEyWkI?rel=0;autoplay=1"} ] diff --git a/src/data/terms.json b/src/data/terms.json index f6f4ac2..4c184e2 100644 --- a/src/data/terms.json +++ b/src/data/terms.json @@ -1,27 +1,29 @@ [ - {"term": "About - relative", "code": "", "fix": true}, - {"term": "About - subject", "code": "", "fix": true}, - {"term": "Adult", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/adult.mp4", "fix": true}, + {"term": "About - (approximately)", "code": "https://media.signbsl.com/videos/asl/signlanguagestudent/mp4/about%20(approximately).mp4"}, + {"term": "About - subject", "code": "https://media.signbsl.com/videos/asl/signlanguagestudent/mp4/about.mp4"}, + {"term": "Adult", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/adult.mp4"}, + {"term": "Adult", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/ADULT_2-2364.mp4"}, {"term": "Again", "code": ""}, - {"term": "Amazing", "code": "", "fix": true}, + {"term": "Amazing", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/AMAZING-325.mp4"}, {"term": "Ask Me", "code": "https://media.signbsl.com/videos/asl/aslbricks/mp4/question.mp4"}, {"term": "Ask You", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/need.mp4"}, {"term": "Aunt", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/aunt.mp4"}, - {"term": "Awesome", "code": "", "fix": true}, + {"term": "Awesome", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/SWELL-282.mp4"}, {"term": "Baby", "code": ""}, {"term": "Bald", "code": ""}, {"term": "Ball", "code": ""}, - {"term": "Best Friend", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/BEST-FRIEND-2404.mp4", "fix": true}, + {"term": "Best Friend", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/BEST-FRIEND-2404.mp4"}, + {"term": "Best Friend", "code": "https://player.vimeo.com/external/392648027.sd.mp4?s=6653887fd6a4ec52a02d65ff524fe87de3b9770f&profile_id=164"}, {"term": "Best", "code": ""}, {"term": "Better", "code": "", "fix": true}, {"term": "Blue", "code": ""}, - {"term": "Boring", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/M2rKwo4Uhrc.mp4", "fix": true}, + {"term": "Boring", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/M2rKwo4Uhrc.mp4"}, {"term": "Boy", "code": ""}, - {"term": "Break", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/BREAK-420.mp4", "fix": true}, + {"term": "Break", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/BREAK-420.mp4"}, {"term": "Brother", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/brother.mp4"}, {"term": "But", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/but.mp4"}, - {"term": "Cheat", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/CHEAT_1-1058.mp4", "fix": true}, - {"term": "Child", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/CHILD-75.mp4", "fix": true}, + {"term": "Cheat", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/CHEAT_1-1058.mp4"}, + {"term": "Child", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/CHILD-75.mp4"}, {"term": "Children", "code": ""}, {"term": "Class", "code": ""}, {"term": "Cloudy", "code": "https://media.signbsl.com/videos/asl/elementalaslconcepts/mp4/cloudy.mp4"}, @@ -30,60 +32,64 @@ {"term": "Date", "code": ""}, {"term": "Day before Yesterday", "code": "https://media.signbsl.com/videos/asl/mariekatzenbachschool/mp4/day%20before%20yesterday.mp4"}, {"term": "Deaf & Blind", "code": "", "fix": true}, - {"term": "Deaf (are you deaf)", "code": "", "fix": true}, - {"term": "Doesn’t Matter", "code": "", "fix": true}, + {"term": "Deaf (are you deaf)", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/areyoudeaf.mp4"}, + {"term": "Doesn’t Matter", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/doesnt-matter.mp4"}, {"term": "Draw", "code": ""}, {"term": "Drink", "code": ""}, - {"term": "Drunk", "code": "", "fix": true}, + {"term": "Drunk", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/drunk.mp4"}, {"term": "Express", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/EXPRESS-1363.mp4"}, {"term": "Fall", "code": ""}, + {"term": "Fall Down", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/fall-down.mp4"}, {"term": "Family", "code": ""}, {"term": "Father", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/father.mp4"}, {"term": "Fine", "code": ""}, {"term": "Finish", "code": ""}, - {"term": "First Name", "code": "", "fix": true}, + {"term": "First Name", "code": "https://media.signbsl.com/videos/asl/aslbricks/mp4/name.mp4"}, {"term": "Flower", "code": ""}, {"term": "Forget", "code": "https://player.vimeo.com/external/392130769.sd.mp4?s=de91226fb30712a556a59463c2459b85c3b49747&profile_id=164"}, - {"term": "Forgot", "code": "", "fix": true}, + {"term": "Forgot", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/forgot2.mp4", "fix": true}, {"term": "Friend", "code": ""}, {"term": "Future", "code": ""}, {"term": "Girl", "code": ""}, - {"term": "Glass", "code": ""}, - {"term": "Go Back", "code": "", "fix": true}, + {"term": "Glass", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/WVdjIYyuErs.mp4"}, + {"term": "Go Back", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/back2.mp4"}, {"term": "Go", "code": ""}, {"term": "Grandfather", "code": ""}, {"term": "Grandmother", "code": ""}, - {"term": "Great Grandfather", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/great-grandpa.mp4", "fix": true}, - {"term": "Great Grandmother", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/great-grandma.mp4", "fix": true}, - {"term": "Group", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/GROUP-643.mp4", "fix": true}, + {"term": "Great Grandfather", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/great-grandpa.mp4"}, + {"term": "Great Grandmother", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/great-grandma.mp4"}, + {"term": "Group", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/GROUP-643.mp4"}, {"term": "Hair", "code": ""}, - {"term": "Hard of Hearing", "code": "", "fix": true}, + {"term": "Hard of Hearing", "code": "https://player.vimeo.com/external/392169486.sd.mp4?s=ecbe6558248630f992d5a65865c55d4c5e5f26cd&profile_id=164"}, {"term": "He / She / You / There", "code": "https://media.signbsl.com/videos/asl/elementalaslconcepts/mp4/he.mp4"}, - {"term": "Hearing (can you hear / speaking)", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/DEAF-103.mp4", "fix": true}, + {"term": "Hearing (can you hear / speaking)", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/hearing.mp4"}, {"term": "Hello", "code": ""}, {"term": "Help", "code": ""}, - {"term": "High School", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/highschool.mp4", "fix": true}, + {"term": "High School", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/highschool.mp4"}, {"term": "Hiking", "code": ""}, {"term": "His / Hers / Yours", "code": "https://media.signbsl.com/videos/asl/elementalaslconcepts/mp4/his.mp4"}, {"term": "Hold", "code": "", "fix": true}, - {"term": "How - do you...", "code": "", "fix": true}, - {"term": "How - Question", "code": "", "fix": true}, + {"term": "Hold On", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/YR6sQXnDmzU.mp4"}, + {"term": "How - do you...", "code": "https://media.signbsl.com/videos/asl/dictio/mp4/A_howC.mp4"}, + {"term": "How - Question", "code": "https://media.signbsl.com/videos/asl/dictio/mp4/A_howB.mp4"}, {"term": "How", "code": ""}, {"term": "Hungry", "code": ""}, - {"term": "Hurt", "code": ""}, + {"term": "Hurt", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/PAIN-489.mp4"}, {"term": "Husband", "code": ""}, - {"term": "I go to", "code": "", "fix": true}, - {"term": "I Have to Go", "code": "", "fix": true}, - {"term": "I", "code": "", "fix": true}, + {"term": "I Have to Go", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/2gkECov8jEc.mp4"}, + {"term": "I", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/qIaZAO2YlYk.mp4"}, + {"term": "I", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/HONORIFIC-1762.mp4"}, + {"term": "I", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/ONLY-SELF_1-2813.mp4"}, + {"term": "Important", "code": "https://media.signbsl.com/videos/asl/aslbricks/mp4/important.mp4"}, {"term": "Individual", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/29joNpBp6Io.mp4"}, {"term": "Information", "code": "https://media.signbsl.com/videos/asl/elementalaslconcepts/mp4/information.mp4"}, - {"term": "Introduce", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/INTRODUCE-158.mp4", "fix": true}, - {"term": "Kid", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/kid.mp4", "fix": true}, + {"term": "Introduce", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/INTRODUCE-158.mp4"}, + {"term": "Kid", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/kid.mp4"}, {"term": "Knowledge", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/G1idOu49Nq0.mp4"}, {"term": "Large", "code": ""}, - {"term": "Last Name", "code": "", "fix": true}, + {"term": "Last Name", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/3uim_eaSkmI.mp4"}, {"term": "Learn", "code": ""}, - {"term": "Leave", "code": ""}, + {"term": "Leave", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/leave.mp4"}, {"term": "Like", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/like.mp4"}, {"term": "Listen - Deaf Person (ears and heart)", "code": "", "fix": true}, {"term": "Listen - Hearing Person (ears only)", "code": "", "fix": true}, @@ -91,43 +97,43 @@ {"term": "Make Sure", "code": "", "fix": true}, {"term": "Man", "code": ""}, {"term": "Married", "code": ""}, - {"term": "Masters Degree", "code": "https://player.vimeo.com/external/392375781.sd.mp4?s=a43231c78024257432df917f9228dccf12378623&profile_id=164", "fix": true}, + {"term": "Masters Degree", "code": "https://player.vimeo.com/external/392375781.sd.mp4?s=a43231c78024257432df917f9228dccf12378623&profile_id=164"}, {"term": "Matters", "code": "", "fix": true}, {"term": "Maybe", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/MAYBE-505.mp4"}, {"term": "Mother", "code": ""}, - {"term": "My / Mine", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/3msfJ_fibwg.mp4", "fix": true}, - {"term": "Name", "code": "", "fix": true}, + {"term": "My / Mine", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/3msfJ_fibwg.mp4"}, + {"term": "Name", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/DikA_15hmng.mp4"}, {"term": "Nephew", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/nephew.mp4"}, {"term": "News", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/6oJPiLU3KLE.mp4"}, {"term": "Niece", "code": ""}, {"term": "No", "code": ""}, - {"term": "Not Yet / ?", "code": "", "fix": true}, - {"term": "Our", "code": "", "fix": true}, + {"term": "Not Yet / ?", "code": "https://www.youtube.com/watch?v=00H6TCCoIpU"}, + {"term": "Our", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/OUR-206.mp4"}, {"term": "Party", "code": ""}, - {"term": "People", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/PEOPLE-570.mp4", "fix": true}, - {"term": "Person", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/chKH69r3n2I.mp4", "fix": true}, - {"term": "PHD", "code": "", "fix": true}, + {"term": "People", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/PEOPLE-570.mp4"}, + {"term": "Person", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/chKH69r3n2I.mp4"}, + {"term": "PHD", "code": "https://player.vimeo.com/external/391987830.sd.mp4?s=09d1fb8ea0daa37dd417fe3897d3db59663111b3&profile_id=164"}, {"term": "Plant", "code": ""}, {"term": "Play", "code": ""}, {"term": "Please", "code": ""}, {"term": "Poor", "code": ""}, - {"term": "Popular", "code": "", "fix": true}, - {"term": "Quiet", "code": ""}, - {"term": "Quiet", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/quiet.mp4", "fix": true}, + {"term": "Popular", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/POPULAR-917.mp4"}, + {"term": "Quiet (be)", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/BFp3DTZdFZg.mp4"}, {"term": "Rain", "code": ""}, {"term": "Read", "code": ""}, {"term": "Red", "code": ""}, - {"term": "Remember", "code": "", "fix": true}, - {"term": "Review / Start Over", "code": "", "fix": true}, + {"term": "Remember", "code": "https://media.signbsl.com/videos/asl/mariekatzenbachschool/mp4/remember.mp4"}, + {"term": "Review / Start Over", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/ZcCTfCnGqeU.mp4"}, {"term": "Rich", "code": ""}, {"term": "Right", "code": ""}, - {"term": "Sign Name", "code":"", "fix": true}, - {"term": "Silent", "code": "", "fix": true}, + {"term": "Scream", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/p6gvHHHjFVk.mp4"}, + {"term": "Silent", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/9rp2ICTeDgM.mp4"}, {"term": "Silly", "code": ""}, {"term": "Sister", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/sister.mp4"}, {"term": "Small", "code": ""}, {"term": "Smart", "code": "https://media.signbsl.com/videos/asl/mariekatzenbachschool/mp4/smart.mp4"}, {"term": "Snow", "code": ""}, + {"term": "Sorry", "code": ""}, {"term": "Spring", "code": ""}, {"term": "Steal", "code": ""}, {"term": "Student", "code": ""}, @@ -135,39 +141,39 @@ {"term": "Taught", "code": "", "fix": true}, {"term": "Teach", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/hN7WKfdT_BU.mp4", "fix": true}, {"term": "Teacher", "code": ""}, - {"term": "Teaching", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/8ziG3fnIjF8.mp4", "fix": true}, {"term": "Team", "code": ""}, - {"term": "Thank You", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/thankyou.mp4", "fix": true}, + {"term": "Thank You", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/thankyou.mp4"}, {"term": "Them", "code": "https://media.signbsl.com/videos/asl/elementalaslconcepts/mp4/them.mp4"}, - {"term": "They're", "code": "", "fix": true}, - {"term": "Thin", "code": "", "fix": true}, + {"term": "They're", "code": "https://media.signbsl.com/videos/asl/aslsearch/mp4/they.mp4"}, + {"term": "Thin", "code": ""}, {"term": "Time", "code": ""}, + {"term": "Together", "code": "", "fix": true}, {"term": "Tomorrow", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/tomorrow.mp4"}, {"term": "Tree", "code": ""}, {"term": "Uncle", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/uncle.mp4"}, {"term": "University", "code": ""}, - {"term": "Us", "code": "", "fix": true}, - {"term": "We", "code": "", "fix": true}, + {"term": "Us", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/q8bzN_qcPls.mp4"}, + {"term": "We", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/19JJXcGUvBo.mp4"}, {"term": "Weather", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/weather.mp4"}, {"term": "Week", "code": ""}, - {"term": "Weekend", "code": "", "fix": true}, - {"term": "What Happened", "code": "", "fix": true}, + {"term": "Weekend", "code": "https://media.signbsl.com/videos/asl/aslsignbank/mp4/WEEKEND-817.mp4"}, + {"term": "What Happened", "code": "https://www.signasl.org/sign/what-happened#8r4cbjhtns"}, {"term": "What", "code": ""}, - {"term": "What's Up", "code": "", "fix": true}, + {"term": "What's Up", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/9-Slb3aHw5A.mp4"}, {"term": "When", "code": ""}, - {"term": "Where", "code": "https://www.youtube.com/embed/4T2BfSwTIl8?rel=0;autoplay=1"}, + {"term": "Where", "code": "https://media.signbsl.com/videos/asl/startasl/mp4/where.mp4"}, {"term": "Which", "code": "https://media.signbsl.com/videos/asl/youtube/mp4/ivWficO0urg.mp4"}, {"term": "Who", "code": ""}, {"term": "Why", "code": ""}, {"term": "Wife", "code": ""}, {"term": "Will be", "code": "", "fix": true}, - {"term": "Will", "code": "", "fix": true}, + {"term": "Will", "code": "https://media.signbsl.com/videos/asl/aslbricks/mp4/will.mp4"}, {"term": "Win", "code": ""}, {"term": "Winter", "code": ""}, {"term": "With", "code": "https://www.youtube.com/embed/l1ujo80sNU0?rel=0;autoplay=1"}, {"term": "Woman", "code": ""}, {"term": "Workshop", "code": ""}, - {"term": "Wow", "code": "", "fix": true}, + {"term": "Wow", "code": ""}, {"term": "Wrong", "code": ""}, {"term": "Yell", "code": ""}, {"term": "Yes", "code": ""}, diff --git a/src/data/terms_to_fix.json b/src/data/terms_to_fix.json index 0d4f101..34f72be 100644 --- a/src/data/terms_to_fix.json +++ b/src/data/terms_to_fix.json @@ -1,2 +1,3 @@ [ + {"term": "First Aid", "code": "", "fix": true} ] diff --git a/yarn.lock b/yarn.lock index f62fb92..35d98a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -141,7 +141,7 @@ dependencies: "@babel/types" "^7.29.0" -"@babel/runtime@^7.12.5": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.28.4", "@babel/runtime@^7.5.5": version "7.29.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== @@ -646,6 +646,46 @@ dependencies: csstype "^3.2.2" +"@videojs/http-streaming@^3.17.3": + version "3.17.4" + resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-3.17.4.tgz#083cb53e2a19b59e5d0fbce98c1f62fe77e93ab5" + integrity sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg== + dependencies: + "@babel/runtime" "^7.12.5" + "@videojs/vhs-utils" "^4.1.1" + aes-decrypter "^4.0.2" + global "^4.4.0" + m3u8-parser "^7.2.0" + mpd-parser "^1.3.1" + mux.js "7.1.0" + video.js "^7 || ^8" + +"@videojs/vhs-utils@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz#4d4dbf5d61a9fbd2da114b84ec747c3a483bc60d" + integrity sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg== + dependencies: + "@babel/runtime" "^7.12.5" + global "^4.4.0" + url-toolkit "^2.2.1" + +"@videojs/vhs-utils@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz#44226fc5993f577490b5e08951ddc083714405cc" + integrity sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA== + dependencies: + "@babel/runtime" "^7.12.5" + global "^4.4.0" + +"@videojs/xhr@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@videojs/xhr/-/xhr-2.7.0.tgz#e272af6e2b5448aeb400905a5c6f4818f6b6ad47" + integrity sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ== + dependencies: + "@babel/runtime" "^7.5.5" + global "~4.4.0" + is-function "^1.0.1" + "@vimeo/player@2.29.0": version "2.29.0" resolved "https://registry.yarnpkg.com/@vimeo/player/-/player-2.29.0.tgz#f620f4f936706f92c99a3807e7b7ae4a7be9452f" @@ -721,6 +761,11 @@ convert-source-map "^2.0.0" tinyrainbow "^3.1.0" +"@xmldom/xmldom@^0.8.3": + version "0.8.13" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.13.tgz#00d1dd940b218dff2e49309d410d8bb212159225" + integrity sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -731,6 +776,16 @@ acorn@^8.15.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== +aes-decrypter@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-4.0.2.tgz#90648181c68878f54093920a3b44776ec2dc4914" + integrity sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw== + dependencies: + "@babel/runtime" "^7.12.5" + "@videojs/vhs-utils" "^4.1.1" + global "^4.4.0" + pkcs7 "^1.0.4" + ajv@^6.14.0: version "6.14.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" @@ -1047,6 +1102,11 @@ dom-accessibility-api@^0.6.3: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -1337,6 +1397,14 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +global@4.4.0, global@^4.3.1, global@^4.4.0, global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" @@ -1477,6 +1545,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -1697,6 +1770,15 @@ lz-string@^1.5.0: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== +m3u8-parser@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-7.2.0.tgz#9e2eb50abb8349d248cd58842367da4acabdf297" + integrity sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@videojs/vhs-utils" "^4.1.1" + global "^4.4.0" + magic-string@^0.30.21: version "0.30.21" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" @@ -1743,6 +1825,13 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +min-document@^2.19.0: + version "2.19.2" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.2.tgz#f95db44639eaae3ac8ea85ae6809ae85ff7e3b81" + integrity sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A== + dependencies: + dom-walk "^0.1.0" + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -1755,6 +1844,16 @@ minimatch@^3.1.5: dependencies: brace-expansion "^1.1.7" +mpd-parser@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mpd-parser/-/mpd-parser-1.3.1.tgz#557b6ac27411c2c177bb01e46e14440703a414a3" + integrity sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw== + dependencies: + "@babel/runtime" "^7.12.5" + "@videojs/vhs-utils" "^4.0.0" + "@xmldom/xmldom" "^0.8.3" + global "^4.4.0" + ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -1765,6 +1864,14 @@ mux-embed@5.18.1, mux-embed@^5.16.1: resolved "https://registry.yarnpkg.com/mux-embed/-/mux-embed-5.18.1.tgz#c33094979f8573d7e6743cbfe08f3fecee33e9fc" integrity sha512-ePsHjiEKY+FgrSBiMmaF+LOtTQSSBWv/1zqpREQFN96JE93xlsArT/MEi30yKOE06MgjOlL70YI750molu3y7g== +mux.js@7.1.0, mux.js@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-7.1.0.tgz#aba5ed55a39cb790ef4b30b2c3ea0d2630b0264e" + integrity sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA== + dependencies: + "@babel/runtime" "^7.11.2" + global "^4.4.0" + nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" @@ -1865,6 +1972,13 @@ picomatch@^4.0.3, picomatch@^4.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== +pkcs7@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-1.0.4.tgz#6090b9e71160dabf69209d719cbafa538b00a1cb" + integrity sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ== + dependencies: + "@babel/runtime" "^7.5.5" + player.style@^0.3.0: version "0.3.4" resolved "https://registry.yarnpkg.com/player.style/-/player.style-0.3.4.tgz#89ae398391ba80fc0f60ddbb2db0fcc52133fb81" @@ -1895,6 +2009,11 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -2193,6 +2312,48 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-toolkit@^2.2.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.2.5.tgz#58406b18e12c58803e14624df5e374f638b0f607" + integrity sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg== + +"video.js@^7 || ^8", video.js@^8.23.7: + version "8.23.7" + resolved "https://registry.yarnpkg.com/video.js/-/video.js-8.23.7.tgz#f32be0689b0184e4d8b8b03fd150bac21e6db2ab" + integrity sha512-cG4HOygYt+Z8j6Sf5DuK6OgEOoM+g9oGP6vpqoZRaD13aHE4PMITbyjJUXZcIQbgB0wJEadBRaVm5lJIzo2jAA== + dependencies: + "@babel/runtime" "^7.28.4" + "@videojs/http-streaming" "^3.17.3" + "@videojs/vhs-utils" "^4.1.1" + "@videojs/xhr" "2.7.0" + aes-decrypter "^4.0.2" + global "4.4.0" + m3u8-parser "^7.2.0" + mpd-parser "^1.3.1" + mux.js "^7.0.1" + videojs-contrib-quality-levels "4.1.0" + videojs-font "4.2.0" + videojs-vtt.js "0.15.5" + +videojs-contrib-quality-levels@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz#44c2d2167114a5c8418548b10a25cb409d6cba51" + integrity sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA== + dependencies: + global "^4.4.0" + +videojs-font@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-4.2.0.tgz#fbce803d347c565816e296f527e208dc65c9f235" + integrity sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ== + +videojs-vtt.js@0.15.5: + version "0.15.5" + resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz#567776eaf2a7a928d88b148a8b401ade2406f2ca" + integrity sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ== + dependencies: + global "^4.3.1" + vimeo-video-element@^1.6.1: version "1.7.1" resolved "https://registry.yarnpkg.com/vimeo-video-element/-/vimeo-video-element-1.7.1.tgz#dc254b67e7bb1344db1208dd00439ad8eabf0100"