diff --git a/aircox/models/episode.py b/aircox/models/episode.py
index 3df684d..a329bfc 100644
--- a/aircox/models/episode.py
+++ b/aircox/models/episode.py
@@ -10,8 +10,13 @@ from .program import ProgramChildQuerySet
__all__ = ("Episode",)
+class EpisodeQuerySet(ProgramChildQuerySet):
+ def with_podcasts(self):
+ return self.filter(sound__is_public=True).distinct()
+
+
class Episode(Page):
- objects = ProgramChildQuerySet.as_manager()
+ objects = EpisodeQuerySet.as_manager()
detail_url_name = "episode-detail"
template_prefix = "episode"
@@ -26,6 +31,7 @@ class Episode(Page):
@cached_property
def podcasts(self):
"""Return serialized data about podcasts."""
+ from .sound import Sound
from ..serializers import PodcastSerializer
podcasts = [PodcastSerializer(s).data for s in self.sound_set.public().order_by("type")]
@@ -35,7 +41,14 @@ class Episode(Page):
else:
cover = None
+ archive_index = 1
for index, podcast in enumerate(podcasts):
+ if podcast["type"] == Sound.TYPE_ARCHIVE:
+ if archive_index > 1:
+ podcast["name"] = f"{self.title} - {archive_index}"
+ else:
+ podcast["name"] = self.title
+
podcasts[index]["cover"] = cover
podcasts[index]["page_url"] = self.get_absolute_url()
podcasts[index]["page_title"] = self.title
diff --git a/aircox/static/aircox/css/chunk-common.css b/aircox/static/aircox/css/chunk-common.css
index 5583f3e..fa18775 100644
--- a/aircox/static/aircox/css/chunk-common.css
+++ b/aircox/static/aircox/css/chunk-common.css
@@ -84,7 +84,7 @@ fieldset[disabled] .pagination-ellipsis {
}
.title:not(:last-child),
-.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .progress:not(:last-child), .content:not(:last-child), .box:not(:last-child), .pagination:not(:last-child), .message:not(:last-child), .breadcrumb:not(:last-child) {
+.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .content:not(:last-child), .box:not(:last-child), .pagination:not(:last-child), .message:not(:last-child), .breadcrumb:not(:last-child) {
margin-bottom: 1.5rem;
}
@@ -8819,188 +8819,6 @@ div.icon-text {
display: flex;
}
-.progress {
- -moz-appearance: none;
- -webkit-appearance: none;
- border: none;
- border-radius: 9999px;
- display: block;
- height: 1rem;
- overflow: hidden;
- padding: 0;
- width: 100%;
-}
-.progress::-webkit-progress-bar {
- background-color: hsl(0deg, 0%, 93%);
-}
-.progress::-webkit-progress-value {
- background-color: hsl(0deg, 0%, 29%);
-}
-.progress::-moz-progress-bar {
- background-color: hsl(0deg, 0%, 29%);
-}
-.progress::-ms-fill {
- background-color: hsl(0deg, 0%, 29%);
- border: none;
-}
-.progress.is-white::-webkit-progress-value {
- background-color: #fff;
-}
-.progress.is-white::-moz-progress-bar {
- background-color: #fff;
-}
-.progress.is-white::-ms-fill {
- background-color: #fff;
-}
-.progress.is-white:indeterminate {
- background-image: linear-gradient(to right, #fff 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-black::-webkit-progress-value {
- background-color: #000;
-}
-.progress.is-black::-moz-progress-bar {
- background-color: #000;
-}
-.progress.is-black::-ms-fill {
- background-color: #000;
-}
-.progress.is-black:indeterminate {
- background-image: linear-gradient(to right, #000 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-light::-webkit-progress-value {
- background-color: hsl(0deg, 0%, 96%);
-}
-.progress.is-light::-moz-progress-bar {
- background-color: hsl(0deg, 0%, 96%);
-}
-.progress.is-light::-ms-fill {
- background-color: hsl(0deg, 0%, 96%);
-}
-.progress.is-light:indeterminate {
- background-image: linear-gradient(to right, hsl(0deg, 0%, 96%) 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-dark::-webkit-progress-value {
- background-color: hsl(0deg, 0%, 21%);
-}
-.progress.is-dark::-moz-progress-bar {
- background-color: hsl(0deg, 0%, 21%);
-}
-.progress.is-dark::-ms-fill {
- background-color: hsl(0deg, 0%, 21%);
-}
-.progress.is-dark:indeterminate {
- background-image: linear-gradient(to right, hsl(0deg, 0%, 21%) 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-primary::-webkit-progress-value {
- background-color: hsl(171deg, 100%, 41%);
-}
-.progress.is-primary::-moz-progress-bar {
- background-color: hsl(171deg, 100%, 41%);
-}
-.progress.is-primary::-ms-fill {
- background-color: hsl(171deg, 100%, 41%);
-}
-.progress.is-primary:indeterminate {
- background-image: linear-gradient(to right, hsl(171deg, 100%, 41%) 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-link::-webkit-progress-value {
- background-color: hsl(229deg, 53%, 53%);
-}
-.progress.is-link::-moz-progress-bar {
- background-color: hsl(229deg, 53%, 53%);
-}
-.progress.is-link::-ms-fill {
- background-color: hsl(229deg, 53%, 53%);
-}
-.progress.is-link:indeterminate {
- background-image: linear-gradient(to right, hsl(229deg, 53%, 53%) 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-info::-webkit-progress-value {
- background-color: hsl(207deg, 61%, 53%);
-}
-.progress.is-info::-moz-progress-bar {
- background-color: hsl(207deg, 61%, 53%);
-}
-.progress.is-info::-ms-fill {
- background-color: hsl(207deg, 61%, 53%);
-}
-.progress.is-info:indeterminate {
- background-image: linear-gradient(to right, hsl(207deg, 61%, 53%) 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-success::-webkit-progress-value {
- background-color: hsl(153deg, 53%, 53%);
-}
-.progress.is-success::-moz-progress-bar {
- background-color: hsl(153deg, 53%, 53%);
-}
-.progress.is-success::-ms-fill {
- background-color: hsl(153deg, 53%, 53%);
-}
-.progress.is-success:indeterminate {
- background-image: linear-gradient(to right, hsl(153deg, 53%, 53%) 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-warning::-webkit-progress-value {
- background-color: hsl(44deg, 100%, 77%);
-}
-.progress.is-warning::-moz-progress-bar {
- background-color: hsl(44deg, 100%, 77%);
-}
-.progress.is-warning::-ms-fill {
- background-color: hsl(44deg, 100%, 77%);
-}
-.progress.is-warning:indeterminate {
- background-image: linear-gradient(to right, hsl(44deg, 100%, 77%) 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress.is-danger::-webkit-progress-value {
- background-color: hsl(348deg, 86%, 61%);
-}
-.progress.is-danger::-moz-progress-bar {
- background-color: hsl(348deg, 86%, 61%);
-}
-.progress.is-danger::-ms-fill {
- background-color: hsl(348deg, 86%, 61%);
-}
-.progress.is-danger:indeterminate {
- background-image: linear-gradient(to right, hsl(348deg, 86%, 61%) 30%, hsl(0deg, 0%, 93%) 30%);
-}
-.progress:indeterminate {
- animation-duration: 1.5s;
- animation-iteration-count: infinite;
- animation-name: moveIndeterminate;
- animation-timing-function: linear;
- background-color: hsl(0deg, 0%, 93%);
- background-image: linear-gradient(to right, hsl(0deg, 0%, 29%) 30%, hsl(0deg, 0%, 93%) 30%);
- background-position: top left;
- background-repeat: no-repeat;
- background-size: 150% 150%;
-}
-.progress:indeterminate::-webkit-progress-bar {
- background-color: transparent;
-}
-.progress:indeterminate::-moz-progress-bar {
- background-color: transparent;
-}
-.progress:indeterminate::-ms-fill {
- animation-name: none;
-}
-.progress.is-small {
- height: 0.75rem;
-}
-.progress.is-medium {
- height: 1.25rem;
-}
-.progress.is-large {
- height: 1.5rem;
-}
-
-@keyframes moveIndeterminate {
- from {
- background-position: 200% 0;
- }
- to {
- background-position: -200% 0;
- }
-}
.table {
background-color: #fff;
color: hsl(0deg, 0%, 21%);
@@ -9567,76 +9385,27 @@ a.navbar-item.is-active {
font-weight: 100;
}
-.player {
- z-index: 10000;
- box-shadow: 0em 1.5em 2.5em rgba(0, 0, 0, 0.6);
-}
-.player .player-panels {
- height: 0%;
- transition: height 3s;
-}
-.player .player-panels.is-open {
- height: auto;
-}
-.player .player-panel {
- margin: 0.4em;
- max-height: 80%;
- overflow-y: auto;
-}
-.player .progress {
- margin: 0em;
- padding: 0em;
- border-color: hsl(207deg, 61%, 53%);
- border-style: "solid";
-}
-.player .player-bar {
- border-top: 1px hsl(0deg, 0%, 71%) solid;
-}
-.player .player-bar > div {
- height: 3.75em !important;
-}
-.player .player-bar > .media-left:not(:last-child) {
- margin-right: 0em;
-}
-.player .player-bar > .media-cover {
- border-left: 1px black solid;
-}
-.player .player-bar .cover {
- font-size: 1.5rem !important;
- height: 2.5em !important;
-}
-.player .player-bar > .media-content {
- padding-top: 0.4em;
- padding-left: 0.4em;
-}
-.player .player-bar .button {
- font-size: 1.5rem !important;
- height: 100%;
- padding: auto 0.2em !important;
- min-width: 2.5em;
- border-radius: 0px;
- transition: background-color 1s;
-}
-.player .player-bar .title {
- margin: 0em;
-}
-
:root {
--text-color: black;
--highlight-color: rgba(255, 255, 0, 1);
- --highlight-color-alpha: rgba(255, 255, 0, 0.6);
+ --highlight-color-alpha: rgba(255, 255, 0, 0.7);
--highlight-color-2: rgb(0, 0, 254);
- --highlight-color-2-alpha: rgb(0, 0, 254, 0.6);
+ --highlight-color-2-alpha: rgb(0, 0, 254, 0.7);
--header-height: 30em;
--heading-height: 30em;
--heading-title-bg-color: rgba(255, 255, 0, 1);
--heading-bg-color: var(--highlight-color);
--heading-bg-highlight-color: var(--highlight-color-2);
+ --heading-font-family: default;
--preview-media-height: 10em;
--preview-media-cover-size: 10em;
--preview-cover-size: 24em;
--preview-cover-small-size: 10em;
- --heading-font-family: default;
+ --player-panel-bg: var(--highlight-color-alpha);
+ --player-bar-bg: var(--highlight-color);
+ --progress-border: 1px var(--highlight-color-2) solid;
+ --progress-bg-color: transparent;
+ --progress-bar-color: var(--highlight-color-2);
}
body {
@@ -9649,35 +9418,6 @@ section > .toolbar {
margin-bottom: 1.5em;
}
-aside > section {
- margin-bottom: 2em;
-}
-aside .cover.is-small {
- width: 10em;
-}
-aside .cover.is-tiny {
- height: 2em;
-}
-aside .media .subtitle {
- font-size: 1em;
-}
-
-.sound-item {
- margin-bottom: 0.2em;
-}
-.sound-item .cover {
- height: 5em;
-}
-.sound-item .media-content a {
- padding: 0em;
-}
-
-.sound-item .media-right .button {
- margin-right: 0.2em;
- min-width: 2.5em;
- display: inline-block;
-}
-
h1, h2, h3, h4, h5, h6, .heading, .title, .subtitle {
font-family: var(--heading-font-family);
}
@@ -9689,6 +9429,7 @@ h1, h2, h3, h4, h5, h6, .heading, .title, .subtitle {
background-color: var(--highlight-color-alpha);
color: var(--highlight-color-2);
text-decoration: none;
+ padding: 0.4em;
}
.page .content {
font-size: 2em;
@@ -9700,10 +9441,10 @@ h1, h2, h3, h4, h5, h6, .heading, .title, .subtitle {
margin-top: unset;
padding-top: unset !important;
margin-bottom: 1.2em;
+ border-bottom: 1px solid black;
}
.page section.container:not(:first-child) {
margin-top: 2em;
- border-top: 1px solid black;
}
.d-inline {
@@ -9755,6 +9496,10 @@ h1, h2, h3, h4, h5, h6, .heading, .title, .subtitle {
flex-grow: 0 !important;
}
+.no-border {
+ border: 0px !important;
+}
+
.is-clickable {
cursor: pointer;
}
@@ -9765,24 +9510,49 @@ h1, h2, h3, h4, h5, h6, .heading, .title, .subtitle {
border-radius: 0.2em;
}
-.button.action {
+.button {
+ border-radius: 0px;
+ border-color: var(--highlight-color-2-alpha);
+}
+.button:hover {
+ border-color: var(--highlight-color-2) !important;
+ color: var(--highlight-color-2) !important;
+ opacity: 1 !important;
+}
+.actions .button, .button.action {
background-color: var(--highlight-color);
justify-content: center;
padding: 0.4em !important;
min-width: 2em;
}
-.button.action .icon {
+.actions .button .icon, .button.action .icon {
margin: 0em !important;
}
-.button.action label {
+.actions .button .not-selected, .button.action .not-selected {
+ opacity: 0.6;
+}
+.actions .button label, .button.action label {
margin-left: 0.4em;
}
+.actions .button:hover, .actions .button .selected, .button.action:hover, .button.action .selected {
+ color: var(--highlight-color-2) !important;
+}
.button .dropdown-trigger {
border-radius: 1.5em;
}
-.list-filters {
- text-align: right;
+.button-group .button {
+ background-color: transparent;
+ border-top: 0px;
+ border-bottom: 0px;
+ height: 100%;
+}
+.button-group .button:last-child {
+ border-right: 0px;
+}
+
+.actions.no-label label {
+ display: none;
}
.title {
@@ -9809,10 +9579,6 @@ h1, h2, h3, h4, h5, h6, .heading, .title, .subtitle {
background-color: var(--heading-title-bg-color);
}
-.actions.no-label label {
- display: none;
-}
-
.dropdown-item {
font-size: unset !important;
}
@@ -9875,7 +9641,7 @@ nav li a, nav li .button {
.preview {
position: relative;
background-size: cover;
- margin-bottom: 1.2em !important;
+ margin-bottom: 2em !important;
}
.preview.preview-card:not(.wide) {
max-width: 30em;
@@ -10069,3 +9835,137 @@ preview-header:not(.no-cover) .preview-card-headings .heading {
display: none;
}
}
+.a-progress {
+ display: flex;
+ flex-direction: row;
+ margin: 0em;
+ padding: 0em;
+ background-color: var(--progress-bg-color);
+}
+.a-progress .a-progress-bar-container {
+ flex-grow: 1;
+ margin: 0em 0.8em;
+ border: var(--progress-border);
+}
+.a-progress .a-progress-bar {
+ background-color: var(--progress-bar-color);
+}
+
+.playlist .header, .a-playlist .header {
+ display: flex;
+ flex-direction: row;
+}
+.playlist .title, .a-playlist .title {
+ font-size: 1em;
+ margin: 0;
+ padding: 0.8em;
+}
+.playlist li, .a-playlist li {
+ list-style: none;
+ border-bottom: 1px var(--highlight-color-2) solid;
+}
+.playlist li:last-child, .a-playlist li:last-child {
+ border-bottom: 0px;
+}
+
+.a-sound-item {
+ display: flex;
+ align-items: center;
+ flex-direction: row;
+ height: 3em;
+ background-color: var(--highlight-color-alpha);
+}
+.a-sound-item.playing, .a-sound-item.playing .title {
+ color: var(--highlight-color-2) !important;
+}
+.a-sound-item:hover {
+ background-color: var(--highlight-color);
+}
+.a-sound-item:hover .title {
+ color: var(--highlight-color-2) !important;
+}
+.a-sound-item .title {
+ margin: 0em;
+ padding: 0em;
+ font-size: 1.4em;
+}
+.a-sound-item .title .icon {
+ padding: 0em 0.8em;
+}
+.a-sound-item .button {
+ width: 3em;
+}
+
+.a-player {
+ z-index: 10000;
+ box-shadow: 0em 1.5em 2.5em rgba(0, 0, 0, 0.6);
+}
+.a-player a {
+ color: var(--highlight-color-2);
+}
+
+.a-player-panels {
+ background: var(--player-panel-bg);
+ height: 0%;
+ transition: height 1s;
+}
+
+.a-player-panels.is-open {
+ height: auto;
+}
+
+.a-player-panel {
+ padding-bottom: 0.8em;
+ max-height: 80%;
+ overflow-y: auto;
+}
+.a-player-panel .a-sound-item:not(:hover) {
+ background-color: transparent;
+}
+
+.a-player-bar {
+ display: flex;
+ background: var(--player-bar-bg);
+ flex-direction: row;
+ justify-content: center;
+ border-top: 1px hsl(0deg, 0%, 71%) solid;
+ height: 3.75em !important;
+}
+.a-player-bar > * {
+ height: 100%;
+}
+.a-player-bar .cover {
+ height: 100%;
+}
+.a-player-bar .title {
+ font-size: 1em;
+ margin: 0em;
+}
+.a-player-bar .title:last-child {
+ font-size: 1.6em;
+}
+.a-player-bar .button {
+ font-size: 1.6em;
+ height: 100%;
+ padding: auto 0.2em !important;
+ min-width: 2.5em;
+ border-radius: 0px;
+ transition: background-color 0.5s;
+}
+.a-player-bar .button:hover {
+ color: var(--highlight-color-2) !important;
+}
+.a-player-bar .button.active {
+ color: var(--highlight-color-2);
+}
+.a-player-bar .button.open {
+ background-color: var(--highlight-color-2);
+ color: var(--highlight-color);
+}
+
+.a-player-bar-content {
+ flex-grow: 1;
+ padding-top: 0.8em;
+ padding-left: 0.8em;
+ padding-right: 0.8em;
+}
diff --git a/aircox/static/aircox/js/chunk-common.js b/aircox/static/aircox/js/chunk-common.js
index e47635f..81227a4 100644
--- a/aircox/static/aircox/js/chunk-common.js
+++ b/aircox/static/aircox/js/chunk-common.js
@@ -75,7 +75,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */
\*****************************************************************************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ State: function() { return /* binding */ State; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n/* harmony import */ var _live__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../live */ \"./src/live.js\");\n/* harmony import */ var _sound__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../sound */ \"./src/sound.js\");\n/* harmony import */ var _model__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../model */ \"./src/model.js\");\n/* harmony import */ var _APlaylist__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./APlaylist */ \"./src/components/APlaylist.vue\");\n/* harmony import */ var _AProgress__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./AProgress */ \"./src/components/AProgress.vue\");\n\n\n\n\n\n\n\nconst State = {\n paused: 0,\n playing: 1,\n loading: 2\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n components: {\n APlaylist: _APlaylist__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n AProgress: _AProgress__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n },\n data() {\n let audio = new Audio();\n audio.addEventListener('ended', e => this.onState(e));\n audio.addEventListener('pause', e => this.onState(e));\n audio.addEventListener('playing', e => this.onState(e));\n audio.addEventListener('timeupdate', () => {\n this.currentTime = this.audio.currentTime;\n });\n audio.addEventListener('durationchange', () => {\n this.duration = Number.isFinite(this.audio.duration) ? this.audio.duration : null;\n });\n let live = this.liveArgs ? (0,vue__WEBPACK_IMPORTED_MODULE_1__.reactive)(new _live__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.liveArgs)) : null;\n live && live.refresh();\n return {\n audio,\n duration: 0,\n currentTime: 0,\n state: State.paused,\n live,\n /// Loaded item\n loaded: null,\n //! Active panel name\n panel: null,\n //! current playing playlist name\n playlistName: null,\n //! players' playlists' sets\n sets: {\n queue: _model__WEBPACK_IMPORTED_MODULE_4__.Set.storeLoad(_sound__WEBPACK_IMPORTED_MODULE_3__[\"default\"], \"playlist.queue\", {\n max: 30,\n unique: true\n }),\n pin: _model__WEBPACK_IMPORTED_MODULE_4__.Set.storeLoad(_sound__WEBPACK_IMPORTED_MODULE_3__[\"default\"], \"player.pin\", {\n max: 30,\n unique: true\n })\n }\n };\n },\n props: {\n buttonTitle: String,\n liveArgs: Object\n },\n computed: {\n self() {\n return this;\n },\n paused() {\n return this.state == State.paused;\n },\n playing() {\n return this.state == State.playing;\n },\n loading() {\n return this.state == State.loading;\n },\n playlist() {\n return this.playlistName ? this.$refs[this.playlistName] : null;\n },\n current() {\n return this.loaded ? this.loaded : this.live && this.live.current;\n }\n },\n methods: {\n displayTime(seconds) {\n seconds = parseInt(seconds);\n let s = seconds % 60;\n seconds = (seconds - s) / 60;\n let m = seconds % 60;\n let h = (seconds - m) / 60;\n let [ss, mm, hh] = [s.toString().padStart(2, '0'), m.toString().padStart(2, '0'), h.toString().padStart(2, '0')];\n return h ? `${hh}:${mm}:${ss}` : `${mm}:${ss}`;\n },\n playlistButtonClass(name) {\n let set = this.sets[name];\n return (set ? (set.length ? \"\" : \"has-text-grey-light \") + (this.panel == name ? \"is-info \" : this.playlistName == name ? 'is-primary ' : '') : '') + \"button has-text-weight-bold\";\n },\n /// Show/hide panel\n togglePanel(panel) {\n this.panel = this.panel == panel ? null : panel;\n },\n /// Return True if item is loaded\n isLoaded(item) {\n return this.loaded && this.loaded.id == item.id;\n },\n /// Return True if item is loaded\n isPlaying(item) {\n return this.isLoaded(item) && !this.paused;\n },\n _setPlaylist(playlist) {\n this.playlistName = playlist;\n for (var p in this.sets) if (p != playlist) this.$refs[p].unselect();\n },\n /// Load a sound from playlist or live\n load(playlist = null, index = 0) {\n let src = null;\n\n // from playlist\n if (playlist !== null && index != -1) {\n let item = this.$refs[playlist].get(index);\n if (!item) throw `No sound at index ${index} for playlist ${playlist}`;\n this.loaded = item;\n src = item.src;\n }\n // from live\n else {\n this.loaded = null;\n src = this.live.src;\n }\n this._setPlaylist(playlist);\n\n // load sources\n const audio = this.audio;\n if (src instanceof Array) {\n audio.innerHTML = '';\n audio.removeAttribute('src');\n for (var s of src) {\n let source = document.createElement('source');\n source.setAttribute('src', s);\n audio.appendChild(source);\n }\n } else {\n audio.src = src;\n }\n audio.load();\n },\n play(playlist = null, index = 0) {\n this.load(playlist, index);\n this.audio.play().catch(e => console.error(e));\n },\n /// Push items to playlist (by name)\n push(playlist, ...items) {\n return this.sets[playlist].push(...items);\n },\n /// Push and play items\n playItems(playlist, ...items) {\n let index = this.push(playlist, ...items);\n this.$refs[playlist].selectedIndex = index;\n this.play(playlist, index);\n },\n /// Handle click event that plays multiple items (from `data-sounds` attribute)\n playButtonClick(event) {\n var items = JSON.parse(event.currentTarget.dataset.sounds);\n this.playItems('queue', ...items);\n },\n /// Pause\n pause() {\n this.audio.pause();\n },\n //! Play/pause\n togglePlay(playlist = null, index = 0) {\n if (playlist !== null) {\n let item = this.sets[playlist].get(index);\n if (!this.playlist || this.playlistName !== playlist || this.loaded != item) {\n this.play(playlist, index);\n return;\n }\n }\n if (this.paused) this.audio.play().catch(e => console.error(e));else this.audio.pause();\n },\n //! Pin/Unpin an item\n togglePin(item) {\n let index = this.sets.pin.findIndex(item);\n if (index > -1) this.sets.pin.remove(index);else {\n this.sets.pin.push(item);\n this.$refs.pinPlaylistButton.focus();\n }\n },\n /// Audio player state change event\n onState(event) {\n const audio = this.audio;\n this.state = audio.paused ? State.paused : State.playing;\n if (event.type == 'ended' && (!this.playlist || this.playlist.selectNext() == -1)) this.play();\n }\n },\n mounted() {\n this.load();\n }\n});\n\n//# sourceURL=webpack://aircox-assets/./src/components/APlayer.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ State: function() { return /* binding */ State; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n/* harmony import */ var _live__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../live */ \"./src/live.js\");\n/* harmony import */ var _sound__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../sound */ \"./src/sound.js\");\n/* harmony import */ var _model__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../model */ \"./src/model.js\");\n/* harmony import */ var _APlaylist__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./APlaylist */ \"./src/components/APlaylist.vue\");\n/* harmony import */ var _AProgress__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./AProgress */ \"./src/components/AProgress.vue\");\n\n\n\n\n\n\n\nconst State = {\n paused: 0,\n playing: 1,\n loading: 2\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n components: {\n APlaylist: _APlaylist__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n AProgress: _AProgress__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n },\n data() {\n let audio = new Audio();\n audio.addEventListener('ended', e => this.onState(e));\n audio.addEventListener('pause', e => this.onState(e));\n audio.addEventListener('playing', e => this.onState(e));\n audio.addEventListener('timeupdate', () => {\n this.currentTime = this.audio.currentTime;\n });\n audio.addEventListener('durationchange', () => {\n this.duration = Number.isFinite(this.audio.duration) ? this.audio.duration : null;\n });\n let live = this.liveArgs ? (0,vue__WEBPACK_IMPORTED_MODULE_1__.reactive)(new _live__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.liveArgs)) : null;\n live && live.refresh();\n return {\n audio,\n duration: 0,\n currentTime: 0,\n state: State.paused,\n live,\n /// Loaded item\n loaded: null,\n //! Active panel name\n panel: null,\n //! current playing playlist name\n playlistName: null,\n //! players' playlists' sets\n sets: {\n queue: _model__WEBPACK_IMPORTED_MODULE_4__.Set.storeLoad(_sound__WEBPACK_IMPORTED_MODULE_3__[\"default\"], \"playlist.queue\", {\n max: 30,\n unique: true\n }),\n pin: _model__WEBPACK_IMPORTED_MODULE_4__.Set.storeLoad(_sound__WEBPACK_IMPORTED_MODULE_3__[\"default\"], \"player.pin\", {\n max: 30,\n unique: true\n })\n }\n };\n },\n props: {\n buttonTitle: String,\n liveArgs: Object\n },\n computed: {\n self() {\n return this;\n },\n paused() {\n return this.state == State.paused;\n },\n playing() {\n return this.state == State.playing;\n },\n loading() {\n return this.state == State.loading;\n },\n playlist() {\n return this.playlistName ? this.$refs[this.playlistName] : null;\n },\n current() {\n return this.loaded ? this.loaded : this.live && this.live.current;\n }\n },\n methods: {\n displayTime(seconds) {\n seconds = parseInt(seconds);\n let s = seconds % 60;\n seconds = (seconds - s) / 60;\n let m = seconds % 60;\n let h = (seconds - m) / 60;\n let [ss, mm, hh] = [s.toString().padStart(2, '0'), m.toString().padStart(2, '0'), h.toString().padStart(2, '0')];\n return h ? `${hh}:${mm}:${ss}` : `${mm}:${ss}`;\n },\n playlistButtonClass(name) {\n let set = this.sets[name];\n return (set ? (set.length ? \"\" : \"has-text-grey-light \") + (this.panel == name ? \"open\" : this.playlistName == name ? 'active' : '') : '') + \" button\";\n },\n /// Show/hide panel\n togglePanel(panel) {\n this.panel = this.panel == panel ? null : panel;\n },\n /// Return True if item is loaded\n isLoaded(item) {\n return this.loaded && this.loaded.id == item.id;\n },\n /// Return True if item is loaded\n isPlaying(item) {\n return this.isLoaded(item) && !this.paused;\n },\n _setPlaylist(playlist) {\n this.playlistName = playlist;\n for (var p in this.sets) if (p != playlist) this.$refs[p].unselect();\n },\n /// Load a sound from playlist or live\n load(playlist = null, index = 0) {\n let src = null;\n\n // from playlist\n if (playlist !== null && index != -1) {\n let item = this.$refs[playlist].get(index);\n if (!item) throw `No sound at index ${index} for playlist ${playlist}`;\n this.loaded = item;\n src = item.src;\n }\n // from live\n else {\n this.loaded = null;\n src = this.live.src;\n }\n this._setPlaylist(playlist);\n\n // load sources\n const audio = this.audio;\n if (src instanceof Array) {\n audio.innerHTML = '';\n audio.removeAttribute('src');\n for (var s of src) {\n let source = document.createElement('source');\n source.setAttribute('src', s);\n audio.appendChild(source);\n }\n } else {\n audio.src = src;\n }\n audio.load();\n },\n play(playlist = null, index = 0) {\n this.load(playlist, index);\n this.audio.play().catch(e => console.error(e));\n },\n /// Push items to playlist (by name)\n push(playlist, ...items) {\n return this.sets[playlist].push(...items);\n },\n /// Push and play items\n playItems(playlist, ...items) {\n let index = this.push(playlist, ...items);\n this.$refs[playlist].selectedIndex = index;\n this.play(playlist, index);\n },\n /// Handle click event that plays multiple items (from `data-sounds` attribute)\n playButtonClick(event) {\n var items = JSON.parse(event.currentTarget.dataset.sounds);\n this.playItems('queue', ...items);\n },\n /// Pause\n pause() {\n this.audio.pause();\n },\n //! Play/pause\n togglePlay(playlist = null, index = 0) {\n if (playlist !== null) {\n let item = this.sets[playlist].get(index);\n if (!this.playlist || this.playlistName !== playlist || this.loaded != item) {\n this.play(playlist, index);\n return;\n }\n }\n if (this.paused) this.audio.play().catch(e => console.error(e));else this.audio.pause();\n },\n //! Pin/Unpin an item\n togglePin(item) {\n let index = this.sets.pin.findIndex(item);\n if (index > -1) this.sets.pin.remove(index);else {\n this.sets.pin.push(item);\n this.$refs.pinPlaylistButton.focus();\n }\n },\n /// Audio player state change event\n onState(event) {\n const audio = this.audio;\n this.state = audio.paused ? State.paused : State.playing;\n if (event.type == 'ended' && (!this.playlist || this.playlist.selectNext() == -1)) this.play();\n }\n },\n mounted() {\n this.load();\n }\n});\n\n//# sourceURL=webpack://aircox-assets/./src/components/APlayer.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
/***/ }),
@@ -105,7 +105,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
\*******************************************************************************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n data() {\n return {\n hoverValue: null\n };\n },\n props: {\n value: Number,\n max: Number,\n format: {\n type: Function,\n default: x => x\n },\n progressClass: {\n default: 'has-background-primary'\n },\n vertical: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n valueDisplay() {\n return this.hoverValue === null ? this.value : this.hoverValue;\n },\n progressStyle() {\n if (!this.max) return null;\n let value = this.max ? this.valueDisplay * 100 / this.max : 0;\n return this.vertical ? {\n height: `${value}%`\n } : {\n width: `${value}%`\n };\n }\n },\n methods: {\n xToValue(x) {\n return x * this.max / this.$refs.bar.getBoundingClientRect().width;\n },\n yToValue(y) {\n return y * this.max / this.$refs.bar.getBoundingClientRect().height;\n },\n valueFromEvent(event) {\n let rect = event.currentTarget.getBoundingClientRect();\n return this.vertical ? this.yToValue(event.clientY - rect.y) : this.xToValue(event.clientX - rect.x);\n },\n onClick(event) {\n this.$emit('select', this.valueFromEvent(event));\n },\n onMouseMove(event) {\n if (event.type == 'mouseleave') this.hoverValue = null;else {\n this.hoverValue = this.valueFromEvent(event);\n }\n }\n }\n});\n\n//# sourceURL=webpack://aircox-assets/./src/components/AProgress.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n data() {\n return {\n hoverValue: null\n };\n },\n props: {\n value: Number,\n max: Number,\n format: {\n type: Function,\n default: x => x\n },\n progressClass: {\n default: 'a-progress-bar'\n },\n vertical: {\n type: Boolean,\n default: false\n }\n },\n computed: {\n valueDisplay() {\n return this.hoverValue === null ? this.value : this.hoverValue;\n },\n progressStyle() {\n if (!this.max) return null;\n let value = this.max ? this.valueDisplay * 100 / this.max : 0;\n return this.vertical ? {\n height: `${value}%`\n } : {\n width: `${value}%`\n };\n }\n },\n methods: {\n xToValue(x) {\n return x * this.max / this.$refs.bar.getBoundingClientRect().width;\n },\n yToValue(y) {\n return y * this.max / this.$refs.bar.getBoundingClientRect().height;\n },\n valueFromEvent(event) {\n let rect = event.currentTarget.getBoundingClientRect();\n return this.vertical ? this.yToValue(event.clientY - rect.y) : this.xToValue(event.clientX - rect.x);\n },\n onClick(event) {\n this.$emit('select', this.valueFromEvent(event));\n },\n onMouseMove(event) {\n if (event.type == 'mouseleave') this.hoverValue = null;else {\n this.hoverValue = this.valueFromEvent(event);\n }\n }\n }\n});\n\n//# sourceURL=webpack://aircox-assets/./src/components/AProgress.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
/***/ }),
@@ -225,7 +225,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
\*********************************************************************************************************************************************************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"player\"\n};\nconst _hoisted_2 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", {\n class: \"menu-label\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-thumbtack\"\n})]), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" Pinned \")], -1 /* HOISTED */);\nconst _hoisted_3 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", {\n class: \"menu-label\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-list\"\n})]), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" Playlist \")], -1 /* HOISTED */);\nconst _hoisted_4 = {\n class: \"player-bar media\"\n};\nconst _hoisted_5 = {\n class: \"media-left\"\n};\nconst _hoisted_6 = [\"title\", \"aria-label\"];\nconst _hoisted_7 = {\n key: 0,\n class: \"fas fa-pause\"\n};\nconst _hoisted_8 = {\n key: 1,\n class: \"fas fa-play\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"media-left media-cover\"\n};\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n class: \"media-content\"\n};\nconst _hoisted_12 = {\n class: \"media-right\"\n};\nconst _hoisted_13 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon is-size-6 has-text-danger\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-circle\"\n})], -1 /* HOISTED */);\nconst _hoisted_14 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"Live\", -1 /* HOISTED */);\nconst _hoisted_15 = [_hoisted_13, _hoisted_14];\nconst _hoisted_16 = {\n key: 0,\n class: \"is-size-6\"\n};\nconst _hoisted_17 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-thumbtack\"\n})], -1 /* HOISTED */);\nconst _hoisted_18 = {\n key: 0,\n class: \"is-size-6\"\n};\nconst _hoisted_19 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-list\"\n})], -1 /* HOISTED */);\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_APlaylist = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"APlaylist\");\n const _component_AProgress = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"AProgress\");\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(['player-panels', $data.panel ? 'is-open' : ''])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_APlaylist, {\n ref: \"pin\",\n class: \"player-panel menu\",\n name: \"Pinned\",\n actions: ['page'],\n editable: true,\n player: $options.self,\n set: $data.sets.pin,\n onSelect: _cache[0] || (_cache[0] = $event => $options.togglePlay('pin', $event.index)),\n listClass: \"menu-list\",\n itemClass: \"menu-item\"\n }, {\n header: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [_hoisted_2]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"player\", \"set\"]), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, $data.panel == 'pin' && $data.sets.pin.length]]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_APlaylist, {\n ref: \"queue\",\n class: \"player-panel menu\",\n actions: ['page'],\n editable: true,\n player: $options.self,\n set: $data.sets.queue,\n onSelect: _cache[1] || (_cache[1] = $event => $options.togglePlay('queue', $event.index)),\n listClass: \"menu-list\",\n itemClass: \"menu-item\"\n }, {\n header: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [_hoisted_3]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"player\", \"set\"]), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, $data.panel == 'queue' && $data.sets.queue.length]])], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"button\",\n onClick: _cache[2] || (_cache[2] = $event => $options.togglePlay()),\n title: $props.buttonTitle,\n \"aria-label\": $props.buttonTitle\n }, [$options.playing ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_8))], 8 /* PROPS */, _hoisted_6)]), $options.current && $options.current.data.cover ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n src: $options.current.data.cover,\n class: \"cover\"\n }, null, 8 /* PROPS */, _hoisted_10)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_11, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"content\", {\n loaded: $data.loaded,\n live: $data.live,\n current: $options.current\n }), $data.loaded && $data.duration ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_AProgress, {\n key: 0,\n value: $data.currentTime,\n max: this.duration,\n format: $options.displayTime,\n class: \"pt-1 is-size-7\",\n onSelect: _cache[3] || (_cache[3] = $event => $data.audio.currentTime = $event)\n }, null, 8 /* PROPS */, [\"value\", \"max\", \"format\"])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_12, [$data.loaded ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 0,\n class: \"button has-text-weight-bold\",\n onClick: _cache[4] || (_cache[4] = $event => $options.play())\n }, _hoisted_15)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n ref: \"pinPlaylistButton\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)($options.playlistButtonClass('pin')),\n onClick: _cache[5] || (_cache[5] = $event => $options.togglePanel('pin'))\n }, [$data.sets.pin.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($data.sets.pin.length), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), _hoisted_17], 2 /* CLASS */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, $data.sets.pin.length]]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)($options.playlistButtonClass('queue')),\n onClick: _cache[6] || (_cache[6] = $event => $options.togglePanel('queue'))\n }, [$data.sets.queue.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_18, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($data.sets.queue.length), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), _hoisted_19], 2 /* CLASS */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, $data.sets.queue.length]])])])]);\n}\n\n//# sourceURL=webpack://aircox-assets/./src/components/APlayer.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"a-player\"\n};\nconst _hoisted_2 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"title is-flex-grow-1\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-star\"\n})]), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" Pinned \")], -1 /* HOISTED */);\nconst _hoisted_3 = {\n class: \"action button no-border\"\n};\nconst _hoisted_4 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"i\", {\n class: \"fa fa-close\"\n}, null, -1 /* HOISTED */);\nconst _hoisted_5 = [_hoisted_4];\nconst _hoisted_6 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"title is-flex-grow-1\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-list\"\n})]), /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" Playlist \")], -1 /* HOISTED */);\nconst _hoisted_7 = {\n class: \"action button no-border\"\n};\nconst _hoisted_8 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"i\", {\n class: \"fa fa-close\"\n}, null, -1 /* HOISTED */);\nconst _hoisted_9 = [_hoisted_8];\nconst _hoisted_10 = {\n class: \"a-player-bar button-group\"\n};\nconst _hoisted_11 = [\"title\", \"aria-label\"];\nconst _hoisted_12 = {\n key: 0,\n class: \"fas fa-pause\"\n};\nconst _hoisted_13 = {\n key: 1,\n class: \"fas fa-play\"\n};\nconst _hoisted_14 = {\n key: 0,\n class: \"media-cover\"\n};\nconst _hoisted_15 = [\"src\"];\nconst _hoisted_16 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon is-size-6 has-text-danger\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-circle\"\n})], -1 /* HOISTED */);\nconst _hoisted_17 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"Live\", -1 /* HOISTED */);\nconst _hoisted_18 = [_hoisted_16, _hoisted_17];\nconst _hoisted_19 = {\n key: 0,\n class: \"is-size-6\"\n};\nconst _hoisted_20 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-star\"\n})], -1 /* HOISTED */);\nconst _hoisted_21 = {\n key: 0,\n class: \"is-size-6\"\n};\nconst _hoisted_22 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-list\"\n})], -1 /* HOISTED */);\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_APlaylist = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"APlaylist\");\n const _component_AProgress = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"AProgress\");\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(['a-player-panels', $data.panel ? 'is-open' : ''])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_APlaylist, {\n ref: \"pin\",\n class: \"a-player-panel a-playlist\",\n name: \"Pinned\",\n actions: ['page'],\n editable: true,\n player: $options.self,\n set: $data.sets.pin,\n onSelect: _cache[1] || (_cache[1] = $event => $options.togglePlay('pin', $event.index)),\n listClass: \"menu-list\",\n itemClass: \"menu-item\"\n }, {\n header: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [_hoisted_2, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\",\n onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $options.togglePanel(), [\"stop\"]))\n }, _hoisted_5)])]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"player\", \"set\"]), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, $data.panel == 'pin' && $data.sets.pin.length]]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_APlaylist, {\n ref: \"queue\",\n class: \"a-player-panel a-playlist\",\n actions: ['page'],\n editable: true,\n player: $options.self,\n set: $data.sets.queue,\n onSelect: _cache[3] || (_cache[3] = $event => $options.togglePlay('queue', $event.index)),\n listClass: \"menu-list\",\n itemClass: \"menu-item\"\n }, {\n header: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [_hoisted_6, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon\",\n onClick: _cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $options.togglePanel(), [\"stop\"]))\n }, _hoisted_9)])]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"player\", \"set\"]), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, $data.panel == 'queue' && $data.sets.queue.length]])], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"button\",\n onClick: _cache[4] || (_cache[4] = $event => $options.togglePlay()),\n title: $props.buttonTitle,\n \"aria-label\": $props.buttonTitle\n }, [$options.playing ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_12)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_13))], 8 /* PROPS */, _hoisted_11), $options.current && $options.current.data.cover ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n src: $options.current.data.cover,\n class: \"cover\"\n }, null, 8 /* PROPS */, _hoisted_15)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(['a-player-bar-content', $data.loaded && $data.duration ? 'has-progress' : ''])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"content\", {\n loaded: $data.loaded,\n live: $data.live,\n current: $options.current\n }), $data.loaded && $data.duration ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_AProgress, {\n key: 0,\n value: $data.currentTime,\n max: this.duration,\n format: $options.displayTime,\n class: \"pt-1 is-size-7\",\n onSelect: _cache[5] || (_cache[5] = $event => $data.audio.currentTime = $event)\n }, null, 8 /* PROPS */, [\"value\", \"max\", \"format\"])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [$data.loaded ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 0,\n class: \"button has-text-weight-bold\",\n onClick: _cache[6] || (_cache[6] = $event => $options.play())\n }, _hoisted_18)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n ref: \"pinPlaylistButton\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)($options.playlistButtonClass('pin')),\n onClick: _cache[7] || (_cache[7] = $event => $options.togglePanel('pin'))\n }, [$data.sets.pin.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_19, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($data.sets.pin.length), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), _hoisted_20], 2 /* CLASS */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, $data.sets.pin.length]]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)($options.playlistButtonClass('queue')),\n onClick: _cache[8] || (_cache[8] = $event => $options.togglePanel('queue'))\n }, [$data.sets.queue.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($data.sets.queue.length), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), _hoisted_22], 2 /* CLASS */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vShow, $data.sets.queue.length]])])])]);\n}\n\n//# sourceURL=webpack://aircox-assets/./src/components/APlayer.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
/***/ }),
@@ -235,7 +235,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
\***********************************************************************************************************************************************************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"playlist\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = [\"onClick\"];\nconst _hoisted_4 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon is-small\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-close\"\n})], -1 /* HOISTED */);\nconst _hoisted_5 = [_hoisted_4];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ASoundItem = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"ASoundItem\");\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"header\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"ul\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(_ctx.listClass)\n }, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.items, (item, index) => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"li\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(_ctx.itemClass),\n onClick: $event => !$options.hasAction('play') && _ctx.select(index),\n key: index\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"a\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)($props.player.isPlaying(item) ? 'is-active' : '')\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_ASoundItem, {\n data: item,\n index: index,\n set: _ctx.set,\n player: $options.player_,\n onTogglePlay: $event => $options.togglePlay(index),\n actions: $props.actions\n }, {\n \"extra-right\": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(({}) => [$props.editable ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 0,\n class: \"button\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => _ctx.remove(index, true), [\"stop\"])\n }, _hoisted_5, 8 /* PROPS */, _hoisted_3)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]),\n _: 2 /* DYNAMIC */\n }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"data\", \"index\", \"set\", \"player\", \"onTogglePlay\", \"actions\"])], 2 /* CLASS */)], 10 /* CLASS, PROPS */, _hoisted_2);\n }), 128 /* KEYED_FRAGMENT */))], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"footer\")]);\n}\n\n//# sourceURL=webpack://aircox-assets/./src/components/APlaylist.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"a-playlist\"\n};\nconst _hoisted_2 = {\n class: \"header\"\n};\nconst _hoisted_3 = [\"onClick\"];\nconst _hoisted_4 = [\"onClick\"];\nconst _hoisted_5 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon is-small\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-close\"\n})], -1 /* HOISTED */);\nconst _hoisted_6 = [_hoisted_5];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ASoundItem = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"ASoundItem\");\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"header\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"ul\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(_ctx.listClass)\n }, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(_ctx.items, (item, index) => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"li\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(_ctx.itemClass),\n onClick: $event => !$options.hasAction('play') && _ctx.select(index),\n key: index\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"a\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)($props.player.isPlaying(item) ? 'is-active' : '')\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_ASoundItem, {\n data: item,\n index: index,\n set: _ctx.set,\n player: $options.player_,\n onTogglePlay: $event => $options.togglePlay(index),\n actions: $props.actions\n }, {\n actions: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(({}) => [$props.editable ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 0,\n class: \"button\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => _ctx.remove(index, true), [\"stop\"])\n }, _hoisted_6, 8 /* PROPS */, _hoisted_4)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]),\n _: 2 /* DYNAMIC */\n }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"data\", \"index\", \"set\", \"player\", \"onTogglePlay\", \"actions\"])], 2 /* CLASS */)], 10 /* CLASS, PROPS */, _hoisted_3);\n }), 128 /* KEYED_FRAGMENT */))], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"footer\")]);\n}\n\n//# sourceURL=webpack://aircox-assets/./src/components/APlaylist.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
/***/ }),
@@ -255,7 +255,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
\***********************************************************************************************************************************************************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"media\"\n};\nconst _hoisted_2 = {\n class: \"media-left\"\n};\nconst _hoisted_3 = {\n class: \"media-right\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"value\", {\n value: $options.valueDisplay,\n max: $props.max\n }, () => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.format($options.valueDisplay)), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n ref: \"bar\",\n class: \"media-content\",\n onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)((...args) => $options.onClick && $options.onClick(...args), [\"stop\"])),\n onMouseleave: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)((...args) => $options.onMouseMove && $options.onMouseMove(...args), [\"stop\"])),\n onMousemove: _cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)((...args) => $options.onMouseMove && $options.onMouseMove(...args), [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)($props.progressClass),\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($options.progressStyle)\n }, \" \", 6 /* CLASS, STYLE */)], 544 /* HYDRATE_EVENTS, NEED_PATCH */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"value\", {\n value: $options.valueDisplay,\n max: $props.max\n }, () => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.format($props.max)), 1 /* TEXT */)])])]);\n}\n\n//# sourceURL=webpack://aircox-assets/./src/components/AProgress.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"a-progress m-0\"\n};\nconst _hoisted_2 = {\n class: \"time-now\"\n};\nconst _hoisted_3 = {\n class: \"time-total\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"time\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"value\", {\n value: $options.valueDisplay,\n max: $props.max\n }, () => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.format($options.valueDisplay)), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n ref: \"bar\",\n class: \"a-progress-bar-container\",\n onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)((...args) => $options.onClick && $options.onClick(...args), [\"stop\"])),\n onMouseleave: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)((...args) => $options.onMouseMove && $options.onMouseMove(...args), [\"stop\"])),\n onMousemove: _cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)((...args) => $options.onMouseMove && $options.onMouseMove(...args), [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)($props.progressClass),\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($options.progressStyle)\n }, \" \", 6 /* CLASS, STYLE */)], 544 /* HYDRATE_EVENTS, NEED_PATCH */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"time\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"value\", {\n value: $options.valueDisplay,\n max: $props.max\n }, () => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.format($props.max)), 1 /* TEXT */)])])]);\n}\n\n//# sourceURL=webpack://aircox-assets/./src/components/AProgress.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
/***/ }),
@@ -285,7 +285,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
\************************************************************************************************************************************************************************************************************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"media sound-item\"\n};\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = {\n class: \"media-content\"\n};\nconst _hoisted_4 = {\n key: 0,\n class: \"icon is-small is-size-7 blink\"\n};\nconst _hoisted_5 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-play\"\n}, null, -1 /* HOISTED */);\nconst _hoisted_6 = [_hoisted_5];\nconst _hoisted_7 = [\"href\"];\nconst _hoisted_8 = {\n class: \"media-right\"\n};\nconst _hoisted_9 = [\"href\"];\nconst _hoisted_10 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon is-small\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-download\"\n})], -1 /* HOISTED */);\nconst _hoisted_11 = [_hoisted_10];\nconst _hoisted_12 = {\n class: \"icon is-small\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"media-left\",\n onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => _ctx.$emit('togglePlay'), [\"stop\"]))\n }, [$options.item.data.cover ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"cover is-tiny\",\n src: $options.item.data.cover\n }, null, 8 /* PROPS */, _hoisted_2)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"content\", {\n player: $props.player,\n item: $options.item,\n loaded: $options.loaded\n }, () => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h4\", {\n class: \"title is-5\",\n onClick: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => _ctx.$emit('togglePlay'), [\"stop\"]))\n }, [$options.playing ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_4, _hoisted_6)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" \" + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.name || $options.item.name), 1 /* TEXT */)]), $options.hasAction('page') && $options.item.data.page_url ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 0,\n class: \"subtitle is-6 is-inline-block\",\n href: $options.item.data.page_url\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($options.item.data.page_title), 9 /* TEXT, PROPS */, _hoisted_7)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_8, [$options.item.data.is_downloadable ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 0,\n class: \"button\",\n href: $options.item.data.url,\n target: \"_blank\"\n }, _hoisted_11, 8 /* PROPS */, _hoisted_9)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $props.player && $props.player.sets.pin != _ctx.$parent.set ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 1,\n class: \"button\",\n onClick: _cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $props.player.togglePin($options.item), [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(($options.pinned ? '' : 'has-text-grey-light ') + 'fa fa-thumbtack')\n }, null, 2 /* CLASS */)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"actions\", {\n player: $props.player,\n item: $options.item,\n loaded: $options.loaded\n })]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"extra-right\", {\n player: $props.player,\n item: $options.item,\n loaded: $options.loaded\n })]);\n}\n\n//# sourceURL=webpack://aircox-assets/./src/components/ASoundItem.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm-bundler.js\");\n\nconst _hoisted_1 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon mr-3\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"i\", {\n class: \"fa fa-play\"\n})], -1 /* HOISTED */);\nconst _hoisted_2 = {\n class: \"button-group actions\"\n};\nconst _hoisted_3 = [\"href\"];\nconst _hoisted_4 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon is-small\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-download\"\n})], -1 /* HOISTED */);\nconst _hoisted_5 = [_hoisted_4];\nconst _hoisted_6 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"icon is-small\"\n}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"fa fa-star\"\n})], -1 /* HOISTED */);\nconst _hoisted_7 = [_hoisted_6];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(['a-sound-item m-0 button-group', $options.playing && 'playing' || ''])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"title\", {\n player: $props.player,\n item: $options.item,\n loaded: $options.loaded\n }, () => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(['title is-flex-grow-1', $options.playing && 'blink' || '']),\n onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => _ctx.$emit('togglePlay'), [\"stop\"]))\n }, [_hoisted_1, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" \" + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.name || $options.item.name), 1 /* TEXT */)], 2 /* CLASS */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_2, [$options.item.data.is_downloadable ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 0,\n class: \"button\",\n href: $options.item.data.url,\n target: \"_blank\"\n }, _hoisted_5, 8 /* PROPS */, _hoisted_3)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $props.player && $props.player.sets.pin != _ctx.$parent.set ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 1,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(['button', $options.pinned ? 'selected' : 'not-selected']),\n onClick: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $props.player.togglePin($options.item), [\"stop\"]))\n }, _hoisted_7, 2 /* CLASS */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"actions\", {\n player: $props.player,\n item: $options.item,\n loaded: $options.loaded\n })]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, \"extra-right\", {\n player: $props.player,\n item: $options.item,\n loaded: $options.loaded\n })], 2 /* CLASS */);\n}\n\n//# sourceURL=webpack://aircox-assets/./src/components/ASoundItem.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D");
/***/ }),
diff --git a/aircox/templates/aircox/basepage_list.html b/aircox/templates/aircox/basepage_list.html
index c860390..f10322b 100644
--- a/aircox/templates/aircox/basepage_list.html
+++ b/aircox/templates/aircox/basepage_list.html
@@ -11,7 +11,7 @@
{% with parent.title as title %}
{% with model|default:"Publications"|verbose_name:True|capfirst as model %}
{% comment %}Translators: title when pages are filtered for a specific parent page, e.g.: Articles of My Incredible Show{% endcomment %}
- {% blocktranslate %}{{ model }} of {{ title }}{% endblocktranslate %}
+ {% blocktranslate %}All {{ model }}{% endblocktranslate %}
{% endwith %}
{% endwith %}
{% endif %}
diff --git a/aircox/templates/aircox/episode_detail.html b/aircox/templates/aircox/episode_detail.html
index d2ebf0d..3c6a39d 100644
--- a/aircox/templates/aircox/episode_detail.html
+++ b/aircox/templates/aircox/episode_detail.html
@@ -8,13 +8,27 @@
{% endwith %}
{% endblock %}
-{% block content %}
+{% block content-container %}
+{{ block.container }}
+
{{ block.super }}
+ {% if object.podcasts %}
+
+ {% translate "Podcasts" %}
+
+
+
+ {% endif %}
+
{% if tracks %}
-
+
{% translate "Playlist" %}
@@ -28,24 +42,10 @@
{% endfor %}
-
-
{% endif %}
- {% if object.podcasts %}
-
-
-
- {% translate "Podcasts" %}
-
-
-
- {% endif %}
+
{% endblock %}
diff --git a/aircox/templates/aircox/program_detail.html b/aircox/templates/aircox/program_detail.html
index 2aa6fbf..44de1cf 100644
--- a/aircox/templates/aircox/program_detail.html
+++ b/aircox/templates/aircox/program_detail.html
@@ -9,7 +9,7 @@
{{ block.super }}
{% if episodes %}
- {% translate "Last Episodes" %}
+ {% translate "Last Episodes" %}
{% for object in episodes|slice:":3" %}
{% page_widget "card" object %}
@@ -18,8 +18,7 @@