Compare commits

..

86 Commits

Author SHA1 Message Date
Janis
442e8f05e6 update version 2023-11-12 19:57:28 +01:00
Janis
f30cd26393 fix generator font size 2023-11-12 19:57:10 +01:00
Janis
f0761c40b7 update version 2023-11-12 19:26:26 +01:00
Janis
ef442f10e0 Merge branch 'main' of https://github.com/DerTyp7/ts5-obs-overlay 2023-11-12 19:25:52 +01:00
Janis
ce7bd90362 add link for detailed instructions 2023-11-12 19:25:50 +01:00
Janis
61f6651a57 Merge pull request #90 from DerTyp7/DerTyp7-patch-1
Update README.md
2023-11-12 19:24:46 +01:00
Janis
1d9b6de814 Update README.md 2023-11-12 19:24:20 +01:00
Janis
751fad72f4 Update README.md 2023-11-12 19:22:30 +01:00
Janis
4eb61d3b96 fix viewer font size 2023-11-12 19:19:33 +01:00
Janis
7fd2e2aafa Merge pull request #89 from DerTyp7/DerTyp7-patch-2
Update README.md
2023-11-12 19:04:09 +01:00
Janis
33786d7366 Update README.md 2023-11-12 19:03:18 +01:00
Janis
1a5b231d1e fix hashruter generator 2023-11-12 19:01:01 +01:00
Janis
232bca2bbc remove doubled pathname issue 2023-11-12 18:52:24 +01:00
Janis
0b74390d2e update version 2023-11-12 18:50:13 +01:00
Janis
d16e80a48d fix pathname in generator 2023-11-12 18:49:49 +01:00
Janis
c5009271c4 update version 2023-11-12 18:43:57 +01:00
Janis
e9f3fa28f9 remove auto reroute 2023-11-12 18:43:24 +01:00
Janis
8b23a8cca7 update version 2023-11-12 18:41:36 +01:00
Janis
87dd069dec fix url generation for gh pages 2023-11-12 18:41:12 +01:00
Janis
1a5f0b8e6e update version 2023-11-12 18:35:34 +01:00
Janis
8db32153d2 Use Hashrouter because of ghpages 2023-11-12 18:34:40 +01:00
Janis
b1da52ad1d Merge pull request #88 from DerTyp7/dev
Implement generator to simplify customization
2023-11-12 18:24:08 +01:00
Janis
dbc2bd422d Merge pull request #87 from DerTyp7/feature_implement-url-generator
Feature implement URL generator
2023-11-12 18:21:44 +01:00
Janis
86d2eb4c50 remove vite-plugin-singlefile 2023-11-12 18:19:14 +01:00
Janis
63bef6e11d update readme 2023-11-12 18:16:18 +01:00
Janis
e65eb5b3c4 Update README.md 2023-11-12 18:14:30 +01:00
Janis
e847dde41d update readme 2023-11-12 18:14:08 +01:00
Janis
5f0ca2c209 clean up 2023-11-12 18:03:20 +01:00
Janis
a4f64c3781 add instructions 2023-11-12 17:24:34 +01:00
Janis
9870fdcdb4 add responsive design 2023-11-12 17:16:58 +01:00
Janis
ce7aee8481 fix viewer style 2023-11-12 16:41:09 +01:00
Janis
5ef2facfec better generator 2023-11-12 16:28:42 +01:00
bbd10af0dc add basic generator structure 2023-11-10 11:20:58 +01:00
Janis
e2a8472cf9 add generator url 2023-11-05 17:40:16 +01:00
Janis
ed78b23bb1 add router 2023-11-05 17:32:27 +01:00
Janis
58fa81eb71 change version to 2.0.0 2023-11-05 17:20:01 +01:00
Janis
3a75c91bbd use moduleResolution node 2023-11-05 17:19:14 +01:00
Janis
fa64de9666 update vite 2023-11-05 17:16:22 +01:00
Janis
847cb76bca Merge pull request #83 from DerTyp7/dependabot/npm_and_yarn/dev/eslint-8.53.0
Bump eslint from 8.45.0 to 8.53.0
2023-11-05 17:10:25 +01:00
Janis
6a7dd4455e Merge pull request #84 from DerTyp7/dependabot/npm_and_yarn/dev/typescript-eslint/parser-6.9.1
Bump @typescript-eslint/parser from 6.2.1 to 6.9.1
2023-11-05 17:10:19 +01:00
dependabot[bot]
61678b3ed4 Bump eslint from 8.45.0 to 8.53.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.45.0 to 8.53.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.45.0...v8.53.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-05 16:10:14 +00:00
Janis
fea7f03d20 Merge pull request #85 from DerTyp7/dependabot/npm_and_yarn/dev/types/react-dom-18.2.14
Bump @types/react-dom from 18.2.7 to 18.2.14
2023-11-05 17:10:12 +01:00
dependabot[bot]
7551dd421c Bump @typescript-eslint/parser from 6.2.1 to 6.9.1
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 6.2.1 to 6.9.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.9.1/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-05 16:10:00 +00:00
dependabot[bot]
18b4c0c67d Bump @types/react-dom from 18.2.7 to 18.2.14
Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.2.7 to 18.2.14.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: "@types/react-dom"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-05 16:09:55 +00:00
Janis
e75116d6c9 Merge pull request #86 from DerTyp7/dependabot/npm_and_yarn/dev/types/react-18.2.35
Bump @types/react from 18.2.23 to 18.2.35
2023-11-05 17:09:20 +01:00
dependabot[bot]
176cdc79ed Bump @types/react from 18.2.23 to 18.2.35
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.23 to 18.2.35.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-05 16:08:39 +00:00
Janis
6ca724bd77 Merge pull request #82 from DerTyp7/dependabot/npm_and_yarn/react-router-dom-6.18.0
Bump react-router-dom from 6.14.2 to 6.18.0
2023-11-05 17:07:53 +01:00
Janis
3bd6c60987 dependabot should target dev branch 2023-11-05 17:06:49 +01:00
dependabot[bot]
eb73c51ee1 Bump react-router-dom from 6.14.2 to 6.18.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.14.2 to 6.18.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.18.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 01:11:44 +00:00
Janis
945c3ec582 Update bug_report.md 2023-10-23 15:12:11 +02:00
Janis
2c24379bbb Update README.md 2023-10-21 16:28:24 +02:00
Janis
d67a243c5d Update README 2023-10-07 23:04:42 +02:00
Janis
3174145067 update package.json 2023-10-07 22:59:51 +02:00
Janis
c40b33de2b update prettier config 2023-10-07 22:53:39 +02:00
Janis
7974a08b24 remove old eslint comment 2023-10-07 22:50:45 +02:00
Janis
ab38a1b1fe add . to meta 2023-10-07 22:48:23 +02:00
Janis
bb7d2d61c6 add meta tags 2023-10-07 22:46:04 +02:00
Janis
81eed1e0ab Delete .github/workflows/eslint.yml 2023-10-07 22:39:04 +02:00
Janis
d75e11f3cd Create eslint.yml 2023-10-07 22:36:17 +02:00
Janis
c5a8f484b7 Update README.md 2023-10-07 20:32:00 +02:00
Janis
c5b801d3d5 Update README.md 2023-10-07 17:29:33 +02:00
Janis
c86618f78f add better readability 2023-10-07 17:26:20 +02:00
Janis
2f1e91c199 add new common issue 2023-10-07 17:24:26 +02:00
Janis
59594125a5 change version to 1.3.1 2023-10-07 17:15:09 +02:00
Janis
32108d7a99 change author and version 2023-10-07 17:10:37 +02:00
Janis
5c8d9721b2 add quick instructions 2023-10-07 17:06:25 +02:00
Janis
24f3e6dd88 Rewrite instructions 2023-10-07 16:36:19 +02:00
Janis
3461e2be0a Add new instruction for the easy online usage 2023-10-07 16:04:48 +02:00
Janis
456d09d647 update version to 1.2.5 2023-10-07 15:42:53 +02:00
Janis
09d24b2acd Merge pull request #75 from DerTyp7/dependabot/npm_and_yarn/types/node-20.8.3
Bump @types/node from 20.8.0 to 20.8.3
2023-10-07 15:41:33 +02:00
dependabot[bot]
389033e795 Bump @types/node from 20.8.0 to 20.8.3
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.8.0 to 20.8.3.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-07 13:41:03 +00:00
Janis
76ee50e262 Merge pull request #76 from DerTyp7/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-6.7.4
Bump @typescript-eslint/eslint-plugin from 6.7.3 to 6.7.4
2023-10-07 15:40:26 +02:00
Janis
2fb3c47e33 uninstall jest (not used) 2023-10-07 15:40:07 +02:00
dependabot[bot]
7676e72ca1 Bump @typescript-eslint/eslint-plugin from 6.7.3 to 6.7.4
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 6.7.3 to 6.7.4.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.7.4/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-07 13:39:09 +00:00
Janis
7bd7786465 Merge pull request #70 from DerTyp7/dependabot/npm_and_yarn/sass-1.68.0
Bump sass from 1.64.1 to 1.68.0
2023-10-07 15:38:39 +02:00
Janis
e27cd40234 Merge pull request #71 from DerTyp7/dependabot/npm_and_yarn/types/node-20.8.0
Bump @types/node from 20.4.5 to 20.8.0
2023-10-07 15:38:32 +02:00
Janis
13080ca9d1 Merge pull request #72 from DerTyp7/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-6.7.3
Bump @typescript-eslint/eslint-plugin from 6.2.0 to 6.7.3
2023-10-07 15:38:26 +02:00
Janis
a74ae8988f Merge pull request #73 from DerTyp7/dependabot/npm_and_yarn/types/react-18.2.23
Bump @types/react from 18.2.15 to 18.2.23
2023-10-07 15:38:19 +02:00
Janis
31b564d676 Merge pull request #74 from DerTyp7/dependabot/npm_and_yarn/postcss-8.4.31
Bump postcss from 8.4.26 to 8.4.31
2023-10-07 15:38:10 +02:00
Janis
c9c31a3e64 update package.json values 2023-10-07 15:37:34 +02:00
Janis
295153e702 newer gh-pages actions version 2023-10-07 15:32:27 +02:00
dependabot[bot]
db770ab2b1 Bump postcss from 8.4.26 to 8.4.31
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.26 to 8.4.31.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.26...8.4.31)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-07 13:21:18 +00:00
dependabot[bot]
9d3a30462c Bump @types/react from 18.2.15 to 18.2.23
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.15 to 18.2.23.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 01:33:44 +00:00
dependabot[bot]
dbb171ef11 Bump @typescript-eslint/eslint-plugin from 6.2.0 to 6.7.3
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 6.2.0 to 6.7.3.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.7.3/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 01:33:23 +00:00
dependabot[bot]
66e8f699e3 Bump @types/node from 20.4.5 to 20.8.0
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.4.5 to 20.8.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 01:32:22 +00:00
dependabot[bot]
c8a44d5a5d Bump sass from 1.64.1 to 1.68.0
Bumps [sass](https://github.com/sass/dart-sass) from 1.64.1 to 1.68.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.64.1...1.68.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 01:31:48 +00:00
20 changed files with 971 additions and 2740 deletions

View File

@@ -1,14 +1,11 @@
module.exports = { module.exports = {
env: { browser: true, es2020: true }, env: { browser: true, es2020: true },
extends: [ extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react-hooks/recommended"],
'eslint:recommended', parser: "@typescript-eslint/parser",
'plugin:@typescript-eslint/recommended', parserOptions: { ecmaVersion: "latest", sourceType: "module" },
'plugin:react-hooks/recommended', plugins: ["react-refresh"],
],
parser: '@typescript-eslint/parser',
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
plugins: ['react-refresh'],
rules: { rules: {
'react-refresh/only-export-components': 'warn', "react-refresh/only-export-components": "warn",
"react-hooks/exhaustive-deps": "ignore",
}, },
} };

View File

@@ -17,6 +17,10 @@ Example or explanation to reproduce the issue.
## Expected behavior ## Expected behavior
A clear and concise description of what you expected to happen. A clear and concise description of what you expected to happen.
**Do you use the local or online version?**
- [x] Online version with URL: `https://dertyp7.github.io/ts5-obs-overlay`
- [ ] The version named below locally downloaded on my device
**Your environment:** **Your environment:**
- OS: [e.g. Windows 11] - OS: [e.g. Windows 11]
- OBS version: [e.g. 29.1.3] - OBS version: [e.g. 29.1.3]

View File

@@ -8,3 +8,4 @@ updates:
directory: "/" # Location of package manifests directory: "/" # Location of package manifests
schedule: schedule:
interval: "monthly" interval: "monthly"
target-branch: "dev"

View File

@@ -25,7 +25,7 @@ jobs:
run: npm run build run: npm run build
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3 uses: peaceiris/actions-gh-pages@v3.9.3
with: with:
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist publish_dir: ./dist

View File

@@ -1,5 +1,7 @@
{ {
"tabWidth": 2, "tabWidth": 2,
"useTabs": false, "useTabs": false,
"printWidth": 120 "printWidth": 180,
"singleQuote": false,
"semi": true
} }

105
README.md
View File

@@ -1,73 +1,61 @@
# Teamspeak5-OBS-Overlay # TeamSpeak5-OBS-Overlay
This is an overlay for OBS to show the current talking clients in your Teamspeak 5 Channel. This is an overlay for OBS to show the current talking clients in your TeamSpeak5 Channel.
This App uses the new "Remote Apps" feature of Teamspeak 5. This App uses the new "Remote Apps" feature of TeamSpeak5.
This overlay uses the [Teamspeak 5 Remote App API](https://github.com/DerTyp7/react-ts5-remote-app-api). This overlay uses the [TeamSpeak5 Remote App API](https://github.com/DerTyp7/react-ts5-remote-app-api).
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/d0ab06f2-1a36-479d-826f-bd4bd3d405b7) ![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/d0ab06f2-1a36-479d-826f-bd4bd3d405b7)
- [Teamspeak5-OBS-Overlay](#teamspeak5-obs-overlay) - [TeamSpeak5-OBS-Overlay](#teamspeak5-obs-overlay)
- [Setup](#setup) - [Usage](#usage)
- [Customization (Parameters)](#customization-parameters) - [Quick instructions](#quick-instructions)
- [Setup (Developer)](#setup-developer) - [Detailed instructions](#detailed-instructions)
- [Common Issues](#common-issues) - [Common Issues](#common-issues)
- [The overlay is empty, but i'm connected to a Teamspeak 5 server](#the-overlay-is-empty-but-im-connected-to-a-teamspeak-5-server) - [The overlay is empty, but i'm connected to a TeamSpeak5 server](#the-overlay-is-empty-but-im-connected-to-a-teamspeak5-server)
- [OBS doesn't show the latest version of the overlay](#obs-doesnt-show-the-latest-version-of-the-overlay)
- [Setup (Developer)](#setup-developer)
## Setup ## Usage
1. Download the `ts5-overlay-{version}.html` of the latest release from [here](https://github.com/DerTyp7/ts5-obs-overlay/releases/latest) ### Quick instructions
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/04dc3a66-c493-429b-b4ae-44bade473ad6)
1.1. (optional) You can rename the file. Just remember using the new file name in the future instead of `ts5-overlay-{version}.html` 1. Open this link in your Browser: [https://dertyp7.github.io/ts5-obs-overlay/#/generate](https://dertyp7.github.io/ts5-obs-overlay/#/generate)
2. Go into the Teamspeak 5 Settings and enable "Remote Apps" 2. Follow the instructions on the website
3. Accept overlay inside TeamSpeak5
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/aa83b07d-3dea-461f-9487-f9e6a299f2f3)
### Detailed instructions
Try this instruction if you have problems with the quick instructions above.
1. Open this link in your Browser: [https://dertyp7.github.io/ts5-obs-overlay/#/generate](https://dertyp7.github.io/ts5-obs-overlay/#/generate)
2. Follow the instructions on the website
3. Go into the TeamSpeak5 Settings and enable "Remote Apps"
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/b31bc553-fde2-46ab-b07c-d3c81339cc7d) ![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/b31bc553-fde2-46ab-b07c-d3c81339cc7d)
3. Add a new Browser Source to your OBS Scene 4. Add a new Browser Source to your OBS Scene
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/0198b468-bb96-4b65-bdd4-3d6bb3ef7d25) ![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/0198b468-bb96-4b65-bdd4-3d6bb3ef7d25)
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/58ad399f-5344-456f-b243-6e267b489fd5) ![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/58ad399f-5344-456f-b243-6e267b489fd5)
4. Tick the checkbox "Local File" and select the downloaded `ts5-overlay-{version}.html` 5. Enter the in step 1 generated URL into the URL field of the Browser Source
4.1. Set the width and height to your desired size (e.g. 1920x1080 OR 1280x720) ![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/e8fd4a1b-be70-4123-8d28-4dc7ebc8c2bd)
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/5ad8ce69-645b-45e7-acc3-ce7ba8d7f8ab)
5. You should now receive a notification in Teamspeak 5 that the app is allowed to connect to your Teamspeak 5 client. Allow it. (If you don't get a notification, restart Teamspeak 5 and OBS -> try again) 6. Set the width and height to your desired size. Recommended is a width of 1000px and the height is determined of how many clients are expected (play around with these values)
7. You should now receive a notification in TeamSpeak5 that the app is allowed to connect to your TeamSpeak5 client. Allow it. (If you don't get a notification, restart TeamSpeak5 and OBS -> try again)
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/40faa435-e128-415f-98eb-a9e8809e8f65) ![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/40faa435-e128-415f-98eb-a9e8809e8f65)
### Customization (Parameters)
You can customize the overlay by adding parameters to the URL of the Browser Source.
1. Open your Browser Source settings
2. **Untick** the checkbox "Local File"
3. Add `file://` to the beginning of the URL
![image](https://github.com/DerTyp7/ts5-obs-overlay/assets/76851529/87985b4c-4397-4681-9635-239d1e382c24)
4. Start adding parameters like discribed below
Start by adding a `?` to the end of the URL and then add the parameters.
To add multiple parameters, you have to seperate them with a `&`.
Like this: `file://C:/Users/.../ts5-overlay-{version}.html?parameter1=value1&parameter2=value2`
Real example: `file://C:/Users/.../ts5-overlay-{version}.html?remoteAppPort=5899&hideNonTalking=true&clientLimit=5`
This is a list of all available parameters (all parameters are optional):
| Parameter | Description | Type | Default |
| ----------------- | ---------------------------------------- | ------- | --------------- |
| `remoteAppPort` | The port of the Teamspeak 5 remote app | number | `5899` |
| `hideNonTalking` | Hide all non-talking clients | boolean | `false` |
| `clientLimit` | Count of how many client should be shown | number | `0` (unlimited) |
| `showChannelName` | Display the channel name | boolean | `false` |
## Setup (Developer)
1. Clone this repository
2. Run `npm install`
3. To start the development server run `npm run dev`
## Common Issues ## Common Issues
### The overlay is empty, but i'm connected to a Teamspeak 5 server ### The overlay is empty, but i'm connected to a TeamSpeak5 server
**Fix 1**
Make sure you accepted the notification in your TeamSpeak Client.
**Fix 2**
Sadly TeamSpeak5 does not give us any information about the current active server tab. Sadly TeamSpeak5 does not give us any information about the current active server tab.
So we try currently use a workaround, where the active server tab is determined by looking on which server the your hardware input was unmuted the latest, since the non-active server tabs in TS5 usually mute the clients microphone. So we try currently use a workaround, where the active server tab is determined by looking on which server the your hardware input was unmuted the latest, since the non-active server tabs in TS5 usually mute the clients microphone.
@@ -77,3 +65,18 @@ Possible fixes:
- Unmute and mute yourself in the active server tab (Just a normal unmute and mute, not the hardware mute) - Unmute and mute yourself in the active server tab (Just a normal unmute and mute, not the hardware mute)
- Reconnect to the TS5 server while the overlay is open - Reconnect to the TS5 server while the overlay is open
### OBS doesn't show the latest version of the overlay
This can happen if the OBS Browser Source is caching the overlay.
To fix this, open the Browser Source settings and click on "Refresh cache of current page".
## Setup (Developer)
1. Clone this repository
2. Run `npm install`
3. To start the development server run `npm run dev`
> **Note:** Pull requests are welcome, but please be consistent with the code style.
> This project uses [Prettier](https://prettier.io/) to format the code.
> Pull requests always in the `dev` branch.

View File

@@ -3,6 +3,9 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="An OBS overlay for TeamSpeak5, so your audience can see who is talking. https://github.com/DerTyp7/ts5-obs-overlay" />
<meta name="author" content="DerTyp7" />
<link rel="icon" href="/logo.svg" type="image/x-icon" />
<title>TS5-OBS-Overlay</title> <title>TS5-OBS-Overlay</title>
</head> </head>
<body> <body>

2842
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,27 @@
{ {
"name": "ts5-obs-overlay", "name": "ts5-obs-overlay",
"private": true, "private": false,
"version": "1.2.3", "version": "2.0.9",
"description": "Overlay for OBS to show the current talking clients in your TeamSpeak 5 Channel",
"author": "DerTyp7",
"homepage": "https://dertyp7.github.io/ts5-obs-overlay/#",
"repository": {
"type": "git",
"url": "https://github.com/DerTyp7/ts5-obs-overlay"
},
"keywords": [
"ts5",
"teamspeak",
"overlay",
"remote app",
"obs",
"typescript",
"react",
"vite"
],
"bugs": {
"url": "https://github.com/DerTyp7/ts5-obs-overlay/issues"
},
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
@@ -10,26 +30,24 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@types/node": "^20.4.5", "@types/node": "^20.8.3",
"jest": "^29.6.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-router-dom": "^6.14.2", "react-router-dom": "^6.18.0",
"react-ts5-remote-app-api": "^1.1.1", "react-ts5-remote-app-api": "^1.1.1",
"sass": "^1.64.1" "sass": "^1.68.0"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.2", "@types/jest": "^29.5.2",
"@types/react": "^18.2.14", "@types/react": "^18.2.35",
"@types/react-dom": "^18.2.7", "@types/react-dom": "^18.2.14",
"@typescript-eslint/eslint-plugin": "^6.2.0", "@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.2.1", "@typescript-eslint/parser": "^6.9.1",
"@vitejs/plugin-react-swc": "^3.0.0", "@vitejs/plugin-react-swc": "^3.0.0",
"eslint": "^8.45.0", "eslint": "^8.53.0",
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.3", "eslint-plugin-react-refresh": "^0.4.3",
"typescript": "^5.1.6", "typescript": "^5.2.2",
"vite": "^4.4.7", "vite": "^4.5.0"
"vite-plugin-singlefile": "^0.13.5"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

23
public/logo.svg Normal file
View File

@@ -0,0 +1,23 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="307.000000pt" height="339.000000pt" viewBox="0 0 307.000000 339.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,339.000000) scale(0.100000,-0.100000)"
fill="#008080" stroke="none">
<path d="M1297 3382 c-3 -4 -7 -61 -11 -127 -20 -341 -120 -616 -370 -1010
-158 -251 -306 -436 -331 -415 -7 6 -18 52 -24 103 -22 170 -77 377 -101 377
-5 0 -21 -38 -35 -86 -27 -89 -79 -213 -212 -504 -201 -438 -244 -657 -180
-901 52 -198 102 -290 232 -427 137 -145 345 -310 474 -376 l34 -18 -5 24 c-3
12 -18 63 -32 113 -64 213 -19 418 154 701 106 173 164 314 194 474 16 82 30
120 45 120 13 0 55 -59 94 -131 45 -83 81 -198 102 -329 9 -57 18 -106 20
-108 7 -7 122 231 144 298 34 104 49 202 63 403 6 103 15 186 20 185 4 -2 79
-72 167 -155 257 -247 392 -414 501 -625 97 -187 102 -205 107 -413 6 -223 -1
-265 -73 -418 -31 -65 -53 -121 -50 -124 7 -7 188 122 295 212 210 176 368
383 455 598 149 370 117 760 -98 1193 -110 220 -245 417 -434 633 l-39 45 -7
-183 c-5 -106 -14 -203 -22 -230 -14 -46 -80 -144 -99 -145 -14 -1 -59 92
-101 209 -121 342 -331 651 -579 854 -130 107 -287 203 -298 183z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,38 +1,26 @@
/* eslint-disable react-hooks/exhaustive-deps */
import "@styles/App.scss"; import "@styles/App.scss";
import { useSearchParams } from "react-router-dom"; import { Navigate, Route, Routes, useSearchParams } from "react-router-dom";
import useTSRemoteApp, { IClient } from "react-ts5-remote-app-api";
import Viewer from "./Viewer"; import Viewer from "./Viewer";
import Generator from "./Generator";
export default function App() { export default function App() {
const [searchParams] = useSearchParams(); const [searchParams] = useSearchParams();
const { clients, activeConnectionId, currentChannel } = useTSRemoteApp({
remoteAppPort: parseInt(searchParams.get("remoteAppPort") ?? "5899"),
auth: {
identifier: "de.tealfire.obs",
version: "1.2.3",
name: "TS5 OBS Overlay",
description: "A OBS overlay for TS5 by DerTyp876",
},
logging: true,
});
return ( return (
<div className="App"> <Routes>
<Route
path="/"
element={
<Viewer <Viewer
remoteAppPort={parseInt(searchParams.get("remoteAppPort") ?? "5899")}
showChannelName={searchParams.get("showChannelName") === "true"} showChannelName={searchParams.get("showChannelName") === "true"}
hideNonTalking={searchParams.get("hideNonTalking") === "true"} hideNonTalking={searchParams.get("hideNonTalking") === "true"}
clientLimit={searchParams.get("clientLimit") ? parseInt(searchParams.get("clientLimit") ?? "0") : 0} clientLimit={searchParams.get("clientLimit") ? parseInt(searchParams.get("clientLimit") ?? "0") : 0}
clients={
clients.map((client) => {
if (client.channel?.id === currentChannel?.id && client.channel.connection.id === activeConnectionId) {
return client;
}
}) as IClient[]
}
channel={currentChannel}
/> />
</div> }
/>
<Route path="/generate" element={<Generator />} />
</Routes>
); );
} }

126
src/Generator.tsx Normal file
View File

@@ -0,0 +1,126 @@
import React, { ChangeEvent, useRef, useState, useEffect } from "react";
import "@styles/Generator.scss";
import Viewer from "./Viewer";
export default function Generator() {
// State variables
const [outputUrl, setOutputUrl] = useState(() => new URL(window.location.href).toString());
const copiedTooltipRef = useRef<HTMLDivElement>(null);
const [remoteAppPort, setRemoteAppPort] = useState(5899);
const [showChannelName, setShowChannelName] = useState(true);
const [hideNonTalking, setHideNonTalking] = useState(false);
const [clientLimit, setClientLimit] = useState(0);
// Effect to generate URL when dependencies change
useEffect(() => {
generateUrl();
}, [remoteAppPort, showChannelName, hideNonTalking, clientLimit]);
// Function to generate the output URL
function generateUrl() {
const url = new URL(window.location.href);
url.hash = "";
url.searchParams.set("remoteAppPort", remoteAppPort.toString());
url.searchParams.set("showChannelName", showChannelName.toString());
url.searchParams.set("hideNonTalking", hideNonTalking.toString());
url.searchParams.set("clientLimit", clientLimit.toString());
// url.hash function always sets the hash to the end of the URL, so we have to replace the question mark with a hash
// gh-pages needs the hash to be between the base URL and the search params
setOutputUrl(url.toString().replace("?", "#/?"));
}
// Function to copy URL to clipboard
function copy() {
navigator.clipboard.writeText(outputUrl);
if (copiedTooltipRef.current) {
copiedTooltipRef.current.style.animation = "tooltipAnimation 200ms";
copiedTooltipRef.current.style.opacity = "1";
setTimeout(() => {
if (copiedTooltipRef.current) {
copiedTooltipRef.current.style.opacity = "0";
copiedTooltipRef.current.style.animation = "";
}
}, 1000);
}
}
return (
<div className="generator">
{/* Header */}
<div className="headline">
<h1>TS5-OBS-Overlay Generator</h1>
<h4>by DerTyp7</h4>
</div>
{/* Instructions */}
<div className="instructions">
<p>1. Customize your settings</p>
<p>2. Copy the generated URL</p>
<p>3. Paste the URL into the BrowserSource URL field in OBS</p>
<a href="https://github.com/DerTyp7/ts5-obs-overlay#detailed-instructions">Click here for detailed instructions</a>
</div>
{/* Output Section */}
<div className="output">
<p className="url">
<code>{outputUrl}</code>
</p>
<button onClick={copy} className="copy">
Copy
</button>
<div ref={copiedTooltipRef} className="copiedTooltip">
Copied!
</div>
</div>
{/* Generator Content */}
<div className="generatorContent">
{/* Configurations */}
<div className="configurations">
<h2>Configurations</h2>
<div className="options">
{/* Option Sections */}
<section>
{/* Show Channel Name Option */}
<div className="option" onClick={() => setShowChannelName(!showChannelName)}>
<input type="checkbox" checked={showChannelName} />
<label>Show channel name</label>
</div>
{/* Hide Non-Talking Clients Option */}
<div className="option" onClick={() => setHideNonTalking(!hideNonTalking)}>
<input type="checkbox" checked={hideNonTalking} />
<label>Hide non talking clients</label>
</div>
</section>
<section>
{/* Client Limit Option */}
<div className="option">
<input type="number" value={clientLimit} min={0} onChange={(e: ChangeEvent<HTMLInputElement>) => setClientLimit(parseInt(e.target.value))} />
<label>Client Limit</label>
</div>
{/* RemoteApp-Port Option */}
<div className="option">
<input type="number" value={remoteAppPort} min={0} onChange={(e: ChangeEvent<HTMLInputElement>) => setRemoteAppPort(parseInt(e.target.value))} />
<label>RemoteApp-Port</label>
</div>
</section>
</div>
</div>
{/* Preview */}
<div className="preview">
<Viewer remoteAppPort={remoteAppPort} showChannelName={showChannelName} hideNonTalking={hideNonTalking} clientLimit={clientLimit} />
</div>
</div>
</div>
);
}

View File

@@ -1,27 +1,42 @@
import "@styles/Viewer.scss"; import "@styles/Viewer.scss";
import { IChannel, IClient } from "react-ts5-remote-app-api"; import useTSRemoteApp, { IClient } from "react-ts5-remote-app-api";
export default function Viewer({ export default function Viewer({
clients, remoteAppPort = 5899,
channel,
showChannelName = false, showChannelName = false,
hideNonTalking = false, hideNonTalking = false,
clientLimit = 0, clientLimit = 0,
}: { }: {
clients: IClient[] | undefined; remoteAppPort?: number;
channel: IChannel | undefined;
showChannelName?: boolean; showChannelName?: boolean;
hideNonTalking?: boolean; hideNonTalking?: boolean;
clientLimit?: number; clientLimit?: number;
}) { }) {
const { clients, activeConnectionId, currentChannel } = useTSRemoteApp({
remoteAppPort: remoteAppPort,
auth: {
identifier: "de.tealfire.obs",
version: "2.0.9",
name: "TS5 OBS Overlay",
description: "A OBS overlay for TS5 by DerTyp7",
},
logging: true,
});
const currentClients = clients.map((client) => {
if (client.channel?.id === currentChannel?.id && client.channel.connection.id === activeConnectionId) {
return client;
}
}) as IClient[];
return ( return (
<div className="viewer"> <div className="viewer">
{showChannelName ? ( {showChannelName ? (
<div className="channelNameContainer"> <div className="channelNameContainer">
<h3>{channel?.properties.name}</h3> <h1>{currentChannel?.properties.name}</h1>
</div> </div>
) : null} ) : null}
{clients?.map((client, i) => { {currentClients?.map((client, i) => {
//* Client limit //* Client limit
if (clientLimit != 0 && i >= clientLimit) { if (clientLimit != 0 && i >= clientLimit) {
return null; return null;
@@ -29,10 +44,7 @@ export default function Viewer({
if (client) { if (client) {
//* Non-talking client //* Non-talking client
if ( if (hideNonTalking && (client.properties.inputMuted || client.properties.outputMuted || client.talkStatus == 0)) {
hideNonTalking &&
(client.properties.inputMuted || client.properties.outputMuted || client.talkStatus == 0)
) {
return null; return null;
} }
@@ -73,16 +85,7 @@ export default function Viewer({
d="M88.62,54.15V64A24.69,24.69,0,0,1,64,88.62a25.26,25.26,0,0,1-8.38-1.46l-7.39,7.39A34,34,0,0,0,64,98.46,34.5,34.5,0,0,0,98.46,64V54.15a4.92,4.92,0,1,1,9.85,0V64a44.31,44.31,0,0,1-39.38,44v10.15H88.62a4.92,4.92,0,0,1,0,9.85H39.38a4.92,4.92,0,1,1,0-9.85H59.08V108A43.3,43.3,0,0,1,41,101.77L21.46,121.31a2.46,2.46,0,0,1-3.54,0L11.62,115a2.46,2.46,0,0,1,0-3.54l94.92-94.92a2.46,2.46,0,0,1,3.54,0l6.31,6.31a2.46,2.46,0,0,1,0,3.54ZM22.92,80.46A43.3,43.3,0,0,1,19.69,64V54.15a4.92,4.92,0,1,1,9.85,0V64a35.94,35.94,0,0,0,1.15,8.69ZM39.38,64V24.62a24.62,24.62,0,0,1,47.77-8.38Z" d="M88.62,54.15V64A24.69,24.69,0,0,1,64,88.62a25.26,25.26,0,0,1-8.38-1.46l-7.39,7.39A34,34,0,0,0,64,98.46,34.5,34.5,0,0,0,98.46,64V54.15a4.92,4.92,0,1,1,9.85,0V64a44.31,44.31,0,0,1-39.38,44v10.15H88.62a4.92,4.92,0,0,1,0,9.85H39.38a4.92,4.92,0,1,1,0-9.85H59.08V108A43.3,43.3,0,0,1,41,101.77L21.46,121.31a2.46,2.46,0,0,1-3.54,0L11.62,115a2.46,2.46,0,0,1,0-3.54l94.92-94.92a2.46,2.46,0,0,1,3.54,0l6.31,6.31a2.46,2.46,0,0,1,0,3.54ZM22.92,80.46A43.3,43.3,0,0,1,19.69,64V54.15a4.92,4.92,0,1,1,9.85,0V64a35.94,35.94,0,0,0,1.15,8.69ZM39.38,64V24.62a24.62,24.62,0,0,1,47.77-8.38Z"
fill="#d8d8d8" fill="#d8d8d8"
/> />
<rect <rect x="-5.93" y="61.89" width="139.87" height="14.02" rx="2.87" ry="2.87" transform="translate(-29.97 65.43) rotate(-45)" fill="#c9070a" />
x="-5.93"
y="61.89"
width="139.87"
height="14.02"
rx="2.87"
ry="2.87"
transform="translate(-29.97 65.43) rotate(-45)"
fill="#c9070a"
/>
</g> </g>
</svg> </svg>
) : client.properties.outputMuted ? ( ) : client.properties.outputMuted ? (

View File

@@ -1,11 +1,11 @@
import React from "react"; import React from "react";
import ReactDOM from "react-dom/client"; import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App.tsx"; import App from "./App.tsx";
import "@styles/index.scss"; import "@styles/index.scss";
import { BrowserRouter, HashRouter } from "react-router-dom";
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( ReactDOM.createRoot(document.getElementById("root")!).render(
<BrowserRouter> <HashRouter>
<App /> <App />
</BrowserRouter> </HashRouter>
); );

271
src/styles/Generator.scss Normal file
View File

@@ -0,0 +1,271 @@
// Breakpoints
$breakpoint-1: 1200px;
$breakpoint-2: 790px;
$breakpoint-3: 600px;
// Tooltip animation keyframes
@keyframes tooltipAnimation {
0% {
opacity: 0;
transform: translateY(-10px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.generator {
background-color: #232528;
color: #fff;
width: 100%;
display: flex;
height: 100%;
flex-direction: column;
align-items: center;
gap: 50px;
padding: 50px 0;
.headline {
text-align: center;
letter-spacing: 1.8px;
}
.instructions {
border-bottom: 2px solid #75797773;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
gap: 10px 50px;
flex-wrap: wrap;
padding-bottom: 10px;
p,
a {
font-size: 0.8rem;
}
p {
color: #b4b4b4;
}
}
.output {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
column-gap: 20px;
position: relative;
height: 50px;
.url {
white-space: nowrap;
overflow: auto;
font-weight: bold;
width: 500px;
padding: 5px 10px;
background-color: #313136;
border-radius: 5px;
text-align: center;
}
.copy {
padding: 5px 10px;
border: 2px solid #31f39973;
transition: all 100ms ease-in-out;
&:hover {
border-color: #42d486;
background-color: transparent;
color: #fff;
}
}
.copiedTooltip {
opacity: 0;
position: absolute;
right: -90px;
background-color: #31f399;
color: #202024;
padding: 5px 10px;
border-radius: 5px;
font-size: 0.8rem;
font-weight: bold;
}
}
.generatorContent {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0 50px;
gap: 30px;
width: 100%;
.configurations {
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
flex: 1;
gap: 50px;
.options {
display: flex;
flex-direction: row;
align-items: center;
gap: 100px;
user-select: none;
section {
display: flex;
flex-direction: column;
align-items: center;
justify-content: left;
gap: 10px;
}
.option {
display: flex;
flex-direction: row;
align-items: center;
justify-content: left;
column-gap: 10px;
width: 100%;
input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 20px;
height: 20px;
border: 2px solid #31f399;
border-radius: 5px;
background-color: #202024;
outline: none;
transition: all 200ms ease-in-out;
position: relative;
color: #fff;
text-align: center;
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
// Cross when checked styles
&:checked {
&:after {
content: "";
position: absolute;
width: 10px;
height: 2px;
background-color: #31f399;
transform: rotate(45deg);
}
&:before {
content: "";
position: absolute;
width: 10px;
height: 2px;
background-color: #31f399;
transform: rotate(-45deg);
}
&:after,
&:before {
top: 7px;
left: 3px;
}
}
cursor: pointer;
}
input[type="number"] {
width: 50px;
height: 25px;
cursor: text;
-moz-appearance: textfield;
appearance: textfield;
}
label {
cursor: pointer;
}
}
}
}
// Preview styles
.preview {
flex: 1;
border: 2px solid #31f39973;
// Viewer styles (see src/styles/Viewer.scss)
.viewer {
background-image: url("/images/viewer_example_background.png");
background-repeat: no-repeat;
background-size: cover;
min-height: 500px;
h1 {
font-size: 2rem;
}
.client {
svg {
width: 2rem;
}
p {
font-size: 2rem;
}
}
}
}
}
// Responsive styles
@media screen and (max-width: $breakpoint-1) {
.generatorContent {
flex-direction: column;
.preview {
width: 80%;
}
}
}
@media screen and (max-width: $breakpoint-2) {
.output {
.url {
width: 300px;
}
}
.generatorContent {
.preview {
width: 100%;
}
}
}
@media screen and (max-width: $breakpoint-3) {
.output {
.url {
width: 200px;
}
.generatorContent {
.configurations {
.options {
flex-direction: column;
gap: 30px;
}
}
}
}
}
}

View File

@@ -1,22 +1,32 @@
//* Viewer styles
// this file contains styles for the viewer component
// styles for the viewer component should not be modified somewhere else
.viewer { .viewer {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 0 0; padding: 0.5rem;
padding: 1rem;
h1 {
font-size: 5vw;
}
h1,
p {
background-color: #2f313680;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 20ch;
user-select: none;
}
.channelNameContainer { .channelNameContainer {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 20px; margin-bottom: 20px;
h3 {
font-size: 1.7rem;
font-weight: 500;
margin: 0;
background-color: rgba(47, 49, 54, 0.5);
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
color: white;
}
} }
.client { .client {
@@ -26,23 +36,17 @@
align-items: center; align-items: center;
margin: 0.5rem 0; margin: 0.5rem 0;
// icon styles
svg { svg {
width: 2.8rem; width: 5vw;
height: 2.8rem; aspect-ratio: 1/1;
margin-right: 0.5rem; margin-right: 0.5rem;
filter: drop-shadow(0 0 0.75rem rgba(15, 15, 15, 0.1));
} }
p {
margin: 0;
color: white;
background-color: rgba(47, 49, 54, 0.5);
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
// ellipsis after 22 characters // client name styles
white-space: nowrap; p {
overflow: hidden; font-size: 5vw;
text-overflow: ellipsis;
max-width: 20ch;
} }
} }
} }

View File

@@ -1,5 +1,101 @@
// Reset styles for all elements
* { * {
font-family: Arial, Helvetica, sans-serif; font-family: Arial, Helvetica, sans-serif;
font-weight: bold; font-weight: bold;
font-size: 3rem; font-size: 1rem;
margin: 0;
padding: 0;
box-sizing: border-box;
}
// Set up basic styles for the entire page
body,
html {
min-height: 100vh;
min-width: 100%;
display: flex;
overflow-x: hidden;
color: #fff;
}
// Ensure the root element takes up the full viewport
#root {
height: 100%;
min-width: 100%;
}
// Headline styles
h1 {
font-size: 1.8rem;
}
h2 {
font-size: 1.5rem;
}
h3 {
font-size: 1.2rem;
}
h4 {
font-size: 1.1rem;
}
// Common styles for heading elements
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: bold;
}
// Text styles
a {
color: #3abe78;
font-weight: bold;
text-decoration: none;
transition: all 100ms ease-in-out;
&:hover {
color: #31f399;
}
}
// Button styles
button {
background-color: #202024;
color: #fff;
font-weight: bold;
border: 2px solid #31f399;
border-radius: 5px;
padding: 10px 20px;
cursor: pointer;
transition: all 300ms ease-in-out;
&:hover {
background-color: #42d486;
color: #202024;
}
}
// Custom dark-themed scrollbar
::-webkit-scrollbar {
width: 5px;
height: 5px;
}
::-webkit-scrollbar-track {
background: #363638;
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
background: #31f39973;
border-radius: 10px;
&:hover {
background: #48ee95;
}
} }

View File

@@ -18,7 +18,8 @@
}, },
/* Bundler mode */ /* Bundler mode */
"moduleResolution": "bundler", "moduleResolution": "Node",
"allowSyntheticDefaultImports": true,
"allowImportingTsExtensions": true, "allowImportingTsExtensions": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,

View File

@@ -1,6 +1,5 @@
import { defineConfig } from 'vite' import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc' import react from '@vitejs/plugin-react-swc'
import { viteSingleFile } from "vite-plugin-singlefile"
import path from 'path'; import path from 'path';
// https://vitejs.dev/config/ // https://vitejs.dev/config/
@@ -21,5 +20,5 @@ export default defineConfig({
outDir: 'dist', outDir: 'dist',
emptyOutDir: true, emptyOutDir: true,
}, },
plugins: [react(), viteSingleFile({ useRecommendedBuildConfig: false })], plugins: [react()],
}) })