Skip to content
Open
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
22fc5df
fix(web-ui): Moved sunshine.css + fixed sunshine css style overriding…
Noklef May 30, 2026
5f06ed6
fix(web-ui): Updated Nord theme stylig with proper theme HEX codes
Noklef May 30, 2026
2e4fda3
feat(web-ui): Added Dracula / Alucard themes
Noklef May 30, 2026
51e3a49
fix(web-ui): Updated button styling
Noklef May 30, 2026
ff6fd13
feat(web-ui): Created a themed drop-down
Noklef May 30, 2026
dffff89
fix(web-ui): Bootstrap override for secondary outline button + fixed …
Noklef May 30, 2026
2aef88f
fix(web-ui): Themed the logout page
Noklef May 30, 2026
73919ad
fix(web-ui): Added `color-on-XXX` css variables to set text colour
Noklef May 30, 2026
ffebd15
fix(web-ui): updated the background of input group texts to use bg co…
Noklef May 30, 2026
43fe884
fix(web-ui): Fixed missing `color-on-warning` for dracula theme
Noklef May 30, 2026
9f047c6
feat(web-ui): added 2 new themes, `Catppuccin Latte` (light) and `Cat…
Noklef May 30, 2026
4d9a57f
feat(web-ui): Added `Rose` themes and updated `Ember` theme to use pr…
Noklef May 30, 2026
4a6f569
fix(web-ui): Added linear gradient for Dracula / Alucard
Noklef May 30, 2026
f880ab2
fix(web-ui): Add navbar gradients to new themes + default
Noklef May 30, 2026
7f89fd6
fix(web-ui): replaced pulse animation with `colour-mix`
Noklef May 30, 2026
1228f32
feat(web-ui): Added a `Random` button to select a random theme
Noklef May 30, 2026
f8ac367
Merge branch 'master' into ui-style-consistency
Noklef May 30, 2026
fdd3c85
fix(web-ui): Added badge theme overriding
Noklef May 30, 2026
aa29109
fix(web-ui): Created toolbar styling for `apps` / `featured` pages
Noklef May 30, 2026
f9879b5
feat(web-ui): Added description to configuration (WIP)
Noklef May 30, 2026
3e61a6d
feat(web-ui): Re-styled the settings tabs to be a vertical column ins…
Noklef May 31, 2026
cf86a80
fix(web-ui): Fixed sonarqube issues
Noklef May 31, 2026
f192a91
Merge branch 'master' into ui-style-consistency
Noklef May 31, 2026
eeba0ea
fix(web-ui): Added description to password page
Noklef May 31, 2026
f486e58
fix(web-ui): added `color-on-xxx` for `latte` and `rose pine dawn`
Noklef May 31, 2026
d88f12c
fix(web-ui): Added `NONSONAR` comment to unflag SonarQube
Noklef May 31, 2026
d3471b7
fix(web-ui): `NON` -> `NO`
Noklef May 31, 2026
d2211d6
Merge branch 'master' into ui-style-consistency
Noklef Jun 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 56 additions & 40 deletions src_assets/common/assets/web/ThemeToggle.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,25 @@ import { onMounted } from 'vue'
import {
CloudMoon,
CloudRain,
Coffee,
Contrast,
Droplet,
Flame,
Flower,
Flower2,
Ghost,
Layers,
Milk,
MonitorSmartphone,
Moon,
Mountain,
Shuffle,
Sparkles,
Sprout,
Sun,
Sunrise,
Sunset,
TreePine,
Trees,
Waves,
} from '@lucide/vue'
Expand All @@ -38,96 +46,104 @@ onMounted(() => {
</span>
<span id="bd-theme-text">{{ $t('navbar.toggle_theme') }}</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
<li>
<ul class="dropdown-menu dropdown-menu-end theme-menu" aria-labelledby="bd-theme-text">
<li class="theme-menu-full">
<button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
<MonitorSmartphone :size="18" class="theme-icon icon"></MonitorSmartphone>
{{ $t('navbar.theme_auto') }}
</button>
<button type="button" id="bd-theme-random" class="dropdown-item d-flex align-items-center">
<Shuffle :size="18" class="theme-icon icon"></Shuffle>
{{ $t('navbar.theme_random') }}
</button>
</li>
<li><hr class="dropdown-divider"></li>
<!-- Dark Themes -->
<li>
<li class="theme-menu-group">
<h6 class="dropdown-header">{{ $t('navbar.theme_group_dark') }}</h6>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
<Moon :size="18" class="theme-icon icon"></Moon>
{{ $t('navbar.theme_dark') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="slate" aria-pressed="false">
<Layers :size="18" class="theme-icon icon"></Layers>
{{ $t('navbar.theme_slate') }}
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dracula" aria-pressed="false">
<Ghost :size="18" class="theme-icon icon"></Ghost>
{{ $t('navbar.theme_dracula') }}
</button>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="mocha" aria-pressed="false">
<Coffee :size="18" class="theme-icon icon"></Coffee>
{{ $t('navbar.theme_mocha') }}
</button>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="ember" aria-pressed="false">
<Flame :size="18" class="theme-icon icon"></Flame>
{{ $t('navbar.theme_ember') }}
</button>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="rose-pine" aria-pressed="false">
<TreePine :size="18" class="theme-icon icon"></TreePine>
{{ $t('navbar.theme_rose_pine') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="moonlight" aria-pressed="false">
<CloudMoon :size="18" class="theme-icon icon"></CloudMoon>
{{ $t('navbar.theme_moonlight') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="slate" aria-pressed="false">
<Layers :size="18" class="theme-icon icon"></Layers>
{{ $t('navbar.theme_slate') }}
</button>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="midnight" aria-pressed="false">
<CloudRain :size="18" class="theme-icon icon"></CloudRain>
{{ $t('navbar.theme_midnight') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="ember" aria-pressed="false">
<Flame :size="18" class="theme-icon icon"></Flame>
{{ $t('navbar.theme_ember') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="nord" aria-pressed="false">
<Mountain :size="18" class="theme-icon icon"></Mountain>
{{ $t('navbar.theme_nord') }}
</button>
</li>
<li><hr class="dropdown-divider"></li>
<!-- Light Themes -->
<li>
<li class="theme-menu-group">
<h6 class="dropdown-header">{{ $t('navbar.theme_group_light') }}</h6>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
<Sun :size="18" class="theme-icon icon"></Sun>
{{ $t('navbar.theme_light') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="indigo" aria-pressed="false">
<Sparkles :size="18" class="theme-icon icon"></Sparkles>
{{ $t('navbar.theme_indigo') }}
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="alucard" aria-pressed="false">
<Droplet :size="18" class="theme-icon icon"></Droplet>
{{ $t('navbar.theme_alucard') }}
</button>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="latte" aria-pressed="false">
<Milk :size="18" class="theme-icon icon"></Milk>
{{ $t('navbar.theme_latte') }}
</button>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="ember-light" aria-pressed="false">
<Sunset :size="18" class="theme-icon icon"></Sunset>
{{ $t('navbar.theme_ember_light') }}
</button>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="rose-pine-dawn" aria-pressed="false">
<Sprout :size="18" class="theme-icon icon"></Sprout>
{{ $t('navbar.theme_rose_pine_dawn') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="sunshine" aria-pressed="false">
<Sunrise :size="18" class="theme-icon icon"></Sunrise>
{{ $t('navbar.theme_sunshine') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="indigo" aria-pressed="false">
<Sparkles :size="18" class="theme-icon icon"></Sparkles>
{{ $t('navbar.theme_indigo') }}
</button>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="ocean" aria-pressed="false">
<Waves :size="18" class="theme-icon icon"></Waves>
{{ $t('navbar.theme_ocean') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="forest" aria-pressed="false">
<Trees :size="18" class="theme-icon icon"></Trees>
{{ $t('navbar.theme_forest') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="rose" aria-pressed="false">
<Flower :size="18" class="theme-icon icon"></Flower>
{{ $t('navbar.theme_rose') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="lavender" aria-pressed="false">
<Flower2 :size="18" class="theme-icon icon"></Flower2>
{{ $t('navbar.theme_lavender') }}
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="monochrome" aria-pressed="false">
<Contrast :size="18" class="theme-icon icon"></Contrast>
{{ $t('navbar.theme_monochrome') }}
Expand Down
2 changes: 1 addition & 1 deletion src_assets/common/assets/web/apps.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ <h1>{{ $t('apps.applications_title') }}<span v-if="apps.length"> ({{ appCountLab
</div>

<!-- Actions toolbar -->
<div class="apps-toolbar d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
<div class="toolbar apps-toolbar d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
<!-- Left side actions -->
<div class="d-flex align-items-center gap-2">
<!-- Add new application -->
Expand Down
99 changes: 65 additions & 34 deletions src_assets/common/assets/web/config.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@
<body id="app" v-cloak>
<Navbar></Navbar>
<div class="container">
<h1 class="my-4">{{ $t('config.configuration') }}</h1>
<div class="my-4">
<h1>{{ $t('config.configuration') }}</h1>
<p>{{ $t('config.configuration_desc') }}</p>
</div>

<!-- Search Bar with Autocomplete -->
<div class="mb-3">
<div class="input-group">
<div class="toolbar mb-3 d-flex flex-wrap align-items-center gap-3">
<div class="input-group config-search">
<span class="input-group-text">
<search :size="18" class="icon"></search>
</span>
Expand All @@ -30,25 +33,60 @@ <h1 class="my-4">{{ $t('config.configuration') }}</h1>
{{ option.tab }} - {{ option.label }}
</option>
</datalist>
<div v-if="searchQuery && searchResults.length === 0" class="text-muted small mt-1">
<span v-if="searchQuery && searchResults.length === 0" class="text-muted small flex-shrink-0">
No results found for "{{ searchQuery }}"
</div>
<div v-else-if="searchQuery" class="text-muted small mt-1">
</span>
<span v-else-if="searchQuery" class="text-muted small flex-shrink-0">
Found {{ searchResults.length }} result(s)
</div>
</span>
</div>

<div class="form" v-if="config">
<!-- Header -->
<ul class="nav nav-tabs">
<li class="nav-item" v-for="tab in tabs" :key="tab.id">
<a class="nav-link" :class="{'active': tab.id === currentTab}" href="#"
@click="currentTab = tab.id">
<component :is="getTabIcon(tab.id)" :size="18" class="icon"></component>
{{tab.name}}
</a>
</li>
</ul>
<div class="config-layout">
<!-- Sidebar navigation -->
<nav class="config-nav">
<ul class="nav config-nav-list">
<li class="nav-item" v-for="tab in generalTabs" :key="tab.id">
<a class="nav-link" :class="{'active': tab.id === currentTab}" href="#"
@click="currentTab = tab.id">
<component :is="getTabIcon(tab.id)" :size="18" class="icon"></component>
{{tab.name}}
</a>
</li>
</ul>
<template v-if="encoderTabs.length">
<div class="config-nav-heading">{{ $t('config.encoders') }}</div>
<ul class="nav config-nav-list">
<li class="nav-item" v-for="tab in encoderTabs" :key="tab.id">
<a class="nav-link" :class="{'active': tab.id === currentTab}" href="#"
@click="currentTab = tab.id">
<component :is="getTabIcon(tab.id)" :size="18" class="icon"></component>
{{tab.name}}
</a>
</li>
</ul>
</template>

<div class="config-actions">
<button class="btn btn-primary" @click="save">
<save :size="18" class="icon"></save>
{{ $t('_common.save') }}
</button>
<button class="btn btn-success" @click="apply" v-if="saved && !restarted">
<check :size="18" class="icon"></check>
{{ $t('_common.apply') }}
</button>
</div>
</nav>

<!-- Tab content -->
<div class="config-content">
<div class="alert alert-success mb-4" v-if="saved && !restarted">
<b>{{ $t('_common.success') }}</b> {{ $t('config.apply_note') }}
</div>
<div class="alert alert-success mb-4" v-if="restarted">
<b>{{ $t('_common.success') }}</b> {{ $t('config.restart_note') }}
</div>

<!-- General Tab -->
<general
Expand Down Expand Up @@ -98,25 +136,10 @@ <h1 class="my-4">{{ $t('config.configuration') }}</h1>
:config="config"
:platform="platform">
</container-encoders>
</div>
</div>
</div>

<!-- Save and Apply buttons -->
<div class="alert alert-success my-4" v-if="saved && !restarted">
<b>{{ $t('_common.success') }}</b> {{ $t('config.apply_note') }}
</div>
<div class="alert alert-success my-4" v-if="restarted">
<b>{{ $t('_common.success') }}</b> {{ $t('config.restart_note') }}
</div>
<div class="mb-3 d-flex gap-2 mt-4">
<button class="btn btn-primary" @click="save">
<save :size="18" class="icon"></save>
{{ $t('_common.save') }}
</button>
<button class="btn btn-success" @click="apply" v-if="saved && !restarted">
<check :size="18" class="icon"></check>
{{ $t('_common.apply') }}
</button>
</div>
</div>
</body>

Expand Down Expand Up @@ -148,6 +171,8 @@ <h1 class="my-4">{{ $t('config.configuration') }}</h1>
Volume2,
} from '@lucide/vue'

const ENCODER_TAB_IDS = new Set(["nv", "amd", "qsv", "vaapi", "vt", "vulkan", "sw"]);

const app = createApp({
components: {
Navbar,
Expand Down Expand Up @@ -360,6 +385,12 @@ <h1 class="my-4">{{ $t('config.configuration') }}</h1>
}
},
computed: {
generalTabs() {
return this.tabs.filter(tab => !ENCODER_TAB_IDS.has(tab.id));
},
encoderTabs() {
return this.tabs.filter(tab => ENCODER_TAB_IDS.has(tab.id));
},
allConfigOptions() {
const options = [];
this.tabs.forEach(tab => {
Expand Down
2 changes: 1 addition & 1 deletion src_assets/common/assets/web/featured.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ <h1>{{ $t('featured.title') }}</h1>
</div>

<!-- Category Filter -->
<div class="mb-4">
<div class="toolbar mb-4">
<div class="btn-group" role="group" aria-label="Category filter">
<button
type="button"
Expand Down
5 changes: 5 additions & 0 deletions src_assets/common/assets/web/init.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import i18n from './locale'

import 'bootstrap/dist/css/bootstrap.min.css'
// Load Sunshine.css after bootstrap to override some of the styles.
// Makes themes load and style correctly.
import './sunshine.css'

// must import even if not implicitly using here
// https://github.com/aurelia/skeleton-navigation/issues/894
// https://discourse.aurelia.io/t/bootstrap-import-bootstrap-breaks-dropdown-menu-in-navbar/641/9
Expand Down
3 changes: 3 additions & 0 deletions src_assets/common/assets/web/logout.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@ <h1 class="h3 mb-3">{{ $t('logout.logged_out') }}</h1>
<script type="module">
import { createApp } from 'vue'
import { initApp } from './init'
import { loadAutoTheme } from './theme'
import { LogIn } from '@lucide/vue'

loadAutoTheme();

const app = createApp({
components: {
LogIn,
Expand Down
5 changes: 4 additions & 1 deletion src_assets/common/assets/web/password.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
<body id="app" v-cloak>
<Navbar></Navbar>
<div class="container">
<h1 class="my-4">{{ $t('password.password_change') }}</h1>
<div class="my-4">
<h1>{{ $t('password.password_change') }}</h1>
<p>{{ $t('password.password_change_desc') }}</p>
</div>
<form @submit.prevent="save">
<div class="card">
<div class="card-body">
Expand Down
Loading