@@ -944,7 +946,7 @@
? `
@@ -953,7 +955,7 @@
: `
-
${esc(favoriteSummary(favorite))}
+
${esc(favoriteBadge)}${esc(favoriteSummary(favorite))}
@@ -1541,6 +1543,52 @@
return mode;
}
+ function favoriteToneClass(favorite) {
+ const mode = String(favorite?.mode || "").toLowerCase();
+ if (mode === "live" || mode === "live_category") {
+ return "fav-tone-live";
+ }
+ if (mode === "vod" || mode === "vod_category") {
+ return "fav-tone-vod";
+ }
+ if (mode === "series_item" || mode === "series_episode" || mode === "series_category") {
+ return "fav-tone-series";
+ }
+ if (mode === "custom") {
+ return "fav-tone-custom";
+ }
+ return "fav-tone-other";
+ }
+
+ function favoriteBadgeLabel(favorite) {
+ const mode = String(favorite?.mode || "").toLowerCase();
+ if (mode === "live") {
+ return "LIVE";
+ }
+ if (mode === "live_category") {
+ return "LIVE CATEGORY";
+ }
+ if (mode === "vod") {
+ return "VOD";
+ }
+ if (mode === "vod_category") {
+ return "VOD CATEGORY";
+ }
+ if (mode === "series_item") {
+ return "SERIES";
+ }
+ if (mode === "series_episode") {
+ return "EPISODE";
+ }
+ if (mode === "series_category") {
+ return "SERIES CATEGORY";
+ }
+ if (mode === "custom") {
+ return "CUSTOM";
+ }
+ return "FAVORITE";
+ }
+
function makeFavoriteLive(item) {
const streamId = String(item?.stream_id || "");
return {
diff --git a/src/main/resources/web/assets/style.css b/src/main/resources/web/assets/style.css
index b78314b..7703ea7 100644
--- a/src/main/resources/web/assets/style.css
+++ b/src/main/resources/web/assets/style.css
@@ -275,6 +275,68 @@ progress::-moz-progress-bar {
line-height: 1;
}
+.favorite-item {
+ border-left-width: 4px;
+}
+
+.fav-type-badge {
+ display: inline-block;
+ margin-right: 0.45rem;
+ padding: 0.05rem 0.38rem;
+ border-radius: 999px;
+ font-size: 0.67rem;
+ letter-spacing: 0.05rem;
+ font-weight: 700;
+ color: var(--text);
+ border: 1px solid transparent;
+ background: rgba(255, 255, 255, 0.08);
+}
+
+.favorite-item.fav-tone-live {
+ border-left-color: #56d6c8;
+}
+
+.favorite-item.fav-tone-live .fav-type-badge {
+ background: rgba(86, 214, 200, 0.18);
+ border-color: rgba(86, 214, 200, 0.45);
+}
+
+.favorite-item.fav-tone-vod {
+ border-left-color: #f2b95c;
+}
+
+.favorite-item.fav-tone-vod .fav-type-badge {
+ background: rgba(242, 185, 92, 0.2);
+ border-color: rgba(242, 185, 92, 0.45);
+}
+
+.favorite-item.fav-tone-series {
+ border-left-color: #9cb7ff;
+}
+
+.favorite-item.fav-tone-series .fav-type-badge {
+ background: rgba(156, 183, 255, 0.2);
+ border-color: rgba(156, 183, 255, 0.45);
+}
+
+.favorite-item.fav-tone-custom {
+ border-left-color: #f08fd1;
+}
+
+.favorite-item.fav-tone-custom .fav-type-badge {
+ background: rgba(240, 143, 209, 0.2);
+ border-color: rgba(240, 143, 209, 0.45);
+}
+
+.favorite-item.fav-tone-other {
+ border-left-color: #8da2b3;
+}
+
+.favorite-item.fav-tone-other .fav-type-badge {
+ background: rgba(141, 162, 179, 0.2);
+ border-color: rgba(141, 162, 179, 0.45);
+}
+
.player-panel {
position: sticky;
top: 0.6rem;