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 }} + {% 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 @@