From e2c523ca3280e5a743770a5f9474fa7f6dfa6316 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:03:06 +0200 Subject: [PATCH 01/17] =?UTF-8?q?Feature=20Branch=20Setup:=20GitHub=20Acti?= =?UTF-8?q?ons=20f=C3=BCr=20Feature=20Branches,=20Docker=20Compose=20f?= =?UTF-8?q?=C3=BCr=20Testing,=20Dokumentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...animiertem Hintergrund und grünen Akzenten | 324 ++++++++++++++++++ .github/workflows/docker-build.yml | 3 +- FEATURE_BRANCH.md | 48 +++ docker-compose.feature.yml | 23 ++ tatus | 3 + 5 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 -grünes trippy Theme mit animiertem Hintergrund und grünen Akzenten create mode 100644 FEATURE_BRANCH.md create mode 100644 docker-compose.feature.yml create mode 100644 tatus diff --git a/-grünes trippy Theme mit animiertem Hintergrund und grünen Akzenten b/-grünes trippy Theme mit animiertem Hintergrund und grünen Akzenten new file mode 100644 index 0000000..74570f6 --- /dev/null +++ b/-grünes trippy Theme mit animiertem Hintergrund und grünen Akzenten @@ -0,0 +1,324 @@ + + SSUUMMMMAARRYY OOFF LLEESSSS CCOOMMMMAANNDDSS + + Commands marked with * may be preceded by a number, _N. + Notes in parentheses indicate the behavior if _N is given. + A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K. + + h H Display this help. + q :q Q :Q ZZ Exit. + --------------------------------------------------------------------------- + + MMOOVVIINNGG + + e ^E j ^N CR * Forward one line (or _N lines). + y ^Y k ^K ^P * Backward one line (or _N lines). + ESC-j * Forward one file line (or _N file lines). + ESC-k * Backward one file line (or _N file lines). + f ^F ^V SPACE * Forward one window (or _N lines). + b ^B ESC-v * Backward one window (or _N lines). + z * Forward one window (and set window to _N). + w * Backward one window (and set window to _N). + ESC-SPACE * Forward one window, but don't stop at end-of-file. + ESC-b * Backward one window, but don't stop at beginning-of-file. + d ^D * Forward one half-window (and set half-window to _N). + u ^U * Backward one half-window (and set half-window to _N). + ESC-) RightArrow * Right one half screen width (or _N positions). + ESC-( LeftArrow * Left one half screen width (or _N positions). + ESC-} ^RightArrow Right to last column displayed. + ESC-{ ^LeftArrow Left to first column. + F Forward forever; like "tail -f". + ESC-F Like F but stop when search pattern is found. + r ^R ^L Repaint screen. + R Repaint screen, discarding buffered input. + --------------------------------------------------- + Default "window" is the screen height. + Default "half-window" is half of the screen height. + --------------------------------------------------------------------------- + + SSEEAARRCCHHIINNGG + + /_p_a_t_t_e_r_n * Search forward for (_N-th) matching line. + ?_p_a_t_t_e_r_n * Search backward for (_N-th) matching line. + n * Repeat previous search (for _N-th occurrence). + N * Repeat previous search in reverse direction. + ESC-n * Repeat previous search, spanning files. + ESC-N * Repeat previous search, reverse dir. & spanning files. + ^O^N ^On * Search forward for (_N-th) OSC8 hyperlink. + ^O^P ^Op * Search backward for (_N-th) OSC8 hyperlink. + ^O^L ^Ol Jump to the currently selected OSC8 hyperlink. + ESC-u Undo (toggle) search highlighting. + ESC-U Clear search highlighting. + &_p_a_t_t_e_r_n * Display only matching lines. + --------------------------------------------------- + Search is case-sensitive unless changed with -i or -I. + A search pattern may begin with one or more of: + ^N or ! Search for NON-matching lines. + ^E or * Search multiple files (pass thru END OF FILE). + ^F or @ Start search at FIRST file (for /) or last file (for ?). + ^K Highlight matches, but don't move (KEEP position). + ^R Don't use REGULAR EXPRESSIONS. + ^S _n Search for match in _n-th parenthesized subpattern. + ^W WRAP search if no match found. + ^L Enter next character literally into pattern. + --------------------------------------------------------------------------- + + JJUUMMPPIINNGG + + g < ESC-< * Go to first line in file (or line _N). + G > ESC-> * Go to last line in file (or line _N). + p % * Go to beginning of file (or _N percent into file). + t * Go to the (_N-th) next tag. + T * Go to the (_N-th) previous tag. + { ( [ * Find close bracket } ) ]. + } ) ] * Find open bracket { ( [. + ESC-^F _<_c_1_> _<_c_2_> * Find close bracket _<_c_2_>. + ESC-^B _<_c_1_> _<_c_2_> * Find open bracket _<_c_1_>. + --------------------------------------------------- + Each "find close bracket" command goes forward to the close bracket + matching the (_N-th) open bracket in the top line. + Each "find open bracket" command goes backward to the open bracket + matching the (_N-th) close bracket in the bottom line. + + m_<_l_e_t_t_e_r_> Mark the current top line with . + M_<_l_e_t_t_e_r_> Mark the current bottom line with . + '_<_l_e_t_t_e_r_> Go to a previously marked position. + '' Go to the previous position. + ^X^X Same as '. + ESC-m_<_l_e_t_t_e_r_> Clear a mark. + --------------------------------------------------- + A mark is any upper-case or lower-case letter. + Certain marks are predefined: + ^ means beginning of the file + $ means end of the file + --------------------------------------------------------------------------- + + CCHHAANNGGIINNGG FFIILLEESS + + :e [_f_i_l_e] Examine a new file. + ^X^V Same as :e. + :n * Examine the (_N-th) next file from the command line. + :p * Examine the (_N-th) previous file from the command line. + :x * Examine the first (or _N-th) file from the command line. + ^O^O Open the currently selected OSC8 hyperlink. + :d Delete the current file from the command line list. + = ^G :f Print current file name. + --------------------------------------------------------------------------- + + MMIISSCCEELLLLAANNEEOOUUSS CCOOMMMMAANNDDSS + + -_<_f_l_a_g_> Toggle a command line option [see OPTIONS below]. + --_<_n_a_m_e_> Toggle a command line option, by name. + __<_f_l_a_g_> Display the setting of a command line option. + ___<_n_a_m_e_> Display the setting of an option, by name. + +_c_m_d Execute the less cmd each time a new file is examined. + + !_c_o_m_m_a_n_d Execute the shell command with $SHELL. + #_c_o_m_m_a_n_d Execute the shell command, expanded like a prompt. + |XX_c_o_m_m_a_n_d Pipe file between current pos & mark XX to shell command. + s _f_i_l_e Save input to a file. + v Edit the current file with $VISUAL or $EDITOR. + V Print version number of "less". + --------------------------------------------------------------------------- + + OOPPTTIIOONNSS + + Most options may be changed either on the command line, + or from within less by using the - or -- command. + Options may be given in one of two forms: either a single + character preceded by a -, or a name preceded by --. + + -? ........ --help + Display help (from command line). + -a ........ --search-skip-screen + Search skips current screen. + -A ........ --SEARCH-SKIP-SCREEN + Search starts just after target line. + -b [_N] .... --buffers=[_N] + Number of buffers. + -B ........ --auto-buffers + Don't automatically allocate buffers for pipes. + -c ........ --clear-screen + Repaint by clearing rather than scrolling. + -d ........ --dumb + Dumb terminal. + -D xx_c_o_l_o_r . --color=xx_c_o_l_o_r + Set screen colors. + -e -E .... --quit-at-eof --QUIT-AT-EOF + Quit at end of file. + -f ........ --force + Force open non-regular files. + -F ........ --quit-if-one-screen + Quit if entire file fits on first screen. + -g ........ --hilite-search + Highlight only last match for searches. + -G ........ --HILITE-SEARCH + Don't highlight any matches for searches. + -h [_N] .... --max-back-scroll=[_N] + Backward scroll limit. + -i ........ --ignore-case + Ignore case in searches that do not contain uppercase. + -I ........ --IGNORE-CASE + Ignore case in all searches. + -j [_N] .... --jump-target=[_N] + Screen position of target lines. + -J ........ --status-column + Display a status column at left edge of screen. + -k _f_i_l_e ... --lesskey-file=_f_i_l_e + Use a compiled lesskey file. + -K ........ --quit-on-intr + Exit less in response to ctrl-C. + -L ........ --no-lessopen + Ignore the LESSOPEN environment variable. + -m -M .... --long-prompt --LONG-PROMPT + Set prompt style. + -n ......... --line-numbers + Suppress line numbers in prompts and messages. + -N ......... --LINE-NUMBERS + Display line number at start of each line. + -o [_f_i_l_e] .. --log-file=[_f_i_l_e] + Copy to log file (standard input only). + -O [_f_i_l_e] .. --LOG-FILE=[_f_i_l_e] + Copy to log file (unconditionally overwrite). + -p _p_a_t_t_e_r_n . --pattern=[_p_a_t_t_e_r_n] + Start at pattern (from command line). + -P [_p_r_o_m_p_t] --prompt=[_p_r_o_m_p_t] + Define new prompt. + -q -Q .... --quiet --QUIET --silent --SILENT + Quiet the terminal bell. + -r -R .... --raw-control-chars --RAW-CONTROL-CHARS + Output "raw" control characters. + -s ........ --squeeze-blank-lines + Squeeze multiple blank lines. + -S ........ --chop-long-lines + Chop (truncate) long lines rather than wrapping. + -t _t_a_g .... --tag=[_t_a_g] + Find a tag. + -T [_t_a_g_s_f_i_l_e] --tag-file=[_t_a_g_s_f_i_l_e] + Use an alternate tags file. + -u -U .... --underline-special --UNDERLINE-SPECIAL + Change handling of backspaces, tabs and carriage returns. + -V ........ --version + Display the version number of "less". + -w ........ --hilite-unread + Highlight first new line after forward-screen. + -W ........ --HILITE-UNREAD + Highlight first new line after any forward movement. + -x [_N[,...]] --tabs=[_N[,...]] + Set tab stops. + -X ........ --no-init + Don't use termcap init/deinit strings. + -y [_N] .... --max-forw-scroll=[_N] + Forward scroll limit. + -z [_N] .... --window=[_N] + Set size of window. + -" [_c[_c]] . --quotes=[_c[_c]] + Set shell quote characters. + -~ ........ --tilde + Don't display tildes after end of file. + -# [_N] .... --shift=[_N] + Set horizontal scroll amount (0 = one half screen width). + + --exit-follow-on-close + Exit F command on a pipe when writer closes pipe. + --file-size + Automatically determine the size of the input file. + --follow-name + The F command changes files if the input file is renamed. + --form-feed + Stop scrolling when a form feed character is reached. + --header=[_L[,_C[,_N]]] + Use _L lines (starting at line _N) and _C columns as headers. + --incsearch + Search file as each pattern character is typed in. + --intr=[_C] + Use _C instead of ^X to interrupt a read. + --lesskey-context=_t_e_x_t + Use lesskey source file contents. + --lesskey-src=_f_i_l_e + Use a lesskey source file. + --line-num-width=[_N] + Set the width of the -N line number field to _N characters. + --match-shift=[_N] + Show at least _N characters to the left of a search match. + --modelines=[_N] + Read _N lines from the input file and look for vim modelines. + --mouse + Enable mouse input. + --no-edit-warn + Don't warn when using v command on a file opened via LESSOPEN. + --no-keypad + Don't send termcap keypad init/deinit strings. + --no-histdups + Remove duplicates from command history. + --no-number-headers + Don't give line numbers to header lines. + --no-paste + Ignore pasted input. + --no-search-header-lines + Searches do not include header lines. + --no-search-header-columns + Searches do not include header columns. + --no-search-headers + Searches do not include header lines or columns. + --no-vbell + Disable the terminal's visual bell. + --redraw-on-quit + Redraw final screen when quitting. + --rscroll=[_C] + Set the character used to mark truncated lines. + --save-marks + Retain marks across invocations of less. + --search-options=[EFKNRW-] + Set default options for every search. + --show-preproc-errors + Display a message if preprocessor exits with an error status. + --proc-backspace + Process backspaces for bold/underline. + --PROC-BACKSPACE + Treat backspaces as control characters. + --proc-return + Delete carriage returns before newline. + --PROC-RETURN + Treat carriage returns as control characters. + --proc-tab + Expand tabs to spaces. + --PROC-TAB + Treat tabs as control characters. + --status-col-width=[_N] + Set the width of the -J status column to _N characters. + --status-line + Highlight or color the entire line containing a mark. + --use-backslash + Subsequent options use backslash as escape char. + --use-color + Enables colored text. + --wheel-lines=[_N] + Each click of the mouse wheel moves _N lines. + --wordwrap + Wrap lines at spaces. + + + --------------------------------------------------------------------------- + + LLIINNEE EEDDIITTIINNGG + + These keys can be used to edit text being entered + on the "command line" at the bottom of the screen. + + RightArrow ..................... ESC-l ... Move cursor right one character. + LeftArrow ...................... ESC-h ... Move cursor left one character. + ctrl-RightArrow ESC-RightArrow ESC-w ... Move cursor right one word. + ctrl-LeftArrow ESC-LeftArrow ESC-b ... Move cursor left one word. + HOME ........................... ESC-0 ... Move cursor to start of line. + END ............................ ESC-$ ... Move cursor to end of line. + BACKSPACE ................................ Delete char to left of cursor. + DELETE ......................... ESC-x ... Delete char under cursor. + ctrl-BACKSPACE ESC-BACKSPACE ........... Delete word to left of cursor. + ctrl-DELETE .... ESC-DELETE .... ESC-X ... Delete word under cursor. + ctrl-U ......... ESC (MS-DOS only) ....... Delete entire line. + UpArrow ........................ ESC-k ... Retrieve previous command line. + DownArrow ...................... ESC-j ... Retrieve next command line. + TAB ...................................... Complete filename & cycle. + SHIFT-TAB ...................... ESC-TAB Complete filename & reverse cycle. + ctrl-L ................................... Complete filename, list all. diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 4590d5d..7d36e3e 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -2,7 +2,7 @@ on: push: - branches: [ "main" ] + branches: [ "main", "feature/*" ] workflow_dispatch: env: @@ -32,4 +32,5 @@ jobs: tags: | ${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:${{ github.sha }} + ${{ env.IMAGE_NAME }}:${{ github.ref_name }} platforms: linux/amd64 diff --git a/FEATURE_BRANCH.md b/FEATURE_BRANCH.md new file mode 100644 index 0000000..23e121e --- /dev/null +++ b/FEATURE_BRANCH.md @@ -0,0 +1,48 @@ +# Feature Branch Development + +## Workflow für Experimente + +### 1. Feature Branch erstellen +```bash +git checkout -b feature/mein-experiment +git push -u origin feature/mein-experiment +``` + +### 2. Entwickeln und Testen +- Änderungen im Feature Branch machen +- Commits und Pushes wie gewohnt +- GitHub Actions baut automatisch das Feature Image + +### 3. Feature Version testen +```bash +# Feature Version starten (Port 3001) +docker-compose -f docker-compose.feature.yml up -d + +# Hauptversion läuft weiter auf Port 3000 +# Feature Version läuft auf Port 3001 +``` + +### 4. In Portainer +- **Hauptversion:** `flex420/discordsoundbot-vib:latest` (Port 3000) +- **Feature Version:** `flex420/discordsoundbot-vib:feature/css-experiments` (Port 3001) + +### 5. Mergen wenn bereit +```bash +git checkout main +git merge feature/mein-experiment +git push origin main +# Feature Branch löschen +git branch -d feature/mein-experiment +``` + +## Docker Images +- `:latest` - Hauptversion (main branch) +- `:feature/css-experiments` - Feature Version +- `:main` - Explizit main branch +- `:sha-abc123` - Spezifischer Commit + +## Portainer Setup +1. **Hauptcontainer:** Port 3000, Image `:latest` +2. **Feature Container:** Port 3001, Image `:feature/css-experiments` +3. **Testing:** Feature auf Port 3001 testen +4. **Deployment:** Wenn gut, Feature in main mergen diff --git a/docker-compose.feature.yml b/docker-compose.feature.yml new file mode 100644 index 0000000..540d5d8 --- /dev/null +++ b/docker-compose.feature.yml @@ -0,0 +1,23 @@ +version: '3.8' + +services: + app-feature: + image: flex420/discordsoundbot-vib:feature/css-experiments + container_name: jukebox-feature + restart: unless-stopped + ports: + - "3001:3000" # Anderer Port für Feature Testing + environment: + - DISCORD_TOKEN=${DISCORD_TOKEN} + - CLIENT_ID=${CLIENT_ID} + - GUILD_ID=${GUILD_ID} + - ADMIN_PWD=${ADMIN_PWD} + volumes: + - ./data/sounds:/data/sounds + - ./data/uploads:/data/uploads + networks: + - jukebox-network + +networks: + jukebox-network: + driver: bridge diff --git a/tatus b/tatus new file mode 100644 index 0000000..1dcb380 --- /dev/null +++ b/tatus @@ -0,0 +1,3 @@ +664af11 (HEAD -> main, origin/main, origin/HEAD) Header: Neues Google Stitch Design implementiert - horizontales Layout mit Zählern und Buttons +bf9d6d6 Persistenz: state.json ins Sounds-Volume verschoben (Migration vom alten Pfad). totalPlays bleibt über Deployments erhalten +f6a5be4 UI: Entfernt Plus-Icon auf Sound-Karten; Favoriten-Icon bleibt (Hover-Action) From 7c9224243bf5de5a759b912160f6673d2306e64f Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:04:36 +0200 Subject: [PATCH 02/17] Branch umbenannt: feature/css-experiments feature/nightly --- FEATURE_BRANCH.md | 6 +++--- docker-compose.feature.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FEATURE_BRANCH.md b/FEATURE_BRANCH.md index 23e121e..77249c7 100644 --- a/FEATURE_BRANCH.md +++ b/FEATURE_BRANCH.md @@ -24,7 +24,7 @@ docker-compose -f docker-compose.feature.yml up -d ### 4. In Portainer - **Hauptversion:** `flex420/discordsoundbot-vib:latest` (Port 3000) -- **Feature Version:** `flex420/discordsoundbot-vib:feature/css-experiments` (Port 3001) +- **Feature Version:** `flex420/discordsoundbot-vib:feature/nightly` (Port 3001) ### 5. Mergen wenn bereit ```bash @@ -37,12 +37,12 @@ git branch -d feature/mein-experiment ## Docker Images - `:latest` - Hauptversion (main branch) -- `:feature/css-experiments` - Feature Version +- `:feature/nightly` - Feature Version - `:main` - Explizit main branch - `:sha-abc123` - Spezifischer Commit ## Portainer Setup 1. **Hauptcontainer:** Port 3000, Image `:latest` -2. **Feature Container:** Port 3001, Image `:feature/css-experiments` +2. **Feature Container:** Port 3001, Image `:feature/nightly` 3. **Testing:** Feature auf Port 3001 testen 4. **Deployment:** Wenn gut, Feature in main mergen diff --git a/docker-compose.feature.yml b/docker-compose.feature.yml index 540d5d8..32c46ed 100644 --- a/docker-compose.feature.yml +++ b/docker-compose.feature.yml @@ -2,7 +2,7 @@ version: '3.8' services: app-feature: - image: flex420/discordsoundbot-vib:feature/css-experiments + image: flex420/discordsoundbot-vib:feature/nightly container_name: jukebox-feature restart: unless-stopped ports: From e3e341be6b7b9b84cb7d888afeba8bbde98b4935 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:09:36 +0200 Subject: [PATCH 03/17] =?UTF-8?q?Nightly:=20Grid-Layout=20zu=20flexibler?= =?UTF-8?q?=20Reihe=20ge=C3=A4ndert=20-=20Sounds=20stehen=20nacheinander?= =?UTF-8?q?=20mit=20automatischem=20Umbruch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/App.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index c919460..9bb7c88 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -323,7 +323,7 @@ export default function App() { {error &&
{error}
} {info &&
{info}
} -
+
{(activeFolder === '__favs__' ? filtered.filter((s) => !!favs[s.relativePath ?? s.fileName]) : filtered).map((s) => { const key = `${s.relativePath ?? s.fileName}`; const isFav = !!favs[key]; @@ -337,7 +337,7 @@ export default function App() { onChange={(e)=>{ e.stopPropagation(); toggleSelect(key, e.target.checked); }} /> )} -
handlePlay(s.name, s.relativePath)}> +
handlePlay(s.name, s.relativePath)}> {s.name}
From 17fa64c05a24da3b93f0e497b9d15f147ea98556 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:12:52 +0200 Subject: [PATCH 04/17] Nightly: Sounds-Listing auf lineares Flex-Wrap umgestellt (keine Spalten, responsives Umbruch-Verhalten) --- web/src/App.tsx | 4 ++-- web/src/styles.css | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index 9bb7c88..3f66f9a 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -323,7 +323,7 @@ export default function App() { {error &&
{error}
} {info &&
{info}
} -
+
{(activeFolder === '__favs__' ? filtered.filter((s) => !!favs[s.relativePath ?? s.fileName]) : filtered).map((s) => { const key = `${s.relativePath ?? s.fileName}`; const isFav = !!favs[key]; @@ -337,7 +337,7 @@ export default function App() { onChange={(e)=>{ e.stopPropagation(); toggleSelect(key, e.target.checked); }} /> )} -
handlePlay(s.name, s.relativePath)}> +
handlePlay(s.name, s.relativePath)}> {s.name}
diff --git a/web/src/styles.css b/web/src/styles.css index 171b293..c09bc3a 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -532,6 +532,16 @@ header p { .error { background: rgba(255, 99, 99, .12); color: #ffd1d1; border: 1px solid rgba(255, 99, 99, .3); padding: 10px 12px; border-radius: 10px; margin-bottom: 12px; } .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 14px; } + +/* Lineares, responsives Flow-Layout für Sounds */ +.sounds-flow { + display: flex; + flex-wrap: wrap; + gap: 14px; +} +.sounds-flow .sound-wrap { + flex: 0 1 220px; /* Basisbreite wie zuvor im Grid */ +} .sound-wrap { position: relative; display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 8px; } .sound-wrap.row .sound { width: 100%; } .row-check { width: 18px; height: 18px; accent-color: #60a5fa; } From eac3cdecad8a2c5f2090f6b6f0db8e522428673f Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:14:08 +0200 Subject: [PATCH 05/17] =?UTF-8?q?Fix:=20Docker=20Tag-Format=20f=C3=BCr=20F?= =?UTF-8?q?eature=20Branches=20(Slash=20=20Bindestrich),=20GitHub=20Action?= =?UTF-8?q?s=20Pipeline=20korrigiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-build.yml | 13 ++++++++++++- FEATURE_BRANCH.md | 6 +++--- docker-compose.feature.yml | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 7d36e3e..6da32a9 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -24,6 +24,17 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Generate Docker tag + id: docker_tag + run: | + if [[ "${{ github.ref_name }}" == "main" ]]; then + echo "tag=main" >> $GITHUB_OUTPUT + else + # Ersetze Slashes durch Bindestriche für gültige Docker Tags + CLEAN_TAG=$(echo "${{ github.ref_name }}" | sed 's/\//-/g') + echo "tag=$CLEAN_TAG" >> $GITHUB_OUTPUT + fi + - name: Build and push uses: docker/build-push-action@v5 with: @@ -32,5 +43,5 @@ jobs: tags: | ${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:${{ github.sha }} - ${{ env.IMAGE_NAME }}:${{ github.ref_name }} + ${{ env.IMAGE_NAME }}:${{ steps.docker_tag.outputs.tag }} platforms: linux/amd64 diff --git a/FEATURE_BRANCH.md b/FEATURE_BRANCH.md index 77249c7..e895340 100644 --- a/FEATURE_BRANCH.md +++ b/FEATURE_BRANCH.md @@ -24,7 +24,7 @@ docker-compose -f docker-compose.feature.yml up -d ### 4. In Portainer - **Hauptversion:** `flex420/discordsoundbot-vib:latest` (Port 3000) -- **Feature Version:** `flex420/discordsoundbot-vib:feature/nightly` (Port 3001) +- **Feature Version:** `flex420/discordsoundbot-vib:feature-nightly` (Port 3001) ### 5. Mergen wenn bereit ```bash @@ -37,12 +37,12 @@ git branch -d feature/mein-experiment ## Docker Images - `:latest` - Hauptversion (main branch) -- `:feature/nightly` - Feature Version +- `:feature-nightly` - Feature Version - `:main` - Explizit main branch - `:sha-abc123` - Spezifischer Commit ## Portainer Setup 1. **Hauptcontainer:** Port 3000, Image `:latest` -2. **Feature Container:** Port 3001, Image `:feature/nightly` +2. **Feature Container:** Port 3001, Image `:feature-nightly` 3. **Testing:** Feature auf Port 3001 testen 4. **Deployment:** Wenn gut, Feature in main mergen diff --git a/docker-compose.feature.yml b/docker-compose.feature.yml index 32c46ed..909cee5 100644 --- a/docker-compose.feature.yml +++ b/docker-compose.feature.yml @@ -2,7 +2,7 @@ version: '3.8' services: app-feature: - image: flex420/discordsoundbot-vib:feature/nightly + image: flex420/discordsoundbot-vib:feature-nightly container_name: jukebox-feature restart: unless-stopped ports: From 067a92b7c4d1074e7293cb44c2af66c70955e208 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:19:53 +0200 Subject: [PATCH 06/17] Nightly: Header zeigt 'Nightly' Badge auf Port 3001 (Feature Version) --- web/src/App.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index 3f66f9a..1ae2f2f 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -177,7 +177,12 @@ export default function App() {
-

Jukebox 420

+

+ Jukebox 420 + {window.location.hostname.includes('localhost') && window.location.port === '3001' && ( + Nightly + )} +

{clock}

From 517182b7781c0dca952e7d454f3cf6a3633fbeb8 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:22:50 +0200 Subject: [PATCH 07/17] =?UTF-8?q?Vereinfachung:=20Einheitlicher=20Port=208?= =?UTF-8?q?199,=20Nightly=20Badge=20=C3=BCber=20Umgebungsvariable=20REACT?= =?UTF-8?q?=5FAPP=5FVERSION?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FEATURE_BRANCH.md | 16 ++++++++-------- docker-compose.feature.yml | 3 ++- docker-compose.yml | 2 ++ web/src/App.tsx | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/FEATURE_BRANCH.md b/FEATURE_BRANCH.md index e895340..bb5474f 100644 --- a/FEATURE_BRANCH.md +++ b/FEATURE_BRANCH.md @@ -15,16 +15,16 @@ git push -u origin feature/mein-experiment ### 3. Feature Version testen ```bash -# Feature Version starten (Port 3001) +# Feature Version starten (ersetzt Stable Version) docker-compose -f docker-compose.feature.yml up -d -# Hauptversion läuft weiter auf Port 3000 -# Feature Version läuft auf Port 3001 +# Beide Versionen verwenden Port 8199 +# Nightly Version zeigt "Nightly" Badge im Header ``` ### 4. In Portainer -- **Hauptversion:** `flex420/discordsoundbot-vib:latest` (Port 3000) -- **Feature Version:** `flex420/discordsoundbot-vib:feature-nightly` (Port 3001) +- **Stable Version:** `flex420/discordsoundbot-vib:latest` (Port 8199) +- **Nightly Version:** `flex420/discordsoundbot-vib:feature-nightly` (Port 8199) ### 5. Mergen wenn bereit ```bash @@ -42,7 +42,7 @@ git branch -d feature/mein-experiment - `:sha-abc123` - Spezifischer Commit ## Portainer Setup -1. **Hauptcontainer:** Port 3000, Image `:latest` -2. **Feature Container:** Port 3001, Image `:feature-nightly` -3. **Testing:** Feature auf Port 3001 testen +1. **Stable Container:** Port 8199, Image `:latest` +2. **Nightly Container:** Port 8199, Image `:feature-nightly` +3. **Testing:** Nightly Version zeigt "Nightly" Badge im Header 4. **Deployment:** Wenn gut, Feature in main mergen diff --git a/docker-compose.feature.yml b/docker-compose.feature.yml index 909cee5..5f57f83 100644 --- a/docker-compose.feature.yml +++ b/docker-compose.feature.yml @@ -6,12 +6,13 @@ services: container_name: jukebox-feature restart: unless-stopped ports: - - "3001:3000" # Anderer Port für Feature Testing + - "8199:8080" # Gleicher Port wie Stable environment: - DISCORD_TOKEN=${DISCORD_TOKEN} - CLIENT_ID=${CLIENT_ID} - GUILD_ID=${GUILD_ID} - ADMIN_PWD=${ADMIN_PWD} + - REACT_APP_VERSION=nightly volumes: - ./data/sounds:/data/sounds - ./data/uploads:/data/uploads diff --git a/docker-compose.yml b/docker-compose.yml index 77c3269..9674592 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,8 @@ services: - "8199:8080" env_file: - .env + environment: + - REACT_APP_VERSION=stable volumes: - ./data/sounds:/data/sounds restart: unless-stopped diff --git a/web/src/App.tsx b/web/src/App.tsx index 1ae2f2f..22ff5b9 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -179,7 +179,7 @@ export default function App() {

Jukebox 420 - {window.location.hostname.includes('localhost') && window.location.port === '3001' && ( + {process.env.REACT_APP_VERSION === 'nightly' && ( Nightly )}

From 8ae88be5e668e5c78b0355d9c483c6b9deaafbc0 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:25:17 +0200 Subject: [PATCH 08/17] Nightly: Sounds-Listing auf echte lineare Liste umgestellt (vertikale Anordnung, keine Spalten) --- web/src/styles.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/styles.css b/web/src/styles.css index c09bc3a..fdf7055 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -536,11 +536,11 @@ header p { /* Lineares, responsives Flow-Layout für Sounds */ .sounds-flow { display: flex; - flex-wrap: wrap; - gap: 14px; + flex-direction: column; + gap: 8px; } .sounds-flow .sound-wrap { - flex: 0 1 220px; /* Basisbreite wie zuvor im Grid */ + width: 100%; } .sound-wrap { position: relative; display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 8px; } .sound-wrap.row .sound { width: 100%; } From 136312467dfc9a89cba4f73fc02a17ffbd560c75 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:27:35 +0200 Subject: [PATCH 09/17] =?UTF-8?q?Fix:=20REACT=5FAPP=5FVERSION=20Build-Argu?= =?UTF-8?q?ment=20f=C3=BCr=20Nightly=20Badge=20im=20Header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-build.yml | 2 ++ Dockerfile | 3 +++ 2 files changed, 5 insertions(+) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 6da32a9..9ebfa82 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -40,6 +40,8 @@ jobs: with: context: . push: true + build-args: | + REACT_APP_VERSION=${{ steps.docker_tag.outputs.tag == 'main' && 'stable' || 'nightly' }} tags: | ${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:${{ github.sha }} diff --git a/Dockerfile b/Dockerfile index 3d11cbe..8ecf4e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,9 @@ WORKDIR /app/web COPY web/package*.json ./ RUN npm install --no-audit --no-fund COPY web/ . +# Umgebungsvariable für React Build verfügbar machen +ARG REACT_APP_VERSION=stable +ENV REACT_APP_VERSION=$REACT_APP_VERSION RUN npm run build # --- Build server (npm) --- From 17b3737176b121fdb1c0486213ca29d753646ea7 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:33:48 +0200 Subject: [PATCH 10/17] =?UTF-8?q?Nightly=20Badge=20zuverl=C3=A4ssig:=20Vit?= =?UTF-8?q?e=20Env=20VITE=5FBUILD=5FCHANNEL,=20Dockerfile=20ARG/ENV,=20CI?= =?UTF-8?q?=20Build-Args=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-build.yml | 2 +- Dockerfile | 6 +++--- web/src/App.tsx | 4 ++-- web/src/styles.css | 3 +++ 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 9ebfa82..058c79b 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -41,7 +41,7 @@ jobs: context: . push: true build-args: | - REACT_APP_VERSION=${{ steps.docker_tag.outputs.tag == 'main' && 'stable' || 'nightly' }} + VITE_BUILD_CHANNEL=${{ steps.docker_tag.outputs.tag == 'main' && 'stable' || 'nightly' }} tags: | ${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:${{ github.sha }} diff --git a/Dockerfile b/Dockerfile index 8ecf4e8..2864250 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,9 +6,9 @@ WORKDIR /app/web COPY web/package*.json ./ RUN npm install --no-audit --no-fund COPY web/ . -# Umgebungsvariable für React Build verfügbar machen -ARG REACT_APP_VERSION=stable -ENV REACT_APP_VERSION=$REACT_APP_VERSION +# Umgebungsvariable für React Build verfügbar machen (Vite liest nur VITE_*) +ARG VITE_BUILD_CHANNEL=stable +ENV VITE_BUILD_CHANNEL=$VITE_BUILD_CHANNEL RUN npm run build # --- Build server (npm) --- diff --git a/web/src/App.tsx b/web/src/App.tsx index 22ff5b9..79ed838 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -179,8 +179,8 @@ export default function App() {

Jukebox 420 - {process.env.REACT_APP_VERSION === 'nightly' && ( - Nightly + {import.meta.env.VITE_BUILD_CHANNEL === 'nightly' && ( + Nightly Build )}

{clock}

diff --git a/web/src/styles.css b/web/src/styles.css index fdf7055..05ef182 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -339,6 +339,9 @@ header h1 { color: inherit; } +/* Nightly Badge Farbe (Fallback) */ +.nightly-badge { color: #ff4d4f; } + header p { margin: 0; opacity: .9; From 8c7b1fbc3121947f9dc73002c787993720e4f2d6 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:35:14 +0200 Subject: [PATCH 11/17] Nightly: Sounds wieder organisch wie Tabs nebeneinander (flex-wrap, auto-breite Karten) --- web/src/styles.css | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/web/src/styles.css b/web/src/styles.css index 05ef182..13d9552 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -539,13 +539,17 @@ header p { /* Lineares, responsives Flow-Layout für Sounds */ .sounds-flow { display: flex; - flex-direction: column; - gap: 8px; + flex-wrap: wrap; + align-items: flex-start; + gap: 12px; } .sounds-flow .sound-wrap { - width: 100%; + position: relative; + flex: 0 0 auto; } -.sound-wrap { position: relative; display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 8px; } +/* Kartenbreite an Tabs angelehnt */ +.sounds-flow .sound-btn { min-width: 180px; } +.sound-wrap { position: relative; display: block; } .sound-wrap.row .sound { width: 100%; } .row-check { width: 18px; height: 18px; accent-color: #60a5fa; } .select-check { From 83fb33c6173fe637ee18a116db42ed2f9930f955 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:42:02 +0200 Subject: [PATCH 12/17] =?UTF-8?q?Nightly:=20Sound-Buttons=20passen=20Breit?= =?UTF-8?q?e=20dynamisch=20an=20Textl=C3=A4nge=20an=20(inline-flex,=20auto?= =?UTF-8?q?=20width)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/styles.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/src/styles.css b/web/src/styles.css index 13d9552..ef6a143 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -548,7 +548,12 @@ header p { flex: 0 0 auto; } /* Kartenbreite an Tabs angelehnt */ -.sounds-flow .sound-btn { min-width: 180px; } +.sounds-flow .sound-btn { + display: inline-flex; + width: auto; + max-width: 260px; /* verhindert überlange Buttons, mehr Cards pro Zeile */ + white-space: nowrap; /* einzeilig */ +} .sound-wrap { position: relative; display: block; } .sound-wrap.row .sound { width: 100%; } .row-check { width: 18px; height: 18px; accent-color: #60a5fa; } From 1820e3ceff364b3341d636133dbc05304b995d3f Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:43:35 +0200 Subject: [PATCH 13/17] Nightly: Tabs/Filter optisch an Random-Button angeglichen (bg-gray-700, hover bg-gray-600, bold, rounded) --- web/src/styles.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/web/src/styles.css b/web/src/styles.css index ef6a143..d1d1085 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -631,3 +631,19 @@ header p { + +/* Tabs/Filter wie der Random-Button im Header (einheitlicher Stil über alle Themes) */ +[data-theme] .tag-btn { + padding: 12px 24px; + border-radius: 0.5rem; + background: #374151; /* bg-gray-700 */ + color: #ffffff; + font-weight: 700; + border: none; + transition: background-color .2s ease, transform .2s ease; +} +[data-theme] .tag-btn:hover { background: #4b5563; /* bg-gray-600 */ } +[data-theme] .tag-btn.active { + background: #4b5563; + box-shadow: 0 0 0 2px rgba(255,255,255,.08) inset; +} \ No newline at end of file From d9a450f06a730c94a4e3719e40bcc8cf862e6076 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:52:31 +0200 Subject: [PATCH 14/17] =?UTF-8?q?Nightly:=20Sound-Button=20Padding=20gleic?= =?UTF-8?q?hm=C3=A4=C3=9Fig=20(12px=2016px),=20Text=20zentriert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/styles.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/src/styles.css b/web/src/styles.css index d1d1085..6c36c67 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -553,6 +553,8 @@ header p { width: auto; max-width: 260px; /* verhindert überlange Buttons, mehr Cards pro Zeile */ white-space: nowrap; /* einzeilig */ + padding: 12px 16px; /* gleichmäßiges Padding links/rechts */ + justify-content: center; /* Text zentrieren */ } .sound-wrap { position: relative; display: block; } .sound-wrap.row .sound { width: 100%; } From 869f005ccbcbefe080ab47246ae5cfb310ae3ea3 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 02:58:48 +0200 Subject: [PATCH 15/17] =?UTF-8?q?Nightly:=20Einheitliche=20Tab-Schriftgr?= =?UTF-8?q?=C3=B6=C3=9Fe=20(.875rem)=20=C3=BCber=20alle=20Themes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/styles.css | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/styles.css b/web/src/styles.css index 6c36c67..05c8167 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -640,6 +640,7 @@ header p { border-radius: 0.5rem; background: #374151; /* bg-gray-700 */ color: #ffffff; + font-size: .875rem; /* einheitliche Schriftgröße wie andere Themes */ font-weight: 700; border: none; transition: background-color .2s ease, transform .2s ease; From d5df8b63f84d03d50af989202930388c5e978e75 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 10:34:42 +0200 Subject: [PATCH 16/17] Nightly: Aktives Tab/Filter farbig pro Theme (dark/rainbow/420) --- web/src/styles.css | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/web/src/styles.css b/web/src/styles.css index 05c8167..928b377 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -649,4 +649,21 @@ header p { [data-theme] .tag-btn.active { background: #4b5563; box-shadow: 0 0 0 2px rgba(255,255,255,.08) inset; +} + +/* Aktives Tab farbig je nach Theme */ +[data-theme="dark"] .tag-btn.active { + background: #0a84ff !important; + color: #ffffff !important; +} +[data-theme="rainbow"] .tag-btn.active { + background: linear-gradient(90deg, #ff6384, #36a2eb, #ffce56, #4bc0c0, #9966ff) !important; + color: #ffffff !important; + border: 1px solid transparent !important; +} +[data-theme="420"] .tag-btn.active { + background: #22c55e !important; + color: #ffffff !important; + border-color: #22c55e !important; + box-shadow: 0 0 15px rgba(34, 197, 94, 0.5); } \ No newline at end of file From 2b2349491df9d0591984a908145afe7f27e72933 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sat, 9 Aug 2025 10:40:34 +0200 Subject: [PATCH 17/17] Nightly: Tabs-Schrift vereinheitlicht + doppelte Klammerzahlen in Ordnernamen entfernt (Most played) --- web/src/App.tsx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index 79ed838..17bc640 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -319,9 +319,22 @@ export default function App() {
- {folders.map(f=> ( - - ))} + {folders.map(f=> { + const displayName = f.name.replace(/\s*\(\d+\)\s*$/, ''); + return ( + + ); + })}