From 3995a0772aaa5dfd1158210ab2efa4faad838a4b Mon Sep 17 00:00:00 2001 From: mohanad69 Date: Tue, 10 Feb 2026 17:36:07 +0200 Subject: [PATCH 01/38] review site pages --- app/Http/Controllers/BookController.php | 12 +- app/Http/Controllers/CourseController.php | 2 +- app/Http/Controllers/MagazineController.php | 104 ++- app/Http/Controllers/MasterController.php | 13 + app/Http/Controllers/QuickScanController.php | 101 ++- app/Http/Controllers/QuizController.php | 105 ++- app/Http/Controllers/RevisionController.php | 103 ++- app/Http/Controllers/TodoController.php | 100 +- app/Http/Controllers/ToolsController.php | 29 + app/Http/Controllers/VisualController.php | 103 ++- app/Http/Controllers/WelcomeController.php | 30 +- app/Http/Resources/CourseResource.php | 1 + app/Http/Resources/RevisionResource.php | 2 +- app/Policies/Policy.php | 85 ++ app/Providers/NovaServiceProvider.php | 1 + package-lock.json | 853 ++++++++++++++---- package.json | 12 +- public/img/GI_Logo_horizontal_white.png | Bin 0 -> 47197 bytes public/img/grey-trader-factory.png | Bin 0 -> 47197 bytes resources/js/components/ApplicationLogo.vue | 3 + .../js/components/ApplicationLogoLight.vue | 3 + resources/js/components/ApplicationMark.vue | 3 + resources/js/components/Banner.vue | 88 ++ resources/js/components/Dropdown.vue | 79 ++ resources/js/components/DropdownLink.vue | 28 + resources/js/components/Modal.vue | 93 ++ resources/js/components/NavLink.vue | 21 + resources/js/components/ResponsiveNavLink.vue | 28 + resources/js/components/VideoPlayer.vue | 37 + .../js/components/buttons/PrimaryButton.vue | 19 + .../components/buttons/PrimaryLinkButton.vue | 26 + .../js/components/buttons/ProgressButton.vue | 559 ++++++++++++ .../buttons/SecondaryLinkButton.vue | 25 + .../footers/FooterSocialLinksOnly.vue | 99 ++ resources/js/components/menu/BackMenu.vue | 26 + resources/js/components/menu/ExitMenu.vue | 23 + resources/js/components/menu/Main.vue | 147 +++ .../modals/CenteredWithWideButtons.vue | 95 ++ .../js/components/modals/RatingModal.vue | 196 ++++ resources/js/components/modals/VideoModal.vue | 52 ++ .../pagination/MagazinePagination.vue | 77 ++ resources/js/layouts/AppLayout.vue | 404 ++++++++- resources/js/layouts/BoxesSlideLayout.vue | 84 ++ .../js/layouts/CenterContentScreenLayout.vue | 94 ++ resources/js/layouts/FinalSlideLayout.vue | 19 + .../js/layouts/FullBackgroundScreenLayout.vue | 15 + resources/js/layouts/GuestLayout.vue | 49 +- resources/js/layouts/HalfScreenLayout.vue | 29 + resources/js/layouts/LeftHalfScreenLayout.vue | 28 + resources/js/layouts/LessonLayout.vue | 31 + resources/js/layouts/PointsScreenLayout.vue | 29 + .../js/layouts/RightHalfScreenLayout.vue | 29 + resources/js/layouts/SectionLayout.vue | 37 + resources/js/layouts/TodoLayout.vue | 19 + resources/js/pages/Survey.vue | 39 + resources/js/pages/books/Download.vue | 3 +- .../js/pages/courses/partials/CourseCard.vue | 108 ++- resources/js/pages/faqs/Index.vue | 28 +- resources/js/pages/magazine/Show.vue | 68 ++ .../js/pages/magazine/partials/Slide.vue | 45 + resources/js/pages/quick-scan/Show.vue | 21 + .../pages/quick-scan/partials/AnswersList.vue | 63 ++ .../quick-scan/partials/QuickScanItem.vue | 103 +++ .../quick-scan/partials/QuickScanLayout.vue | 21 + .../quick-scan/partials/QuickScanList.vue | 144 +++ .../quick-scan/partials/QuickScanResult.vue | 90 ++ .../quick-scan/partials/StartQuickScan.vue | 67 ++ resources/js/pages/quiz/QuizItem.vue | 142 +++ resources/js/pages/quiz/QuizLayout.vue | 21 + resources/js/pages/quiz/QuizList.vue | 110 +++ resources/js/pages/quiz/QuizResult.vue | 93 ++ resources/js/pages/quiz/Show.vue | 21 + resources/js/pages/quiz/StartQuiz.vue | 34 + resources/js/pages/revision/Show.vue | 111 +++ .../js/pages/sections/partials/LessonItem.vue | 2 +- resources/js/pages/todo/Show.vue | 77 ++ resources/js/pages/todo/StartTodo.vue | 28 + resources/js/pages/tools/Index.vue | 19 + .../pages/tools/margin-calculator/Index.vue | 14 + resources/js/pages/tools/pip-value/Index.vue | 14 + .../js/pages/tools/position-size/Index.vue | 14 + resources/js/pages/visual/Index.vue | 13 + resources/js/pages/visual/Show.vue | 19 + resources/js/pages/webinars/Index.vue | 89 ++ resources/js/pages/webinars/Webinar.vue | 83 ++ resources/js/pages/welcome/Index.vue | 2 +- routes/web.php | 12 + 87 files changed, 5679 insertions(+), 289 deletions(-) create mode 100644 app/Http/Controllers/MasterController.php create mode 100644 app/Http/Controllers/ToolsController.php create mode 100644 app/Policies/Policy.php create mode 100644 public/img/GI_Logo_horizontal_white.png create mode 100644 public/img/grey-trader-factory.png create mode 100644 resources/js/components/ApplicationLogo.vue create mode 100644 resources/js/components/ApplicationLogoLight.vue create mode 100644 resources/js/components/ApplicationMark.vue create mode 100644 resources/js/components/Banner.vue create mode 100644 resources/js/components/Dropdown.vue create mode 100644 resources/js/components/DropdownLink.vue create mode 100644 resources/js/components/Modal.vue create mode 100644 resources/js/components/NavLink.vue create mode 100644 resources/js/components/ResponsiveNavLink.vue create mode 100644 resources/js/components/VideoPlayer.vue create mode 100644 resources/js/components/buttons/PrimaryButton.vue create mode 100644 resources/js/components/buttons/PrimaryLinkButton.vue create mode 100644 resources/js/components/buttons/ProgressButton.vue create mode 100644 resources/js/components/buttons/SecondaryLinkButton.vue create mode 100644 resources/js/components/footers/FooterSocialLinksOnly.vue create mode 100644 resources/js/components/menu/BackMenu.vue create mode 100644 resources/js/components/menu/ExitMenu.vue create mode 100644 resources/js/components/menu/Main.vue create mode 100644 resources/js/components/modals/CenteredWithWideButtons.vue create mode 100644 resources/js/components/modals/RatingModal.vue create mode 100644 resources/js/components/modals/VideoModal.vue create mode 100644 resources/js/components/pagination/MagazinePagination.vue create mode 100644 resources/js/layouts/BoxesSlideLayout.vue create mode 100644 resources/js/layouts/CenterContentScreenLayout.vue create mode 100644 resources/js/layouts/FinalSlideLayout.vue create mode 100644 resources/js/layouts/FullBackgroundScreenLayout.vue create mode 100644 resources/js/layouts/HalfScreenLayout.vue create mode 100644 resources/js/layouts/LeftHalfScreenLayout.vue create mode 100644 resources/js/layouts/LessonLayout.vue create mode 100644 resources/js/layouts/PointsScreenLayout.vue create mode 100644 resources/js/layouts/RightHalfScreenLayout.vue create mode 100644 resources/js/layouts/SectionLayout.vue create mode 100644 resources/js/layouts/TodoLayout.vue create mode 100644 resources/js/pages/Survey.vue create mode 100644 resources/js/pages/magazine/Show.vue create mode 100644 resources/js/pages/magazine/partials/Slide.vue create mode 100644 resources/js/pages/quick-scan/Show.vue create mode 100644 resources/js/pages/quick-scan/partials/AnswersList.vue create mode 100644 resources/js/pages/quick-scan/partials/QuickScanItem.vue create mode 100644 resources/js/pages/quick-scan/partials/QuickScanLayout.vue create mode 100644 resources/js/pages/quick-scan/partials/QuickScanList.vue create mode 100644 resources/js/pages/quick-scan/partials/QuickScanResult.vue create mode 100644 resources/js/pages/quick-scan/partials/StartQuickScan.vue create mode 100644 resources/js/pages/quiz/QuizItem.vue create mode 100644 resources/js/pages/quiz/QuizLayout.vue create mode 100644 resources/js/pages/quiz/QuizList.vue create mode 100644 resources/js/pages/quiz/QuizResult.vue create mode 100644 resources/js/pages/quiz/Show.vue create mode 100644 resources/js/pages/quiz/StartQuiz.vue create mode 100644 resources/js/pages/revision/Show.vue create mode 100644 resources/js/pages/todo/Show.vue create mode 100644 resources/js/pages/todo/StartTodo.vue create mode 100644 resources/js/pages/tools/Index.vue create mode 100644 resources/js/pages/tools/margin-calculator/Index.vue create mode 100644 resources/js/pages/tools/pip-value/Index.vue create mode 100644 resources/js/pages/tools/position-size/Index.vue create mode 100644 resources/js/pages/visual/Index.vue create mode 100644 resources/js/pages/visual/Show.vue create mode 100644 resources/js/pages/webinars/Index.vue create mode 100644 resources/js/pages/webinars/Webinar.vue diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php index bc0affa..86da7e2 100644 --- a/app/Http/Controllers/BookController.php +++ b/app/Http/Controllers/BookController.php @@ -34,6 +34,7 @@ public function sendDownloadLink(Book $book) */ public function downloadPage(Book $book) { + // dd($book->file_src); // Check if the user owns the book if (! $book->purchased()) { return redirect()->route('books.index')->with('error', 'لا يمكنك تحميل هذا الكتاب لأنك لم تشتريه بعد'); @@ -55,11 +56,16 @@ public function downloadPage(Book $book) // Generate temporary download URL $url = null; if ($book->file_src) { - $path = json_decode($book->file_src)->path; - $url = Storage::disk('s3_public')->temporaryUrl($path, now()->addMinutes(30)); + $fileObj = json_decode($book->file_src); + if ($fileObj && isset($fileObj->path)) { + $path = $fileObj->path; + $url = Storage::disk('s3_public')->temporaryUrl($path, now()->addMinutes(30)); + } + // $path = json_decode($book->file_src)->path; + // $url = Storage::disk('s3_public')->temporaryUrl($path, now()->addMinutes(30)); } - return Inertia::render('Books/Download', [ + return Inertia::render('books/Download', [ 'book' => BookResource::make($book), 'downloadUrl' => $url, ]); diff --git a/app/Http/Controllers/CourseController.php b/app/Http/Controllers/CourseController.php index e885520..647e452 100644 --- a/app/Http/Controllers/CourseController.php +++ b/app/Http/Controllers/CourseController.php @@ -49,4 +49,4 @@ public function sections(Section $section): InertiaResponse 'metadata' => MetaData::where('page_slug', $section->slug)->first(), ]); } -} +} \ No newline at end of file diff --git a/app/Http/Controllers/MagazineController.php b/app/Http/Controllers/MagazineController.php index 7219436..97cd282 100644 --- a/app/Http/Controllers/MagazineController.php +++ b/app/Http/Controllers/MagazineController.php @@ -2,9 +2,109 @@ namespace App\Http\Controllers; +use App\Events\EventableComplete; +use App\Events\EventableStart; +use App\Events\EventableUpdate; +use App\Http\Requests\ProgressRequest; +use App\Http\Requests\RatingRequest; +use App\Http\Resources\LessonResource; +use App\Http\Resources\MagazineResource; +use App\Models\Lesson; +use App\Models\Magazine; +use App\Models\Section; +use App\Models\User; +use App\Policies\Policy; use Illuminate\Http\Request; +use Inertia\Inertia; +use Illuminate\Foundation\Auth\Access\AuthorizesRequests; class MagazineController extends Controller { - // -} + use AuthorizesRequests; + + public function show(Magazine $magazine) + { + // $this->authorize(Policy::View, $magazine); + return Inertia::render('magazine/Show', [ + 'magazine' => MagazineResource::make($magazine), + 'lesson' => LessonResource::make($magazine->lesson), + ]); + } + + /** + * Update the specified resource in storage. + */ + public function updateProgress(ProgressRequest $request, Magazine $magazine) + { + if ($request->user()->isProgressStarted($magazine)) { + event(new EventableStart($magazine, $request->user())); + + if ($request->user()->isProgressStarted($magazine->lesson)) { + event(new EventableStart($magazine->lesson, $request->user())); + } + + if ($request->user()->isProgressStarted($magazine->section)) { + event(new EventableStart($magazine->section, $request->user())); + } + } + + $request->user()->addProgress($request->user_progress, $magazine); + event(new EventableUpdate($magazine, $request->user(), $request->user_progress)); + + if ($request->user()->isProgressCompleted($request->user_progress)) { + event(new EventableComplete($magazine, $request->user())); + + $this->updateLessonProgress($request->user(), $magazine->lesson); + $this->updateSectionProgress($request->user(), $magazine->section); + } + + return redirect()->back()->with('progress', [ + 'model' => MagazineResource::make($magazine), + 'href' => route('magazines.rates', $magazine), + ]); + } + + public function updateFavorites(Request $request, Magazine $magazine) + { + $request->user()->toggleFavorite($magazine); + + return redirect()->back(); + } + + public function updateRate(RatingRequest $request, Magazine $magazine) + { + $request->user()->rate($magazine, $request->rate); + + return redirect()->back(); + } + + /** + * Update lesson progress and trigger related events. + */ + protected function updateLessonProgress(User $user, Lesson $lesson): void + { + $lesson_progress = $lesson->calcLessonProgress($user->id); + $user->addProgress($lesson_progress, $lesson); + + event(new EventableUpdate($lesson, $user, $lesson_progress)); + + if ($user->isProgressCompleted($lesson_progress)) { + event(new EventableComplete($lesson, $user)); + } + } + + /** + * Update section progress and trigger related events. + */ + protected function updateSectionProgress(User $user, Section $section): void + { + $section_progress = $section->calcSectionProgress($user->id); + $user->addProgress($section_progress, $section); + + event(new EventableUpdate($section, $user, $section_progress)); + + if ($user->isProgressCompleted($section_progress)) { + event(new EventableComplete($section, $user)); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/MasterController.php b/app/Http/Controllers/MasterController.php new file mode 100644 index 0000000..443163d --- /dev/null +++ b/app/Http/Controllers/MasterController.php @@ -0,0 +1,13 @@ + QuickScanResource::make($quickScan->load('quickQuestions')), + 'lesson' => LessonResource::make($quickScan->lesson), + ]); + } + + /** + * Update the specified resource in storage. + */ + public function updateProgress(ProgressRequest $request, QuickScan $quickScan) + { + if ($request->user()->isProgressStarted($quickScan)) { + event(new EventableStart($quickScan, $request->user())); + + if ($request->user()->isProgressStarted($quickScan->lesson)) { + event(new EventableStart($quickScan->lesson, $request->user())); + } + + if ($request->user()->isProgressStarted($quickScan->section)) { + event(new EventableStart($quickScan->section, $request->user())); + } + } + + $request->user()->addProgress($request->user_progress, $quickScan); + event(new EventableUpdate($quickScan, $request->user(), $request->user_progress)); + + if ($request->user()->isProgressCompleted($request->user_progress)) { + event(new EventableComplete($quickScan, $request->user())); + + $this->updateLessonProgress($request->user(), $quickScan->lesson); + $this->updateSectionProgress($request->user(), $quickScan->section); + } + + return redirect()->back()->with('progress', [ + 'model' => QuickScanResource::make($quickScan), + 'href' => route('quickScans.rates', $quickScan), + ]); + } + + public function updateFavorites(Request $request, QuickScan $quickScan) + { + $request->user()->toggleFavorite($quickScan); + + return redirect()->back(); + } + + public function updateRate(RatingRequest $request, QuickScan $quickScan) + { + $request->user()->rate($quickScan, $request->rate); + + return redirect()->back(); + } + + /** + * Update lesson progress and trigger related events. + */ + protected function updateLessonProgress(User $user, Lesson $lesson): void + { + $lesson_progress = $lesson->calcLessonProgress($user->id); + $user->addProgress($lesson_progress, $lesson); + + event(new EventableUpdate($lesson, $user, $lesson_progress)); + + if ($user->isProgressCompleted($lesson_progress)) { + event(new EventableComplete($lesson, $user)); + } + } + + /** + * Update section progress and trigger related events. + */ + protected function updateSectionProgress(User $user, Section $section): void + { + $section_progress = $section->calcSectionProgress($user->id); + $user->addProgress($section_progress, $section); + + event(new EventableUpdate($section, $user, $section_progress)); + + if ($user->isProgressCompleted($section_progress)) { + event(new EventableComplete($section, $user)); + } + } } diff --git a/app/Http/Controllers/QuizController.php b/app/Http/Controllers/QuizController.php index 4cc0568..767f912 100644 --- a/app/Http/Controllers/QuizController.php +++ b/app/Http/Controllers/QuizController.php @@ -2,9 +2,110 @@ namespace App\Http\Controllers; +use App\Events\EventableComplete; +use App\Events\EventableStart; +use App\Events\EventableUpdate; +use App\Http\Requests\ProgressRequest; +use App\Http\Requests\RatingRequest; +use App\Http\Resources\LessonResource; +use App\Http\Resources\QuizResource; +use App\Models\Lesson; +use App\Models\Quiz; +use App\Models\Section; +use App\Models\User; +use App\Policies\Policy; use Illuminate\Http\Request; +use Inertia\Inertia; class QuizController extends Controller { - // -} + /** + * Display the specified resource. + */ + public function show(Quiz $quiz) + { + // $this->authorize(Policy::View, $quiz); + + return Inertia::render('quiz/Show', [ + 'quiz' => QuizResource::make($quiz), + 'lesson' => LessonResource::make($quiz->lesson), + ]); + } + + /** + * Update the specified resource in storage. + */ + public function updateProgress(ProgressRequest $request, Quiz $quiz) + { + if ($request->user()->isProgressStarted($quiz)) { + event(new EventableStart($quiz, $request->user())); + + if ($request->user()->isProgressStarted($quiz->lesson)) { + event(new EventableStart($quiz->lesson, $request->user())); + } + + if ($request->user()->isProgressStarted($quiz->section)) { + event(new EventableStart($quiz->section, $request->user())); + } + } + + $request->user()->addProgress($request->user_progress, $quiz); + event(new EventableUpdate($quiz, $request->user(), $request->user_progress)); + + if ($request->user()->isProgressCompleted($request->user_progress)) { + event(new EventableComplete($quiz, $request->user())); + + $this->updateLessonProgress($request->user(), $quiz->lesson); + $this->updateSectionProgress($request->user(), $quiz->section); + } + + return redirect()->back()->with('progress', [ + 'model' => QuizResource::make($quiz), + 'href' => route('quizzes.rates', $quiz), + ]); + } + + public function updateFavorites(Request $request, Quiz $quiz) + { + $request->user()->toggleFavorite($quiz); + + return redirect()->back(); + } + + public function updateRate(RatingRequest $request, Quiz $quiz) + { + $request->user()->rate($quiz, $request->rate); + + return redirect()->back(); + } + + /** + * Update lesson progress and trigger related events. + */ + protected function updateLessonProgress(User $user, Lesson $lesson): void + { + $lesson_progress = $lesson->calcLessonProgress($user->id); + $user->addProgress($lesson_progress, $lesson); + + event(new EventableUpdate($lesson, $user, $lesson_progress)); + + if ($user->isProgressCompleted($lesson_progress)) { + event(new EventableComplete($lesson, $user)); + } + } + + /** + * Update section progress and trigger related events. + */ + protected function updateSectionProgress(User $user, Section $section): void + { + $section_progress = $section->calcSectionProgress($user->id); + $user->addProgress($section_progress, $section); + + event(new EventableUpdate($section, $user, $section_progress)); + + if ($user->isProgressCompleted($section_progress)) { + event(new EventableComplete($section, $user)); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/RevisionController.php b/app/Http/Controllers/RevisionController.php index 9ab5b0f..0546901 100644 --- a/app/Http/Controllers/RevisionController.php +++ b/app/Http/Controllers/RevisionController.php @@ -2,9 +2,108 @@ namespace App\Http\Controllers; +use App\Events\EventableComplete; +use App\Events\EventableStart; +use App\Events\EventableUpdate; +use App\Http\Requests\ProgressRequest; +use App\Http\Requests\RatingRequest; +use App\Http\Resources\LessonResource; +use App\Http\Resources\RevisionResource; +use App\Models\Lesson; +use App\Models\Revision; +use App\Models\Section; +use App\Models\User; use Illuminate\Http\Request; +use Inertia\Inertia; class RevisionController extends Controller { - // -} + /** + * Display the specified resource. + */ + public function show(Revision $revision) + { + // return RevisionResource::make($revision->load('revisionItems')); + return Inertia::render('revision/Show', [ + 'revision' => RevisionResource::make($revision->load('revisionItems')), + 'lesson' => LessonResource::make($revision->lesson), + ]); + } + + /** + * Update the specified resource in storage. + */ + public function updateProgress(ProgressRequest $request, Revision $revision) + { + if ($request->user()->isProgressStarted($revision)) { + event(new EventableStart($revision, $request->user())); + + if ($request->user()->isProgressStarted($revision->lesson)) { + event(new EventableStart($revision->lesson, $request->user())); + } + + if ($request->user()->isProgressStarted($revision->section)) { + event(new EventableStart($revision->section, $request->user())); + } + } + + $request->user()->addProgress($request->user_progress, $revision); + event(new EventableUpdate($revision, $request->user(), $request->user_progress)); + + if ($request->user()->isProgressCompleted($request->user_progress)) { + event(new EventableComplete($revision, $request->user())); + + $this->updateLessonProgress($request->user(), $revision->lesson); + $this->updateSectionProgress($request->user(), $revision->section); + } + + return redirect()->back()->with('progress', [ + 'model' => RevisionResource::make($revision), + 'href' => route('revisions.rates', $revision), + ]); + } + + public function updateFavorites(Request $request, Revision $revision) + { + $request->user()->toggleFavorite($revision); + + return redirect()->back(); + } + + public function updateRate(RatingRequest $request, Revision $revision) + { + $request->user()->rate($revision, $request->rate); + + return redirect()->back(); + } + + /** + * Update lesson progress and trigger related events. + */ + protected function updateLessonProgress(User $user, Lesson $lesson): void + { + $lesson_progress = $lesson->calcLessonProgress($user->id); + $user->addProgress($lesson_progress, $lesson); + + event(new EventableUpdate($lesson, $user, $lesson_progress)); + + if ($user->isProgressCompleted($lesson_progress)) { + event(new EventableComplete($lesson, $user)); + } + } + + /** + * Update section progress and trigger related events. + */ + protected function updateSectionProgress(User $user, Section $section): void + { + $section_progress = $section->calcSectionProgress($user->id); + $user->addProgress($section_progress, $section); + + event(new EventableUpdate($section, $user, $section_progress)); + + if ($user->isProgressCompleted($section_progress)) { + event(new EventableComplete($section, $user)); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/TodoController.php b/app/Http/Controllers/TodoController.php index 9fd5492..ff35715 100644 --- a/app/Http/Controllers/TodoController.php +++ b/app/Http/Controllers/TodoController.php @@ -2,9 +2,107 @@ namespace App\Http\Controllers; +use App\Events\EventableComplete; +use App\Events\EventableStart; +use App\Events\EventableUpdate; +use App\Http\Requests\ProgressRequest; +use App\Http\Requests\RatingRequest; +use App\Http\Resources\LessonResource; +use App\Http\Resources\TodoResource; +use App\Models\Lesson; +use App\Models\Section; +use App\Models\Todo; +use App\Models\User; use Illuminate\Http\Request; +use Inertia\Inertia; class TodoController extends Controller { - // + /** + * Display the specified resource. + */ + public function show(Todo $todo) + { + return Inertia::render('todo/Show', [ + 'todo' => TodoResource::make($todo), + 'lesson' => LessonResource::make($todo->lesson), + ]); + } + + /** + * Update the specified resource in storage. + */ + public function updateProgress(ProgressRequest $request, Todo $todo) + { + if ($request->user()->isProgressStarted($todo)) { + event(new EventableStart($todo, $request->user())); + + if ($request->user()->isProgressStarted($todo->lesson)) { + event(new EventableStart($todo->lesson, $request->user())); + } + + if ($request->user()->isProgressStarted($todo->section)) { + event(new EventableStart($todo->section, $request->user())); + } + } + + $request->user()->addProgress($request->user_progress, $todo); + event(new EventableUpdate($todo, $request->user(), $request->user_progress)); + + if ($request->user()->isProgressCompleted($request->user_progress)) { + event(new EventableComplete($todo, $request->user())); + + $this->updateLessonProgress($request->user(), $todo->lesson); + $this->updateSectionProgress($request->user(), $todo->section); + } + + return redirect()->back()->with('progress', [ + 'model' => TodoResource::make($todo), + 'href' => route('todos.rates', $todo), + ]); + } + + public function updateFavorites(Request $request, Todo $todo) + { + $request->user()->toggleFavorite($todo); + + return redirect()->back(); + } + + public function updateRate(RatingRequest $request, Todo $todo) + { + $request->user()->rate($todo, $request->rate); + + return redirect()->back(); + } + + /** + * Update lesson progress and trigger related events. + */ + protected function updateLessonProgress(User $user, Lesson $lesson): void + { + $lesson_progress = $lesson->calcLessonProgress($user->id); + $user->addProgress($lesson_progress, $lesson); + + event(new EventableUpdate($lesson, $user, $lesson_progress)); + + if ($user->isProgressCompleted($lesson_progress)) { + event(new EventableComplete($lesson, $user)); + } + } + + /** + * Update section progress and trigger related events. + */ + protected function updateSectionProgress(User $user, Section $section): void + { + $section_progress = $section->calcSectionProgress($user->id); + $user->addProgress($section_progress, $section); + + event(new EventableUpdate($section, $user, $section_progress)); + + if ($user->isProgressCompleted($section_progress)) { + event(new EventableComplete($section, $user)); + } + } } diff --git a/app/Http/Controllers/ToolsController.php b/app/Http/Controllers/ToolsController.php new file mode 100644 index 0000000..0090612 --- /dev/null +++ b/app/Http/Controllers/ToolsController.php @@ -0,0 +1,29 @@ +authorize(Policy::View, $visual); + + return Inertia::render('visual/Show', [ + 'visual' => VisualResource::make($visual), + 'lesson' => LessonResource::make($visual->lesson), + ]); + } + + /** + * Update the specified resource in storage. + */ + public function updateProgress(ProgressRequest $request, Visual $visual) + { + if ($request->user()->isProgressStarted($visual)) { + event(new EventableStart($visual, $request->user())); + + if ($request->user()->isProgressStarted($visual->lesson)) { + event(new EventableStart($visual->lesson, $request->user())); + } + + if ($request->user()->isProgressStarted($visual->section)) { + event(new EventableStart($visual->section, $request->user())); + } + } + + $request->user()->addProgress($request->user_progress, $visual); + event(new EventableUpdate($visual, $request->user(), $request->user_progress)); + + if ($request->user()->isProgressCompleted($request->user_progress)) { + event(new EventableComplete($visual, $request->user())); + + $this->updateLessonProgress($request->user(), $visual->lesson); + $this->updateSectionProgress($request->user(), $visual->section); + } + + return redirect()->back()->with('progress', [ + 'model' => VisualResource::make($visual), + 'href' => route('visuals.rates', $visual), + ]); + } + + public function updateFavorites(Request $request, Visual $visual) + { + $request->user()->toggleFavorite($visual); + + return redirect()->back(); + } + + public function updateRate(RatingRequest $request, Visual $visual) + { + $request->user()->rate($visual, $request->rate); + + return redirect()->back(); + } + + /** + * Update lesson progress and trigger related events. + */ + protected function updateLessonProgress(User $user, Lesson $lesson): void + { + $lesson_progress = $lesson->calcLessonProgress($user->id); + $user->addProgress($lesson_progress, $lesson); + + event(new EventableUpdate($lesson, $user, $lesson_progress)); + + if ($user->isProgressCompleted($lesson_progress)) { + event(new EventableComplete($lesson, $user)); + } + } + + /** + * Update section progress and trigger related events. + */ + protected function updateSectionProgress(User $user, Section $section): void + { + $section_progress = $section->calcSectionProgress($user->id); + $user->addProgress($section_progress, $section); + + event(new EventableUpdate($section, $user, $section_progress)); + + if ($user->isProgressCompleted($section_progress)) { + event(new EventableComplete($section, $user)); + } + } } diff --git a/app/Http/Controllers/WelcomeController.php b/app/Http/Controllers/WelcomeController.php index 554e815..d67db02 100644 --- a/app/Http/Controllers/WelcomeController.php +++ b/app/Http/Controllers/WelcomeController.php @@ -4,6 +4,7 @@ use App\Http\Resources\BookResource; use App\Models\Book; +use App\Models\Faq; use App\Models\MetaData; use Inertia\Inertia; @@ -20,4 +21,31 @@ public function about() { return Inertia::render('about/Index'); } -} + + public function faq() + { + return Inertia::render('faqs/Index', [ + 'faqs' => Faq::query() + ->where(function ($q) { + $q->where('is_published', true) + ->orWhereNull('is_published'); + }) + ->orderBy('order_column') + ->get(['id','question','answer']) + ]); + } + + public function webinars() + { + return Inertia::render('webinars/Index', [ + 'webinars' => [], + ]); + } + + public function books() + { + return Inertia::render('books/Index', [ + 'books' => BookResource::collection(Book::all()), + ]); + } +} \ No newline at end of file diff --git a/app/Http/Resources/CourseResource.php b/app/Http/Resources/CourseResource.php index 2d5519c..a559397 100644 --- a/app/Http/Resources/CourseResource.php +++ b/app/Http/Resources/CourseResource.php @@ -20,6 +20,7 @@ class CourseResource extends JsonResource public function toArray(Request $request): array { return [ + 'id' => $this->resource->id, 'title' => $this->resource->title, 'title_line2' => $this->resource->title_line2, 'description' => $this->resource->description, diff --git a/app/Http/Resources/RevisionResource.php b/app/Http/Resources/RevisionResource.php index 9aec577..0d29a1a 100644 --- a/app/Http/Resources/RevisionResource.php +++ b/app/Http/Resources/RevisionResource.php @@ -31,4 +31,4 @@ public function toArray(Request $request): array 'items' => $this->resource->revisionItems()->get(), ]; } -} +} \ No newline at end of file diff --git a/app/Policies/Policy.php b/app/Policies/Policy.php new file mode 100644 index 0000000..cefc2db --- /dev/null +++ b/app/Policies/Policy.php @@ -0,0 +1,85 @@ +key = class_basename(Str::remove('Policy', $this::class)); + } + + public function before(Authenticatable|User|Admin $auth): ?bool + { + return Nova::whenServing(function (NovaRequest $request) use ($auth) { + try { + if ($auth?->isSuper()) { + return true; + } + } catch (\Throwable $e) { + return null; + } + + return null; + }); + } + + public function viewAny(Authenticatable|Admin|User $auth): bool + { + return Nova::whenServing(function (NovaRequest $request) use ($auth) { + if ($auth instanceof Admin) { + return $auth->hasPermissionTo(Policy::ViewAny.$this->key, 'admin'); + } + + return false; + }, function (Request $request) use ($auth) { + return $auth->hasVerifiedEmail(); + }); + } + + public function create(Authenticatable|Admin|User $auth): bool + { + return Nova::whenServing(function (NovaRequest $request) use ($auth) { + if ($auth instanceof Admin) { + return $auth->hasPermissionTo(Policy::Create.$this->key, 'admin'); + } + + return false; + }, function (Request $request) { + return false; + }); + } +} diff --git a/app/Providers/NovaServiceProvider.php b/app/Providers/NovaServiceProvider.php index 716893e..9b26f70 100644 --- a/app/Providers/NovaServiceProvider.php +++ b/app/Providers/NovaServiceProvider.php @@ -34,6 +34,7 @@ public function boot(): void MenuSection::make('E-Learning', [ MenuItem::resource(\App\Nova\Course::class), MenuItem::resource(\App\Nova\Section::class), + // MenuItem::resource(\App\Nova\Lesson::class), MenuItem::resource(\App\Nova\Glossary::class), ])->icon('finger-print')->collapsable(), diff --git a/package-lock.json b/package-lock.json index 6cc91dd..b0a8dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,11 +5,18 @@ "packages": { "": { "dependencies": { + "@fullcalendar/core": "^6.1.20", + "@fullcalendar/daygrid": "^6.1.20", + "@fullcalendar/interaction": "^6.1.20", + "@fullcalendar/list": "^6.1.20", + "@fullcalendar/timegrid": "^6.1.20", + "@fullcalendar/vue3": "^6.1.20", "@headlessui/vue": "^1.7.23", "@heroicons/vue": "^2.2.0", "@inertiajs/vue3": "^2.0.0", "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.1.1", + "@videojs/themes": "^1.0.1", "@vitejs/plugin-vue": "^5.2.1", "@vueuse/core": "^12.8.2", "class-variance-authority": "^0.7.1", @@ -23,6 +30,7 @@ "tailwindcss": "^4.1.1", "tw-animate-css": "^1.2.5", "typescript": "^5.2.2", + "video.js": "^8.23.6", "vite": "^6.3.4", "vue": "^3.5.13", "vue-sonner": "^1.3.2", @@ -81,6 +89,15 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", @@ -751,6 +768,64 @@ } } }, + "node_modules/@fullcalendar/core": { + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.20.tgz", + "integrity": "sha512-1cukXLlePFiJ8YKXn/4tMKsy0etxYLCkXk8nUCFi11nRONF2Ba2CD5b21/ovtOO2tL6afTJfwmc1ed3HG7eB1g==", + "license": "MIT", + "dependencies": { + "preact": "~10.12.1" + } + }, + "node_modules/@fullcalendar/daygrid": { + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.20.tgz", + "integrity": "sha512-AO9vqhkLP77EesmJzuU+IGXgxNulsA8mgQHynclJ8U70vSwAVnbcLG9qftiTAFSlZjiY/NvhE7sflve6cJelyQ==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.20" + } + }, + "node_modules/@fullcalendar/interaction": { + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.20.tgz", + "integrity": "sha512-p6txmc5txL0bMiPaJxe2ip6o0T384TyoD2KGdsU6UjZ5yoBlaY+dg7kxfnYKpYMzEJLG58n+URrHr2PgNL2fyA==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.20" + } + }, + "node_modules/@fullcalendar/list": { + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.20.tgz", + "integrity": "sha512-7Hzkbb7uuSqrXwTyD0Ld/7SwWNxPD6SlU548vtkIpH55rZ4qquwtwYdMPgorHos5OynHA4OUrZNcH51CjrCf2g==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.20" + } + }, + "node_modules/@fullcalendar/timegrid": { + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.20.tgz", + "integrity": "sha512-4H+/MWbz3ntA50lrPif+7TsvMeX3R1GSYjiLULz0+zEJ7/Yfd9pupZmAwUs/PBpA6aAcFmeRr0laWfcz1a9V1A==", + "license": "MIT", + "dependencies": { + "@fullcalendar/daygrid": "~6.1.20" + }, + "peerDependencies": { + "@fullcalendar/core": "~6.1.20" + } + }, + "node_modules/@fullcalendar/vue3": { + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.1.20.tgz", + "integrity": "sha512-8qg6pS27II9QBwFkkJC+7SfflMpWqOe7i3ii5ODq9KpLAjwQAd/zjfq8RvKR1Yryoh5UmMCmvRbMB7i4RGtqog==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.20", + "vue": "^3.0.11" + } + }, "node_modules/@headlessui/vue": { "version": "1.7.23", "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.23.tgz", @@ -1630,17 +1705,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", + "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/type-utils": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/type-utils": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -1653,7 +1728,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.54.0", + "@typescript-eslint/parser": "^8.55.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1669,16 +1744,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz", + "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", "debug": "^4.4.3" }, "engines": { @@ -1694,14 +1769,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz", + "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", "debug": "^4.4.3" }, "engines": { @@ -1716,14 +1791,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz", + "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1734,9 +1809,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz", + "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", "dev": true, "license": "MIT", "engines": { @@ -1751,15 +1826,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz", + "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -1776,9 +1851,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz", + "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==", "dev": true, "license": "MIT", "engines": { @@ -1790,16 +1865,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz", + "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.55.0", + "@typescript-eslint/tsconfig-utils": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", @@ -1818,16 +1893,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz", + "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0" + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1842,13 +1917,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz", + "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/types": "8.55.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -1872,6 +1947,63 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@videojs/http-streaming": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.17.3.tgz", + "integrity": "sha512-6AteOnlpiY8ljijyCB+JszDCIVl9UcSgIiM+CfpBe3Yk2VESjKw9Jq8AkOyZyfLI4U5kDR9izHcGi6ho517n8g==", + "license": "Apache-2.0", + "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" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^8.19.0" + } + }, + "node_modules/@videojs/themes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@videojs/themes/-/themes-1.0.1.tgz", + "integrity": "sha512-2b6YIIIz5x+/eSFdkSZ2RZJfHIMfP7bGODR3wDzLTqFF2kEKnJVIXxBUNzdZC/qiVETqAA2Ba6mCp+iXTUYt4A==", + "license": "MIT", + "dependencies": { + "postcss-inline-svg": "^4.1.0" + } + }, + "node_modules/@videojs/vhs-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz", + "integrity": "sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/xhr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.7.0.tgz", + "integrity": "sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", @@ -1915,53 +2047,93 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.27.tgz", - "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", + "integrity": "sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.27", - "entities": "^7.0.0", + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.28", + "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/@vue/compiler-dom": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", - "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz", + "integrity": "sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/compiler-core": "3.5.28", + "@vue/shared": "3.5.28" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", - "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.28.tgz", + "integrity": "sha512-6TnKMiNkd6u6VeVDhZn/07KhEZuBSn43Wd2No5zaP5s3xm8IqFTHBj84HJah4UepSUJTro5SoqqlOY22FKY96g==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/compiler-core": "3.5.27", - "@vue/compiler-dom": "3.5.27", - "@vue/compiler-ssr": "3.5.27", - "@vue/shared": "3.5.27", + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.28", + "@vue/compiler-dom": "3.5.28", + "@vue/compiler-ssr": "3.5.28", + "@vue/shared": "3.5.28", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, + "node_modules/@vue/compiler-sfc/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", - "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.28.tgz", + "integrity": "sha512-JCq//9w1qmC6UGLWJX7RXzrGpKkroubey/ZFqTpvEIDJEKGgntuDMqkuWiZvzTzTA5h2qZvFBFHY7fAAa9475g==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/compiler-dom": "3.5.28", + "@vue/shared": "3.5.28" } }, "node_modules/@vue/compiler-vue2": { @@ -2027,53 +2199,53 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.27.tgz", - "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.28.tgz", + "integrity": "sha512-gr5hEsxvn+RNyu9/9o1WtdYdwDjg5FgjUSBEkZWqgTKlo/fvwZ2+8W6AfKsc9YN2k/+iHYdS9vZYAhpi10kNaw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.27" + "@vue/shared": "3.5.28" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.27.tgz", - "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.28.tgz", + "integrity": "sha512-POVHTdbgnrBBIpnbYU4y7pOMNlPn2QVxVzkvEA2pEgvzbelQq4ZOUxbp2oiyo+BOtiYlm8Q44wShHJoBvDPAjQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/reactivity": "3.5.28", + "@vue/shared": "3.5.28" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", - "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.28.tgz", + "integrity": "sha512-4SXxSF8SXYMuhAIkT+eBRqOkWEfPu6nhccrzrkioA6l0boiq7sp18HCOov9qWJA5HML61kW8p/cB4MmBiG9dSA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.27", - "@vue/runtime-core": "3.5.27", - "@vue/shared": "3.5.27", + "@vue/reactivity": "3.5.28", + "@vue/runtime-core": "3.5.28", + "@vue/shared": "3.5.28", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.27.tgz", - "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.28.tgz", + "integrity": "sha512-pf+5ECKGj8fX95bNincbzJ6yp6nyzuLDhYZCeFxUNp8EBrQpPpQaLX3nNCp49+UbgbPun3CeVE+5CXVV1Xydfg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/compiler-ssr": "3.5.28", + "@vue/shared": "3.5.28" }, "peerDependencies": { - "vue": "3.5.27" + "vue": "3.5.28" } }, "node_modules/@vue/shared": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.27.tgz", - "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.28.tgz", + "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", "license": "MIT" }, "node_modules/@vueuse/core": { @@ -2112,6 +2284,15 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -2135,6 +2316,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/aes-decrypter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.2.tgz", + "integrity": "sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2209,13 +2402,13 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", - "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -2230,7 +2423,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, "license": "ISC" }, "node_modules/brace-expansion": { @@ -2434,6 +2626,39 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2508,6 +2733,46 @@ "node": ">=8" } }, + "node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2542,16 +2807,10 @@ } }, "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "license": "BSD-2-Clause" }, "node_modules/es-define-property": { "version": "1.0.1", @@ -3243,6 +3502,16 @@ "node": ">=10.13.0" } }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -3332,6 +3601,20 @@ "he": "bin/he" } }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "license": "MIT", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3369,6 +3652,12 @@ "node": ">=0.8.19" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3388,6 +3677,12 @@ "node": ">=8" } }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "license": "MIT" + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3828,6 +4123,17 @@ "vue": ">=3.0.1" } }, + "node_modules/m3u8-parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.2.0.tgz", + "integrity": "sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -3891,6 +4197,15 @@ "node": ">= 0.6" } }, + "node_modules/min-document": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz", + "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==", + "license": "MIT", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -3907,6 +4222,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mpd-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.1.tgz", + "integrity": "sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.0.0", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3921,6 +4251,23 @@ "dev": true, "license": "MIT" }, + "node_modules/mux.js": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.1.0.tgz", + "integrity": "sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -4085,6 +4432,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkcs7": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz", + "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.5.5" + }, + "bin": { + "pkcs7": "bin/cli.js" + } + }, "node_modules/playwright": { "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", @@ -4116,31 +4475,33 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-inline-svg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-inline-svg/-/postcss-inline-svg-4.1.0.tgz", + "integrity": "sha512-0pYBJyoQ9/sJViYRc1cNOOTM7DYh0/rmASB0TBeRmWkG8YFK2tmgdkfjHkbRma1iFtBFKFHZFsHwRTDZTMKzSQ==", + "license": "MIT", + "dependencies": { + "css-select": "^2.0.2", + "dom-serializer": "^0.1.1", + "htmlparser2": "^3.10.1", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" } }, "node_modules/postcss-selector-parser": { @@ -4156,6 +4517,28 @@ "node": ">=4" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/preact": { + "version": "10.12.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", + "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4286,6 +4669,15 @@ } } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -4350,6 +4742,20 @@ ], "license": "MIT" }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/reka-ui": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.8.0.tgz", @@ -4372,14 +4778,14 @@ } }, "node_modules/reka-ui/node_modules/@vueuse/core": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.2.0.tgz", - "integrity": "sha512-tpjzVl7KCQNVd/qcaCE9XbejL38V6KJAEq/tVXj7mDPtl6JtzmUdnXelSS+ULRkkrDgzYVK7EerQJvd2jR794Q==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.2.1.tgz", + "integrity": "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==", "license": "MIT", "dependencies": { "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.2.0", - "@vueuse/shared": "14.2.0" + "@vueuse/metadata": "14.2.1", + "@vueuse/shared": "14.2.1" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -4389,18 +4795,18 @@ } }, "node_modules/reka-ui/node_modules/@vueuse/metadata": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.2.0.tgz", - "integrity": "sha512-i3axTGjU8b13FtyR4Keeama+43iD+BwX9C2TmzBVKqjSHArF03hjkp2SBZ1m72Jk2UtrX0aYCugBq2R1fhkuAQ==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.2.1.tgz", + "integrity": "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/reka-ui/node_modules/@vueuse/shared": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.2.0.tgz", - "integrity": "sha512-Z0bmluZTlAXgUcJ4uAFaML16JcD8V0QG00Db3quR642I99JXIDRa2MI2LGxiLVhcBjVnL1jOzIvT5TT2lqJlkA==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.2.1.tgz", + "integrity": "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" @@ -4529,6 +4935,26 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -4649,6 +5075,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4658,6 +5093,15 @@ "node": ">=0.10.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4876,16 +5320,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", - "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.55.0.tgz", + "integrity": "sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.54.0", - "@typescript-eslint/parser": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0" + "@typescript-eslint/eslint-plugin": "8.55.0", + "@typescript-eslint/parser": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4922,6 +5366,57 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/video.js": { + "version": "8.23.6", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.23.6.tgz", + "integrity": "sha512-qjS3HTDo7iapedJuso62scA303i+6CaCUnwyRr8GYd/BYAp7XGb7InUMw2Eu6zrN6IWooPOb78NzyMyjRbIN+Q==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "^3.17.2", + "@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" + } + }, + "node_modules/videojs-contrib-quality-levels": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz", + "integrity": "sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==", + "license": "Apache-2.0", + "dependencies": { + "global": "^4.4.0" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + }, + "peerDependencies": { + "video.js": "^8" + } + }, + "node_modules/videojs-font": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.2.0.tgz", + "integrity": "sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==", + "license": "Apache-2.0" + }, + "node_modules/videojs-vtt.js": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", + "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", + "license": "Apache-2.0", + "dependencies": { + "global": "^4.3.1" + } + }, "node_modules/vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", @@ -5049,6 +5544,34 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", @@ -5057,16 +5580,16 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.27.tgz", - "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.28.tgz", + "integrity": "sha512-BRdrNfeoccSoIZeIhyPBfvWSLFP4q8J3u8Ju8Ug5vu3LdD+yTM13Sg4sKtljxozbnuMu1NB1X5HBHRYUzFocKg==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.27", - "@vue/compiler-sfc": "3.5.27", - "@vue/runtime-dom": "3.5.27", - "@vue/server-renderer": "3.5.27", - "@vue/shared": "3.5.27" + "@vue/compiler-dom": "3.5.28", + "@vue/compiler-sfc": "3.5.28", + "@vue/runtime-dom": "3.5.28", + "@vue/server-renderer": "3.5.28", + "@vue/shared": "3.5.28" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index dfd97e9..790237c 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,18 @@ "vue3-radial-progress": "^1.1.1" }, "dependencies": { + "@fullcalendar/core": "^6.1.20", + "@fullcalendar/daygrid": "^6.1.20", + "@fullcalendar/interaction": "^6.1.20", + "@fullcalendar/list": "^6.1.20", + "@fullcalendar/timegrid": "^6.1.20", + "@fullcalendar/vue3": "^6.1.20", "@headlessui/vue": "^1.7.23", "@heroicons/vue": "^2.2.0", - "@tailwindcss/typography": "^0.5.16", "@inertiajs/vue3": "^2.0.0", + "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.1.1", + "@videojs/themes": "^1.0.1", "@vitejs/plugin-vue": "^5.2.1", "@vueuse/core": "^12.8.2", "class-variance-authority": "^0.7.1", @@ -42,6 +49,7 @@ "tailwindcss": "^4.1.1", "tw-animate-css": "^1.2.5", "typescript": "^5.2.2", + "video.js": "^8.23.6", "vite": "^6.3.4", "vue": "^3.5.13", "vue-sonner": "^1.3.2", @@ -52,4 +60,4 @@ "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", "lightningcss-linux-x64-gnu": "^1.29.1" } -} \ No newline at end of file +} diff --git a/public/img/GI_Logo_horizontal_white.png b/public/img/GI_Logo_horizontal_white.png new file mode 100644 index 0000000000000000000000000000000000000000..3135bb5bd0770b69eeb7d9315cc4ea2d8ead5910 GIT binary patch literal 47197 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 literal 0 HcmV?d00001 diff --git a/public/img/grey-trader-factory.png b/public/img/grey-trader-factory.png new file mode 100644 index 0000000000000000000000000000000000000000..3135bb5bd0770b69eeb7d9315cc4ea2d8ead5910 GIT binary patch literal 47197 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 literal 0 HcmV?d00001 diff --git a/resources/js/components/ApplicationLogo.vue b/resources/js/components/ApplicationLogo.vue new file mode 100644 index 0000000..4cd92aa --- /dev/null +++ b/resources/js/components/ApplicationLogo.vue @@ -0,0 +1,3 @@ + diff --git a/resources/js/components/ApplicationLogoLight.vue b/resources/js/components/ApplicationLogoLight.vue new file mode 100644 index 0000000..02d5ddb --- /dev/null +++ b/resources/js/components/ApplicationLogoLight.vue @@ -0,0 +1,3 @@ + diff --git a/resources/js/components/ApplicationMark.vue b/resources/js/components/ApplicationMark.vue new file mode 100644 index 0000000..ec7e8e0 --- /dev/null +++ b/resources/js/components/ApplicationMark.vue @@ -0,0 +1,3 @@ + diff --git a/resources/js/components/Banner.vue b/resources/js/components/Banner.vue new file mode 100644 index 0000000..ff40753 --- /dev/null +++ b/resources/js/components/Banner.vue @@ -0,0 +1,88 @@ + + + diff --git a/resources/js/components/Dropdown.vue b/resources/js/components/Dropdown.vue new file mode 100644 index 0000000..e8a9bb3 --- /dev/null +++ b/resources/js/components/Dropdown.vue @@ -0,0 +1,79 @@ + + + diff --git a/resources/js/components/DropdownLink.vue b/resources/js/components/DropdownLink.vue new file mode 100644 index 0000000..9c9d768 --- /dev/null +++ b/resources/js/components/DropdownLink.vue @@ -0,0 +1,28 @@ + + + diff --git a/resources/js/components/Modal.vue b/resources/js/components/Modal.vue new file mode 100644 index 0000000..bc3d256 --- /dev/null +++ b/resources/js/components/Modal.vue @@ -0,0 +1,93 @@ + + + diff --git a/resources/js/components/NavLink.vue b/resources/js/components/NavLink.vue new file mode 100644 index 0000000..3fd6261 --- /dev/null +++ b/resources/js/components/NavLink.vue @@ -0,0 +1,21 @@ + + + diff --git a/resources/js/components/ResponsiveNavLink.vue b/resources/js/components/ResponsiveNavLink.vue new file mode 100644 index 0000000..64a97fb --- /dev/null +++ b/resources/js/components/ResponsiveNavLink.vue @@ -0,0 +1,28 @@ + + + diff --git a/resources/js/components/VideoPlayer.vue b/resources/js/components/VideoPlayer.vue new file mode 100644 index 0000000..bb213f3 --- /dev/null +++ b/resources/js/components/VideoPlayer.vue @@ -0,0 +1,37 @@ + + + diff --git a/resources/js/components/buttons/PrimaryButton.vue b/resources/js/components/buttons/PrimaryButton.vue new file mode 100644 index 0000000..c726dd5 --- /dev/null +++ b/resources/js/components/buttons/PrimaryButton.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/components/buttons/PrimaryLinkButton.vue b/resources/js/components/buttons/PrimaryLinkButton.vue new file mode 100644 index 0000000..d9866a4 --- /dev/null +++ b/resources/js/components/buttons/PrimaryLinkButton.vue @@ -0,0 +1,26 @@ + + + diff --git a/resources/js/components/buttons/ProgressButton.vue b/resources/js/components/buttons/ProgressButton.vue new file mode 100644 index 0000000..1454e7e --- /dev/null +++ b/resources/js/components/buttons/ProgressButton.vue @@ -0,0 +1,559 @@ + + + + + + diff --git a/resources/js/components/buttons/SecondaryLinkButton.vue b/resources/js/components/buttons/SecondaryLinkButton.vue new file mode 100644 index 0000000..aa72beb --- /dev/null +++ b/resources/js/components/buttons/SecondaryLinkButton.vue @@ -0,0 +1,25 @@ + + + diff --git a/resources/js/components/footers/FooterSocialLinksOnly.vue b/resources/js/components/footers/FooterSocialLinksOnly.vue new file mode 100644 index 0000000..d642ba9 --- /dev/null +++ b/resources/js/components/footers/FooterSocialLinksOnly.vue @@ -0,0 +1,99 @@ + + + diff --git a/resources/js/components/menu/BackMenu.vue b/resources/js/components/menu/BackMenu.vue new file mode 100644 index 0000000..dfeb768 --- /dev/null +++ b/resources/js/components/menu/BackMenu.vue @@ -0,0 +1,26 @@ + + + diff --git a/resources/js/components/menu/ExitMenu.vue b/resources/js/components/menu/ExitMenu.vue new file mode 100644 index 0000000..490db96 --- /dev/null +++ b/resources/js/components/menu/ExitMenu.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/components/menu/Main.vue b/resources/js/components/menu/Main.vue new file mode 100644 index 0000000..e5fe074 --- /dev/null +++ b/resources/js/components/menu/Main.vue @@ -0,0 +1,147 @@ + + + diff --git a/resources/js/components/modals/CenteredWithWideButtons.vue b/resources/js/components/modals/CenteredWithWideButtons.vue new file mode 100644 index 0000000..546a8be --- /dev/null +++ b/resources/js/components/modals/CenteredWithWideButtons.vue @@ -0,0 +1,95 @@ + + + + diff --git a/resources/js/components/modals/RatingModal.vue b/resources/js/components/modals/RatingModal.vue new file mode 100644 index 0000000..a838242 --- /dev/null +++ b/resources/js/components/modals/RatingModal.vue @@ -0,0 +1,196 @@ + + + + diff --git a/resources/js/components/modals/VideoModal.vue b/resources/js/components/modals/VideoModal.vue new file mode 100644 index 0000000..2dc0cc1 --- /dev/null +++ b/resources/js/components/modals/VideoModal.vue @@ -0,0 +1,52 @@ + + + + + + diff --git a/resources/js/components/pagination/MagazinePagination.vue b/resources/js/components/pagination/MagazinePagination.vue new file mode 100644 index 0000000..7ca5ad9 --- /dev/null +++ b/resources/js/components/pagination/MagazinePagination.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/resources/js/layouts/AppLayout.vue b/resources/js/layouts/AppLayout.vue index 4409628..3b7fcc6 100644 --- a/resources/js/layouts/AppLayout.vue +++ b/resources/js/layouts/AppLayout.vue @@ -1,21 +1,395 @@ - diff --git a/resources/js/layouts/BoxesSlideLayout.vue b/resources/js/layouts/BoxesSlideLayout.vue new file mode 100644 index 0000000..a3c8144 --- /dev/null +++ b/resources/js/layouts/BoxesSlideLayout.vue @@ -0,0 +1,84 @@ + + + diff --git a/resources/js/layouts/CenterContentScreenLayout.vue b/resources/js/layouts/CenterContentScreenLayout.vue new file mode 100644 index 0000000..b79ceb5 --- /dev/null +++ b/resources/js/layouts/CenterContentScreenLayout.vue @@ -0,0 +1,94 @@ + + + diff --git a/resources/js/layouts/FinalSlideLayout.vue b/resources/js/layouts/FinalSlideLayout.vue new file mode 100644 index 0000000..2809f2c --- /dev/null +++ b/resources/js/layouts/FinalSlideLayout.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/layouts/FullBackgroundScreenLayout.vue b/resources/js/layouts/FullBackgroundScreenLayout.vue new file mode 100644 index 0000000..6c0d3fe --- /dev/null +++ b/resources/js/layouts/FullBackgroundScreenLayout.vue @@ -0,0 +1,15 @@ + + + diff --git a/resources/js/layouts/GuestLayout.vue b/resources/js/layouts/GuestLayout.vue index 63303a8..7c13cea 100644 --- a/resources/js/layouts/GuestLayout.vue +++ b/resources/js/layouts/GuestLayout.vue @@ -1,21 +1,36 @@ - +
- + + + + diff --git a/resources/js/layouts/HalfScreenLayout.vue b/resources/js/layouts/HalfScreenLayout.vue new file mode 100644 index 0000000..331dcaa --- /dev/null +++ b/resources/js/layouts/HalfScreenLayout.vue @@ -0,0 +1,29 @@ + + + diff --git a/resources/js/layouts/LeftHalfScreenLayout.vue b/resources/js/layouts/LeftHalfScreenLayout.vue new file mode 100644 index 0000000..eae3e1b --- /dev/null +++ b/resources/js/layouts/LeftHalfScreenLayout.vue @@ -0,0 +1,28 @@ + + + diff --git a/resources/js/layouts/LessonLayout.vue b/resources/js/layouts/LessonLayout.vue new file mode 100644 index 0000000..84528a6 --- /dev/null +++ b/resources/js/layouts/LessonLayout.vue @@ -0,0 +1,31 @@ + + + diff --git a/resources/js/layouts/PointsScreenLayout.vue b/resources/js/layouts/PointsScreenLayout.vue new file mode 100644 index 0000000..a45e63a --- /dev/null +++ b/resources/js/layouts/PointsScreenLayout.vue @@ -0,0 +1,29 @@ + + + diff --git a/resources/js/layouts/RightHalfScreenLayout.vue b/resources/js/layouts/RightHalfScreenLayout.vue new file mode 100644 index 0000000..331dcaa --- /dev/null +++ b/resources/js/layouts/RightHalfScreenLayout.vue @@ -0,0 +1,29 @@ + + + diff --git a/resources/js/layouts/SectionLayout.vue b/resources/js/layouts/SectionLayout.vue new file mode 100644 index 0000000..763ebc2 --- /dev/null +++ b/resources/js/layouts/SectionLayout.vue @@ -0,0 +1,37 @@ + + + diff --git a/resources/js/layouts/TodoLayout.vue b/resources/js/layouts/TodoLayout.vue new file mode 100644 index 0000000..2708b62 --- /dev/null +++ b/resources/js/layouts/TodoLayout.vue @@ -0,0 +1,19 @@ + + + diff --git a/resources/js/pages/Survey.vue b/resources/js/pages/Survey.vue new file mode 100644 index 0000000..4d39156 --- /dev/null +++ b/resources/js/pages/Survey.vue @@ -0,0 +1,39 @@ + + + + diff --git a/resources/js/pages/books/Download.vue b/resources/js/pages/books/Download.vue index 3c7484a..8382a73 100644 --- a/resources/js/pages/books/Download.vue +++ b/resources/js/pages/books/Download.vue @@ -22,13 +22,12 @@ interface Props { const props = defineProps(); const sendEmailLink = () => { - router.post(route('books.download', props.book.id)); + router.post(route('books.download', props.book.data.id)); };