From 0a80ecd9f772fc6df5ccb4c4a3856c5615258812 Mon Sep 17 00:00:00 2001 From: Tomas Dvorak Date: Fri, 27 Feb 2026 17:34:20 +0100 Subject: [PATCH] Configure Docker publishing with correct GitHub username --- .github/workflows/ci-cd.yml | 2 +- .../page-2026-02-26T12-34-09-331Z.yml | 14 + .../page-2026-02-26T12-34-28-645Z.yml | 14 + .../page-2026-02-26T12-34-30-732Z.yml | 18 + .../page-2026-02-26T12-35-04-145Z.yml | 21 + .../page-2026-02-26T14-54-09-111Z.yml | 1 + .../page-2026-02-26T14-54-13-078Z.yml | 1 + .../page-2026-02-26T14-56-03-022Z.yml | 1 + .../page-2026-02-26T14-56-27-005Z.yml | 1 + .../page-2026-02-26T14-56-28-029Z.yml | 1 + .../page-2026-02-26T15-18-21-814Z.yml | 1 + .../page-2026-02-26T15-18-37-422Z.yml | 1 + .../page-2026-02-26T15-18-42-009Z.yml | 1 + .../page-2026-02-26T15-18-52-746Z.yml | 1 + .../page-2026-02-26T15-18-56-756Z.yml | 1 + .../page-2026-02-26T15-19-45-237Z.yml | 14 + .../page-2026-02-26T15-19-48-248Z.yml | 14 + .../page-2026-02-26T15-20-06-638Z.yml | 18 + .../page-2026-02-26T15-20-18-095Z.yml | 14 + .../page-2026-02-26T15-20-20-118Z.yml | 14 + .../page-2026-02-26T15-20-32-231Z.yml | 18 + .../page-2026-02-26T15-20-42-660Z.yml | 14 + .../page-2026-02-26T15-20-43-674Z.yml | 14 + .../page-2026-02-26T15-20-59-270Z.yml | 14 + .../page-2026-02-26T15-21-08-629Z.yml | 237 ++ .../page-2026-02-26T15-21-11-692Z.yml | 237 ++ .../page-2026-02-26T15-22-03-788Z.yml | 14 + .../page-2026-02-26T15-22-13-101Z.yml | 237 ++ .../page-2026-02-26T15-22-17-372Z.yml | 257 ++ .../page-2026-02-26T15-22-28-352Z.yml | 14 + .../page-2026-02-26T15-22-37-589Z.yml | 237 ++ .../page-2026-02-26T15-22-39-697Z.yml | 244 ++ .../page-2026-02-26T15-22-40-730Z.yml | 244 ++ .../page-2026-02-26T15-22-58-998Z.yml | 14 + .../page-2026-02-26T15-23-08-291Z.yml | 237 ++ .../page-2026-02-26T15-23-10-396Z.yml | 244 ++ .../page-2026-02-26T15-23-12-458Z.yml | 257 ++ .../page-2026-02-26T15-23-13-524Z.yml | 257 ++ .../page-2026-02-26T15-23-27-789Z.yml | 14 + .../page-2026-02-26T15-23-37-523Z.yml | 237 ++ .../page-2026-02-26T15-23-39-611Z.yml | 263 ++ .../page-2026-02-26T15-23-40-633Z.yml | 263 ++ .../page-2026-02-26T15-24-05-157Z.yml | 14 + .../page-2026-02-26T15-24-14-602Z.yml | 197 + .../page-2026-02-26T15-24-15-685Z.yml | 197 + .../page-2026-02-26T15-24-30-848Z.yml | 14 + .../page-2026-02-26T15-24-40-199Z.yml | 197 + .../page-2026-02-26T15-24-42-323Z.yml | 197 + .../page-2026-02-26T15-24-43-380Z.yml | 197 + .../page-2026-02-26T15-25-29-514Z.yml | 14 + .../page-2026-02-26T15-25-38-932Z.yml | 197 + .../page-2026-02-26T15-25-41-019Z.yml | 197 + .../page-2026-02-26T15-25-43-063Z.yml | 197 + .../page-2026-02-26T15-26-36-435Z.yml | 14 + .../page-2026-02-26T15-26-45-970Z.yml | 197 + .../page-2026-02-26T15-26-48-313Z.yml | 197 + Dockerfile.youtube-search | 45 - Others/browser-extension/icons/icon128.png | Bin 41215 -> 769 bytes Others/browser-extension/icons/icon16.png | Bin 41215 -> 181 bytes Others/browser-extension/icons/icon32.png | Bin 41215 -> 275 bytes Others/browser-extension/icons/icon48.png | Bin 41215 -> 346 bytes Others/browser-extension/options.html | 629 ++- Others/browser-extension/options.js | 62 +- Others/browser-extension/popup.html | 1020 ++++- Others/browser-extension/popup.js | 176 +- backend/handlers/admin.go | 66 + backend/handlers/ai_features.go | 2 +- backend/handlers/auth.go | 51 + backend/handlers/file.go | 37 +- backend/handlers/messages.go | 179 +- backend/main.go | 1 + backend/services/favicon_fetcher.go | 23 +- docker-compose.published.yml | 56 + docker-compose.yml | 8 +- enable-demo-mode.js | 4 - .../src/components/AuthenticationWarning.tsx | 12 +- frontend/src/components/ProtectedRoute.tsx | 40 +- frontend/src/components/Timer.tsx | 8 +- frontend/src/components/layout/FloatingAI.tsx | 9 +- frontend/src/components/layout/Header.tsx | 12 + frontend/src/components/layout/Layout.tsx | 16 +- frontend/src/components/layout/Sidebar.tsx | 382 +- frontend/src/components/ui/ActivityFeed.tsx | 241 +- frontend/src/components/ui/BookmarkModal.tsx | 155 +- frontend/src/components/ui/ColorPicker.css | 4 - frontend/src/components/ui/ConfirmModal.tsx | 73 +- .../src/components/ui/EditBookmarkModal.tsx | 141 +- .../src/components/ui/FilePreviewModal.tsx | 61 +- frontend/src/components/ui/FileUpload.tsx | 35 +- .../src/components/ui/FileUploadModal.tsx | 23 +- frontend/src/components/ui/GitHubActivity.tsx | 354 +- .../src/components/ui/LearningPathModal.tsx | 9 +- .../ui/LearningPathPreviewModal.tsx | 9 +- frontend/src/components/ui/MemberModal.tsx | 133 +- frontend/src/components/ui/ModalPortal.tsx | 10 + frontend/src/components/ui/NoteModal.tsx | 131 +- .../src/components/ui/SearchTagFilterBar.tsx | 11 +- frontend/src/components/ui/TaskModal.tsx | 141 +- frontend/src/components/ui/UpdateChecker.tsx | 11 +- frontend/src/components/ui/UploadModal.tsx | 58 +- .../src/components/ui/UserProfileDropdown.tsx | 92 +- .../src/components/ui/VideoPreviewModal.tsx | 109 +- .../src/components/ui/VideoUploadModal.tsx | 45 +- frontend/src/components/ui/ViewNoteModal.tsx | 45 +- frontend/src/index.css | 9 + frontend/src/lib/api-url.ts | 20 + frontend/src/lib/api.ts | 20 +- frontend/src/lib/auth.tsx | 22 +- frontend/src/lib/brave-search.ts | 10 +- frontend/src/lib/demo-api.ts | 8 +- frontend/src/lib/messages.ts | 36 + frontend/src/pages/Bookmarks.tsx | 78 +- frontend/src/pages/Calendar.tsx | 189 +- frontend/src/pages/Chat.tsx | 304 +- frontend/src/pages/Dashboard.tsx | 970 +++-- frontend/src/pages/Files.tsx | 158 +- frontend/src/pages/GitHub.tsx | 326 +- frontend/src/pages/LearningPaths.tsx | 13 +- frontend/src/pages/Login.tsx | 71 +- frontend/src/pages/Members.tsx | 358 +- frontend/src/pages/Messages.css | 623 +++ frontend/src/pages/Messages.tsx | 1258 ++++-- frontend/src/pages/Notes.tsx | 136 +- frontend/src/pages/RemovedStuff.tsx | 67 +- frontend/src/pages/Stats.tsx | 344 +- frontend/src/pages/Tasks.tsx | 83 +- frontend/src/pages/Youtube.tsx | 113 +- frontend/src/services/updateService.ts | 10 +- frontend/src/stores/updateStore.ts | 8 +- frontend/vite.config.ts | 6 +- go.mod | 3 - package-lock.json | 2 +- search.go | 239 -- simple-test.js | 30 - test-demo-mode.js | 99 - test-youtube-api.html | 143 - update.sh | 19 + youtube.html | 3711 ----------------- 138 files changed, 12130 insertions(+), 7831 deletions(-) create mode 100644 .playwright-cli/page-2026-02-26T12-34-09-331Z.yml create mode 100644 .playwright-cli/page-2026-02-26T12-34-28-645Z.yml create mode 100644 .playwright-cli/page-2026-02-26T12-34-30-732Z.yml create mode 100644 .playwright-cli/page-2026-02-26T12-35-04-145Z.yml create mode 100644 .playwright-cli/page-2026-02-26T14-54-09-111Z.yml create mode 100644 .playwright-cli/page-2026-02-26T14-54-13-078Z.yml create mode 100644 .playwright-cli/page-2026-02-26T14-56-03-022Z.yml create mode 100644 .playwright-cli/page-2026-02-26T14-56-27-005Z.yml create mode 100644 .playwright-cli/page-2026-02-26T14-56-28-029Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-18-21-814Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-18-37-422Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-18-42-009Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-18-52-746Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-18-56-756Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-19-45-237Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-19-48-248Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-20-06-638Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-20-18-095Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-20-20-118Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-20-32-231Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-20-42-660Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-20-43-674Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-20-59-270Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-21-08-629Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-21-11-692Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-22-03-788Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-22-13-101Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-22-17-372Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-22-28-352Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-22-37-589Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-22-39-697Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-22-40-730Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-22-58-998Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-23-08-291Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-23-10-396Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-23-12-458Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-23-13-524Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-23-27-789Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-23-37-523Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-23-39-611Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-23-40-633Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-24-05-157Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-24-14-602Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-24-15-685Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-24-30-848Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-24-40-199Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-24-42-323Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-24-43-380Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-25-29-514Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-25-38-932Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-25-41-019Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-25-43-063Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-26-36-435Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-26-45-970Z.yml create mode 100644 .playwright-cli/page-2026-02-26T15-26-48-313Z.yml delete mode 100644 Dockerfile.youtube-search create mode 100644 docker-compose.published.yml delete mode 100644 enable-demo-mode.js create mode 100644 frontend/src/components/ui/ModalPortal.tsx create mode 100644 frontend/src/lib/api-url.ts create mode 100644 frontend/src/pages/Messages.css delete mode 100644 go.mod delete mode 100644 search.go delete mode 100644 simple-test.js delete mode 100644 test-demo-mode.js delete mode 100644 test-youtube-api.html create mode 100755 update.sh delete mode 100644 youtube.html diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index f8cdf1f..025fb23 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -8,7 +8,7 @@ on: env: REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} + IMAGE_NAME: Dvorinka/trackeep jobs: test: diff --git a/.playwright-cli/page-2026-02-26T12-34-09-331Z.yml b/.playwright-cli/page-2026-02-26T12-34-09-331Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T12-34-09-331Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T12-34-28-645Z.yml b/.playwright-cli/page-2026-02-26T12-34-28-645Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T12-34-28-645Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T12-34-30-732Z.yml b/.playwright-cli/page-2026-02-26T12-34-30-732Z.yml new file mode 100644 index 0000000..b492428 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T12-34-30-732Z.yml @@ -0,0 +1,18 @@ +- generic [ref=e26]: + - generic [ref=e27]: + - img "Trackeep Logo" [ref=e29] + - heading "Trackeep" [level=1] [ref=e30] + - paragraph [ref=e31]: Welcome back + - generic [ref=e32]: + - generic [ref=e35]: Registration Disabled + - paragraph [ref=e36]: Accounts can only be created by the administrator. Please contact your admin to get an account. + - generic [ref=e37]: + - generic [ref=e38]: + - generic [ref=e39]: Email + - textbox "Email" [ref=e40]: + - /placeholder: your@email.com + - generic [ref=e41]: + - generic [ref=e42]: Password + - textbox "Password" [ref=e43]: + - /placeholder: •••••••• + - button "Sign In" [ref=e44] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T12-35-04-145Z.yml b/.playwright-cli/page-2026-02-26T12-35-04-145Z.yml new file mode 100644 index 0000000..ce96320 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T12-35-04-145Z.yml @@ -0,0 +1,21 @@ +- generic [ref=e26]: + - generic [ref=e27]: + - img "Trackeep Logo" [ref=e29] + - heading "Trackeep" [level=1] [ref=e30] + - paragraph [ref=e31]: Welcome back + - generic [ref=e32]: + - generic [ref=e35]: Registration Disabled + - paragraph [ref=e36]: Accounts can only be created by the administrator. Please contact your admin to get an account. + - generic [ref=e37]: + - generic [ref=e45]: Invalid credentials + - generic [ref=e38]: + - generic [ref=e39]: Email + - textbox "Email" [ref=e40]: + - /placeholder: your@email.com + - text: demo@trackeep.com + - generic [ref=e41]: + - generic [ref=e42]: Password + - textbox "Password" [ref=e43]: + - /placeholder: •••••••• + - text: password + - button "Sign In" [ref=e44] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T14-54-09-111Z.yml b/.playwright-cli/page-2026-02-26T14-54-09-111Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T14-54-09-111Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T14-54-13-078Z.yml b/.playwright-cli/page-2026-02-26T14-54-13-078Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T14-54-13-078Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T14-56-03-022Z.yml b/.playwright-cli/page-2026-02-26T14-56-03-022Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T14-56-03-022Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T14-56-27-005Z.yml b/.playwright-cli/page-2026-02-26T14-56-27-005Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T14-56-27-005Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T14-56-28-029Z.yml b/.playwright-cli/page-2026-02-26T14-56-28-029Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T14-56-28-029Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-18-21-814Z.yml b/.playwright-cli/page-2026-02-26T15-18-21-814Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-18-21-814Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-18-37-422Z.yml b/.playwright-cli/page-2026-02-26T15-18-37-422Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-18-37-422Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-18-42-009Z.yml b/.playwright-cli/page-2026-02-26T15-18-42-009Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-18-42-009Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-18-52-746Z.yml b/.playwright-cli/page-2026-02-26T15-18-52-746Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-18-52-746Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-18-56-756Z.yml b/.playwright-cli/page-2026-02-26T15-18-56-756Z.yml new file mode 100644 index 0000000..5f7d3b2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-18-56-756Z.yml @@ -0,0 +1 @@ +- paragraph [ref=e6]: Checking authentication... \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-19-45-237Z.yml b/.playwright-cli/page-2026-02-26T15-19-45-237Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-19-45-237Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-19-48-248Z.yml b/.playwright-cli/page-2026-02-26T15-19-48-248Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-19-48-248Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-20-06-638Z.yml b/.playwright-cli/page-2026-02-26T15-20-06-638Z.yml new file mode 100644 index 0000000..7045b78 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-20-06-638Z.yml @@ -0,0 +1,18 @@ +- generic [ref=e4]: + - generic [ref=e5]: + - img "Trackeep Logo" [ref=e7] + - heading "Trackeep" [level=1] [ref=e8] + - paragraph [ref=e9]: Welcome back + - generic [ref=e10]: + - generic [ref=e13]: Registration Disabled + - paragraph [ref=e14]: Accounts can only be created by the administrator. Please contact your admin to get an account. + - generic [ref=e15]: + - generic [ref=e16]: + - generic [ref=e17]: Email + - textbox "Email" [ref=e18]: + - /placeholder: your@email.com + - generic [ref=e19]: + - generic [ref=e20]: Password + - textbox "Password" [ref=e21]: + - /placeholder: •••••••• + - button "Sign In" [ref=e22] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-20-18-095Z.yml b/.playwright-cli/page-2026-02-26T15-20-18-095Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-20-18-095Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-20-20-118Z.yml b/.playwright-cli/page-2026-02-26T15-20-20-118Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-20-20-118Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-20-32-231Z.yml b/.playwright-cli/page-2026-02-26T15-20-32-231Z.yml new file mode 100644 index 0000000..7045b78 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-20-32-231Z.yml @@ -0,0 +1,18 @@ +- generic [ref=e4]: + - generic [ref=e5]: + - img "Trackeep Logo" [ref=e7] + - heading "Trackeep" [level=1] [ref=e8] + - paragraph [ref=e9]: Welcome back + - generic [ref=e10]: + - generic [ref=e13]: Registration Disabled + - paragraph [ref=e14]: Accounts can only be created by the administrator. Please contact your admin to get an account. + - generic [ref=e15]: + - generic [ref=e16]: + - generic [ref=e17]: Email + - textbox "Email" [ref=e18]: + - /placeholder: your@email.com + - generic [ref=e19]: + - generic [ref=e20]: Password + - textbox "Password" [ref=e21]: + - /placeholder: •••••••• + - button "Sign In" [ref=e22] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-20-42-660Z.yml b/.playwright-cli/page-2026-02-26T15-20-42-660Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-20-42-660Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-20-43-674Z.yml b/.playwright-cli/page-2026-02-26T15-20-43-674Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-20-43-674Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-20-59-270Z.yml b/.playwright-cli/page-2026-02-26T15-20-59-270Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-20-59-270Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-21-08-629Z.yml b/.playwright-cli/page-2026-02-26T15-21-08-629Z.yml new file mode 100644 index 0000000..17488e5 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-21-08-629Z.yml @@ -0,0 +1,237 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:21 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-21-11-692Z.yml b/.playwright-cli/page-2026-02-26T15-21-11-692Z.yml new file mode 100644 index 0000000..17488e5 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-21-11-692Z.yml @@ -0,0 +1,237 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:21 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-22-03-788Z.yml b/.playwright-cli/page-2026-02-26T15-22-03-788Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-22-03-788Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-22-13-101Z.yml b/.playwright-cli/page-2026-02-26T15-22-13-101Z.yml new file mode 100644 index 0000000..ee07269 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-22-13-101Z.yml @@ -0,0 +1,237 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:22 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-22-17-372Z.yml b/.playwright-cli/page-2026-02-26T15-22-17-372Z.yml new file mode 100644 index 0000000..f86782e --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-22-17-372Z.yml @@ -0,0 +1,257 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:22 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] + - generic [ref=e279]: + - generic [ref=e280]: + - heading "Create Workspace" [level=3] [ref=e281] + - paragraph [ref=e282]: Add a new workspace for your team or projects. + - generic [ref=e283]: + - generic [ref=e284]: + - text: Name + - textbox "Workspace name" [ref=e285] + - generic [ref=e286]: + - text: Description + - textbox "Description" [ref=e287]: + - /placeholder: Optional description + - generic [ref=e288]: + - generic [ref=e289]: + - paragraph [ref=e290]: Public workspace + - paragraph [ref=e291]: Allow all members to discover this workspace. + - switch [ref=e292] [cursor=pointer] + - generic [ref=e293]: + - button "Cancel" [ref=e294] [cursor=pointer] + - button "Create Workspace" [ref=e295] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-22-28-352Z.yml b/.playwright-cli/page-2026-02-26T15-22-28-352Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-22-28-352Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-22-37-589Z.yml b/.playwright-cli/page-2026-02-26T15-22-37-589Z.yml new file mode 100644 index 0000000..ee07269 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-22-37-589Z.yml @@ -0,0 +1,237 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:22 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-22-39-697Z.yml b/.playwright-cli/page-2026-02-26T15-22-39-697Z.yml new file mode 100644 index 0000000..9b17589 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-22-39-697Z.yml @@ -0,0 +1,244 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [expanded] [active] [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - listbox [ref=e266]: + - option "Trackeep Workspace" [ref=e267] [cursor=pointer]: + - img [ref=e268] + - generic [ref=e271]: Trackeep Workspace + - button "Create Workspace" [ref=e274] [cursor=pointer]: + - img [ref=e275] + - generic [ref=e276]: Create Workspace + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:22 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-22-40-730Z.yml b/.playwright-cli/page-2026-02-26T15-22-40-730Z.yml new file mode 100644 index 0000000..9b17589 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-22-40-730Z.yml @@ -0,0 +1,244 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [expanded] [active] [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - listbox [ref=e266]: + - option "Trackeep Workspace" [ref=e267] [cursor=pointer]: + - img [ref=e268] + - generic [ref=e271]: Trackeep Workspace + - button "Create Workspace" [ref=e274] [cursor=pointer]: + - img [ref=e275] + - generic [ref=e276]: Create Workspace + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:22 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-22-58-998Z.yml b/.playwright-cli/page-2026-02-26T15-22-58-998Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-22-58-998Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-23-08-291Z.yml b/.playwright-cli/page-2026-02-26T15-23-08-291Z.yml new file mode 100644 index 0000000..17ec7fc --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-23-08-291Z.yml @@ -0,0 +1,237 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:23 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-23-10-396Z.yml b/.playwright-cli/page-2026-02-26T15-23-10-396Z.yml new file mode 100644 index 0000000..0d48d15 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-23-10-396Z.yml @@ -0,0 +1,244 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [expanded] [active] [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - listbox [ref=e266]: + - option "Trackeep Workspace" [ref=e267] [cursor=pointer]: + - img [ref=e268] + - generic [ref=e271]: Trackeep Workspace + - button "Create Workspace" [ref=e274] [cursor=pointer]: + - img [ref=e275] + - generic [ref=e276]: Create Workspace + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:23 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-23-12-458Z.yml b/.playwright-cli/page-2026-02-26T15-23-12-458Z.yml new file mode 100644 index 0000000..ff293e6 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-23-12-458Z.yml @@ -0,0 +1,257 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:23 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] + - generic [ref=e279]: + - generic [ref=e280]: + - heading "Create Workspace" [level=3] [ref=e281] + - paragraph [ref=e282]: Add a new workspace for your team or projects. + - generic [ref=e283]: + - generic [ref=e284]: + - text: Name + - textbox "Workspace name" [ref=e285] + - generic [ref=e286]: + - text: Description + - textbox "Description" [ref=e287]: + - /placeholder: Optional description + - generic [ref=e288]: + - generic [ref=e289]: + - paragraph [ref=e290]: Public workspace + - paragraph [ref=e291]: Allow all members to discover this workspace. + - switch [ref=e292] [cursor=pointer] + - generic [ref=e293]: + - button "Cancel" [ref=e294] [cursor=pointer] + - button "Create Workspace" [ref=e295] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-23-13-524Z.yml b/.playwright-cli/page-2026-02-26T15-23-13-524Z.yml new file mode 100644 index 0000000..ff293e6 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-23-13-524Z.yml @@ -0,0 +1,257 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:23 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] + - generic [ref=e279]: + - generic [ref=e280]: + - heading "Create Workspace" [level=3] [ref=e281] + - paragraph [ref=e282]: Add a new workspace for your team or projects. + - generic [ref=e283]: + - generic [ref=e284]: + - text: Name + - textbox "Workspace name" [ref=e285] + - generic [ref=e286]: + - text: Description + - textbox "Description" [ref=e287]: + - /placeholder: Optional description + - generic [ref=e288]: + - generic [ref=e289]: + - paragraph [ref=e290]: Public workspace + - paragraph [ref=e291]: Allow all members to discover this workspace. + - switch [ref=e292] [cursor=pointer] + - generic [ref=e293]: + - button "Cancel" [ref=e294] [cursor=pointer] + - button "Create Workspace" [ref=e295] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-23-27-789Z.yml b/.playwright-cli/page-2026-02-26T15-23-27-789Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-23-27-789Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-23-37-523Z.yml b/.playwright-cli/page-2026-02-26T15-23-37-523Z.yml new file mode 100644 index 0000000..17ec7fc --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-23-37-523Z.yml @@ -0,0 +1,237 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:23 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-23-39-611Z.yml b/.playwright-cli/page-2026-02-26T15-23-39-611Z.yml new file mode 100644 index 0000000..b8740a6 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-23-39-611Z.yml @@ -0,0 +1,263 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - generic [ref=e178]: + - button "AU" [active] [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - generic [ref=e267]: + - generic [ref=e269]: + - generic [ref=e270]: AU + - generic [ref=e271]: + - paragraph [ref=e272]: Admin User + - paragraph [ref=e273]: admin@trackeep.com + - generic [ref=e275]: + - generic [ref=e276]: + - paragraph [ref=e277]: "0" + - paragraph [ref=e278]: Bookmarks + - generic [ref=e279]: + - paragraph [ref=e280]: "0" + - paragraph [ref=e281]: Tasks + - button "Profile" [ref=e282] [cursor=pointer]: + - img [ref=e283] + - text: Profile + - button "Statistics" [ref=e286] [cursor=pointer]: + - img [ref=e287] + - text: Statistics + - button "Settings" [ref=e289] [cursor=pointer]: + - img [ref=e290] + - text: Settings + - button "Logout" [ref=e294] [cursor=pointer]: + - img [ref=e295] + - text: Logout + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:23 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-23-40-633Z.yml b/.playwright-cli/page-2026-02-26T15-23-40-633Z.yml new file mode 100644 index 0000000..b8740a6 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-23-40-633Z.yml @@ -0,0 +1,263 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - generic [ref=e178]: + - button "AU" [active] [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - generic [ref=e267]: + - generic [ref=e269]: + - generic [ref=e270]: AU + - generic [ref=e271]: + - paragraph [ref=e272]: Admin User + - paragraph [ref=e273]: admin@trackeep.com + - generic [ref=e275]: + - generic [ref=e276]: + - paragraph [ref=e277]: "0" + - paragraph [ref=e278]: Bookmarks + - generic [ref=e279]: + - paragraph [ref=e280]: "0" + - paragraph [ref=e281]: Tasks + - button "Profile" [ref=e282] [cursor=pointer]: + - img [ref=e283] + - text: Profile + - button "Statistics" [ref=e286] [cursor=pointer]: + - img [ref=e287] + - text: Statistics + - button "Settings" [ref=e289] [cursor=pointer]: + - img [ref=e290] + - text: Settings + - button "Logout" [ref=e294] [cursor=pointer]: + - img [ref=e295] + - text: Logout + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Tasks" [level=1] [ref=e188] + - button "Add Task" [ref=e189] [cursor=pointer] + - generic [ref=e190]: + - generic [ref=e191]: + - paragraph [ref=e192]: "0" + - paragraph [ref=e193]: Total Tasks + - generic [ref=e194]: + - paragraph [ref=e195]: "0" + - paragraph [ref=e196]: Active + - generic [ref=e197]: + - paragraph [ref=e198]: "0" + - paragraph [ref=e199]: Completed + - generic [ref=e201]: + - textbox "Search tasks..." [ref=e202] + - combobox [ref=e203]: + - option "All Priorities" [selected] + - option "high" + - option "medium" + - option "low" + - generic [ref=e204]: + - button "all" [ref=e205] [cursor=pointer] + - button "active" [ref=e206] [cursor=pointer] + - button "completed" [ref=e207] [cursor=pointer] + - paragraph [ref=e210]: No tasks yet. Add your first task! + - button "AI Assistant" [ref=e211] [cursor=pointer]: + - img [ref=e212] + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e223] + - generic [ref=e230]: + - heading "AI Assistant" [level=3] [ref=e231] + - paragraph [ref=e232]: Always here to help + - button [ref=e234] [cursor=pointer]: + - img [ref=e235] + - generic [ref=e239]: + - img [ref=e241] + - generic [ref=e248]: + - paragraph [ref=e249]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e250]: 04:23 PM + - generic [ref=e251]: + - generic [ref=e252]: + - textbox "Type your message..." [ref=e253] + - button [disabled]: + - img + - generic [ref=e255]: + - button "longcat icon LongCat" [ref=e257] [cursor=pointer]: + - img "longcat icon" [ref=e258] + - generic [ref=e259]: LongCat + - img [ref=e260] + - generic [ref=e262]: + - generic [ref=e263]: longcat + - link "AI settings" [ref=e264] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - heading "Add New Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Add Task" [disabled] + - generic: + - generic: + - generic: + - heading "Edit Task" [level=3] + - button: + - img + - generic: + - textbox "Task title *" + - textbox "Description (optional)" + - generic: + - combobox: + - option "Low Priority" + - option "Medium Priority" [selected] + - option "High Priority" + - generic: + - button "Due date (optional)": + - generic: Due date (optional) + - img + - generic: + - button "Cancel" + - button "Save Changes" [disabled] + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-24-05-157Z.yml b/.playwright-cli/page-2026-02-26T15-24-05-157Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-24-05-157Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-24-14-602Z.yml b/.playwright-cli/page-2026-02-26T15-24-14-602Z.yml new file mode 100644 index 0000000..6dd2582 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-24-14-602Z.yml @@ -0,0 +1,197 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:24 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-24-15-685Z.yml b/.playwright-cli/page-2026-02-26T15-24-15-685Z.yml new file mode 100644 index 0000000..6dd2582 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-24-15-685Z.yml @@ -0,0 +1,197 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:24 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-24-30-848Z.yml b/.playwright-cli/page-2026-02-26T15-24-30-848Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-24-30-848Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-24-40-199Z.yml b/.playwright-cli/page-2026-02-26T15-24-40-199Z.yml new file mode 100644 index 0000000..6dd2582 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-24-40-199Z.yml @@ -0,0 +1,197 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:24 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-24-42-323Z.yml b/.playwright-cli/page-2026-02-26T15-24-42-323Z.yml new file mode 100644 index 0000000..2584a1c --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-24-42-323Z.yml @@ -0,0 +1,197 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [active] [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:24 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-24-43-380Z.yml b/.playwright-cli/page-2026-02-26T15-24-43-380Z.yml new file mode 100644 index 0000000..2584a1c --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-24-43-380Z.yml @@ -0,0 +1,197 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [active] [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:24 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-25-29-514Z.yml b/.playwright-cli/page-2026-02-26T15-25-29-514Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-25-29-514Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-25-38-932Z.yml b/.playwright-cli/page-2026-02-26T15-25-38-932Z.yml new file mode 100644 index 0000000..a7e9817 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-25-38-932Z.yml @@ -0,0 +1,197 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:25 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-25-41-019Z.yml b/.playwright-cli/page-2026-02-26T15-25-41-019Z.yml new file mode 100644 index 0000000..76078dd --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-25-41-019Z.yml @@ -0,0 +1,197 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [active] [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:25 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-25-43-063Z.yml b/.playwright-cli/page-2026-02-26T15-25-43-063Z.yml new file mode 100644 index 0000000..76078dd --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-25-43-063Z.yml @@ -0,0 +1,197 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [active] [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:25 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-26-36-435Z.yml b/.playwright-cli/page-2026-02-26T15-26-36-435Z.yml new file mode 100644 index 0000000..0a86ad7 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-26-36-435Z.yml @@ -0,0 +1,14 @@ +- generic [ref=e5]: + - generic [ref=e7]: + - img "Trackeep Logo" [ref=e10] + - heading "Authentication Required" [level=1] [ref=e11] + - paragraph [ref=e12]: Please sign in to access Trackeep + - generic [ref=e13]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e19]: + - heading "Authentication Required" [level=3] [ref=e20] + - paragraph [ref=e21]: You need to be authenticated to access this page. Please sign in or create an account to continue. + - generic [ref=e22]: + - button "Sign In" [ref=e23] [cursor=pointer] + - button "Create Account" [ref=e24] [cursor=pointer] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-26-45-970Z.yml b/.playwright-cli/page-2026-02-26T15-26-45-970Z.yml new file mode 100644 index 0000000..985c2f2 --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-26-45-970Z.yml @@ -0,0 +1,197 @@ +- generic [active] [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:26 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/.playwright-cli/page-2026-02-26T15-26-48-313Z.yml b/.playwright-cli/page-2026-02-26T15-26-48-313Z.yml new file mode 100644 index 0000000..4854d6e --- /dev/null +++ b/.playwright-cli/page-2026-02-26T15-26-48-313Z.yml @@ -0,0 +1,197 @@ +- generic [ref=e1]: + - generic [ref=e4]: + - generic [ref=e7]: + - link "Trackeep Logo Trackeep" [ref=e9] [cursor=pointer]: + - /url: /app + - img "Trackeep Logo" [ref=e10] + - generic [ref=e11]: Trackeep + - group [ref=e13]: + - button "Trackeep Workspace" [ref=e14] [cursor=pointer]: + - generic [ref=e15]: + - img [ref=e17] + - generic [ref=e20]: Trackeep Workspace + - img [ref=e22] + - navigation [ref=e24]: + - link "Home" [ref=e25] [cursor=pointer]: + - /url: /app + - generic [ref=e26]: + - img [ref=e27] + - generic [ref=e31]: Home + - link "Bookmarks" [ref=e33] [cursor=pointer]: + - /url: /app/bookmarks + - generic [ref=e34]: + - img [ref=e35] + - generic [ref=e37]: Bookmarks + - link "Tasks" [ref=e39] [cursor=pointer]: + - /url: /app/tasks + - generic [ref=e40]: + - img [ref=e41] + - generic [ref=e44]: Tasks + - link "Time Tracking" [ref=e46] [cursor=pointer]: + - /url: /app/time-tracking + - generic [ref=e47]: + - img [ref=e48] + - generic [ref=e51]: Time Tracking + - link "Calendar" [ref=e53] [cursor=pointer]: + - /url: /app/calendar + - generic [ref=e54]: + - img [ref=e55] + - generic [ref=e57]: Calendar + - link "Files" [ref=e59] [cursor=pointer]: + - /url: /app/files + - generic [ref=e60]: + - img [ref=e61] + - generic [ref=e63]: Files + - link "Notes" [ref=e65] [cursor=pointer]: + - /url: /app/notes + - generic [ref=e66]: + - img [ref=e67] + - generic [ref=e69]: Notes + - link "Messages" [ref=e71] [cursor=pointer]: + - /url: /app/messages + - generic [ref=e72]: + - img [ref=e73] + - generic [ref=e75]: Messages + - link "YouTube" [ref=e77] [cursor=pointer]: + - /url: /app/youtube + - generic [ref=e78]: + - img [ref=e79] + - generic [ref=e82]: YouTube + - link "Members" [ref=e84] [cursor=pointer]: + - /url: /app/members + - generic [ref=e85]: + - img [ref=e86] + - generic [ref=e91]: Members + - link "Learning" [ref=e93] [cursor=pointer]: + - /url: /app/learning-paths + - generic [ref=e94]: + - img [ref=e95] + - generic [ref=e98]: Learning + - link "Stats" [ref=e100] [cursor=pointer]: + - /url: /app/stats + - generic [ref=e101]: + - img [ref=e102] + - generic [ref=e104]: Stats + - link "GitHub" [ref=e106] [cursor=pointer]: + - /url: /app/github + - generic [ref=e107]: + - img [ref=e108] + - generic [ref=e110]: GitHub + - link "AI Assistant" [ref=e112] [cursor=pointer]: + - /url: /app/chat + - generic [ref=e113]: + - img [ref=e114] + - generic [ref=e121]: AI Assistant + - generic [ref=e124]: + - generic [ref=e125]: Version 1.0.0 + - button "Update Failed" [ref=e126] [cursor=pointer]: + - generic [ref=e127]: + - img [ref=e128] + - generic [ref=e130]: Update Failed + - navigation [ref=e132]: + - link "Removed stuff" [ref=e133] [cursor=pointer]: + - /url: /app/removed-stuff + - generic [ref=e134]: + - img [ref=e135] + - generic [ref=e138]: Removed stuff + - link "Settings" [ref=e140] [cursor=pointer]: + - /url: /app/settings + - generic [ref=e141]: + - img [ref=e142] + - generic [ref=e145]: Settings + - button "Logout" [ref=e147] [cursor=pointer]: + - generic [ref=e148]: + - img [ref=e149] + - generic [ref=e153]: Logout + - generic [ref=e155]: + - generic [ref=e156]: + - generic [ref=e157]: + - button [ref=e158] [cursor=pointer]: + - img [ref=e159] + - button "Quick search" [ref=e160] [cursor=pointer]: + - img [ref=e161] + - text: Quick search + - generic [ref=e164]: + - button "Import a document" [ref=e165] [cursor=pointer]: + - img [ref=e166] + - text: Import a document + - button [ref=e170] [cursor=pointer]: + - img [ref=e171] + - img [ref=e176] + - button "AU" [ref=e180] [cursor=pointer]: + - generic [ref=e181]: AU + - img [ref=e182] + - main [ref=e184]: + - generic [ref=e186]: + - generic [ref=e187]: + - heading "Files" [level=1] [ref=e188] + - button "Upload File" [active] [ref=e189] [cursor=pointer]: + - img [ref=e190] + - text: Upload File + - generic [ref=e194]: + - textbox "Search files..." [ref=e195] + - combobox [ref=e196]: + - option "All Tags" [selected] + - paragraph [ref=e198]: No files uploaded yet. Upload your first file! + - button "AI Assistant" [ref=e199] [cursor=pointer]: + - img [ref=e200] + - generic [ref=e207]: + - generic [ref=e208]: + - generic [ref=e209]: + - img [ref=e211] + - generic [ref=e218]: + - heading "AI Assistant" [level=3] [ref=e219] + - paragraph [ref=e220]: Always here to help + - button [ref=e222] [cursor=pointer]: + - img [ref=e223] + - generic [ref=e227]: + - img [ref=e229] + - generic [ref=e236]: + - paragraph [ref=e237]: Hello! I'm your AI assistant. How can I help you today? + - paragraph [ref=e238]: 04:26 PM + - generic [ref=e239]: + - generic [ref=e240]: + - textbox "Type your message..." [ref=e241] + - button [disabled]: + - img + - generic [ref=e243]: + - button "longcat icon LongCat" [ref=e245] [cursor=pointer]: + - img "longcat icon" [ref=e246] + - generic [ref=e247]: LongCat + - img [ref=e248] + - generic [ref=e250]: + - generic [ref=e251]: longcat + - link "AI settings" [ref=e252] [cursor=pointer]: + - /url: /app/settings#ai + - generic: + - generic: + - generic: + - generic: + - heading [level=3] + - generic: Unknown size + - button: + - img + - generic: + - generic: Unknown file type + - generic: + - button "Download": + - img + - text: Download + - button "Open": + - img + - text: Open + - generic: + - generic: + - generic: + - heading "Import Documents" [level=3] + - button: + - img + - generic: + - generic: + - img + - heading "Drop files here" [level=4] + - paragraph: or click to browse + - button "Browse Files" + - generic: + - button "Cancel" + - button "Upload 0 Files" [disabled] \ No newline at end of file diff --git a/Dockerfile.youtube-search b/Dockerfile.youtube-search deleted file mode 100644 index 3eaa291..0000000 --- a/Dockerfile.youtube-search +++ /dev/null @@ -1,45 +0,0 @@ -# Build stage for YouTube search service -FROM golang:1.21-alpine AS builder - -# Install git and other build dependencies -RUN apk add --no-cache git - -# Set working directory -WORKDIR /app - -# Copy go mod files -COPY search.go ./ - -# Build the search service -RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o youtube-search search.go - -# Final stage -FROM alpine:latest - -# Install ca-certificates for HTTPS requests -RUN apk --no-cache add ca-certificates wget - -# Create non-root user -RUN addgroup -g 1001 -S appgroup && \ - adduser -u 1001 -S appuser -G appgroup - -WORKDIR /app - -# Copy the binary from builder stage -COPY --from=builder /app/youtube-search . - -# Change ownership to non-root user -RUN chown appuser:appgroup youtube-search - -# Switch to non-root user -USER appuser - -# Expose port -EXPOSE 8090 - -# Health check -HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \ - CMD wget --no-verbose --tries=1 --spider http://localhost:8090/youtube?q=test || exit 1 - -# Run the binary -CMD ["./youtube-search"] \ No newline at end of file diff --git a/Others/browser-extension/icons/icon128.png b/Others/browser-extension/icons/icon128.png index 97d928095aaf7f709c9d78ceb67f2839569c464c..97f57952b0d3f803394b13266de2d9dd4205e3d1 100644 GIT binary patch literal 769 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU^?OH;uumf=j~m8Bke$u;~(>$ z`fuc}PB_BUV`ONW%zSL6M8Gq#18P1w4XhGTjj{nDg3L=@CNEife(&=;|7z_whrhpC zeE0L)*-IvW4-o|#3j;4^->PQ(zp?n2$+tM?=yG*w*EhK@T&J0Qs9eM*m={p z631qN)`RA*90zL|yPESq@hF}Ym+L?N$=P@5y6np{btC_!YVb35C^HnYDD*KL5p1wv z5^!gD#Ni;r*kR1yQ2jeI^1Z%#gT-Zr9lt(rxRdV3P?*M8@b!7>*86in%I0`7$o#j{ z`Br-~N%0<^e*CKTy>W$D)oaVHnJ)Z#_mMcl0a#sySMcj2`L->lGHb#PH-6VjddLFz z3vONOiWz`GxAmygh8gRA&wuinVR!m@`?^}|DF2VCDkk4AMNQ*x5pbzq$$sz2r%r{Y zAJeKI_@?#WpY}huW`6SqnH@(zub(iV^UY<>hqbNeg^e1Po%GdFYA?7kN>*Ar+#TQaNIh%)Bk2Xo6y0Wo!^g_O5D-;^{g~;$32cm zCO@9++d;N>YIE>{|vVQGzlL8XS_ XlE}J?FK?&m| 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 diff --git a/Others/browser-extension/icons/icon16.png b/Others/browser-extension/icons/icon16.png index 97d928095aaf7f709c9d78ceb67f2839569c464c..c49afdb44663f2f94f1c66b6be12c4f63d2614a0 100644 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr*6y6C^SYa3ufv|Np=J z$yt(;k~1|*8IQ7Ucrd9T=l8h}zx7*U-yJ^nAiE=2ljYBGCZlKnf7E|}8lMyNKQYnl zL!trCqKSetlka|cYtPKge0XA%-yEr&S^JF*fIw#LIj0_*&_$Q|_yqF4f2ZN`ppUXO@geCy+PDyY8 literal 41215 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 diff --git a/Others/browser-extension/icons/icon32.png b/Others/browser-extension/icons/icon32.png index 97d928095aaf7f709c9d78ceb67f2839569c464c..6bd6c23dedeef9b87eb7bb89ea066e815bb0fa28 100644 GIT binary patch literal 275 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 diff --git a/Others/browser-extension/icons/icon48.png b/Others/browser-extension/icons/icon48.png index 97d928095aaf7f709c9d78ceb67f2839569c464c..bdab2a48c1a634c12f9803d57f3dd603d0fcd18e 100644 GIT binary patch literal 346 zcmV-g0j2(lP)}|f`Y4uEanMZw-b{`mwK9NM1M12%566-kNF#5edYiFFd6{d_o=Ti zKSZAaGJp*kz=jN9Lk6(%R*9>mV}LvhSADBQp8+y}4H>{jxeBdL{Oi1n)ukR&hO{%M z^IPe|kdENCmZNhWu*s0g469J~MqOJgd6qg0mNk5Xf5bj#y9uQM+rGUoRPnVkfMr4_ suJ$X`wF%vL{okRH@eg}s1VKd32k!q)?&m| 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 diff --git a/Others/browser-extension/options.html b/Others/browser-extension/options.html index 940fce1..7fd1053 100644 --- a/Others/browser-extension/options.html +++ b/Others/browser-extension/options.html @@ -4,260 +4,527 @@ Trackeep Saver – Options -

- - Trackeep Saver – Options -

-

Configure how the extension connects to your Trackeep backend.

- -
-
API Configuration
- - - - - -
- How to get your token:
- 1. Log into Trackeep in your browser.
- 2. Open DevTools → Application → Local Storage.
- 3. Find the key trackeep_token and copy its value.
- 4. Paste it above. Never share this token publicly. + +
+
+
+ +
+

Trackeep Saver

+

Configure your extension settings

+
+
+
- -
-
+ +
+
+
+
+ + + + +
+

API Configuration

+
+ +
+ + +
+ +
+ + +
+ +
+
+ + + + + + + + How to get your authentication token: +
+
    +
  1. Log into your Trackeep account in your browser
  2. +
  3. Open Developer Tools (F12) → Application → Local Storage
  4. +
  5. Find key trackeep_token and copy its value
  6. +
  7. Paste token in field above
  8. +
  9. Never share this token publicly - it provides full access to your account
  10. +
+
+ + + + +
+
diff --git a/Others/browser-extension/options.js b/Others/browser-extension/options.js index 9e03ad3..cdbe1f0 100644 --- a/Others/browser-extension/options.js +++ b/Others/browser-extension/options.js @@ -3,13 +3,41 @@ const apiBaseUrlInput = document.getElementById('apiBaseUrl'); const authTokenInput = document.getElementById('authToken'); const saveBtn = document.getElementById('saveBtn'); -const statusEl = document.getElementById('status'); +const statusMessageEl = document.getElementById('statusMessage'); -function setStatus(message, type) { - statusEl.textContent = message || ''; - statusEl.classList.remove('success', 'error'); - if (type) { - statusEl.classList.add(type); +function showMessage(message, type = 'info', duration = 5000) { + statusMessageEl.textContent = message; + statusMessageEl.className = `status-message ${type}`; + statusMessageEl.style.display = 'flex'; + + if (duration > 0) { + setTimeout(() => { + statusMessageEl.style.display = 'none'; + }, duration); + } +} + +function hideMessage() { + statusMessageEl.style.display = 'none'; +} + +function setButtonLoading(button, loading = true) { + if (loading) { + button.disabled = true; + const originalContent = button.innerHTML; + button.dataset.originalContent = originalContent; + button.innerHTML = ` + + + + Saving... + `; + } else { + button.disabled = false; + if (button.dataset.originalContent) { + button.innerHTML = button.dataset.originalContent; + delete button.dataset.originalContent; + } } } @@ -63,17 +91,17 @@ function saveSettings() { const authToken = authTokenInput.value.trim(); if (!apiBaseUrl) { - setStatus('API base URL is required.', 'error'); + showMessage('API base URL is required.', 'error'); return; } if (!authToken) { - setStatus('Auth token is required.', 'error'); + showMessage('Authentication token is required.', 'error'); return; } - saveBtn.disabled = true; - setStatus('Saving…', null); + setButtonLoading(saveBtn, true); + hideMessage(); chrome.storage.sync.set( { @@ -81,18 +109,22 @@ function saveSettings() { trackeepAuthToken: authToken }, () => { - saveBtn.disabled = false; + setButtonLoading(saveBtn, false); if (chrome.runtime.lastError) { - setStatus(`Failed to save: ${chrome.runtime.lastError.message}`, 'error'); + showMessage(`Failed to save: ${chrome.runtime.lastError.message}`, 'error'); } else { - setStatus('Settings saved. You can now use the popup to save bookmarks and files.', 'success'); + showMessage(` + + + + Settings saved successfully! You can now use the extension to save bookmarks and files. + `, 'success'); } } ); } -// Init - +// Initialize everything when DOM is loaded document.addEventListener('DOMContentLoaded', () => { detectAndPrefillApiBaseUrl(() => { loadSettings(); diff --git a/Others/browser-extension/popup.html b/Others/browser-extension/popup.html index cd7c62e..82e4a8a 100644 --- a/Others/browser-extension/popup.html +++ b/Others/browser-extension/popup.html @@ -4,136 +4,345 @@ Trackeep Saver -

- - Trackeep Saver -

-
- - - -
-
Save current page / video
- - - - - - - - - - - - -
-
- - + +
+
+
+ +

Trackeep

- +
+
+ + +
+
+
Checking configuration...
-
- -
-
Upload file to Trackeep
- - - - - - -
- + +
+ +
+ +
-
-
+ +
+
+
+
+ + + + +
+

Save Current Page

+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ + +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+ + + + + +
+

Upload File

+
+ +
+ + +
+ +
+ + +
+ + +
+
+ + + + diff --git a/Others/browser-extension/popup.js b/Others/browser-extension/popup.js index e90b37c..2006dd8 100644 --- a/Others/browser-extension/popup.js +++ b/Others/browser-extension/popup.js @@ -1,9 +1,16 @@ /* global chrome */ -const statusEl = document.getElementById('status'); -const configHintEl = document.getElementById('configHint'); +// DOM Elements +const statusIndicatorEl = document.getElementById('statusIndicator'); +const statusTextEl = document.getElementById('statusText'); +const statusMessageEl = document.getElementById('statusMessage'); const openOptionsBtn = document.getElementById('openOptions'); +// Tab elements +const tabBtns = document.querySelectorAll('.tab'); +const tabContents = document.querySelectorAll('.tab-content'); + +// Bookmark elements const bookmarkTitleInput = document.getElementById('bookmarkTitle'); const bookmarkUrlInput = document.getElementById('bookmarkUrl'); const bookmarkDescriptionInput = document.getElementById('bookmarkDescription'); @@ -11,6 +18,7 @@ const bookmarkTagsInput = document.getElementById('bookmarkTags'); const bookmarkPublicInput = document.getElementById('bookmarkPublic'); const saveBookmarkBtn = document.getElementById('saveBookmarkBtn'); +// File elements const fileInput = document.getElementById('fileInput'); const fileDescriptionInput = document.getElementById('fileDescription'); const uploadFileBtn = document.getElementById('uploadFileBtn'); @@ -20,19 +28,86 @@ let trackeepConfig = { authToken: '' }; -function setStatus(message, type) { - statusEl.textContent = message || ''; - statusEl.classList.remove('error', 'success'); - if (type) { - statusEl.classList.add(type); +// Tab switching functionality +function initTabs() { + tabBtns.forEach(btn => { + btn.addEventListener('click', () => { + const targetTab = btn.dataset.tab; + + // Update button states + tabBtns.forEach(b => b.classList.remove('active')); + btn.classList.add('active'); + + // Update content visibility + tabContents.forEach(content => { + content.classList.remove('active'); + if (content.id === `${targetTab}-tab`) { + content.classList.add('active'); + } + }); + }); + }); +} + +// Status management +function updateStatus(text, type = 'info') { + statusTextEl.textContent = text; + statusIndicatorEl.className = 'status-indicator'; + + if (type === 'success') { + statusIndicatorEl.classList.add('connected'); + } else if (type === 'error') { + statusIndicatorEl.classList.add('error'); + } +} + +function showMessage(message, type = 'info', duration = 5000) { + statusMessageEl.textContent = message; + statusMessageEl.className = `status-message ${type}`; + statusMessageEl.style.display = 'flex'; + + // Auto-hide after duration + if (duration > 0) { + setTimeout(() => { + statusMessageEl.style.display = 'none'; + }, duration); + } +} + +function hideMessage() { + statusMessageEl.style.display = 'none'; +} + +// Loading states +function setButtonLoading(button, loading = true) { + if (loading) { + button.disabled = true; + const originalContent = button.innerHTML; + button.dataset.originalContent = originalContent; + button.innerHTML = ` + + + + Processing... + `; + } else { + button.disabled = false; + if (button.dataset.originalContent) { + button.innerHTML = button.dataset.originalContent; + delete button.dataset.originalContent; + } } } function disableForms(disabled) { - [bookmarkTitleInput, bookmarkUrlInput, bookmarkDescriptionInput, bookmarkTagsInput, bookmarkPublicInput, saveBookmarkBtn, - fileInput, fileDescriptionInput, uploadFileBtn].forEach((el) => { - if (!el) return; - el.disabled = disabled; + const elements = [ + bookmarkTitleInput, bookmarkUrlInput, bookmarkDescriptionInput, + bookmarkTagsInput, bookmarkPublicInput, saveBookmarkBtn, + fileInput, fileDescriptionInput, uploadFileBtn + ]; + + elements.forEach(el => { + if (el) el.disabled = disabled; }); } @@ -44,10 +119,12 @@ function loadConfig(callback) { trackeepConfig = { apiBaseUrl, authToken }; if (!apiBaseUrl || !authToken) { - configHintEl.textContent = 'Configure API URL and token in Options to enable saving.'; + updateStatus('Configuration required', 'error'); + showMessage('Configure API URL and token in Options to enable saving.', 'error'); disableForms(true); } else { - configHintEl.textContent = `Using API: ${apiBaseUrl}`; + updateStatus(`Connected to ${apiBaseUrl}`, 'success'); + hideMessage(); disableForms(false); } @@ -67,11 +144,9 @@ function detectTrackeepDomain(callback) { try { const url = new URL(tab.url); - // Common Trackeep domains: localhost, trackeep.*, etc. const isTrackeepDomain = url.hostname.includes('trackeep') || url.hostname === 'localhost'; if (isTrackeepDomain && url.protocol === 'https:') { const candidate = `${url.origin}/api/v1`; - // Only pre-fill if not already set chrome.storage.sync.get(['trackeepApiBaseUrl'], (items) => { if (!items.trackeepApiBaseUrl) { chrome.storage.sync.set({ trackeepApiBaseUrl: candidate }, () => { @@ -96,11 +171,9 @@ function initActiveTab() { const tab = tabs && tabs[0]; if (!tab) return; - // Check for context menu data first chrome.storage.local.get(['contextMenuData'], (items) => { const ctx = items.contextMenuData; if (ctx && ctx.timestamp && Date.now() - ctx.timestamp < 5000) { - // Use context menu data if recent if (ctx.url && !bookmarkUrlInput.value) { bookmarkUrlInput.value = ctx.url; } @@ -110,10 +183,8 @@ function initActiveTab() { if (ctx.selection && !bookmarkDescriptionInput.value) { bookmarkDescriptionInput.value = ctx.selection; } - // Clear after using chrome.storage.local.remove(['contextMenuData']); } else { - // Fallback to active tab if (tab.title && !bookmarkTitleInput.value) { bookmarkTitleInput.value = tab.title; } @@ -127,17 +198,17 @@ function initActiveTab() { async function saveBookmark(event) { event.preventDefault(); - setStatus('', null); + hideMessage(); const { apiBaseUrl, authToken } = trackeepConfig; if (!apiBaseUrl || !authToken) { - setStatus('Missing API URL or auth token. Open options first.', 'error'); + showMessage('Missing API URL or auth token. Open options first.', 'error'); return; } const url = bookmarkUrlInput.value.trim(); if (!url) { - setStatus('URL is required.', 'error'); + showMessage('URL is required.', 'error'); return; } @@ -158,8 +229,8 @@ async function saveBookmark(event) { is_public: isPublic }; - saveBookmarkBtn.disabled = true; - setStatus('Saving bookmark…', null); + setButtonLoading(saveBookmarkBtn, true); + showMessage('Saving bookmark...', 'info', 0); try { const base = apiBaseUrl.replace(/\/$/, ''); @@ -185,28 +256,41 @@ async function saveBookmark(event) { throw new Error(errorMessage); } - setStatus('Bookmark saved to Trackeep.', 'success'); + showMessage(` + + + + Bookmark saved successfully! + `, 'success'); + + // Clear form after successful save + setTimeout(() => { + bookmarkDescriptionInput.value = ''; + bookmarkTagsInput.value = ''; + bookmarkPublicInput.checked = false; + }, 2000); + } catch (err) { console.error('Error saving bookmark', err); - setStatus(err && err.message ? err.message : 'Failed to save bookmark.', 'error'); + showMessage(err && err.message ? err.message : 'Failed to save bookmark.', 'error'); } finally { - saveBookmarkBtn.disabled = false; + setButtonLoading(saveBookmarkBtn, false); } } async function uploadFile(event) { event.preventDefault(); - setStatus('', null); + hideMessage(); const { apiBaseUrl, authToken } = trackeepConfig; if (!apiBaseUrl || !authToken) { - setStatus('Missing API URL or auth token. Open options first.', 'error'); + showMessage('Missing API URL or auth token. Open options first.', 'error'); return; } const file = fileInput.files && fileInput.files[0]; if (!file) { - setStatus('Please choose a file to upload.', 'error'); + showMessage('Please choose a file to upload.', 'error'); return; } @@ -218,8 +302,8 @@ async function uploadFile(event) { formData.append('description', description); } - uploadFileBtn.disabled = true; - setStatus('Uploading file…', null); + setButtonLoading(uploadFileBtn, true); + showMessage('Uploading file...', 'info', 0); try { const base = apiBaseUrl.replace(/\/$/, ''); @@ -244,14 +328,24 @@ async function uploadFile(event) { throw new Error(errorMessage); } - setStatus('File uploaded to Trackeep.', 'success'); - fileInput.value = ''; - fileDescriptionInput.value = ''; + showMessage(` + + + + File uploaded successfully! + `, 'success'); + + // Clear form after successful upload + setTimeout(() => { + fileInput.value = ''; + fileDescriptionInput.value = ''; + }, 2000); + } catch (err) { console.error('Error uploading file', err); - setStatus(err && err.message ? err.message : 'Failed to upload file.', 'error'); + showMessage(err && err.message ? err.message : 'Failed to upload file.', 'error'); } finally { - uploadFileBtn.disabled = false; + setButtonLoading(uploadFileBtn, false); } } @@ -263,9 +357,12 @@ function openOptions() { } } -// Init - +// Initialize everything when DOM is loaded document.addEventListener('DOMContentLoaded', () => { + // Initialize tabs + initTabs(); + + // Event listeners openOptionsBtn.addEventListener('click', openOptions); saveBookmarkBtn.addEventListener('click', (e) => { e.preventDefault(); @@ -276,6 +373,7 @@ document.addEventListener('DOMContentLoaded', () => { uploadFile(e); }); + // Initialize configuration and active tab detectTrackeepDomain(() => { loadConfig(() => { initActiveTab(); diff --git a/backend/handlers/admin.go b/backend/handlers/admin.go index aba19ae..574b58d 100644 --- a/backend/handlers/admin.go +++ b/backend/handlers/admin.go @@ -8,6 +8,7 @@ import ( "github.com/gin-gonic/gin" "github.com/trackeep/backend/config" "github.com/trackeep/backend/models" + "golang.org/x/crypto/bcrypt" ) // AdminMiddleware checks if user is admin @@ -212,6 +213,71 @@ func AdminGetUsers(c *gin.Context) { }) } +// AdminCreateUser handles POST /api/v1/admin/users +func AdminCreateUser(c *gin.Context) { + db := config.GetDB() + + var req struct { + Email string `json:"email" binding:"required,email"` + Username string `json:"username" binding:"required,min=3,max=50"` + Password string `json:"password" binding:"required,min=6"` + FullName string `json:"fullName" binding:"required,min=1,max=100"` + Role string `json:"role"` + } + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + role := req.Role + if role == "" { + role = "user" + } + if role != "user" && role != "admin" { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid role. Must be 'user' or 'admin'"}) + return + } + + var existing models.User + if err := db.Where("email = ?", req.Email).First(&existing).Error; err == nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "User with this email already exists"}) + return + } + if err := db.Where("username = ?", req.Username).First(&existing).Error; err == nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Username already taken"}) + return + } + + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"}) + return + } + + user := models.User{ + Email: req.Email, + Username: req.Username, + Password: string(hashedPassword), + FullName: req.FullName, + Role: role, + Theme: "dark", + } + + if err := db.Create(&user).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create user"}) + return + } + + _ = ensureMessagingDefaults(db, user.ID) + + user.Password = "" + c.JSON(http.StatusCreated, gin.H{ + "message": "User created successfully", + "user": user, + }) +} + // AdminUpdateUserRole handles PUT /api/v1/admin/users/:id/role func AdminUpdateUserRole(c *gin.Context) { db := config.GetDB() diff --git a/backend/handlers/ai_features.go b/backend/handlers/ai_features.go index 193e079..e416c5a 100644 --- a/backend/handlers/ai_features.go +++ b/backend/handlers/ai_features.go @@ -588,7 +588,7 @@ Provide a JSON array of task objects with: - context_data: Additional context - deadline: Suggested deadline (ISO date or null) - estimated_time: Estimated time in minutes -- confidence: Confidence score 0-1`, contextData, limit) +- confidence: Confidence score 0-1`, limit, contextData) messages := []services.Message{ {Role: "system", Content: "You are a productivity assistant. Always respond with valid JSON array."}, diff --git a/backend/handlers/auth.go b/backend/handlers/auth.go index 333d913..379beb1 100644 --- a/backend/handlers/auth.go +++ b/backend/handlers/auth.go @@ -95,6 +95,33 @@ func ValidateJWT(tokenString string) (*Claims, error) { return nil, errors.New("invalid token") } +func getAuthenticatedUserFromHeader(c *gin.Context, db *gorm.DB) (*models.User, error) { + authHeader := c.GetHeader("Authorization") + if authHeader == "" { + return nil, errors.New("authorization header required") + } + + tokenString := authHeader + if strings.HasPrefix(authHeader, "Bearer ") { + tokenString = strings.TrimSpace(strings.TrimPrefix(authHeader, "Bearer ")) + } + if tokenString == "" { + return nil, errors.New("invalid authorization header") + } + + claims, err := ValidateJWT(tokenString) + if err != nil { + return nil, err + } + + var user models.User + if err := db.First(&user, claims.UserID).Error; err != nil { + return nil, err + } + + return &user, nil +} + // AuthMiddleware validates JWT tokens func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { @@ -202,6 +229,24 @@ func Register(c *gin.Context) { db := config.GetDB() + // Registration rules: + // - First user can self-register and becomes admin. + // - After that, only authenticated admins can create users. + var userCount int64 + if err := db.Model(&models.User{}).Count(&userCount).Error; err != nil { + c.JSON(500, gin.H{"error": "Failed to check existing users"}) + return + } + + isFirstUser := userCount == 0 + if !isFirstUser { + requester, err := getAuthenticatedUserFromHeader(c, db) + if err != nil || requester.Role != "admin" { + c.JSON(403, gin.H{"error": "Registration is disabled. Only an administrator can create users."}) + return + } + } + // Check if user already exists var existingUser models.User if err := db.Where("email = ?", req.Email).First(&existingUser).Error; err == nil { @@ -222,11 +267,17 @@ func Register(c *gin.Context) { } // Create user + role := "user" + if isFirstUser { + role = "admin" + } + user := models.User{ Email: req.Email, Username: req.Username, Password: string(hashedPassword), FullName: req.FullName, + Role: role, Theme: "dark", } diff --git a/backend/handlers/file.go b/backend/handlers/file.go index 1b82979..15c964d 100644 --- a/backend/handlers/file.go +++ b/backend/handlers/file.go @@ -6,6 +6,7 @@ import ( "net/http" "os" "path/filepath" + "strconv" "strings" "time" @@ -18,10 +19,40 @@ import ( func GetFiles(c *gin.Context) { var files []models.File - // TODO: Get user ID from authentication context - userID := uint(1) // Placeholder + userID := c.GetUint("user_id") + if userID == 0 { + userID = c.GetUint("userID") + } + if userID == 0 { + c.JSON(http.StatusUnauthorized, gin.H{"error": "User not authenticated"}) + return + } - if err := models.DB.Where("user_id = ?", userID).Find(&files).Error; err != nil { + query := models.DB.Where("user_id = ?", userID) + + if rawQuery := strings.TrimSpace(c.Query("q")); rawQuery != "" { + needle := "%" + strings.ToLower(rawQuery) + "%" + query = query.Where("LOWER(original_name) LIKE ? OR LOWER(description) LIKE ?", needle, needle) + } + + limitApplied := false + if limitRaw := strings.TrimSpace(c.Query("limit")); limitRaw != "" { + limit, err := strconv.Atoi(limitRaw) + if err != nil || limit <= 0 { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid limit"}) + return + } + if limit > 100 { + limit = 100 + } + query = query.Limit(limit) + limitApplied = true + } + if !limitApplied && strings.TrimSpace(c.Query("q")) != "" { + query = query.Limit(20) + } + + if err := query.Order("created_at DESC").Find(&files).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to retrieve files"}) return } diff --git a/backend/handlers/messages.go b/backend/handlers/messages.go index 3927869..9450006 100644 --- a/backend/handlers/messages.go +++ b/backend/handlers/messages.go @@ -640,41 +640,23 @@ func CreateConversationMessage(c *gin.Context) { return } - if strings.TrimSpace(req.Body) == "" && len(req.Attachments) == 0 { + trimmedBody := strings.TrimSpace(req.Body) + if trimmedBody == "" && len(req.Attachments) == 0 { c.JSON(http.StatusBadRequest, gin.H{"error": "Message body or attachments are required"}) return } - metadataJSON := "{}" - if req.Metadata != nil { - if raw, err := json.Marshal(req.Metadata); err == nil { - metadataJSON = string(raw) - } - } - - message := models.Message{ - ConversationID: conversationID, - SenderID: userID, - Body: strings.TrimSpace(req.Body), - MetadataJSON: metadataJSON, - } - if err := models.DB.Create(&message).Error; err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create message"}) - return - } - attachmentRows := make([]models.MessageAttachment, 0, len(req.Attachments)) for _, a := range req.Attachments { attachmentRows = append(attachmentRows, models.MessageAttachment{ - MessageID: message.ID, - Kind: normalizeAttachmentKind(a.Kind), - FileID: a.FileID, - URL: a.URL, - Title: a.Title, + Kind: normalizeAttachmentKind(a.Kind), + FileID: a.FileID, + URL: a.URL, + Title: a.Title, }) } - suggestions, inferredAttachments, isSensitive := services.DetectMessageContent(message.Body) + suggestions, inferredAttachments, isSensitive := services.DetectMessageContent(trimmedBody) for _, inferred := range inferredAttachments { if hasAttachment(attachmentRows, inferred.Kind, inferred.URL) { continue @@ -684,13 +666,55 @@ func CreateConversationMessage(c *gin.Context) { previewJSON = string(raw) } attachmentRows = append(attachmentRows, models.MessageAttachment{ - MessageID: message.ID, Kind: normalizeAttachmentKind(inferred.Kind), URL: inferred.URL, Title: inferred.Title, PreviewJSON: previewJSON, }) } + + metadataMap := map[string]interface{}{} + for k, v := range req.Metadata { + metadataMap[k] = v + } + + storedBody := trimmedBody + if isSensitive && (conv.Type == models.ConversationTypeDM || conv.Type == models.ConversationTypeSelf) && trimmedBody != "" { + ciphertext, err := utils.Encrypt(trimmedBody) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to encrypt sensitive message"}) + return + } + storedBody = maskSensitiveBody(trimmedBody) + metadataMap["sensitive_payload"] = map[string]interface{}{ + "version": "v1", + "ciphertext": ciphertext, + "masked_body": storedBody, + "scope": string(conv.Type), + } + } + + metadataJSON := "{}" + if len(metadataMap) > 0 { + if raw, err := json.Marshal(metadataMap); err == nil { + metadataJSON = string(raw) + } + } + + message := models.Message{ + ConversationID: conversationID, + SenderID: userID, + Body: storedBody, + MetadataJSON: metadataJSON, + } + if err := models.DB.Create(&message).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create message"}) + return + } + + for i := range attachmentRows { + attachmentRows[i].MessageID = message.ID + } if len(attachmentRows) > 0 { models.DB.Create(&attachmentRows) } @@ -1187,6 +1211,37 @@ func DismissMessageSuggestion(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"suggestion": suggestion}) } +// RevealSensitiveMessage decrypts and returns sensitive message plaintext for authorized members. +func RevealSensitiveMessage(c *gin.Context) { + userID := getAuthUserID(c) + messageID, err := parseUintParam(c, "id") + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid message id"}) + return + } + + var msg models.Message + if err := models.DB.First(&msg, messageID).Error; err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "Message not found"}) + return + } + if _, _, err := getConversationWithMembership(models.DB, msg.ConversationID, userID); err != nil { + c.JSON(http.StatusForbidden, gin.H{"error": "Access denied"}) + return + } + + plaintext, ok := extractSensitivePlaintext(msg.MetadataJSON) + if !ok { + c.JSON(http.StatusNotFound, gin.H{"error": "Sensitive payload not found"}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "message_id": msg.ID, + "plaintext": plaintext, + }) +} + // GetPasswordVaultItems returns owned and explicitly shared vault items. func GetPasswordVaultItems(c *gin.Context) { userID := getAuthUserID(c) @@ -1760,11 +1815,15 @@ func applySuggestionAction(db *gorm.DB, userID uint, message *models.Message, su return gin.H{"deep_link": ref.DeepLink}, nil case "move_to_password_vault": + secretSource := message.Body + if sensitivePlaintext, ok := extractSensitivePlaintext(message.MetadataJSON); ok { + secretSource = sensitivePlaintext + } label := "Imported from chat" - if compact := compactMessageTitle(message.Body, 50); compact != "" { + if compact := compactMessageTitle(secretSource, 50); compact != "" { label = compact } - encryptedSecret, err := utils.Encrypt(message.Body) + encryptedSecret, err := utils.Encrypt(secretSource) if err != nil { return nil, err } @@ -2026,6 +2085,70 @@ func hasAttachment(rows []models.MessageAttachment, kind, url string) bool { return false } +func maskSensitiveBody(text string) string { + trimmed := strings.TrimSpace(text) + if trimmed == "" { + return "[sensitive content hidden]" + } + + parts := strings.Fields(trimmed) + if len(parts) == 0 { + return "[sensitive content hidden]" + } + + maskedParts := make([]string, 0, len(parts)) + for _, part := range parts { + runes := []rune(part) + if len(runes) <= 2 { + maskedParts = append(maskedParts, "**") + continue + } + maskedParts = append(maskedParts, strings.Repeat("*", len(runes))) + } + return strings.Join(maskedParts, " ") +} + +func extractSensitivePlaintext(metadataJSON string) (string, bool) { + payload := extractSensitivePayload(metadataJSON) + if payload == nil { + return "", false + } + + ciphertext := asString(payload["ciphertext"]) + if ciphertext == "" { + return "", false + } + + plaintext, err := utils.Decrypt(ciphertext) + if err != nil { + return "", false + } + return plaintext, true +} + +func extractSensitivePayload(metadataJSON string) map[string]interface{} { + trimmed := strings.TrimSpace(metadataJSON) + if trimmed == "" || trimmed == "{}" { + return nil + } + + metadata := map[string]interface{}{} + if err := json.Unmarshal([]byte(trimmed), &metadata); err != nil { + return nil + } + + rawPayload, ok := metadata["sensitive_payload"] + if !ok || rawPayload == nil { + return nil + } + + payload, ok := rawPayload.(map[string]interface{}) + if !ok { + return nil + } + return payload +} + func normalizeAttachmentKind(kind string) string { k := strings.ToLower(strings.TrimSpace(kind)) switch k { diff --git a/backend/main.go b/backend/main.go index 7e60b01..c32e442 100644 --- a/backend/main.go +++ b/backend/main.go @@ -369,6 +369,7 @@ func main() { messages.GET("/messages/:id/suggestions", handlers.GetMessageSuggestions) messages.POST("/messages/:id/suggestions/:suggestionId/accept", handlers.AcceptMessageSuggestion) messages.POST("/messages/:id/suggestions/:suggestionId/dismiss", handlers.DismissMessageSuggestion) + messages.POST("/messages/:id/reveal-sensitive", handlers.RevealSensitiveMessage) messages.GET("/ws", handlers.MessagesWebSocket) messages.GET("/password-vault/items", handlers.GetPasswordVaultItems) diff --git a/backend/services/favicon_fetcher.go b/backend/services/favicon_fetcher.go index 70aae10..6cbb07c 100644 --- a/backend/services/favicon_fetcher.go +++ b/backend/services/favicon_fetcher.go @@ -196,6 +196,10 @@ func (ff *FaviconFetcher) makeAbsoluteURL(href string, baseURL *url.URL) string if idx := strings.Index(href, "#"); idx != -1 { href = href[:idx] } + href = strings.TrimSpace(href) + if href == "" { + return "" + } // Handle different URL types if strings.HasPrefix(href, "http://") || strings.HasPrefix(href, "https://") { @@ -206,22 +210,11 @@ func (ff *FaviconFetcher) makeAbsoluteURL(href string, baseURL *url.URL) string return baseURL.Scheme + ":" + href } - if strings.HasPrefix(href, "/") { - return baseURL.Scheme + "://" + baseURL.Host + href + ref, err := url.Parse(href) + if err != nil { + return href } - - // Relative path - construct proper URL - if baseURL.Path == "" || baseURL.Path == "/" { - return baseURL.Scheme + "://" + baseURL.Host + "/" + href - } - - // Remove filename from base path - basePath := baseURL.Path - if lastSlash := strings.LastIndex(basePath, "/"); lastSlash != -1 { - basePath = basePath[:lastSlash+1] - } - - return baseURL.Scheme + "://" + baseURL.Host + basePath + href + return baseURL.ResolveReference(ref).String() } // tryCommonLocations tries common favicon file paths diff --git a/docker-compose.published.yml b/docker-compose.published.yml new file mode 100644 index 0000000..fde10e6 --- /dev/null +++ b/docker-compose.published.yml @@ -0,0 +1,56 @@ +services: + postgres: + image: postgres:15-alpine + environment: + POSTGRES_DB: ${DB_NAME:-trackeep} + POSTGRES_USER: ${DB_USER:-trackeep} + POSTGRES_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-trackeep} -d ${DB_NAME:-trackeep}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + + trackeep-backend: + image: ghcr.io/Dvorinka/trackeep/backend:latest + ports: + - "${PORT:-8080}:8080" + env_file: + - .env + volumes: + - ./data:/data + - ./uploads:/app/uploads + restart: unless-stopped + depends_on: + postgres: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:8080/health || wget --no-verbose --tries=1 --spider http://localhost:8080/live"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + trackeep-frontend: + image: ghcr.io/Dvorinka/trackeep/frontend:latest + ports: + - "5173:80" + depends_on: + trackeep-backend: + condition: service_healthy + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pgrep nginx > /dev/null || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 20s + +volumes: + postgres_data: diff --git a/docker-compose.yml b/docker-compose.yml index bc864c4..56e1771 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,16 +2,16 @@ services: postgres: image: postgres:15-alpine environment: - POSTGRES_DB: ${POSTGRES_DB:-trackeep} - POSTGRES_USER: ${POSTGRES_USER:-trackeep} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} + POSTGRES_DB: ${DB_NAME:-trackeep} + POSTGRES_USER: ${DB_USER:-trackeep} + POSTGRES_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD is required} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-trackeep} -d ${POSTGRES_DB:-trackeep}"] + test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-trackeep} -d ${DB_NAME:-trackeep}"] interval: 10s timeout: 5s retries: 5 diff --git a/enable-demo-mode.js b/enable-demo-mode.js deleted file mode 100644 index 3261518..0000000 --- a/enable-demo-mode.js +++ /dev/null @@ -1,4 +0,0 @@ -// Enable demo mode - run this in browser console -localStorage.setItem('demoMode', 'true'); -document.title = 'Trackeep - Demo Mode'; -console.log('Demo mode enabled! Refresh the page to see changes.'); diff --git a/frontend/src/components/AuthenticationWarning.tsx b/frontend/src/components/AuthenticationWarning.tsx index 42b714a..776f444 100644 --- a/frontend/src/components/AuthenticationWarning.tsx +++ b/frontend/src/components/AuthenticationWarning.tsx @@ -27,11 +27,13 @@ export const AuthenticationWarning = () => {
- Trackeep Logo +
+ Trackeep Logo +

Authentication Required

Please sign in to access Trackeep

diff --git a/frontend/src/components/ProtectedRoute.tsx b/frontend/src/components/ProtectedRoute.tsx index a9a3803..16df568 100644 --- a/frontend/src/components/ProtectedRoute.tsx +++ b/frontend/src/components/ProtectedRoute.tsx @@ -1,32 +1,32 @@ import { useAuth } from '@/lib/auth'; import { AuthenticationWarning } from '@/components/AuthenticationWarning'; import { isDemoMode } from '@/lib/demo-mode'; +import { Show } from 'solid-js'; interface ProtectedRouteProps { children: any; } export const ProtectedRoute = (props: ProtectedRouteProps) => { - // In demo mode, show UI immediately without any checks - if (isDemoMode()) { - console.log('[ProtectedRoute] Demo mode active - showing UI immediately'); - return props.children; - } - const { authState } = useAuth(); - console.log('[ProtectedRoute] Render:', { - isDemoMode: isDemoMode(), - isAuthenticated: authState.isAuthenticated, - isLoading: authState.isLoading - }); - - // If not authenticated, show authentication warning (no loading state) - if (!authState.isAuthenticated) { - console.log('[ProtectedRoute] Rendering authentication warning'); - return ; - } - - console.log('[ProtectedRoute] Rendering children'); - return props.children; + return ( + + +
+
+

Checking authentication...

+
+
+ } + > + }> + {props.children} + + + + ); }; diff --git a/frontend/src/components/Timer.tsx b/frontend/src/components/Timer.tsx index e8264ed..09756b0 100644 --- a/frontend/src/components/Timer.tsx +++ b/frontend/src/components/Timer.tsx @@ -16,6 +16,7 @@ import { type TimeEntry } from '../lib/api'; import { TagPicker } from '@/components/ui/TagPicker'; +import { isDemoMode } from '@/lib/demo-mode'; interface TimerProps { onTimeEntryCreated?: (timeEntry: TimeEntry) => void; @@ -38,13 +39,6 @@ export const Timer = (props: TimerProps) => { const [showSettings, setShowSettings] = createSignal(false); const [availableTags, setAvailableTags] = createSignal([]); - // Check if we're in demo mode - const isDemoMode = () => { - return localStorage.getItem('demoMode') === 'true' || - document.title.includes('Demo Mode') || - window.location.search.includes('demo=true'); - }; - // Use appropriate API based on demo mode const getApi = () => isDemoMode() ? demoTimeEntriesApi : timeEntriesApi; diff --git a/frontend/src/components/layout/FloatingAI.tsx b/frontend/src/components/layout/FloatingAI.tsx index 051412e..051450a 100644 --- a/frontend/src/components/layout/FloatingAI.tsx +++ b/frontend/src/components/layout/FloatingAI.tsx @@ -1,6 +1,7 @@ import { createSignal, Show } from 'solid-js' import { IconX, IconSend, IconUser, IconChevronDown } from '@tabler/icons-solidjs' import longcatIcon from '@/assets/longcat-color.svg' +import { ModalPortal } from '@/components/ui/ModalPortal' interface FloatingAIProps { onToggleChat: () => void @@ -79,8 +80,9 @@ export function FloatingAI(props: FloatingAIProps) { {/* AI Chat Modal */} -
-
+ +
+
{/* Header */}
@@ -177,8 +179,9 @@ export function FloatingAI(props: FloatingAIProps) {
+
-
+ ) diff --git a/frontend/src/components/layout/Header.tsx b/frontend/src/components/layout/Header.tsx index 8a60fd1..1b4d6b1 100644 --- a/frontend/src/components/layout/Header.tsx +++ b/frontend/src/components/layout/Header.tsx @@ -56,6 +56,18 @@ export function Header(props: HeaderProps) {
{/* Left side */}
+ + {/* Menu button */} - - -
-
+
+
+ + {/* Organization Selector */} -
+
+ + + + <> +
+
+
+
+

Create Workspace

+

Add a new workspace for your team or projects.

+
+ +
+
+ + setWorkspaceName((event.currentTarget as HTMLInputElement).value)} + required + disabled={isCreatingWorkspace()} + /> +
+ +
+ +