Compare commits

146 Commits
Author SHA1 Message Date
ztimson 0a636e149e Merge remote-tracking branch 'origin/master'
Build and publish / Build Container (push) Failing after 1m1s
Build and publish / Deploy Container (push) Skipped
2026-08-07 13:35:34 -04:00
ztimson 5ada76ce44 Fixed spacing 2026-08-07 13:35:24 -04:00
ztimson 90e4ae0df5 Update .github/workflows/build.yaml
Build and publish / Build Container (push) Successful in 7s
Build and publish / Deploy Container (push) Successful in 8s
2026-07-14 20:49:45 -04:00
ztimson 28851c5da5 Added missing theming and meta tags
Build and publish / Build Container (push) Successful in 8s
Build and publish / Deploy Container (push) Successful in 2s
2026-06-15 12:42:12 -04:00
ztimson 04b302625f Fixed mobile layout
Build and publish / Build Container (push) Successful in 7s
Build and publish / Deploy Container (push) Successful in 3s
2026-06-14 21:50:44 -04:00
ztimson 3098886938 Connect momentum
Build and publish / Build Container (push) Successful in 10s
Build and publish / Deploy Container (push) Successful in 12s
2026-06-12 02:42:58 -04:00
ztimson 7dda34ec19 Updated build.yaml
Build and publish / Build Container (push) Successful in 8s
Build and publish / Deploy Container (push) Successful in 3s
2026-06-12 02:10:00 -04:00
ztimson f68213955e Updated logo
Build and publish / Build Container (push) Failing after 4s
Build and publish / Deploy Container (push) Has been skipped
2026-06-12 02:05:20 -04:00
ztimson 4a97d4bbd3 Updated website
Build and publish / Build Container (push) Failing after 21s
Build and publish / Deploy Container (push) Has been skipped
2026-06-12 02:03:03 -04:00
ztimson e706057683 Update docker/nginx.conf
Build Website / Build NPM Project (push) Successful in 1m16s
Build Website / Tag Version (push) Successful in 29s
Build Website / Build & Push Dockerfile (push) Successful in 1m18s
2025-02-03 08:55:42 -05:00
ztimson 1fc1f7cfe2 Update README.md
Build Website / Tag Version (push) Successful in 7s
Build Website / Build & Push Dockerfile (push) Successful in 58s
Build Website / Build NPM Project (push) Successful in 25s
2023-12-05 04:41:13 +00:00
ztimson 625af2ed6a Update README.md
Build Website / Build NPM Project (push) Successful in 25s
Build Website / Tag Version (push) Successful in 6s
Build Website / Build & Push Dockerfile (push) Has been cancelled
2023-12-05 04:40:02 +00:00
ztimson 2cf0d62aad Update .github/workflows/website.yaml
Build Website / Build NPM Project (push) Successful in 26s
Build Website / Tag Version (push) Successful in 7s
Build Website / Build & Push Dockerfile (push) Successful in 1m15s
2023-12-05 04:34:43 +00:00
ztimson 080c9d3a48 Delete .gitlab/.gitlab-ci.yml
Build Website / Build NPM Project (push) Successful in 28s
Build Website / Build & Push Dockerfile (push) Successful in 1m0s
2023-11-24 21:11:47 +00:00
ztimson 6ccae9aa1f Updated build
Build Website / Build NPM Project (push) Successful in 29s
Build Website / Build & Push Dockerfile (push) Successful in 2m12s
2023-11-24 13:15:22 -05:00
ztimson 718367fff1 Update README.md
Continues Integration / Install dependencies (push) Failing after 0s
Continues Integration / Build (push) Has been skipped
Continues Integration / Build production (push) Has been skipped
Continues Integration / Build docker image (push) Failing after 4s
2023-08-07 17:05:49 +00:00
ztimson 540dddd6c6 revert ab1ff083a6
Continues Integration / Build (push) Has been skipped
Continues Integration / Build production (push) Has been skipped
Continues Integration / Build docker image (push) Failing after 5s
Continues Integration / Install dependencies (push) Failing after 1s
revert Update LICENSE
2023-08-07 15:16:42 +00:00
ztimson ab1ff083a6 Update LICENSE
Continues Integration / Install dependencies (push) Failing after 0s
Continues Integration / Build (push) Has been skipped
Continues Integration / Build production (push) Has been skipped
Continues Integration / Build docker image (push) Failing after 7s
2023-08-07 15:16:26 +00:00
ztimson 950f9c7ea9 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build (push) Has been skipped
Continues Integration / Build production (push) Has been skipped
Continues Integration / Build docker image (push) Failing after 7s
Continues Integration / Install dependencies (push) Failing after 0s
2023-08-07 15:05:23 +00:00
ztimson f7a4e43bd6 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build (push) Failing after 3s
Continues Integration / Build production (push) Failing after 3s
Continues Integration / Build docker image (push) Failing after 3s
Continues Integration / Install dependencies (push) Failing after 15s
2023-08-07 14:02:31 +00:00
ztimson 1fd55d2ed9 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 36s
Continues Integration / Build docker image (push) Failing after 2s
Continues Integration / Build (push) Successful in 1m9s
Continues Integration / Build production (push) Successful in 1m10s
2023-08-07 13:56:44 +00:00
ztimson 333f935eee Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 37s
Continues Integration / Build docker image (push) Failing after 3s
Continues Integration / Build production (push) Failing after 6s
Continues Integration / Build (push) Failing after 17s
2023-08-07 13:53:59 +00:00
ztimson 05cc7aa5c8 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build (push) Failing after 17s
Continues Integration / Install dependencies (push) Successful in 37s
Continues Integration / Build docker image (push) Failing after 3s
Continues Integration / Build production (push) Failing after 7s
2023-08-07 13:52:06 +00:00
ztimson 189c952db6 Update package.json
Continues Integration / Install dependencies (push) Successful in 36s
Continues Integration / Build docker image (push) Failing after 4s
Continues Integration / Build (push) Failing after 17s
Continues Integration / Build production (push) Failing after 7s
2023-08-07 13:47:22 +00:00
ztimson a931c2c7c6 Update package.json
Continues Integration / Install dependencies (push) Failing after 15s
Continues Integration / Build (push) Has been skipped
Continues Integration / Build production (push) Has been skipped
Continues Integration / Build docker image (push) Failing after 4s
2023-08-07 13:46:51 +00:00
ztimson 627c461d68 Update package.json
Continues Integration / Build docker image (push) Failing after 3s
Continues Integration / Build (push) Failing after 13s
Continues Integration / Build production (push) Failing after 5s
Continues Integration / Install dependencies (push) Successful in 38s
2023-08-07 13:42:36 +00:00
ztimson 0a59e0b58d Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 38s
Continues Integration / Build (push) Failing after 17s
Continues Integration / Build production (push) Failing after 7s
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 13:40:43 +00:00
ztimson 26672f92f9 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 36s
Continues Integration / Build production (push) Failing after 7s
Continues Integration / Build docker image (push) Failing after 4s
Continues Integration / Build (push) Failing after 17s
2023-08-07 13:38:24 +00:00
ztimson 12642dbf93 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build docker image (push) Failing after 3s
Continues Integration / Build (push) Failing after 17s
Continues Integration / Build production (push) Failing after 7s
Continues Integration / Install dependencies (push) Successful in 37s
2023-08-07 13:26:21 +00:00
ztimson 5eb6d7b038 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build production (push) Failing after 6s
Continues Integration / Install dependencies (push) Successful in 37s
Continues Integration / Build (push) Failing after 7s
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 13:10:49 +00:00
ztimson 51f536ff10 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build (push) Failing after 7s
Continues Integration / Install dependencies (push) Successful in 50s
Continues Integration / Build production (push) Failing after 7s
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 02:52:17 +00:00
ztimson d2addd327a Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Failing after 3s
Continues Integration / Build (push) Has been skipped
Continues Integration / Build production (push) Has been skipped
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 02:50:07 +00:00
ztimson da8e9dda00 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 48s
Continues Integration / Build (push) Failing after 9s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 02:25:36 +00:00
ztimson 4dc75d9b0f Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 51s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 02:18:51 +00:00
ztimson 415d176946 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Failing after 37s
Continues Integration / Build (push) Has been skipped
Continues Integration / Build production (push) Has been skipped
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 02:17:27 +00:00
ztimson a5ca7d8f04 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 48s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Failing after 2s
Continues Integration / Build (push) Failing after 9s
2023-08-07 02:07:50 +00:00
ztimson 3bc5b87593 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Install dependencies (push) Failing after 48s
Continues Integration / Build (push) Failing after 8s
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 01:58:59 +00:00
ztimson 12b89dbb1a Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 2m27s
Continues Integration / Build (push) Failing after 49s
Continues Integration / Build production (push) Failing after 14s
Continues Integration / Build docker image (push) Failing after 3s
2023-08-07 01:41:34 +00:00
ztimson db9d674c79 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 36s
Continues Integration / Build docker image (push) Has been skipped
Continues Integration / Build (push) Failing after 8s
Continues Integration / Build production (push) Failing after 10s
2023-08-07 01:34:40 +00:00
ztimson 91bd827c0d Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 35s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 10s
Continues Integration / Build docker image (push) Has been skipped
2023-08-07 01:27:40 +00:00
ztimson cdf5724ac1 Update .github/pull_request_template.md
Continues Integration / Install dependencies (push) Successful in 53s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 10s
Continues Integration / Build docker image (push) Has been skipped
2023-08-06 23:07:57 +00:00
ztimson 8cd59400ae Update README.md
Continues Integration / Install dependencies (push) Successful in 53s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Has been skipped
2023-08-04 17:53:01 +00:00
ztimson 73f59134f8 Update .github/workflows/pull_request_template.md
Continues Integration / Install dependencies (push) Successful in 55s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 11s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 22:20:32 +00:00
ztimson 3a4a41f886 Add .github/workflows/pull_request_template.md
Continues Integration / Install dependencies (push) Successful in 56s
Continues Integration / Build (push) Failing after 11s
Continues Integration / Build production (push) Failing after 10s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 22:19:28 +00:00
ztimson fb4d150792 Update README.md
Continues Integration / Install dependencies (push) Successful in 53s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 12s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 22:17:47 +00:00
ztimson 0f9ad782af Update README.md
Continues Integration / Install dependencies (push) Successful in 54s
Continues Integration / Build (push) Failing after 11s
Continues Integration / Build docker image (push) Has been skipped
Continues Integration / Build production (push) Failing after 11s
2023-08-02 22:17:35 +00:00
ztimson b73d017d7f Add CODEOWNERS
Continues Integration / Install dependencies (push) Successful in 52s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 22:14:38 +00:00
ztimson 76f6425d57 Update README.md
Continues Integration / Install dependencies (push) Successful in 53s
Continues Integration / Build (push) Failing after 9s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 19:30:40 +00:00
ztimson a706de4769 Update README.md
Continues Integration / Install dependencies (push) Successful in 4m38s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Successful in 1m41s
Continues Integration / Build (push) Failing after 10s
2023-08-02 18:46:24 +00:00
ztimson ca6736398d Update package.json
Continues Integration / Install dependencies (push) Successful in 54s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 11s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 18:32:24 +00:00
ztimson 77557919fb Update package.json
Continues Integration / Install dependencies (push) Successful in 53s
Continues Integration / Build (push) Failing after 12s
Continues Integration / Build production (push) Failing after 12s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 18:29:01 +00:00
ztimson 95db753a17 Update README.md
Continues Integration / Build (push) Failing after 9s
Continues Integration / Build production (push) Failing after 10s
Continues Integration / Build docker image (push) Has been skipped
Continues Integration / Install dependencies (push) Successful in 57s
2023-08-02 18:21:50 +00:00
ztimson 7dd9b599f6 Add LICENSE
Continues Integration / Install dependencies (push) Successful in 54s
Continues Integration / Build (push) Failing after 13s
Continues Integration / Build production (push) Failing after 13s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 18:21:11 +00:00
ztimson 3fdc4030d8 Update README.md
Continues Integration / Install dependencies (push) Successful in 57s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Has been skipped
2023-08-02 18:15:43 +00:00
ztimson 2e9a625724 Update README.md
Continues Integration / Build (push) Failing after 9s
Continues Integration / Build docker image (push) Has been skipped
Continues Integration / Install dependencies (push) Successful in 53s
Continues Integration / Build production (push) Failing after 14s
2023-08-01 15:26:20 +00:00
ztimson bc6c20fac7 Upload files to "src/assets/img"
Continues Integration / Install dependencies (push) Successful in 1m8s
Continues Integration / Build (push) Failing after 10s
Continues Integration / Build production (push) Failing after 11s
Continues Integration / Build docker image (push) Has been skipped
2023-08-01 15:23:56 +00:00
ztimson 446ff01056 Delete src/assets/img/header.png
Continues Integration / Install dependencies (push) Successful in 1m2s
Continues Integration / Build (push) Failing after 13s
Continues Integration / Build production (push) Failing after 16s
Continues Integration / Build docker image (push) Has been skipped
2023-08-01 15:23:41 +00:00
ztimson b2bb5fcbfe Upload files to "src/assets/img"
Continues Integration / Install dependencies (push) Successful in 56s
Continues Integration / Build (push) Failing after 15s
Continues Integration / Build production (push) Failing after 14s
Continues Integration / Build docker image (push) Has been skipped
2023-08-01 15:22:18 +00:00
ztimson e81f3bdbe7 Delete src/assets/img/header.png
Continues Integration / Build production (push) Failing after 13s
Continues Integration / Build docker image (push) Has been skipped
Continues Integration / Install dependencies (push) Successful in 57s
Continues Integration / Build (push) Failing after 15s
2023-08-01 15:22:09 +00:00
ztimson 572b3a2701 Upload files to "src/assets/img"
Continues Integration / Install dependencies (push) Successful in 52s
Continues Integration / Build (push) Failing after 9s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Has been skipped
2023-08-01 15:19:23 +00:00
ztimson e19ead65d4 Update .gitlab/.gitlab-ci.yml
Continues Integration / Install dependencies (push) Successful in 53s
Continues Integration / Build (push) Failing after 9s
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build docker image (push) Has been skipped
2023-08-01 15:01:22 +00:00
ztimson e3cfe8246a Update .gitlab/.gitlab-ci.yml
Continues Integration / Install dependencies (push) Successful in 52s
Continues Integration / Build (push) Failing after 9s
Continues Integration / Build production (push) Failing after 10s
Continues Integration / Build docker image (push) Has been skipped
2023-08-01 15:00:19 +00:00
ztimson a0e0b8b4d8 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build production (push) Failing after 9s
Continues Integration / Build (push) Failing after 9s
Continues Integration / Build docker image (push) Has been skipped
Continues Integration / Install dependencies (push) Successful in 51s
2023-07-28 22:07:14 +00:00
ztimson 6072ddc72a Update .github/workflows/Continues Integration.yaml
Continues Integration / Build (push) Has been cancelled
Continues Integration / Build production (push) Has been cancelled
Continues Integration / Build docker image (push) Has been cancelled
Continues Integration / Install dependencies (push) Successful in 52s
2023-07-28 21:58:48 +00:00
ztimson f942b3db2f Update .github/workflows/Continues Integration.yaml
Continues Integration / Build (push) Has been cancelled
Continues Integration / Build production (push) Has been cancelled
Continues Integration / Build docker image (push) Has been cancelled
Continues Integration / Install dependencies (push) Successful in 45s
2023-07-28 21:50:17 +00:00
ztimson 2438e88fda Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 36s
Continues Integration / Build (push) Successful in 49s
Continues Integration / Build production (push) Successful in 1m0s
Continues Integration / Build docker image (push) Successful in 1m44s
2023-07-28 21:44:56 +00:00
ztimson 3908c9636d Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 36s
Continues Integration / Build docker image (push) Has been cancelled
Continues Integration / Build production (push) Has been cancelled
Continues Integration / Build (push) Has been cancelled
2023-07-28 21:41:52 +00:00
ztimson 2e34a1f257 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build (push) Has been cancelled
Continues Integration / Build production (push) Has been cancelled
Continues Integration / Build docker image (push) Has been cancelled
Continues Integration / Install dependencies (push) Has been cancelled
2023-07-28 21:39:26 +00:00
ztimson b514cf0ad5 Update .github/workflows/Continues Integration.yaml
Continues Integration / Build (push) Has been cancelled
Continues Integration / Build production (push) Has been cancelled
Continues Integration / Build docker image (push) Has been cancelled
Continues Integration / Install dependencies (push) Successful in 50s
2023-07-28 21:20:12 +00:00
ztimson 8e036aa9ff Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 33s
Continues Integration / Build (push) Successful in 53s
Continues Integration / Build production (push) Successful in 1m5s
Continues Integration / Build docker image (push) Successful in 1m49s
2023-07-28 18:57:24 +00:00
ztimson dc3732cef9 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 35s
Continues Integration / Build (push) Successful in 53s
Continues Integration / Build production (push) Successful in 1m4s
Continues Integration / Build docker image (push) Failing after 9s
2023-07-28 18:53:25 +00:00
ztimson 7549b8e01f Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 36s
Continues Integration / Build docker image (push) Has been cancelled
Continues Integration / Build production (push) Has been cancelled
Continues Integration / Build (push) Has been cancelled
2023-07-28 18:44:11 +00:00
ztimson c366458652 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 34s
Continues Integration / Build (push) Has been cancelled
Continues Integration / Build production (push) Has been cancelled
Continues Integration / Build docker image (push) Has been cancelled
2023-07-28 18:39:35 +00:00
ztimson 735ef9a87a Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 50s
Continues Integration / Build (push) Failing after 2m31s
Continues Integration / Build docker image (push) Has been cancelled
Continues Integration / Build production (push) Has been cancelled
2023-07-28 18:30:32 +00:00
ztimson 03b3efbb7a Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 35s
Continues Integration / Build production (push) Successful in 1m0s
Continues Integration / Build docker image (push) Has been cancelled
Continues Integration / Build (push) Successful in 52s
2023-07-28 18:21:57 +00:00
ztimson be9ffd160a Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 34s
Continues Integration / Build (push) Successful in 54s
Continues Integration / Build production (push) Successful in 1m5s
Continues Integration / Build docker image (push) Has been cancelled
2023-07-28 18:10:06 +00:00
ztimson a5aa7f9a8f Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 42s
Continues Integration / Build (push) Successful in 1m0s
Continues Integration / Build production (push) Successful in 1m8s
Continues Integration / Build docker image (push) Failing after 1m55s
2023-07-28 18:01:08 +00:00
ztimson 8cd4193971 Update Dockerfile
Continues Integration / Install dependencies (push) Successful in 37s
Continues Integration / Build (push) Successful in 1m1s
Continues Integration / Build production (push) Successful in 1m10s
Continues Integration / Build docker image (push) Failing after 2m1s
2023-07-28 17:53:06 +00:00
ztimson 525f1e2762 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 35s
Continues Integration / Build (push) Successful in 53s
Continues Integration / Build production (push) Successful in 1m4s
Continues Integration / Build docker image (push) Failing after 47s
2023-07-28 17:42:20 +00:00
ztimson 6b756f34e8 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m0s
Continues Integration / Push docker image (push) Failing after 11s
Continues Integration / Build dev (push) Successful in 1m5s
2023-07-28 17:37:19 +00:00
ztimson 4c3746e347 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m1s
Continues Integration / Build dev (push) Successful in 56s
Continues Integration / Push docker image (push) Failing after 12s
2023-07-28 17:26:16 +00:00
ztimson 4a9a048201 Update .github/workflows/Continues Integration.yaml 2023-07-28 17:25:53 +00:00
ztimson 54ceab4d52 Update .github/workflows/Continues Integration.yaml
Continues Integration / Push docker image (push) Failing after 29s
Continues Integration / Install dependencies (push) Successful in 1m20s
Continues Integration / build (push) Failing after 2m13s
2023-07-28 17:17:07 +00:00
ztimson 44c2f162bf Update .github/workflows/Continues Integration.yaml 2023-07-28 17:16:51 +00:00
ztimson 6b29d7ce08 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m7s
Continues Integration / Push docker image (push) Failing after 4s
2023-07-28 16:43:47 +00:00
ztimson 042b20db50 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m8s
Continues Integration / Push docker image (push) Failing after 3s
2023-07-28 16:37:30 +00:00
ztimson a1db74dd64 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m11s
Continues Integration / Push docker image (push) Failing after 1m37s
2023-07-28 16:16:27 +00:00
ztimson 0cc72b975b Update .github/workflows/Continues Integration.yaml
Continues Integration / Push docker image (push) Failing after 4s
Continues Integration / Install dependencies (push) Successful in 1m13s
2023-07-28 16:15:39 +00:00
ztimson cc03c4b7df Update .github/workflows/Continues Integration.yaml
Continues Integration / Push docker image (push) Failing after 6s
Continues Integration / Install dependencies (push) Successful in 1m15s
2023-07-28 15:18:58 +00:00
ztimson 2f43748c9d Update .github/workflows/Continues Integration.yaml
Continues Integration / Push docker image (push) Failing after 5s
Continues Integration / Install dependencies (push) Successful in 1m16s
2023-07-28 15:18:11 +00:00
ztimson 572ecd07db Update .github/workflows/Continues Integration.yaml 2023-07-28 15:18:02 +00:00
ztimson f90ff40c90 Update .github/workflows/Continues Integration.yaml
Continues Integration / Push docker image (push) Failing after 2s
Continues Integration / Install dependencies (push) Successful in 1m12s
2023-07-28 15:14:54 +00:00
ztimson ff637c9a8a Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m11s
Continues Integration / Push docker image (push) Failing after 0s
2023-07-28 15:14:12 +00:00
ztimson 8b1836e33c Update .github/workflows/Continues Integration.yaml 2023-07-28 15:11:42 +00:00
ztimson c0a005104b Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m9s
2023-07-28 15:00:23 +00:00
ztimson bec0ae044f Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m14s
2023-07-28 14:49:52 +00:00
ztimson 01edb28188 Update .github/workflows/Continues Integration.yaml 2023-07-28 14:49:42 +00:00
ztimson 9471a8bb31 Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m12s
2023-07-28 14:47:29 +00:00
ztimson 3d564294bf Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m9s
2023-07-28 14:45:27 +00:00
ztimson 1c3ecb5c1f Update .github/workflows/Continues Integration.yaml
Continues Integration / Install dependencies (push) Successful in 1m12s
Continues Integration / Docker (push) Failing after 0s
2023-07-28 14:36:55 +00:00
ztimson 76a7f8f666 Update .github/workflows/Continues Integration.yaml
Build / Install dependencies (push) Successful in 1m9s
Build / Docker (push) Failing after 0s
2023-07-28 14:34:58 +00:00
ztimson d42fc0c52a Update .github/workflows/build.yaml
Build / Install dependencies (push) Successful in 1m15s
Build / Docker (push) Failing after 0s
2023-07-28 14:30:52 +00:00
ztimson 8838268698 Update .github/workflows/build.yaml 2023-07-28 14:30:41 +00:00
ztimson 6ad0d11cbd Update .github/workflows/build.yaml
Build / Docker (push) Failing after 0s
Build / Install dependencies (push) Successful in 1m9s
2023-07-28 14:28:58 +00:00
ztimson db63b56b9a Delete .github/workflows/docker-publish.yaml
Build / Docker (push) Failing after 4s
Build / Install NPM dependencies (push) Successful in 1m8s
2023-07-28 14:27:46 +00:00
ztimson 5d61191496 Update .github/workflows/build.yaml
Build / Install NPM dependencies (push) Successful in 1m13s
Build / Docker (push) Failing after 1m34s
2023-07-28 14:01:28 +00:00
ztimson abb3b55009 Update .github/workflows/build.yaml
Build / Install NPM dependencies (push) Successful in 1m7s
Build / Build & publish docker image (push) Failing after 0s
2023-07-28 13:53:59 +00:00
ztimson da4153eb9b Update .github/workflows/docker-publish.yaml
Build / Install NPM dependencies (push) Successful in 1m9s
Build / Build & publish docker image (push) Failing after 0s
2023-07-28 13:50:35 +00:00
ztimson 5b39c33abb Update .github/workflows/build.yaml
Build / Install NPM dependencies (push) Successful in 1m7s
Build / Build & publish docker image (push) Failing after 0s
2023-07-28 13:46:51 +00:00
ztimson 3fecb274d1 Update .github/workflows/build.yaml
Build / Install NPM dependencies (push) Successful in 1m9s
Build / Build & publish docker image (push) Failing after 2s
2023-07-28 13:44:14 +00:00
ztimson 270d87036c Update .github/workflows/docker-publish.yaml
Build / Build & publish docker image (push) Failing after 2s
Build / Install NPM dependencies (push) Successful in 1m7s
2023-07-28 13:41:51 +00:00
ztimson 2ee596e851 Update .github/workflows/build.yaml
Build / Install NPM dependencies (push) Successful in 1m7s
Build / Build & publish docker image (push) Failing after 3s
2023-07-28 13:33:52 +00:00
ztimson 356be5f099 Update .github/workflows/build.yaml
Build / Install NPM dependencies (push) Successful in 1m8s
Build / Build & publish docker image (push) Failing after 3s
2023-07-28 13:31:25 +00:00
ztimson f5a922469f Update .github/workflows/build.yaml 2023-07-28 13:28:53 +00:00
ztimson b7c824bf6e Update .github/workflows/build.yaml
Build / Dependencies_NPM (push) Successful in 1m11s
2023-07-28 13:25:58 +00:00
ztimson f199c920ae Update .github/workflows/docker-publish.yaml
Build / Dependencies_NPM (push) Successful in 1m13s
2023-07-28 13:24:34 +00:00
ztimson 88be130719 Update .github/workflows/docker-publish.yaml
Build / Dependencies_NPM (push) Successful in 1m10s
2023-07-28 13:23:26 +00:00
ztimson c8fd7339ca Add .github/workflows/docker-publish.yaml
Build / Dependencies_NPM (push) Successful in 1m7s
2023-07-28 13:21:15 +00:00
ztimson f073023150 Update README.md
Build / Dependencies_NPM (push) Successful in 1m12s
2023-07-28 02:02:30 +00:00
ztimson 166ad3856a Update README.md
Build / Dependencies_NPM (push) Successful in 1m10s
2023-07-28 01:56:26 +00:00
ztimson c39f75aa0b Update README.md
Build / Dependencies_NPM (push) Successful in 1m9s
2023-07-28 01:55:12 +00:00
ztimson 99c127e9ab Update README.md
Build / Dependencies_NPM (push) Successful in 1m8s
2023-07-28 01:43:11 +00:00
ztimson 7e116416ad Updated website look
Build / Dependencies_NPM (push) Successful in 1m7s
2023-07-27 13:04:10 -04:00
ztimson 334c8257c6 Update .gitea/workflows/build.yml
Build / Dependencies_NPM (push) Successful in 1m11s
2023-07-27 04:03:17 +00:00
ztimson e4dcba3654 Update .gitea/workflows/build.yml 2023-07-27 04:02:46 +00:00
ztimson 43261164dc Update .gitea/workflows/build.yml
Build / Dependencies_NPM (push) Successful in 1m3s
2023-07-27 03:57:19 +00:00
ztimson 6860bf3c40 Update .gitea/workflows/build.yml
Build / Dependencies_NPM (push) Successful in 1m48s
2023-07-27 03:36:40 +00:00
ztimson 3966342eff Update .gitea/workflows/build.yml
Build / Dependencies_NPM (push) Failing after 1s
2023-07-27 03:33:15 +00:00
ztimson 825dc1a563 Update .gitea/workflows/build.yml 2023-07-27 03:32:41 +00:00
ztimson 64cb1dca15 Update .gitea/workflows/build.yml
Build / Dependencies_NPM (push) Failing after 49s
2023-07-27 03:20:56 +00:00
ztimson 561b5aea20 Update .gitea/workflows/build.yml 2023-07-27 03:20:32 +00:00
ztimson d252956604 Update .gitea/workflows/build.yml 2023-07-27 03:17:07 +00:00
ztimson 408a6c81ea Update .gitea/workflows/build.yml
Build / Dependencies_NPM (push) Failing after 47s
Build / Build_Node (push) Failing after 4s
2023-07-27 02:04:08 +00:00
ztimson d0fa2c6490 Update .gitea/workflows/build.yml
Build / Dependencies_NPM (push) Failing after 45s
Build / Build_Node (push) Failing after 4s
2023-07-27 02:00:23 +00:00
ztimson 28b80cbc94 Update .gitea/workflows/build.yml
Build / Dependencies_NPM (push) Failing after 1m10s
Build / Build_Node (push) Failing after 24s
2023-07-27 01:56:51 +00:00
ztimson bb9ec6fecd Update .gitea/workflows/build.yml 2023-07-27 01:56:29 +00:00
ztimson 5f01faaf9d Update .gitea/workflows/build.yml 2023-07-27 01:56:20 +00:00
ztimson 55e8202b2b Update .gitea/workflows/build.yml 2023-07-27 01:53:35 +00:00
ztimson e3b8b002d1 Update .gitea/workflows/build.yml 2023-07-27 01:47:26 +00:00
ztimson ecaa8f22cd Update .gitea/workflows/build.yml 2023-07-27 01:47:07 +00:00
ztimson ec89430245 Update .gitea/workflows/build.yml
Build / Explore-Gitea-Actions (push) Failing after 11s
2023-07-27 01:17:56 +00:00
ztimson b3fa846253 Update .gitea/workflows/build.yml
Build / Explore-Gitea-Actions (push) Has been cancelled
2023-07-27 01:17:30 +00:00
ztimson b320982932 Update .gitea/workflows/build.yml 2023-07-27 01:16:22 +00:00
ztimson 96f77247da Update .gitea/workflows/build.yml 2023-07-27 01:12:52 +00:00
ztimson c1fd7c4199 Update .gitea/workflows/build.yml 2023-07-27 01:12:13 +00:00
ztimson 2bb1553731 Added action
Build / Example (push) Has been cancelled
2023-07-27 01:11:30 +00:00
49 changed files with 1225 additions and 21341 deletions
-16
View File
@@ -1,16 +0,0 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR
+17
View File
@@ -0,0 +1,17 @@
---
name: "AI refinement"
about: "Use AI to refine ticket"
ref: "develop"
labels:
- Review/AI
---
Describe your request:
What are you trying to do and what's happening?
How can it be fixed or improved?
Any other useful information? Logs, screenshots, steps to reproduce?
+30
View File
@@ -0,0 +1,30 @@
---
name: "Bug report"
about: "Encountered an issue"
ref: "develop"
labels:
- Kind/Bug
---
# Bug Report
<!-- Description of problem -->
I tried to ...
But instead ...
## Steps to Reproduce
<!-- How can developers replicate & test the problem? -->
1. ...
2. ...
3. ...
## Logs
<!-- Any logs that accompanied the error -->
```
```
## Screenshots
<!-- Screenshots (annotated if possible) of the problem -->
+28
View File
@@ -0,0 +1,28 @@
---
name: "Enhancement"
about: "Request an enhancement"
ref: "develop"
labels:
- Kind/Enhancement
---
# Feature Request
<!-- Detailed description -->
As a...
I want to...
## Requirements
<!-- List of any requirements -->
- [ ] ...
- [ ] ...
- [ ] ...
## Notes
<!-- Any additional design considerations -->
...
## Mockups
<!-- Any visual aids -->
+26
View File
@@ -0,0 +1,26 @@
---
name: "Refactor"
about: "Refactor existing system"
ref: "develop"
labels:
- Kind/Refactor
---
# Refactor
<!-- Detailed description -->
The current...
Should be changed/updated to...
## Reasoning
- ...
## Scope
<!-- What systems will this impact -->
- ...
## Notes
<!-- Any additional design considerations -->
...
+13
View File
@@ -0,0 +1,13 @@
## Description
<!-- Addition information & context -->
...
## Issues
<!-- Issues this PR will address -->
- closes #___
- owner/repo#___
## Checklist
<!-- Complete after creating PR -->
- [ ] Reviewed changes (or use `Review/AI` label)
- [ ] Updated comments/documentation
+45
View File
@@ -0,0 +1,45 @@
name: Build and publish
run-name: Build and publish
on:
push:
jobs:
container:
name: Build Container
runs-on: ubuntu-latest
container: docker
steps:
- name: Build Container
run: |
git clone -b "${{github.ref_name}}" "$(echo ${{github.server_url}}/${{github.repository}}.git | sed s%://%://${{github.token}}@% )" .
DOCKER_HUB=$([ -n "${{secrets.DOCKER_HUB_USER}}" ] && [ -n "${{secrets.DOCKER_HUB_TOKEN}}" ] && [ -n "${{secrets.DOCKER_HUB_IMAGE}}" ] && echo "true" || echo "false")
REGISTRY="$(echo "${{github.server_url}}" | sed -E 's|https?://||')"
docker login -u "${{github.repository_owner}}" -p "${{secrets.DEPLOY_TOKEN}}" "$REGISTRY"
if [ "$DOCKER_HUB" = "true" ]; then docker login -u "${{secrets.DOCKER_HUB_USER}}" -p "${{secrets.DOCKER_HUB_TOKEN}}" docker.io; fi
docker build -t "$REGISTRY/${{github.repository}}:${{github.ref_name}}" .
docker push "$REGISTRY/${{github.repository}}:${{github.ref_name}}"
if [ "$DOCKER_HUB" = "true" ]; then
docker tag "$REGISTRY/${{github.repository}}:${{github.ref_name}}" "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:${{github.ref_name}}"
docker push "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:${{github.ref_name}}"
fi
if [ "${{github.ref_name}}" = "master" ]; then
docker tag "$REGISTRY/${{github.repository}}:${{github.ref_name}}" "$REGISTRY/${{github.repository}}:latest"
docker push "$REGISTRY/${{github.repository}}:latest"
if [ "$DOCKER_HUB" = "true" ]; then
docker tag "$REGISTRY/${{github.repository}}:${{github.ref_name}}" "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:latest"
docker push "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:latest"
fi
fi
deploy:
name: Deploy Container
runs-on: ubuntu-latest
container: node
needs:
- container
steps:
- name: Deploy
run: curl -X POST https://manage.zakscode.com/api/stacks/webhooks/a07c21fa-9751-4b39-a133-ffe4a72fcf82
+29
View File
@@ -0,0 +1,29 @@
name: Code review
on:
pull_request:
types: [opened, synchronize, reopened, labeled]
jobs:
review:
runs-on: ubuntu-latest
container: node:22
steps:
- name: Fetch code
run: |
git clone "$(echo ${{github.server_url}}/${{github.repository}}.git | sed s%://%://${{github.token}}@% )" .
git checkout ${{ github.event.pull_request.head.sha }}
git fetch origin ${{ github.event.pull_request.base.ref }}
- name: Create review
run: npx -y -p @ztimson/ai-agents@latest review $GITHUB_WORKSPACE
env:
AI_HOST: anthropic
AI_MODEL: claude-sonnet-4-5
AI_TOKEN: ${{ secrets.ANTHROPIC_TOKEN }}
GIT_HOST: ${{ github.server_url }}
GIT_OWNER: ${{ github.repository_owner }}
GIT_REPO: ${{ github.event.repository.name }}
GIT_TOKEN: ${{ secrets.ASSISTANT_TOKEN }}
GIT_BRANCH: origin/${{ github.event.pull_request.base.ref }}
PULL_REQUEST: ${{ github.event.pull_request.number }}
+27
View File
@@ -0,0 +1,27 @@
name: Release Bot
on:
milestone:
types: [closed]
jobs:
release:
runs-on: ubuntu-latest
container: node:22
steps:
- name: Checkout
run: |
git clone "$(echo ${{github.server_url}}/${{github.repository}}.git | sed s%://%://${{github.token}}@% )" .
git checkout ${{ github.event.repository.default_branch }}
- name: Create release
run: npx -y @ztimson/ai-agents@latest release
env:
AI_HOST: anthropic
AI_MODEL: claude-sonnet-4-5
AI_TOKEN: ${{ secrets.ANTHROPIC_TOKEN }}
GIT_HOST: ${{ github.server_url }}
GIT_OWNER: ${{ github.repository_owner }}
GIT_REPO: ${{ github.event.repository.name }}
GIT_TOKEN: ${{ secrets.ASSISTANT_TOKEN }}
MILESTONE: ${{ github.event.milestone.number }}
+27
View File
@@ -0,0 +1,27 @@
name: Ticket refinement
on:
issues:
types: [labeled]
jobs:
format:
runs-on: ubuntu-latest
container: node:22
steps:
- name: Fetch code
run: |
git clone "$(echo ${{github.server_url}}/${{github.repository}}.git | sed s%://%://${{github.token}}@% )" .
git checkout ${{ github.event.repository.default_branch }}
- name: Refine ticket
run: npx -y -p @ztimson/ai-agents@latest refine
env:
AI_HOST: anthropic
AI_MODEL: claude-sonnet-4-5
AI_TOKEN: ${{ secrets.ANTHROPIC_TOKEN }}
GIT_HOST: ${{ github.server_url }}
GIT_OWNER: ${{ github.repository_owner }}
GIT_REPO: ${{ github.event.repository.name }}
GIT_TOKEN: ${{ secrets.ASSISTANT_TOKEN }}
TICKET: ${{ github.event.issue.number }}
-82
View File
@@ -1,82 +0,0 @@
image: node:16
stages:
- build
- test
- deploy
npm:
stage: build
cache:
- key:
files:
- package-lock.json
paths:
- node_modules
policy: pull-push
- key: $CI_PIPELINE_ID
paths:
- dist
policy: push
script:
- npm install
- npm run build
artifacts:
paths:
- dist
expire_in: 1 week
rules:
- if: $CI_COMMIT_BRANCH
audit:
stage: test
cache:
- key:
files:
- package-lock.json
paths:
- node_modules
policy: pull
script:
- echo "vulnerabilities_high $(npm audit | grep -oE '[0-9]+ high' | grep -oE '[0-9]+' || echo 0)" > metrics.txt
- echo "vulnerabilities_medium $(npm audit | grep -oE '[0-9]+ moderate' | grep -oE '[0-9]+' || echo 0)" >> metrics.txt
- echo "vulnerabilities_low $(npm audit | grep -oE '[0-9]+ low' | grep -oE '[0-9]+' || echo 0)" >> metrics.txt
artifacts:
reports:
metrics: metrics.txt
rules:
- if: $CI_COMMIT_BRANCH
registry:
stage: deploy
image: docker
cache:
- key: $CI_PIPELINE_ID
paths:
- dist
policy: pull
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
script:
- TAG=$([ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ] && echo "latest" || echo "$CI_COMMIT_BRANCH" | sed -E "s/[_/]/-/g")
- docker build --no-cache -t "$CI_REGISTRY_IMAGE:$TAG" .
- docker push "$CI_REGISTRY_IMAGE:$TAG"
rules:
- if: $CI_COMMIT_BRANCH
allow_failure: true
tag:
stage: deploy
image:
name: alpine/git
entrypoint: [ "" ]
cache: [ ]
before_script:
- git remote set-url origin https://ReleaseBot:$DEPLOY_TOKEN@gitlab.zakscode.com/$CI_PROJECT_PATH.git
script:
- VERSION=$(cat package.json | grep version | grep -Eo ':.+' | grep -Eo '[[:alnum:]\.\/\-]+')
- git tag -f $VERSION $CI_COMMIT_SHA
- git push -f origin $VERSION
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
allow_failure: true
+1
View File
@@ -0,0 +1 @@
* @ztimson
+2 -27
View File
@@ -1,28 +1,3 @@
FROM node:16 as build FROM git.zakscode.com/momentum/momentum:latest
# Variables COPY public /app/server/public
ARG NODE_ENV=prod
ARG NODE_OPTIONS="--max_old_space_size=4096"
ENV NG_CLI_ANALYTICS=ci \
NODE_ENV=${NODE_ENV} \
NODE_OPTIONS=${NODE_OPTIONS}
# Setup
RUN npm config set unsafe-perm true && \
mkdir /app
WORKDIR /app
COPY . .
# Install
RUN if [ ! -d "dist" ] && [ ! -d "node_modules" ]; then npm install; fi
# Build
RUN BUILD_MODE=$([ "$NODE_ENV" = "prod" ] && echo "dynmaic-prod" || echo "dynamic") && \
if [ ! -d "dist" ]; then npm run "build:$BUILD_MODE"; fi
# Use Nginx to serve
FROM nginx:1.20-alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY docker/robots.txt /usr/share/nginx/html/robots.txt
COPY docker/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
+11
View File
@@ -0,0 +1,11 @@
Copyright (c) 2023 Zakary Timson
All Rights Reserved.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+77 -33
View File
@@ -1,46 +1,90 @@
# 291st JTF <!-- Header -->
[Clan page](https://291st.ca) for the 291st Joint Task Force <div id="top" align="center">
<br />
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.2.2. <!-- Logo -->
<img src="./public/assets/img/logo.png" alt="Logo" width="200" height="200">
<!-- Title -->
### 291st Joint Task Force
<!-- Description -->
Clan website for the _291st Joint Task Force_
<!-- Repo badges -->
[![Version](https://img.shields.io/badge/dynamic/json.svg?label=Version&style=for-the-badge&url=https://git.zakscode.com/api/v1/repos/ztimson/291st/tags&query=$[0].name)](https://git.zakscode.com/ztimson/291st/tags)
[![Pull Requests](https://img.shields.io/badge/dynamic/json.svg?label=Pull%20Requests&style=for-the-badge&url=https://git.zakscode.com/api/v1/repos/ztimson/291st&query=open_pr_counter)](https://git.zakscode.com/ztimson/291st/pulls)
[![Issues](https://img.shields.io/badge/dynamic/json.svg?label=Issues&style=for-the-badge&url=https://git.zakscode.com/api/v1/repos/ztimson/291st&query=open_issues_count)](https://git.zakscode.com/ztimson/291st/issues)
<!-- Links -->
---
<div>
<a href="https://git.zakscode.com/ztimson/291st/releases" target="_blank">Release Notes</a>
• <a href="https://git.zakscode.com/ztimson/291st/issues/new?template=.github%2fissue_template%2fbug.md" target="_blank">Report a Bug</a>
• <a href="https://git.zakscode.com/ztimson/291st/issues/new?template=.github%2fissue_template%2fenhancement.md" target="_blank">Request a Feature</a>
</div>
---
</div>
## Table of Contents ## Table of Contents
[[_TOC_]] - [291st](#top)
- [About](#about)
- [Demo](https://291st.ca)
- [Built With](#built-with)
- [Setup](#setup)
- [Production](#production)
- [Development](#development)
- [License](#license)
## Prerequisites ## About
- [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
- [NodeJS 16](https://nodejs.org/en/) This website was created for the _291st Joint Task Force_ to act as a simple landing page for their domain.
- _[Docker](https://docs.docker.com/install/) (Optional)_
### Demo
Website: https://291st.ca
### Built With
[![Docker](https://img.shields.io/badge/Docker-384d54?style=for-the-badge&logo=docker)](https://docker.com/)
[![Momentum](https://img.shields.io/badge/Momentum-4c7bbc?style=for-the-badge)](https://momentum.zakscode.com)
## Setup ## Setup
The project can either be run using NPM or Docker. NPM is recommended for development.
<details>
<summary>NPM</summary>
<details>
<summary>
<h3 id="production" style="display: inline">
Production
</h3>
</summary>
#### Prerequisites
- [Docker](https://docs.docker.com/install/)
#### Instructions
1. Run the docker image: `docker run -p 80:80 git.zakscode.com/ztimson/291st:latest`
2. Open [http://localhost](http://localhost)
</details>
<details>
<summary>
<h3 id="development" style="display: inline">
Development
</h3>
</summary>
#### Prerequisites
- [Node.js](https://nodejs.org/en/download)
#### Instructions
1. Install the dependencies: `npm install` 1. Install the dependencies: `npm install`
2. Start the Angular server: `npm run start` 2. Start the Angular server: `npm run start`
</details> 3. Open [http://localhost:4200](http://localhost:4200)
<details>
<summary>Docker</summary>
1. Build the docker image: `docker build -t 291st:<TAG> .`
2. Start the new image: `docker run -p 4200:80 291st:<TAG>`
</details> </details>
The website should now be accessible on [http://localhost:4200](http://localhost:4200) ## License
Copyright © 2023 Zakary Timson | All Rights Reserved
## Cheatsheet See the [license](./LICENSE) for more information.
```bash
# Start Angular server
npm run start
# Build production
npm run build:prod
# Build docker image
docker build -t 291st:<TAG>
# Run docker image
docker run -p 4200:80 291st:<TAG>
```
-91
View File
@@ -1,91 +0,0 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"291st": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "scss"
}
},
"root": "",
"sourceRoot": "src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
"assets": [
"src/assets"
],
"styles": [
"src/styles.scss"
],
"scripts": [ ]
},
"configurations": {
"production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "500kb",
"maximumError": "1mb"
},
{
"type": "anyComponentStyle",
"maximumWarning": "2kb",
"maximumError": "4kb"
}
],
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"outputHashing": "all"
},
"development": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
"browserTarget": "291st:build:production"
},
"development": {
"browserTarget": "291st:build:development"
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "291st:build"
}
}
}
}
},
"cli": {
"analytics": false
}
}
-31
View File
@@ -1,31 +0,0 @@
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
gzip on;
gzip_proxied any;
gzip_types text/plain text/css application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript application/json application/x-font-woff;
gzip_vary on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
sendfile off;
keepalive_timeout 65;
server {
listen 80;
index index.html;
root /usr/share/nginx/html;
autoindex off;
location / {
try_files $uri$args $uri$args/ /index.html;
}
}
}
-2
View File
@@ -1,2 +0,0 @@
User-Agent: *
Allow: /
-20566
View File
File diff suppressed because it is too large Load Diff
-44
View File
@@ -1,44 +0,0 @@
{
"name": "291st",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "npm run build:dev",
"build:dev": "ng build --configuration development",
"build:prod": "ng build --configuration production",
"watch": "ng build --watch --configuration development"
},
"private": true,
"dependencies": {
"@angular/animations": "^14.2.0",
"@angular/cdk": "^14.2.2",
"@angular/common": "^14.2.0",
"@angular/compiler": "^14.2.0",
"@angular/core": "^14.2.0",
"@angular/forms": "^14.2.0",
"@angular/material": "^14.2.2",
"@angular/platform-browser": "^14.2.0",
"@angular/platform-browser-dynamic": "^14.2.0",
"@angular/router": "^14.2.0",
"bootstrap": "^5.2.1",
"jquery": "^3.6.1",
"rxjs": "~7.5.0",
"tslib": "^2.3.0",
"webstorage-decorators": "^4.2.0",
"zone.js": "~0.11.4"
},
"devDependencies": {
"@angular-devkit/build-angular": "^14.2.2",
"@angular/cli": "~14.2.2",
"@angular/compiler-cli": "^14.2.0",
"@types/jasmine": "~4.0.0",
"jasmine-core": "~4.3.0",
"karma": "~6.4.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.0.0",
"typescript": "~4.7.2"
}
}

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 MiB

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

+568
View File
@@ -0,0 +1,568 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>291st JTF</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- momentum:meta -->
<link href="https://fonts.googleapis.com/css2?family=Saira+Stencil+One&family=Roboto:wght@300;400;500&family=Share+Tech+Mono&display=swap" rel="stylesheet">
<script src="login.mjs" type="module" defer></script>
<!-- momentum:theme -->
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--red: #b10000;
--red-hover: #c00;
--dark: #202225;
--black: #000;
--max-w: 1100px;
--theme-primary: var(--red);
--theme-primary-contrast: white;
--theme-accent: var(--red);
--theme-accent-contrast: white;
}
html, body {
background: var(--black);
color: #fff;
font-family: Roboto, sans-serif;
overflow-x: hidden;
}
.stencil { font-family: 'Saira Stencil One', sans-serif; }
/* ── NAV ── */
nav {
position: sticky;
top: 0;
z-index: 100;
background: var(--dark);
border-bottom: 2px solid var(--red);
}
nav .inner {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0.25rem;
padding: 0 2rem;
}
nav a {
color: #aaa;
text-decoration: none;
padding: 0.75rem 0.75rem;
font-size: 0.8rem;
letter-spacing: 0.05em;
text-transform: uppercase;
border-bottom: 3px solid transparent;
transition: color 0.2s, border-color 0.2s;
}
nav a:hover, nav a.active {
color: #fff;
border-bottom-color: var(--red);
}
/* ── SHARED LAYOUT ── */
.inner {
max-width: var(--max-w);
margin: 0 auto;
padding: 0;
}
.section-wrap {
padding: 4rem 2rem;
}
section {
padding: 4rem 2rem;
max-width: var(--max-w);
margin: 0 auto;
}
section h2 { font-size: 2rem; margin-bottom: 0.5rem; }
.section-divider {
width: 60px;
height: 3px;
background: var(--red);
margin-bottom: 2rem;
}
/* ── ABOUT ── */
#about p {
color: #ccc;
line-height: 1.8;
max-width: 720px;
}
.stats {
display: flex;
gap: 2rem;
margin-top: 2rem;
flex-wrap: wrap;
}
.stat {
background: var(--dark);
border-left: 3px solid var(--red);
padding: 1rem 1.5rem;
min-width: 140px;
}
.stat .num {
font-size: 2rem;
font-weight: 700;
color: var(--red);
}
.stat .label {
font-size: 0.8rem;
color: #aaa;
text-transform: uppercase;
letter-spacing: 0.1em;
}
/* ── MISSION SET ── */
#mission-set { background: #0a0a0a; }
.services-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
@media (max-width: 700px) {
.services-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 480px) {
.services-grid { grid-template-columns: 1fr; }
}
.service-card {
background: var(--dark);
border-top: 3px solid transparent;
padding: 1.25rem;
display: flex;
align-items: flex-start;
gap: 1rem;
transition: border-color 0.2s, transform 0.2s;
}
.service-card:hover {
border-top-color: var(--red);
transform: translateY(-3px);
}
.service-card .icon {
font-size: 1.6rem;
flex-shrink: 0;
}
.service-card .text {
display: flex;
flex-direction: column;
}
.service-card .title { font-size: 1rem; font-weight: 500; margin-bottom: 0.25rem; }
.service-card .desc { font-size: 0.82rem; color: #888; line-height: 1.5; }
/* ── OPERATIONS ── */
.ops-list {
display: flex;
flex-direction: column;
gap: 1rem;
}
.op-item {
display: flex;
gap: 1.5rem;
align-items: flex-start;
background: var(--dark);
padding: 1.25rem 1.5rem;
border-left: 4px solid var(--red);
}
.op-item.upcoming { border-left-color: #4caf50; }
.op-item .op-date {
display: flex;
flex-direction: column;
gap: 0.2rem;
font-size: 0.75rem;
color: #888;
white-space: nowrap;
padding-top: 0.2rem;
min-width: 110px;
font-family: 'Share Tech Mono', monospace;
}
.op-item .op-date .op-time {
color: var(--red);
font-size: 0.7rem;
}
.op-item .op-title { font-weight: 500; margin-bottom: 0.25rem; }
.op-item .op-desc { font-size: 0.85rem; color: #aaa; }
.badge {
display: inline-block;
padding: 0.15rem 0.6rem;
font-size: 0.7rem;
border-radius: 2px;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-left: 0.5rem;
}
.badge-upcoming { background: #1a3a1a; color: #4caf50; }
.badge-completed { background: #1a1a2e; color: #888; }
/* ── DISCORD ── */
#discord { background: #050505; }
.discord-inner {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
align-items: start;
}
@media (max-width: 700px) { .discord-inner { grid-template-columns: 1fr; } }
.discord-inner iframe { width: 100%; min-height: 420px; border: none; }
.discord-info p {
color: #aaa;
line-height: 1.7;
margin-bottom: 1.5rem;
font-size: 0.95rem;
}
.btn {
display: inline-block;
padding: 0.75rem 1.75rem;
background: var(--red);
color: #fff;
text-decoration: none;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.85rem;
transition: background 0.2s;
}
.btn:hover { background: var(--red-hover); }
/* ── LOCATION ── */
#location { background: #080808; border-top: 1px solid #111; }
.location-inner {
display: grid;
grid-template-columns: 1fr 2fr;
gap: 2rem;
align-items: center;
}
@media (max-width: 700px) { .location-inner { grid-template-columns: 1fr; } }
.location-info p {
color: #aaa;
line-height: 1.7;
font-size: 0.95rem;
margin-bottom: 0.5rem;
}
.location-info .detail {
font-family: 'Share Tech Mono', monospace;
font-size: 0.8rem;
color: #555;
margin-top: 1rem;
line-height: 1.8;
}
#map-wrap {
position: relative;
width: 100%;
aspect-ratio: 16/9;
overflow: hidden;
border: 1px solid #1a1a1a;
}
#map-wrap iframe {
width: 100%;
height: 100%;
border: none;
filter: grayscale(1) invert(1) brightness(0.8) contrast(1.1);
}
.map-pin {
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%, -100%);
z-index: 2;
pointer-events: none;
display: flex;
flex-direction: column;
align-items: center;
}
.map-pin .pin-dot {
width: 14px; height: 14px;
background: var(--red);
border-radius: 50%;
box-shadow: 0 0 0 3px rgba(177,0,0,0.3);
animation: pulse 2s infinite;
}
.map-pin .pin-line { width: 2px; height: 20px; background: var(--red); }
.map-pin .pin-label {
background: var(--red);
color: #fff;
font-size: 0.65rem;
font-family: 'Share Tech Mono', monospace;
letter-spacing: 0.1em;
padding: 0.2rem 0.5rem;
white-space: nowrap;
margin-top: 4px;
}
@keyframes pulse {
0%, 100% { box-shadow: 0 0 0 3px rgba(177,0,0,0.3); }
50% { box-shadow: 0 0 0 8px rgba(177,0,0,0.1); }
}
/* ── FOOTER ── */
footer {
background: var(--dark);
border-top: 2px solid #111;
text-align: center;
padding: 1.5rem;
font-size: 0.85rem;
color: #666;
}
footer a, footer a:visited { color: var(--red); text-decoration: none; }
footer a:hover { color: var(--red-hover); }
</style>
</head>
<body>
<jtf-login></jtf-login>
<nav id="main-nav">
<div class="inner">
<a href="#about">About</a>
<a href="#mission-set">Mission Set</a>
<a href="#operations">Operations</a>
<a href="#discord">Discord</a>
</div>
</nav>
<!-- ABOUT -->
<section id="about" class="section-wrap">
<h2 class="stencil">About</h2>
<div class="section-divider"></div>
<p>
The 291st Joint Task Force is a casual group of gamers focused on tactical & strategical cooperative play.
We operate across multiple titles and timezones We run weekly operations and "book clubs" to enjoy singplayer games together.
If youre looking for friends to enjoy games with on a regular baisis, you came to the right place. We're recruting.
</p>
<div class="stats">
<div class="stat"><div class="num">291st</div><div class="label">Unit</div></div>
<div class="stat"><div class="num">15+</div><div class="label">Members</div></div>
<div class="stat"><div class="num">2015</div><div class="label">Founded</div></div>
<div class="stat"><div class="num">1,000+</div><div class="label">Missions</div></div>
</div>
</section>
<!-- MISSION SET -->
<div id="mission-set" class="section-wrap">
<div class="inner">
<h2 class="stencil">Mission Set</h2>
<div class="section-divider"></div>
<div class="services-grid">
<div class="service-card">
<div class="icon">🎮</div>
<div class="text">
<div class="title">Wide Mission Set</div>
<div class="desc">Solo, Shooters, Strategy and MMO's</div>
</div>
</div>
<div class="service-card">
<div class="icon">📅</div>
<div class="text">
<div class="title">Weekly Operations</div>
<div class="desc">Maintain high readiness at all times.</div>
</div>
</div>
<div class="service-card">
<div class="icon">🖥️</div>
<div class="text">
<div class="title">24/7 Servers</div>
<div class="desc">Requisition servers for any game.</div>
</div>
</div>
<div class="service-card">
<div class="icon">🔒</div>
<div class="text">
<div class="title">VPN Access</div>
<div class="desc">Private VPN access for members.</div>
</div>
</div>
<div class="service-card">
<div class="icon">🎬</div>
<div class="text">
<div class="title">Private Media Server</div>
<div class="desc">REDACTED</div>
</div>
</div>
<div class="service-card">
<div class="icon">🌎</div>
<div class="text">
<div class="title">North American</div>
<div class="desc">EDT timezone — All regions welcome</div>
</div>
</div>
</div>
</div>
</div>
<!-- OPERATIONS -->
<section id="operations" class="section-wrap">
<h2 class="stencil">Operations</h2>
<div class="section-divider"></div>
<div class="ops-list" id="ops-list"></div>
</section>
<!-- DISCORD -->
<div id="discord" class="section-wrap">
<div class="inner">
<div class="discord-inner">
<div class="discord-info">
<h2 class="stencil">Join Us</h2>
<div class="section-divider"></div>
<p>
Our Discord is the nerve centre of the 291st. Briefings, op schedules, voice comms,
and unit announcements all live here. Active members are expected to stay connected.
</p>
<a class="btn" href="https://discord.gg/your-invite" target="_blank">Join Discord</a>
</div>
<iframe
src="https://discordapp.com/widget?id=399625240927404033&theme=dark"
allowtransparency="true"
sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts">
</iframe>
</div>
</div>
</div>
<!-- LOCATION -->
<div id="location" class="section-wrap">
<div class="inner">
<div class="location-inner">
<div class="location-info">
<h2 class="stencil">Location</h2>
<div class="section-divider"></div>
<p>Based out of Ontario, Canada. Operating across North America on Eastern time.</p>
<div class="detail">
REGION: North America<br>
PROVINCE: Ontario, CA<br>
TIMEZONE: EDT / UTC-4<br>
OP TIME: Sun 14:3018:30
</div>
</div>
<div id="map-wrap">
<iframe
src="https://www.openstreetmap.org/export/embed.html?bbox=-130.0%2C25.0%2C-55.0%2C55.0&layer=mapnik&marker=43.6532%2C-79.3832"
style="pointer-events: none;"
loading="lazy">
</iframe>
</div>
</div>
</div>
</div>
<!-- FOOTER -->
<footer>
<p>Copyright &copy; 291st JTF 2025 &nbsp;|&nbsp; All Rights Reserved<br>
Created by <a href="https://zakscode.com" target="_blank">Zak Timson</a> | Built with <a href="https://momentum.zakscode.com" target="_blank">Momentum</a></p>
</footer>
<script type="module">
import {Momentum} from 'https://291st.com/momentum.mjs';
const momentum = window.momentum = new Momentum('https://291st.com', {app: 'Website'});
const session = momentum.auth.readSession();
</script>
<script>
// ── DYNAMIC OPS (newest first) ──
function getSundayOps() {
const now = new Date();
const day = now.getDay();
const lastSunday = new Date(now);
lastSunday.setDate(now.getDate() - day);
lastSunday.setHours(14, 30, 0, 0);
const todayEnd = new Date(now);
todayEnd.setHours(18, 30, 0, 0);
const upcomingDate = (day === 0 && now < todayEnd) ? lastSunday : new Date(lastSunday);
if (!(day === 0 && now < todayEnd)) upcomingDate.setDate(lastSunday.getDate() + 7);
const ops = [
{ date: upcomingDate, upcoming: true },
];
for (let i = 1; i <= 2; i++) {
const d = new Date(upcomingDate);
d.setDate(upcomingDate.getDate() - 7 * i);
ops.push({ date: d, upcoming: false });
}
return ops;
}
function fmtDate(d) {
return d.toLocaleDateString('en-CA', { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' });
}
const list = document.getElementById('ops-list');
getSundayOps().forEach(op => {
const item = document.createElement('div');
item.className = 'op-item' + (op.upcoming ? ' upcoming' : '');
item.innerHTML = `
<div class="op-date">
<span>${fmtDate(op.date)}</span>
<span class="op-time">14:30 18:30 EDT</span>
</div>
<div>
<div class="op-title">
Weekly Operation — Sunday Afternoon
${op.upcoming ? `<span class="badge badge-upcoming">Upcoming</span>` : ''}
</div>
<div class="op-desc">${op.upcoming ? 'All squads report in, game TBD' : 'Operation Complete'}</div>
</div>
`;
list.appendChild(item);
});
// ── NAV HIGHLIGHT ──
const navLinks = document.querySelectorAll('nav a');
const observer = new IntersectionObserver(entries => {
entries.forEach(e => {
if (e.isIntersecting)
navLinks.forEach(a => a.classList.toggle('active', a.getAttribute('href') === '#' + e.target.id));
});
}, { threshold: 0.4 });
document.querySelectorAll('[id]').forEach(s => observer.observe(s));
</script>
</body>
</html>
+311
View File
@@ -0,0 +1,311 @@
class JTFLogin extends HTMLElement {
connectedCallback() {
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
<style>
:host {
display: flex;
position: relative;
height: 100vh;
min-height: 500px;
align-items: center;
justify-content: center;
overflow: hidden;
background: radial-gradient(ellipse at center, #010d1a 0%, #000 100%);
font-family: 'Share Tech Mono', monospace;
}
/* ── BOX ── */
.box {
position: relative;
z-index: 3;
width: min(420px, 90vw);
background: rgba(0, 8, 20, 0.92);
border: 1px solid rgba(0,180,255,0.25);
padding: 2.5rem;
box-shadow:
0 0 60px rgba(0,180,255,0.05),
inset 0 0 40px rgba(0,0,0,0.5);
}
.box::before, .box::after {
content: '';
position: absolute;
left: 0; right: 0;
height: 1px;
}
.box::before { top: 6px; background: linear-gradient(90deg, transparent, rgba(0,180,255,0.3), transparent); }
.box::after { bottom: 6px; background: linear-gradient(90deg, transparent, rgba(0,180,255,0.3), transparent); }
.corner {
position: absolute;
width: 12px; height: 12px;
border-color: rgba(0,180,255,0.6);
border-style: solid;
}
.corner-tl { top: -1px; left: -1px; border-width: 2px 0 0 2px; }
.corner-tr { top: -1px; right: -1px; border-width: 2px 2px 0 0; }
.corner-bl { bottom: -1px; left: -1px; border-width: 0 0 2px 2px; }
.corner-br { bottom: -1px; right: -1px; border-width: 0 2px 2px 0; }
/* ── HEADER ── */
.header { text-align: center; margin-bottom: 2rem; }
.tag {
font-size: 0.65rem;
color: rgba(0,180,255,0.5);
letter-spacing: 0.25em;
text-transform: uppercase;
margin-top: 1rem;
}
.logo-img {
height: 120px;
width: auto;
object-fit: contain;
display: block;
margin: 0 auto 1rem;
filter: drop-shadow(0 0 8px rgba(0,180,255,0.4));
}
.title {
font-family: 'Saira Stencil One', sans-serif;
font-size: 1.8rem;
color: #aaa;
letter-spacing: 0.1em;
margin-bottom: 0.2rem;
text-shadow: 0 0 20px rgba(0,180,255,0.3);
}
.subtitle {
font-size: 0.65rem;
color: rgba(0,180,255,0.4);
letter-spacing: 0.2em;
}
/* ── FIELDS ── */
.field { margin-bottom: 1.25rem; }
.field label {
display: flex;
justify-content: space-between;
font-size: 0.65rem;
color: rgba(0,180,255,0.4);
letter-spacing: 0.2em;
text-transform: uppercase;
margin-bottom: 0.5rem;
}
.field label span { color: rgba(255,255,255,0.15); }
.field-value {
width: 100%;
padding: 0.5rem 0;
border: none;
border-bottom: 1px solid rgba(0,180,255,0.15);
background: transparent;
color: rgba(0,180,255,0.8);
font-family: 'Share Tech Mono', monospace;
font-size: 0.95rem;
letter-spacing: 0.08em;
min-height: 2rem;
user-select: none;
}
.field-value.filled {
border-bottom-color: rgba(0,180,255,0.4);
}
.field-value.locked {
color: rgba(0,180,255,0.35);
border-bottom-color: rgba(0,180,255,0.1);
}
/* ── STATUS ── */
.status {
font-size: 0.68rem;
color: rgba(0,180,255,0.4);
letter-spacing: 0.1em;
margin-bottom: 1.5rem;
min-height: 1rem;
}
.status.active { color: rgba(0,180,255,0.8); }
.status.success { color: #00ff87; }
.status.error { color: #b10000; }
/* ── BUTTON ── */
button {
width: 100%;
padding: 0.85rem;
background: transparent;
border: 1px solid rgba(177,0,0,0.6);
color: rgba(177,0,0,0.8);
font-family: 'Share Tech Mono', monospace;
font-size: 0.85rem;
letter-spacing: 0.25em;
text-transform: uppercase;
cursor: default;
transition: all 0.4s;
position: relative;
overflow: hidden;
}
button::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(90deg, transparent, rgba(177,0,0,0.05), transparent);
transform: translateX(-100%);
}
button.flash { animation: btnFlash 0.35s ease-in-out 4; }
button.proceed {
border-color: rgba(0,255,135,0.5);
color: #00ff87;
cursor: pointer;
box-shadow: 0 0 20px rgba(0,255,135,0.1);
}
button.proceed::before {
animation: shimmer 2s infinite;
}
button.proceed:hover {
background: rgba(0,255,135,0.06);
box-shadow: 0 0 30px rgba(0,255,135,0.15);
}
@keyframes btnFlash {
0%, 100% { opacity: 1; }
50% { opacity: 0.1; }
}
@keyframes shimmer {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
/* ── DIVIDER ── */
.divider {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 1.5rem;
color: rgba(0,180,255,0.15);
font-size: 0.6rem;
letter-spacing: 0.2em;
}
.divider::before, .divider::after {
content: '';
flex: 1;
height: 1px;
background: rgba(0,180,255,0.1);
}
</style>
<link href="https://fonts.googleapis.com/css2?family=Saira+Stencil+One&family=Share+Tech+Mono&display=swap" rel="stylesheet">
<div class="box">
<div class="corner corner-tl"></div>
<div class="corner corner-tr"></div>
<div class="corner corner-bl"></div>
<div class="corner corner-br"></div>
<div class="header">
<img class="logo-img" src="assets/img/logo.png" alt="291st JTF">
<div class="title">291st JTF</div>
<div class="subtitle">JOINT TASK FORCE</div>
</div>
<div class="divider">OPERATOR AUTHENTICATION</div>
<div class="field">
<label>Operator ID</label>
<div class="field-value" id="f-user"></div>
</div>
<div class="field">
<label>Access Code</label>
<div class="field-value" id="f-pass"></div>
</div>
<div class="status" id="status"></div>
<button id="btn" disabled>AUTHENTICATE</button>
<div class="tag">Status: SECURE | Version: 1.0.0</div>
</div>
`;
this._runSequence();
}
_type(el, text, delay) {
return new Promise(resolve => {
let i = 0;
const t = setInterval(() => {
el.textContent = text.slice(0, ++i);
if (i >= text.length) { clearInterval(t); resolve(); }
}, delay);
});
}
_wait(ms) { return new Promise(r => setTimeout(r, ms)); }
_setStatus(msg, cls = '') {
const s = this.shadowRoot.getElementById('status');
s.textContent = msg;
s.className = 'status ' + cls;
}
async _runSequence() {
const root = this.shadowRoot;
const fUser = root.getElementById('f-user');
const fPass = root.getElementById('f-pass');
const btn = root.getElementById('btn');
await this._wait(700);
this._setStatus('> INITIALISING ENCRYPTED CHANNEL...', 'active');
await this._wait(1200);
this._setStatus('> BIOMETRIC HANDSHAKE CONFIRMED', 'active');
await this._wait(900);
this._setStatus('> ENTER CREDENTIALS', 'active');
await this._wait(600);
await this._type(fUser, 'OPERATOR_291', 75);
fUser.classList.add('filled');
await this._wait(300);
await this._type(fPass, '● ● ● ● ● ● ● ●', 55);
fPass.classList.add('filled');
await this._wait(400);
this._setStatus('> AUTHENTICATING — STANDBY...', 'active');
await this._wait(300);
btn.disabled = false;
btn.classList.add('flash');
await this._wait(1500);
btn.classList.remove('flash');
this._setStatus('> ACCESS GRANTED — IDENTITY VERIFIED ✓', 'success');
fUser.classList.remove('filled');
fPass.classList.remove('filled');
fUser.classList.add('locked');
fPass.classList.add('locked');
btn.textContent = 'PROCEED ▶';
btn.classList.add('proceed');
btn.addEventListener('click', () => {
document.getElementById('main-nav')?.scrollIntoView({ behavior: 'smooth' });
}, { once: true });
}
}
customElements.define('jtf-login', JTFLogin);
-29
View File
@@ -1,29 +0,0 @@
import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {AppRouting} from './app.routing';
import {FooterComponent} from './components/footer/footer.component';
import {NavbarComponent} from './components/navbar/navbar.component';
import {AppComponent} from './containers/app/app.component';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {MaterialModule} from './material.module';
import {HomeComponent} from './views/home/home.component';
export const APP_COMPONENTS = [
AppComponent,
HomeComponent,
FooterComponent,
NavbarComponent
]
@NgModule({
declarations: APP_COMPONENTS,
imports: [
BrowserModule,
AppRouting,
BrowserAnimationsModule,
MaterialModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
-13
View File
@@ -1,13 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import {HomeComponent} from './views/home/home.component';
const routes: Routes = [
{path: '', pathMatch: 'full', component: HomeComponent}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRouting { }
@@ -1,8 +0,0 @@
<footer>
<div class="py-2 text-center">
<p class="copywright m-0">
Copyright &copy; 291st JTF 2022 | All Rights Reserved<br>
Created by <a href="https://zakscode.com" target="_blank">Zak Timson</a>
</p>
</div>
</footer>
@@ -1,4 +0,0 @@
.copywright {
a, a:visited { color: #b10000; }
a:hover, a:visited:hover { color: #cc0000; }
}
@@ -1,8 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'app-footer',
templateUrl: './footer.component.html',
styleUrls: ['./footer.component.scss']
})
export class FooterComponent { }
@@ -1,16 +0,0 @@
<mat-toolbar>
<mat-toolbar-row>
<div>
<a class="navbar-brand d-flex align-items-center" routerLink="/">
<div class="px-2">291st Joint Task Force</div>
</a>
</div>
<div class="flex-grow-1"></div>
<div *ngIf="!hamburger">
</div>
<button *ngIf="hamburger" mat-icon-button class="mr-3">
<mat-icon (click)="hamburgerClick.emit()">menu</mat-icon>
</button>
</mat-toolbar-row>
</mat-toolbar>
<div class="navbar-spacing"><!-- Spacing --></div>
@@ -1,58 +0,0 @@
.navbar-spacing {
height: 64px;
width: 100%;
}
::ng-deep mat-toolbar {
background: #000 !important;
border-bottom: #fff solid 1px;
height: 64px;
position: fixed;
top: 0;
z-index: 100;
.mat-toolbar-row {
height: 100%;
}
.navbar-brand {
color: #fff;
//font-weight: lighter;
&:hover img {
filter: brightness(5%) sepia(75) saturate(100) hue-rotate(25deg);
}
}
.navbar-button {
//color: rgba(255, 255, 255, 0.55);
font-weight: normal;
padding: 0 8px 0 8px;
//&:hover {
// color: rgba(255, 255, 255, 0.75);
//}
}
}
::ng-deep .mat-menu-content {
background: #000;
border: #fff solid 1px;
padding: 0 !important;
border-radius: 0.25rem;
mat-divider {
border-color: white;
margin-top: 0.2rem;
padding-bottom: 0.1rem;
}
button {
height: 36px;
line-height: 36px;
&:hover {
background: rgba(255, 255, 255, 0.15) !important;
}
}
}
@@ -1,34 +0,0 @@
import {AfterViewInit, Component, EventEmitter, Input, OnDestroy, Output} from '@angular/core';
import {ActivatedRoute} from '@angular/router';
import {Subscription} from 'rxjs';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.scss']
})
export class NavbarComponent implements AfterViewInit, OnDestroy {
private sub!: Subscription;
@Input() hamburger = true;
@Output() hamburgerClick = new EventEmitter<void>();
constructor(private route: ActivatedRoute) { }
ngAfterViewInit() {
this.sub = this.route.fragment.subscribe(frag => {
if(frag) this.scroll(frag);
});
}
ngOnDestroy(): void {
if(this.sub) this.sub.unsubscribe();
}
scroll(id: string) {
const el = document.getElementById(id);
if(el) el.scrollIntoView({behavior: 'smooth'});
else setTimeout(() => this.scroll(id), 500);
}
}
@@ -1,5 +0,0 @@
<app-navbar [hamburger]="mobile"></app-navbar>
<div class="fill app-container">
<router-outlet></router-outlet>
<app-footer></app-footer>
</div>
@@ -1,5 +0,0 @@
.app-container {
overflow-x: hidden;
overflow-y: auto;
scroll-behavior: smooth;
}
-23
View File
@@ -1,23 +0,0 @@
import {BreakpointObserver} from '@angular/cdk/layout';
import { Component } from '@angular/core';
import {ActivatedRoute, NavigationEnd, Router} from '@angular/router';
import {filter} from 'rxjs';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
mobile = false;
open = false;
constructor(private router: Router, route: ActivatedRoute, breakpointObserver: BreakpointObserver) {
router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => this.open = false);
breakpointObserver.observe(['(max-width: 750px)']).subscribe(result => {
this.mobile = result.matches;
this.open = !this.mobile;
})
}
}
-16
View File
@@ -1,16 +0,0 @@
import {NgModule} from '@angular/core';
import {MatButtonModule} from '@angular/material/button';
import {MatIconModule} from '@angular/material/icon';
import {MatToolbarModule} from '@angular/material/toolbar';
export const MATERIAL_MODULES = [
MatButtonModule,
MatIconModule,
MatToolbarModule
];
@NgModule({
imports: MATERIAL_MODULES,
exports: MATERIAL_MODULES,
})
export class MaterialModule {}
-9
View File
@@ -1,9 +0,0 @@
<section class="fill background d-flex flex-column flex-md-row">
<div class="flex-grow-1 p-3" style="flex-basis: 0">
<iframe src="https://discordapp.com/widget?id=399625240927404033&theme=dark" width="100%" height="100%" allowtransparency="true" frameborder="0" style="min-height: 500px" sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"></iframe>
</div>
<div class="flex-grow-1 p-3" style="flex-basis: 0">
</div>
<div class="flex-grow-1 p-3" style="flex-basis: 0">
</div>
</section>
-3
View File
@@ -1,3 +0,0 @@
.background {
background: url("/assets/img/291st-background.png") no-repeat center center;
}
-10
View File
@@ -1,10 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss']
})
export class HomeComponent {
}
-3
View File
@@ -1,3 +0,0 @@
export const environment = {
production: true
};
-3
View File
@@ -1,3 +0,0 @@
export const environment = {
production: false
};
-23
View File
@@ -1,23 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- TODO: Description-->
<meta name="description" content="">
<meta name="author" content="Zak Timson">
<title>291st JTF</title>
<link href="assets/img/logo.png" rel="icon" type="image/png">
<link href="https://use.fontawesome.com/releases/v6.1.1/css/all.css" rel="stylesheet">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body class="mat-typography" style="background: #000">
<app-root></app-root>
</body>
</html>
-12
View File
@@ -1,12 +0,0 @@
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
-53
View File
@@ -1,53 +0,0 @@
/**
* This file includes polyfills needed by Angular and is loaded before the app.
* You can add your own extra polyfills to this file.
*
* This file is divided into 2 sections:
* 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
* 2. Application imports. Files imported after ZoneJS that should be loaded before your main
* file.
*
* The current setup is for so-called "evergreen" browsers; the last versions of browsers that
* automatically update themselves. This includes recent versions of Safari, Chrome (including
* Opera), Edge on the desktop, and iOS and Chrome on mobile.
*
* Learn more in https://angular.io/guide/browser-support
*/
/***************************************************************************************************
* BROWSER POLYFILLS
*/
/**
* By default, zone.js will patch all possible macroTask and DomEvents
* user can disable parts of macroTask/DomEvents patch by setting following flags
* because those flags need to be set before `zone.js` being loaded, and webpack
* will put import in the top of bundle, so user need to create a separate file
* in this directory (for example: zone-flags.ts), and put the following flags
* into that file, and then add the following code before importing zone.js.
* import './zone-flags';
*
* The flags allowed in zone-flags.ts are listed here.
*
* The following flags will work for all browsers.
*
* (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
* (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
* (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
*
* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
* with the following flag, it will bypass `zone.js` patch for IE/Edge
*
* (window as any).__Zone_enable_cross_context_check = true;
*
*/
/***************************************************************************************************
* Zone JS is required by default for Angular itself.
*/
import 'zone.js'; // Included with Angular CLI.
/***************************************************************************************************
* APPLICATION IMPORTS
*/
-54
View File
@@ -1,54 +0,0 @@
@use '@angular/material' as mat;
@include mat.core();
// hue. Available color palettes: https://material.io/design/color/
$LegioXXX-primary: mat.define-palette(mat.$red-palette, 900);
$LegioXXX-accent: mat.define-palette(mat.$indigo-palette, 900);
$LegioXXX-warn: mat.define-palette(mat.$orange-palette, 500);
$LegioXXX-theme: mat.define-dark-theme((
color: (
primary: $LegioXXX-primary,
accent: $LegioXXX-accent,
warn: $LegioXXX-warn,
)
));
@include mat.all-component-themes($LegioXXX-theme);
@import '~bootstrap/dist/css/bootstrap-utilities.min.css';
::-webkit-scrollbar-track {
background: rgba(0, 0, 0, 0);
}
::-webkit-scrollbar {
width: 10px;
background: rgba(0, 0, 0, 0);
}
::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.6);
&:hover { background: rgba(255, 255, 255, 0.8); }
}
html, body {
height: 100%;
}
body {
background: #000;
color: #fff;
font-family: Roboto, sans-serif;
margin: 0;
overflow: hidden;
}
a, a:visited {
text-decoration: none;
color: rgba(255, 255, 255, 0.6);
}
a:hover, a:visited:hover { color: #b10000; }
.fill {
height: 0;
min-height: calc(100vh - 64px);
}
-15
View File
@@ -1,15 +0,0 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/app",
"types": []
},
"files": [
"src/main.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.d.ts"
]
}
-32
View File
@@ -1,32 +0,0 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"experimentalDecorators": true,
"moduleResolution": "node",
"importHelpers": true,
"target": "es2020",
"module": "es2020",
"lib": [
"es2020",
"dom"
]
},
"angularCompilerOptions": {
"enableI18nLegacyMessageIdFormat": false,
"strictInjectionParameters": true,
"strictInputAccessModifiers": true,
"strictTemplates": true
}
}