+
@@ -15,6 +15,8 @@ export default {
props: {
show: {type: Boolean, required: true},
fullscreen: {type: Boolean, default: true},
+ scrolling: {type: Boolean, required: false, default: false},
+ additionalClasses: {type: Array, required: false, default: () => []}
},
data () {
return {
@@ -61,6 +63,7 @@ export default {
this.control.modal('show')
this.focusTrap.activate()
this.focusTrap.unpause()
+ document.body.classList.add('scrolling')
} else {
if (this.control) {
this.$emit('hide')
@@ -68,6 +71,7 @@ export default {
this.control.remove()
this.focusTrap.deactivate()
this.focusTrap.pause()
+ document.body.classList.remove('scrolling')
}
}
}
diff --git a/front/src/style/_main.scss b/front/src/style/_main.scss
index 678205fca..b867d2741 100644
--- a/front/src/style/_main.scss
+++ b/front/src/style/_main.scss
@@ -24,6 +24,7 @@ $bottom-player-height: 4rem;
@import "./components/_content_form.scss";
@import "./components/_copy_input.scss";
@import "./components/_empty_state.scss";
+@import "./components/_favorite.scss";
@import "./components/_form.scss";
@import "./components/_file_upload.scss";
@import "./components/_fs_browser.scss";
@@ -34,6 +35,7 @@ $bottom-player-height: 4rem;
@import "./components/_pagination.scss";
@import "./components/_placeholder.scss";
@import "./components/_play_button.scss";
+@import "./components/_play_indicator.scss";
@import "./components/_player.scss";
@import "./components/_playlist_editor.scss";
@import "./components/_queue.scss";
diff --git a/front/src/style/_vars.scss b/front/src/style/_vars.scss
index 1683ca9f3..5201985eb 100644
--- a/front/src/style/_vars.scss
+++ b/front/src/style/_vars.scss
@@ -117,3 +117,5 @@ $card-box-shadow: 0 1px 3px 0 #D4D4D5, 0 0 0 1px #D4D4D5 !default;
$dimmer-background: rgba(255, 255, 255, 0.85) !default;
$dimmer-color: var(--text-color) !default;
+
+$border-color: rgba(34, 36, 38, 0.15) !default;
diff --git a/front/src/style/components/_button.scss b/front/src/style/components/_button.scss
index eae2c1ebe..7cb685336 100644
--- a/front/src/style/components/_button.scss
+++ b/front/src/style/components/_button.scss
@@ -98,4 +98,4 @@ button.reset {
.ui.inverted.buttons .button:focus,
.ui.inverted.button:focus {
color: white;
-}
\ No newline at end of file
+}
diff --git a/front/src/style/components/_favorite.scss b/front/src/style/components/_favorite.scss
new file mode 100644
index 000000000..350634323
--- /dev/null
+++ b/front/src/style/components/_favorite.scss
@@ -0,0 +1,36 @@
+.favorite-icon.favorited {
+ animation: .5s linear burst;
+ outline-color: transparent;
+ @keyframes burst{
+ 0%,10%{
+ transform: scale(1);
+ opacity: .5;
+ color:lavender;
+ box-shadow: none;
+ }
+ 45%{
+ transform: scale(.2) rotate(30deg);
+ opacity: .75;
+ box-shadow: none;
+ }
+ 50%{
+ transform: scale(2) rotate(-37.5deg);
+ opacity: 1;
+ color: #E03997;
+ text-shadow: 2px 2px 6px rgba(235, 9, 9, 0.5);
+ box-shadow: none;
+ }
+ 90%,95%{
+ transform: scale(1) rotate(10deg);
+ text-shadow: none;
+ }
+ 100% {
+ transform: rotate(-2.5deg);
+ }
+
+ }
+}
+
+.ui.basic.button.really.favorite-icon {
+ box-shadow: none;
+}
diff --git a/front/src/style/components/_play_indicator.scss b/front/src/style/components/_play_indicator.scss
new file mode 100644
index 000000000..d56df945d
--- /dev/null
+++ b/front/src/style/components/_play_indicator.scss
@@ -0,0 +1,29 @@
+#audio-bars {
+ height: 1em;
+ position: relative;
+}
+
+.audio-bar {
+ background: var(--main-color);
+ bottom: 0;
+ height: .1em;
+ position: absolute;
+ width: 3px;
+ animation: sound 1s cubic-bezier(.17,.37,.43,.67) infinite alternate;
+}
+
+@keyframes sound {
+ 0% {
+ opacity: .35;
+ height: .1em;
+ }
+ 100% {
+ opacity: 1;
+ height: 1em;
+ }
+}
+
+.audio-bar:nth-child(1) { left: 0em; animation-duration: 0.4s; }
+.audio-bar:nth-child(2) { left: .25em; animation-duration: 0.2s; }
+.audio-bar:nth-child(3) { left: .50em; animation-duration: 1.0s; }
+.audio-bar:nth-child(4) { left: .75em; animation-duration: 0.3s; }
diff --git a/front/src/style/components/_track_table.scss b/front/src/style/components/_track_table.scss
index 56d518650..327cb5f91 100644
--- a/front/src/style/components/_track_table.scss
+++ b/front/src/style/components/_track_table.scss
@@ -1,19 +1,251 @@
-.component-track-table {
- pre {
- overflow-x: scroll;
+.track-table {
+ > div {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ height: 3.5rem;
}
- &.table-wrapper {
- overflow: visible;
+ .content {
+ flex-grow: 1;
}
- tr:not(:hover) {
- .favorite-icon:not(.favorited),
- .playlist-icon {
- visibility: hidden;
- }
- }
-
- .track {
- display: block;
- line-height: 2;
+ .row:not(.mobile) {
+ border-bottom: 1px solid var(--border-color);
}
}
+
+.track-row.row {
+ align-content: center;
+}
+
+.track-row,
+.track-table.row {
+ .ui.really.tiny.button.play-button {
+ visibility: hidden;
+ }
+ .ui.icon.really.tiny.button.play-button.paused {
+ color: var(--main-color);
+ visibility: visible;
+ display: contents;
+ left: auto;
+ right: auto;
+ }
+ .ui.floating.dropdown {
+ visibility: hidden;
+ }
+ .ui.favorite-icon {
+ visibility: hidden;
+ }
+ .ui.favorite-icon.pink {
+ visibility: visible;
+ }
+ .actions {
+ display: block;
+ max-width: 2rem;
+ width: 100%;
+ }
+ .actions.left.floated.column {
+ width: 3% !important;
+ }
+ .meta.right.floated.column:not(.mobile) {
+ width: 45px;
+ }
+ .content,
+ .meta,
+ .image {
+ user-select: none;
+ }
+ .helper {
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle;
+ }
+ .ui.artist-track.mini.image {
+ top: auto;
+ bottom: 0;
+ position: absolute;
+ margin: auto;
+ }
+
+ .image.left.floated.column {
+ width: 51px;
+ }
+}
+
+.track-row {
+ &.active {
+ background: rgba(155, 155, 155, 0.2);
+ }
+ &:hover:not(.mobile) {
+ background: rgba(155, 155, 155, 0.1);
+ }
+}
+
+.track-table.mobile,
+.track-row.mobile {
+ height: 75px;
+ align-items: center;
+ display: flex;
+
+ > div {
+ margin-right: 0.25em;
+ }
+
+ .modal-button,
+ .meta {
+ display: flex !important;
+ justify-content: center;
+ flex-direction: column;
+ text-align: right;
+ margin: 10% 0;
+ width: 10vw !important;
+ }
+ .meta.with-art {
+ align-items: right;
+ }
+ .modal-button.with-art {
+ align-items: center;
+ }
+ .actions div {
+ height: 75px;
+ line-height: 75px;
+ width: 10vw;
+ }
+ .ui.favorite-icon.button {
+ pointer-events: none;
+ }
+ .ui.artist-track.mini.image {
+ width: 45px;
+ }
+ .track-title.mobile {
+ font-weight: bold;
+ margin-bottom: 0.1em;
+ }
+ .track-title.mobile.play-indicator {
+ color: var(--vibrant-color);
+ }
+ .image.left.floated.column {
+ width: 61px;
+ }
+}
+
+.track-row:hover:not(.mobile) {
+ cursor: pointer;
+
+ // explicitly style the button as if it was hovered itself
+
+ .ui.icon.really.tiny.button.play-button {
+ color: var(--main-color);
+ visibility: visible;
+ display: contents;
+ left: auto;
+ right: auto;
+ }
+ .ui.floating.dropdown {
+ visibility: visible;
+ }
+ .ui.favorite-icon {
+ visibility: visible;
+ }
+}
+
+.track-row,
+.track-table {
+ padding: 0.5em;
+ > div:not(.mobile) {
+ padding: 0.25em;
+ margin-right: 0.25em;
+ }
+ .favorite-icon.tiny.button {
+ border: none !important;
+ padding: 0 !important;
+ margin: 0 0.5em;
+ transition: all ease-in-out;
+ }
+ .mobile {
+ -webkit-tap-highlight-color: transparent;
+ }
+}
+
+.track-position {
+ cursor: pointer;
+ display: contents;
+ min-height: 1em;
+ outline: none;
+ border: none;
+ vertical-align: baseline;
+ font-family: var(--font-family);
+ margin: 0 0.25em 0 0;
+ line-height: 1em;
+ padding: 0.5rem;
+ user-select: none;
+
+ .mobile span {
+ display: inline-block;
+ vertical-align: middle;
+ line-height: normal;
+ }
+}
+
+.ui.overlay.fullscreen.modal {
+ .track-modal-title,
+ .track-modal-subtitle {
+ margin: 0.1em;
+ }
+ .track-modal-subtitle {
+ font-weight: normal;
+ }
+ .track-modal.list-icon {
+ margin-right: 1em;
+ }
+ .track-modal.list-item {
+ font-weight: bold;
+ font-size: large;
+ }
+}
+
+.scrolling.dimmable.dimmed {
+ > .dimmer {
+ overflow: auto;
+ --webkit-overflow-scrolling: touch;
+ }
+ ::-webkit-scrollbar {
+ width: 0px;
+ background: transparent;
+ }
+}
+
+.track-table.podcast.row,
+.track-row.podcast.row {
+ height: 20vh;
+ align-items: center;
+ display: flex;
+ .ui.artist-track.mini.image {
+ height: 15vh;
+ width: auto;
+ top: auto;
+ bottom: auto;
+ }
+ .image.left.floated.column {
+ width: (15vh);
+ display: flex !important;
+ justify-content: center;
+ flex-direction: column;
+ }
+ .content.left.floated.column {
+ margin-left: 26px;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+
+ .podcast-episode-title {
+ font-weight: bold;
+ font-size: medium;
+ display: block;
+ margin-block-start: 1em;
+ margin-block-end: 1em;
+ margin-inline-start: 0px;
+ margin-inline-end: 0px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/front/src/style/globals/_utils.scss b/front/src/style/globals/_utils.scss
index 7cf0e63d4..37a8bc5d0 100644
--- a/front/src/style/globals/_utils.scss
+++ b/front/src/style/globals/_utils.scss
@@ -59,7 +59,7 @@ a {
}
}
.tablet-and-below {
- @include media(">=desktop") {
+ @include media(">=tablet") {
display: none !important;
}
}
@@ -104,3 +104,10 @@ span.diff.removed {
.really.discrete {
color: var(--really-discrete-text-color);
}
+
+.ui.inverted.dimmer {
+ background-color: var(--dimmer-background);
+ > .ui.dimmer {
+ color: var(--dimmer-color);
+ }
+}
\ No newline at end of file
diff --git a/front/src/views/channels/DetailEpisodes.vue b/front/src/views/channels/DetailEpisodes.vue
index 385e58a67..09de17f90 100644
--- a/front/src/views/channels/DetailEpisodes.vue
+++ b/front/src/views/channels/DetailEpisodes.vue
@@ -1,6 +1,6 @@
diff --git a/front/src/views/channels/DetailOverview.vue b/front/src/views/channels/DetailOverview.vue
index 7c37fdbd2..54c53a9b4 100644
--- a/front/src/views/channels/DetailOverview.vue
+++ b/front/src/views/channels/DetailOverview.vue
@@ -49,7 +49,7 @@
:can-update="false">