+ ${title class="d-block text-truncate"}
+ ${release class="text-decoration-none text-truncate link-success"}
diff --git a/approot/playqueue.xml b/approot/playqueue.xml
index 77c17d26..55d9c47e 100644
--- a/approot/playqueue.xml
+++ b/approot/playqueue.xml
@@ -9,17 +9,17 @@
-
+
${clear-btn class="btn btn-secondary"}
-
+
${shuffle-btn class="btn btn-secondary"}
${repeat-btn class="btn-check"}
-
+
${radio-btn class="btn-check"}
-
+
${nb-tracks}
diff --git a/approot/settings.xml b/approot/settings.xml
index a095b403..a07498b3 100644
--- a/approot/settings.xml
+++ b/approot/settings.xml
@@ -149,7 +149,7 @@
${}
-
-
+
${tr:Lms.password-confirm}
${password-confirm class="form-control"}
diff --git a/docroot/css/lms.css b/docroot/css/lms.css
index 84fdec1d..64fa3796 100644
--- a/docroot/css/lms.css
+++ b/docroot/css/lms.css
@@ -1,4 +1,17 @@
/* Generic rules */
+
+.link-success {
+ transition: color 0.15s ease;
+}
+
+.link-secondary {
+ transition: color 0.15s ease;
+}
+
+.Lms-bg-dark-hover {
+ transition: background-color 0.15s ease;
+}
+
.Lms-bg-dark-hover:hover {
background-color: var(--bs-dark);
}
@@ -8,8 +21,9 @@ body {
padding-bottom: 78px;
}
-a img:hover {
- filter: brightness(85%);
+.Lms-badge-cluster {
+ transition: filter 0.15s ease;
+ cursor: pointer;
}
.Lms-badge-cluster:hover {
@@ -29,7 +43,11 @@ a img:hover {
.Lms-cover {
opacity: 0;
- transition: opacity 1s;
+ transition: opacity 0.5s ease-in, filter 0.15s ease;
+}
+
+.Lms-cover-anchor:hover {
+ filter: brightness(85%);
}
.Lms-cover-container {
@@ -66,6 +84,37 @@ a img:hover {
z-index: 999;
}
+.Lms-player-seek-common {
+ position: absolute;
+ width:100%;
+ top: 0;
+ left: 0;
+ height: 6px;
+}
+
+.Lms-player-seek {
+ cursor: pointer;
+ z-index: 1;
+ touch-action: manipulation;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ background: transparent;
+}
+
+.Lms-player-seek::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ height: 0;
+ width: 0;
+}
+
+.Lms-player-seek::-moz-range-thumb {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ height: 0;
+ width: 0;
+}
+
.Lms-responsive-square {
width: 100%;
diff --git a/docroot/js/mediaplayer.js b/docroot/js/mediaplayer.js
index 6023a9ca..f9e81d54 100644
--- a/docroot/js/mediaplayer.js
+++ b/docroot/js/mediaplayer.js
@@ -31,13 +31,16 @@ LMS.mediaplayer = function () {
var _lastStartPlaying = null;
var _updateControls = function() {
+ const pauseClass = "fa-pause";
+ const playClass = "fa-play";
+
if (_elems.audio.paused) {
- _elems.playpause.classList.remove("fa-pause");
- _elems.playpause.classList.add("fa-play");
+ _elems.playpause.firstElementChild.classList.remove(pauseClass);
+ _elems.playpause.firstElementChild.classList.add(playClass);
}
else {
- _elems.playpause.classList.remove("fa-play");
- _elems.playpause.classList.add("fa-pause");
+ _elems.playpause.firstElementChild.classList.remove(playClass);
+ _elems.playpause.firstElementChild.classList.add(pauseClass);
}
}
@@ -178,8 +181,6 @@ LMS.mediaplayer = function () {
_elems.volumeslider = document.getElementById("lms-mp-volume-slider");
_elems.transcodingActive = document.getElementById("lms-transcoding-active");
- $(_elems.transcodingActive).tooltip();
-
var source = _audioCtx.createMediaElementSource(_elems.audio);
source.connect(_gainNode);
_gainNode.connect(_audioCtx.destination);
diff --git a/src/lms/ui/LmsApplication.cpp b/src/lms/ui/LmsApplication.cpp
index 7f76f09b..3762d944 100644
--- a/src/lms/ui/LmsApplication.cpp
+++ b/src/lms/ui/LmsApplication.cpp
@@ -415,13 +415,13 @@ LmsApplication::createHome()
_coverResource = std::make_shared();
declareJavaScriptFunction("onLoadCover", "function(id) { id.className += \" Lms-cover-loaded\"}");
- doJavaScript("$('body').tooltip({ selector: '[data-toggle=\"tooltip\"]'})");
Wt::WTemplate* main {root()->addWidget(std::make_unique(Wt::WString::tr("Lms.main.template")))};
main->addFunction("tr", &Wt::WTemplate::Functions::tr);
Wt::WTemplate* navbar {main->bindNew("navbar", Wt::WString::tr("Lms.main.template.navbar"))};
+ navbar->addFunction("tr", &Wt::WTemplate::Functions::tr);
_notificationContainer = main->bindNew("notifications");
_modalManager = main->bindNew("modal");
diff --git a/src/lms/ui/PlayQueue.cpp b/src/lms/ui/PlayQueue.cpp
index 05a2247f..4c8bc2f8 100644
--- a/src/lms/ui/PlayQueue.cpp
+++ b/src/lms/ui/PlayQueue.cpp
@@ -408,7 +408,7 @@ PlayQueue::addEntry(const Database::TrackListEntry::pointer& tracklistEntry)
{
Wt::WAnchor* anchor {entry->bindWidget("cover", LmsApplication::createReleaseAnchor(release, false))};
auto cover {Utils::createCover(release->getId(), CoverResource::Size::Small)};
- cover->addStyleClass("Lms-cover-track"); // HACK
+ cover->addStyleClass("Lms-cover-track Lms-cover-anchor"); // HACK
anchor->setImage(std::move(cover));
}
}
diff --git a/src/lms/ui/explore/ReleaseListHelpers.cpp b/src/lms/ui/explore/ReleaseListHelpers.cpp
index f3e2ac7b..f66a202d 100644
--- a/src/lms/ui/explore/ReleaseListHelpers.cpp
+++ b/src/lms/ui/explore/ReleaseListHelpers.cpp
@@ -45,7 +45,7 @@ namespace UserInterface::ReleaseListHelpers
{
Wt::WAnchor* anchor {entry->bindWidget("cover", LmsApplication::createReleaseAnchor(release, false))};
auto cover {Utils::createCover(release->getId(), CoverResource::Size::Large)};
- cover->addStyleClass("Lms-cover-release");
+ cover->addStyleClass("Lms-cover-release Lms-cover-anchor");
anchor->setImage(std::move(cover));
}
diff --git a/src/lms/ui/explore/TrackListHelpers.cpp b/src/lms/ui/explore/TrackListHelpers.cpp
index e006d5f0..bb10437d 100644
--- a/src/lms/ui/explore/TrackListHelpers.cpp
+++ b/src/lms/ui/explore/TrackListHelpers.cpp
@@ -62,7 +62,7 @@ namespace UserInterface::TrackListHelpers
entry->bindWidget("release", LmsApplication::createReleaseAnchor(track->getRelease()));
Wt::WAnchor* anchor {entry->bindWidget("cover", LmsApplication::createReleaseAnchor(release, false))};
auto cover {Utils::createCover(release->getId(), CoverResource::Size::Small)};
- cover->addStyleClass("Lms-cover-track"); // HACK
+ cover->addStyleClass("Lms-cover-track Lms-cover-anchor"); // HACK
anchor->setImage(std::move((cover)));
}
else