From 498710da35bafcffef6b59ab7388aa1aeffa035f Mon Sep 17 00:00:00 2001 From: nnwhen Date: Sun, 1 Jun 2025 15:44:23 +0200 Subject: [PATCH] nnwhen edits --- Album-Title.html | 101 ++ config.json | 53 +- index.html | 1766 ---------------------- media/put files here.txt | 0 src/reset.css => res/asset-css-reset.css | 0 res/asset-css-scritch.css | 733 +++++++++ res/asset-js-scritch-player.js | 1050 +++++++++++++ src/common.css | 35 - src/fonts.css | 172 --- src/fonts/icons.eot | Bin 10550 -> 0 bytes src/fonts/icons.svg | 58 - src/fonts/icons.ttf | Bin 10392 -> 0 bytes src/fonts/icons.woff | Bin 10468 -> 0 bytes src/fonts/rubikNumbers-edit.woff2 | Bin 3388 -> 0 bytes 14 files changed, 1926 insertions(+), 2042 deletions(-) create mode 100644 Album-Title.html delete mode 100644 index.html delete mode 100644 media/put files here.txt rename src/reset.css => res/asset-css-reset.css (100%) create mode 100644 res/asset-css-scritch.css create mode 100644 res/asset-js-scritch-player.js delete mode 100644 src/common.css delete mode 100644 src/fonts.css delete mode 100644 src/fonts/icons.eot delete mode 100644 src/fonts/icons.svg delete mode 100644 src/fonts/icons.ttf delete mode 100644 src/fonts/icons.woff delete mode 100644 src/fonts/rubikNumbers-edit.woff2 diff --git a/Album-Title.html b/Album-Title.html new file mode 100644 index 0000000..5830e47 --- /dev/null +++ b/Album-Title.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + Album-Title + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
____
+
+ + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + diff --git a/config.json b/config.json index 4a03557..35b6d6b 100644 --- a/config.json +++ b/config.json @@ -1,13 +1,44 @@ { - "title": "", - "media": [], - "cover": "", - "theme": { - "coverSize": 480, - "layoutStyle": "vertical", - "infoStyle": "overlaid", - "contentWidth": 400, - "nativePlayer": false + "title": "Album Title", + "media": [ + { + "file": "01 - Song 01.flac", + "type": "audio", + "info": "

First Line
Second Line

", + "feature": true, + "title": "Song 01" }, - "description": "" -} \ No newline at end of file + { + "file": "02 - Song 02.flac", + "type": "audio", + "info": "

First Line
Second Line

", + "title": "Song 02" + } + ], + "cover": "cover.png", + "theme": { + "titleStyle": "none", + "layoutStyle": "vertical", + "infoStyle": "overlaid", + "hideInfoDropdown": false, + "contentWidth": "400", + "coverSize": "480", + "nativePlayer": false, + "customCSS": "", + + "backgroundColor": "#181a1b", + "primaryColor": "#ffffff", + "primaryAltColor": "#e3beb3", + "secondaryColor": "#181a1b", + "highlightColor": "#8383834d", + "primaryTextColor": "#c8beb5", + "primaryAltTextColor": "#838383", + "previewStripeColor1": "#3c362e", + "previewStripeColor2": "#242627", + "linkColor": "#f18d74", + "overlayTextColor": "#ffffff", + "overlayBackgroundColor": "#00000080" + }, + "description": "

Description How To

Use normal HTML formatting, inline.

", + "loopModeDefault": "none" +} diff --git a/index.html b/index.html deleted file mode 100644 index fc7e41b..0000000 --- a/index.html +++ /dev/null @@ -1,1766 +0,0 @@ - - - - - - - itch player - - - - - - - - - -
-
-
-
-
-
-
- - -
-
-
-
-
-
-
-
-
- - -
-
-
____
-
- - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - \ No newline at end of file diff --git a/media/put files here.txt b/media/put files here.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/reset.css b/res/asset-css-reset.css similarity index 100% rename from src/reset.css rename to res/asset-css-reset.css diff --git a/res/asset-css-scritch.css b/res/asset-css-scritch.css new file mode 100644 index 0000000..c1f56dd --- /dev/null +++ b/res/asset-css-scritch.css @@ -0,0 +1,733 @@ +:root { + --backgroundColor: #181a1b; + --primaryColor: #ffffff; + --primaryAltColor: #e3beb3; + --secondaryColor: #181a1b; + --highlightColor: #8383834d; + --primaryTextColor: #c8beb5; + --primaryAltTextColor: #838383; + --previewStripeColor1: #3c362e; + --previewStripeColor2: #242627; + --linkColor: #f18d74; + --overlayTextColor: #ffffff; + --overlayBackgroundColor: #00000080; + --font: sans-serif; +} + +@keyframes pulse { + 0% { + opacity: 0.5; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0.5; + } +} + +/* basic layout */ +html, +body { + width: 100%; + height: 100%; + overflow: auto; +} + +body { + color: var(--primaryTextColor); + background-color: var(--backgroundColor); + font-family: var(--font); +} + +a { + color: var(--linkColor); +} + +#mainContainer { + position: relative; + display: grid; + justify-content: space-evenly; + width: 100%; + max-width: 960px; + left: 0; + right: 0; + margin: auto; +} + +#mainContainer.vertical { + grid-template-columns: auto; +} + +a[href]:not([tabindex="-1"]):focus-visible, +area[href]:not([tabindex="-1"]):focus-visible, +input:not([disabled]):not([tabindex="-1"]):focus-visible, +select:not([disabled]):not([tabindex="-1"]):focus-visible, +textarea:not([disabled]):not([tabindex="-1"]):focus-visible, +button:not([disabled]):not([tabindex="-1"]):focus-visible, +iframe:not([tabindex="-1"]):focus-visible, +[tabindex]:not([tabindex="-1"]):focus-visible, +[contentEditable="true"]:not([tabindex="-1"]):focus-visible { + outline: 2px solid rgb(83, 186, 255); + outline-offset: 2px; + border-radius: 2px; +} + +/*** title ***/ + +#titleContainer { + height: 0; +} +#titleContainer.active { + height: auto; +} +#title { + margin: 20px 20px 4px 20px; + font-size: 26px; + display: none; +} +#titleContainer.active #title { + display: block; +} +#mainContainer.vertical #title { + margin: 20px; + text-align: center; +} +#mainContainer.title-span #title { + margin: 20px; + text-align: center; +} +#mainContainer:not(.vertical).title-span #titleContainer { + grid-column: 1/3; +} + +@media (max-width: 590px) { + #mainContainer #title { + margin: 20px; + text-align: center; + } + #mainContainer.title-span.title-span #titleContainer { + grid-column: 1; + } + #mainContainer { + grid-template-columns: auto; + } + #mainContainer #mediaColumn { + grid-row: 2; + grid-column: 1; + position: relative; + top: 0; + } +} + +/*** media column ***/ + +#mediaColumn { + display: flex; + grid-row: 1/3; + grid-column: 2; + flex-direction: column; + position: sticky; + top: 10px; + margin-left: auto; + margin-right: auto; +} +#mainContainer.vertical #mediaColumn { + grid-row: 2; + grid-column: 1; + position: relative; + top: 0; +} +#mainContainer.title-span #mediaColumn { + grid-row: 2/3; +} + +.info-overlaid #mediaColumn, +.info-overlaid-toggle #mediaColumn { + max-width: 480px; + height: fit-content; +} + +#mediaContainer { + width: 100%; + max-width: 480px; + display: flex; + position: relative; + overflow: hidden; +} +#mediaContainer > * { + width: 100%; + /* display: none; */ + visibility: hidden; + margin-right: -100%; +} +#mediaContainer .active { + /* display: block; */ + visibility: visible; +} + +#mediaContainer .active { + /* display: block; */ + visibility: visible; +} + +#mediaInfoContainer { + display: none; + overflow-y: auto; + background-color: var(--highlightColor); + border-radius: 8px; +} +#mediaInfoContainer.active { + display: block; + padding: 10px; + margin-top: 12px; +} + +.info-overlaid #mediaInfoContainer, +.info-overlaid-toggle #mediaInfoContainer { + padding: 30px; + margin: 0; + position: absolute; + backdrop-filter: blur(3px); + width: 100%; + height: 100%; + color: var(--overlayTextColor); + background-color: var(--overlayBackgroundColor); + border-radius: 0; + display: flex; + text-align: center; + font-size: 20px; + opacity: 0; + transition: opacity 0.25s; +} +.info-overlaid #mediaInfoContainer.active, +.info-overlaid-toggle #mediaInfoContainer.active { + opacity: 1; +} +.info-overlaid #mediaInfo, +.info-overlaid-toggle #mediaInfo { + margin: auto; + position: relative; + top: 0; + bottom: 0; +} + +.info-below #mediaInfoContainer { + display: block; + opacity: 0; + transition: opacity 0.25s; +} +.info-below #mediaInfoContainer.active { + opacity: 1; +} +.info-none #mediaInfoContainer { + display: none !important; +} + +/*** content column ***/ + +#contentColumn { + min-width: 270px; + grid-column: 1; +} + +#contentContainer { + padding: 0 10px; + margin: auto; +} + +/* player controls */ + +#audio { + width: 100%; + display: flex; + margin-bottom: 20px; + user-select: none; +} +#player { + width: 100%; + display: none; +} +#audio.native { + height: 70px; +} +#audio.native #player { + display: block; +} + +#audio.native #player.video { + visibility: hidden; + pointer-events: none; +} + +#bigButton { + width: 54px; + height: 54px; + background-color: var(--primaryColor); + border-radius: 50%; + position: relative; + display: flex; + align-items: center; + justify-content: center; + flex: 0 0; + flex-basis: 54px; + margin-left: 0; + cursor: pointer; + margin-top: 26px; + margin-right: 22px; +} + +#bigButton:not(.loading):after { + content: ""; + display: block; + width: 0; + height: 0; + border-top: 14px inset transparent; + border-bottom: 14px inset transparent; + border-left: 23px solid var(--secondaryColor); + border-right: 0; + margin-left: 5px; +} +#bigButton:not(.loading).pause:after { + content: ""; + border: 0; + border-left: 8px solid var(--secondaryColor); + border-right: 8px solid var(--secondaryColor); + height: 24px; + margin: 4px auto; + width: 2px; + padding: 3px; + left: 0; +} +#bigButton.loading:after { + content: "\25cc"; + color: var(--secondaryColor); + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + font-size: 40px; + animation: pulse 1s infinite; +} +#bigButton.looped:before { + content: attr(loopcount); + display: block; + width: 20px; + height: 20px; + position: absolute; + top: -6px; + right: -6px; + color: var(--secondaryColor); + background-color: var(--primaryColor); + border: 2px solid var(--backgroundColor); + border-radius: 20px; + font-weight: 600; + font-size: 14px; + text-align: center; +} + +#controls { + display: flex; + flex-wrap: wrap; + flex: 1 0; + align-items: center; + position: relative; +} + +#controls .title { + flex: 1 0; + font-weight: 600; + align-self: end; + font-size: 28px; + line-height: 28px; + width: 100px; + word-break: break-word; + overflow: hidden; + /* height: 60px; */ + -webkit-line-clamp: 2; + display: -webkit-box; + -webkit-box-orient: vertical; + user-select: none; + flex-basis: 8px; +} + +#controls .riser { + height: 60px; +} + +#controls .time { + font-size: 12px; + align-self: end; + color: var(--primaryAltTextColor); + user-select: none; + text-align: right; +} + +#controls #scrubberTrackContainer { + flex-basis: 100%; + height: 16px; + position: relative; + padding: 4px 0; + user-select: none; + cursor: pointer; + touch-action: none; +} +#controls #scrubberTrackFull { + width: 100%; + height: 100%; + position: relative; + background: repeating-linear-gradient( + 135deg, + var(--previewStripeColor1), + var(--previewStripeColor1) 8px, + var(--previewStripeColor2) 8px, + var(--previewStripeColor2) 16px + ); + border-radius: 12px; +} +#controls #scrubberTrackContainer #scrubberTrackPreview { + width: 100%; + height: 100%; + position: relative; +} +#controls #scrubberTrackContainer.preview #scrubberTrackPreview { + border: 2px solid var(--backgroundColor); + box-sizing: content-box; + top: -2px; + left: -2px; + margin-right: -4px; + border-radius: 12px; +} +#controls #scrubberTrack { + background-color: var(--primaryAltColor); + overflow: hidden; + width: 100%; + height: 100%; + border-radius: 12px; + position: relative; +} +#scrubberFill { + position: absolute; + height: 100%; + background-color: var(--primaryColor); + content: ""; +} +#controls #scrubber { + box-sizing: content-box; + width: 8px; + height: 8px; + background-color: var(--primaryColor); + border: 2px solid var(--backgroundColor); + border-radius: 50%; + position: absolute; + top: 0; + bottom: 0; + margin: auto -2px; +} + +#controls #nextTrack, +#controls #prevTrack, +#controls #loopSwitch { + border: none; + margin-right: 20px; + flex: 0 0; + background: none; + color: var(--primaryColor); + padding: 0; + align-self: start; + cursor: pointer; +} +#controls #loopSwitch { + opacity: 0.5; +} + +#controls .spacer { + flex: 1 1; +} + +#controls #volumeContainer { + display: flex; + align-items: center; + user-select: none; + height: 20px; + position: absolute; + right: 0; + bottom: 0; +} + +#controls #volumeContainer #volumeTrackContainer { + flex: 1 0; + cursor: pointer; + width: 0px; + height: 100%; + overflow: hidden; + position: relative; + align-self: start; + transition: width 0.2s; + touch-action: none; +} +#controls #volumeContainer.hover #volumeTrackContainer { + width: 80px; +} + +#controls #volumeContainer #volumeTrackContainer #volumeTrack { + background-color: var(--primaryAltColor); + width: 80px; + height: 6px; + border-radius: 10px; + position: absolute; + right: 0; + overflow: hidden; + margin: auto; + top: 0; + bottom: 0; +} + +#controls #volumeContainer #volumeTrackContainer #volumeFill { + background-color: var(--primaryColor); + position: absolute; + width: 100%; + height: 100%; + border-radius: 10px; + border: 2px solid var(--backgroundColor); + box-sizing: content-box; + margin: -2px; +} + +#controls #volumeContainer #volumeIcon { + flex: 0 0; + align-self: start; + cursor: pointer; + margin-left: 6px; + cursor: pointer; + color: var(--primaryColor); +} + +#audio.native #controls, +#audio.native #bigButton { + display: none; +} + +/* track list */ + +#tracks { + display: flex; + flex-direction: column; + width: 100%; +} + +.track { + display: flex; + position: relative; + overflow: hidden; + flex-wrap: wrap; + border-radius: 6px; +} +.track.locked { + opacity: 0.5; +} +.track.active:before { + content: ""; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: var(--highlightColor); + position: absolute; + pointer-events: none; +} +.track.active .main { + background-color: var(--highlightColor); + align-items: center; +} + +.track .main { + display: flex; + flex: 1 0 100%; + padding: 6px; + border-radius: 6px; + align-items: center; +} + +.track .playButton { + margin-right: 12px; + width: 26px; + height: 26px; + background-color: var(--primaryColor); + color: var(--secondaryColor); + border-radius: 3px; + flex: 0 0 26px; + cursor: pointer; + position: relative; + display: flex; + align-items: center; + justify-content: center; +} +.track .playButton:not(.loading, .error, .locked):after { + content: ""; + display: block; + width: 0px; + height: 0; + border-top: 6px inset transparent; + border-bottom: 6px inset transparent; + border-left: 10px solid var(--secondaryColor); + border-right: 0; + margin: auto; + position: relative; + left: 1px; +} +.track .playButton:not(.loading, .error, .locked).pause:after { + content: ""; + border: 0; + border-left: 4px solid var(--secondaryColor); + border-right: 4px solid var(--secondaryColor); + height: 12px; + margin: 4px auto; + width: 2px; + padding: 1px; + left: 0; +} + +.track .playButton.loading.loading:after { + content: "\1f506"; + color: var(--secondaryColor); + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + font-size: 20px; + animation: pulse 1s infinite; +} +.track .playButton.error { + opacity: 0.5; + cursor: default; +} + +.track .playButton.locked { + cursor: default; +} +.track .playButton.locked:after { + content: "\1f512"; + color: var(--secondaryColor); + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + font-size: 20px; +} + +.track.looped .playButton:before { + content: attr(loopcount); + display: block; + width: 15px; + height: 15px; + position: absolute; + top: -6px; + right: -6px; + color: var(--secondaryColor); + background-color: var(--primaryColor); + border: 2px solid var(--backgroundColor); + border-radius: 20px; + font-weight: 600; + font-size: 10px; + text-align: center; +} +.track.active.looped .playButton:before { + border-color: var(--secondaryColor); +} + +.track .title { + word-break: break-word; +} +.track .details { + display: flex; + margin-top: 2px; + align-items: center; + flex-basis: 100%; +} +.track .number { + margin-right: 4px; + color: var(--primaryAltTextColor); +} +.track .duration { + margin-left: 14px; + color: var(--primaryAltTextColor); + font-size: 14px; + flex: 0 0 30px; + white-space: nowrap; +} +.track .spacer { + flex: 1 1; +} +.track .toggleInfo { + margin-left: 8px; + margin-right: 4px; + border-radius: 2px; + cursor: pointer; + color: var(--primaryAltTextColor); +} +.track.active .toggleInfo { + color: var(--primaryColor); +} +.hide-info .track .toggleInfo { + cursor: auto; +} + +.track .infoContainer { + width: 100%; + transition: height 0.5s; +} +.track .infoContainer:not(.active) { + height: 0px !important; + overflow: hidden; +} +.hide-info .track .infoContainer { + display: none; +} + +.track .info { + padding: 10px; + padding-left: 45px; +} + +/* description */ + +#description { + display: none; + padding: 8px; + margin-top: 24px; + word-break: break-word; + margin-bottom: 40px; +} + +#description.active { + display: block; +} + +/*** layered style ***/ + +#mainContainer.overlaid { + width: fit-content; + margin: auto; +} + +#mainContainer.overlaid #contentColumn { + position: absolute; + display: flex; + flex-direction: column; + max-height: 100%; + overflow: hidden; + backdrop-filter: blur(5px); + width: 100%; + max-width: unset !important; + padding: 0 14px; +} + +#mainContainer.overlaid #tracks { + overflow-y: auto; +} diff --git a/res/asset-js-scritch-player.js b/res/asset-js-scritch-player.js new file mode 100644 index 0000000..0b4c95a --- /dev/null +++ b/res/asset-js-scritch-player.js @@ -0,0 +1,1050 @@ +let mediaDir = "media/"; +let mainContainerEl = document.getElementById("mainContainer"); +let playerEl = document.getElementById("player"); +let tracksEl = document.getElementById("tracks"); +let descriptionEl = document.getElementById("description"); +let bigButtonEl = document.getElementById("bigButton"); +let controlsEl = document.getElementById("controls"); +let scrubberTrackContainerEl = document.getElementById( + "scrubberTrackContainer" +); +let scrubberTrackPreviewEl = document.getElementById("scrubberTrackPreview"); +let scrubberTrackEl = document.getElementById("scrubberTrack"); +let scrubberFillEl = document.getElementById("scrubberFill"); +let scrubberEl = document.getElementById("scrubber"); +let nextTrackEl = document.getElementById("nextTrack"); +let prevTrackEl = document.getElementById("prevTrack"); +let loopSwitchEl = document.getElementById("loopSwitch"); + +let titleEl = document.getElementById("title"); +let titleContainerEl = document.getElementById("titleContainer"); +let mediaColumnEl = document.getElementById("mediaColumn"); +let mediaContainerEl = document.getElementById("mediaContainer"); +let mediaInfoEl = document.getElementById("mediaInfo"); +let mediaImageEl = document.getElementById("mediaImage"); +let mediaVideoEl = document.getElementById("mediaVideo"); + +let volumeContainerEl = document.getElementById("volumeContainer"); +let volumeTrackContainerEl = document.getElementById("volumeTrackContainer"); +let volumeTrackEl = document.getElementById("volumeTrack"); +let volumeFillEl = document.getElementById("volumeFill"); +let volumeIconEl = document.getElementById("volumeIcon"); + +let currentEntry = {}; +let media = []; + +let scrubPosition = 0; + +let volumeIcons = ["icon-volume-none", "icon-volume-low", "icon-volume-high"]; +let volume = 0.8; +let muted = false; + +let loadedFirst = false; +let autoPlay = false; +let loopMode = "none"; + +let config = {}; + +function init() { + fetch("config.json") + .then((res) => res.json()) + .then((data) => { + update(data); + }) + .catch(console.error); +} +init(); + +function updateTheme(theme) { + config.theme = theme; + let rootEl = document.documentElement; + if (theme.primaryColor) + rootEl.style.setProperty("--primaryColor", theme.primaryColor); + if (theme.primaryAltColor) + rootEl.style.setProperty("--primaryAltColor", theme.primaryAltColor); + if (theme.primaryTextColor) + rootEl.style.setProperty("--primaryTextColor", theme.primaryTextColor); + if (theme.primaryAltTextColor) + rootEl.style.setProperty( + "--primaryAltTextColor", + theme.primaryAltTextColor + ); + if (theme.secondaryColor) + rootEl.style.setProperty("--secondaryColor", theme.secondaryColor); + if (theme.highlightColor) + rootEl.style.setProperty("--highlightColor", theme.highlightColor); + if (theme.backgroundColor) + rootEl.style.setProperty("--backgroundColor", theme.backgroundColor); + if (theme.previewStripeColor1) + rootEl.style.setProperty( + "--previewStripeColor1", + theme.previewStripeColor1 + ); + if (theme.previewStripeColor2) + rootEl.style.setProperty( + "--previewStripeColor2", + theme.previewStripeColor2 + ); + if (theme.linkColor) rootEl.style.setProperty("--linkColor", theme.linkColor); + if (theme.overlayTextColor) + rootEl.style.setProperty("--overlayTextColor", theme.overlayTextColor); + if (theme.overlayBackgroundColor) + rootEl.style.setProperty( + "--overlayBackgroundColor", + theme.overlayBackgroundColor + ); + if (theme.layoutStyle) { + mainContainerEl.classList.remove("vertical", "horizontal"); + mainContainerEl.classList.add(theme.layoutStyle); + } + if (theme.infoStyle) { + mainContainerEl.classList.remove( + "info-none", + "info-overlaid", + "info-below", + "info-overlaid-toggle" + ); + mainContainerEl.classList.add("info-" + theme.infoStyle); + } + if (theme.titleStyle) { + mainContainerEl.classList.remove("title-none", "title-span"); + mainContainerEl.classList.add("title-" + theme.titleStyle); + } + if (theme.contentWidth) + document.getElementById("contentContainer").style.maxWidth = + theme.contentWidth + "px"; + if (theme.nativePlayer) { + document.getElementById("audio").classList.add("native"); + mediaVideoEl.setAttribute("controls", ""); + } else { + document.getElementById("audio").classList.remove("native"); + mediaVideoEl.removeAttribute("controls"); + } + if (theme.hideInfoDropdown) { + mainContainerEl.classList.add("hide-info"); + } else { + mainContainerEl.classList.remove("hide-info"); + } + mediaContainerEl.style.maxWidth = theme.coverSize + "px"; + mediaContainerEl.style.maxHeight = theme.coverSize + "px"; + mediaColumnEl.style.maxWidth = theme.coverSize + "px"; + + if (theme.customCSS !== undefined) { + document.querySelectorAll("#customCSS").forEach((el) => el.remove()); + let styleEl = document.createElement("style"); + styleEl.setAttribute("id", "customCSS"); + styleEl.innerText = theme.customCSS; + document.head.appendChild(styleEl); + } +} + +function loadContent(data) { + loadCover(data.cover); + mediaImageEl.style.width = config.theme.coverSize + "px"; + mediaImageEl.style.height = config.theme.coverSize + "px"; + if (data.media) loadMedia(data.media); +} +function updateTitle(title) { + if (title) { + titleContainerEl.classList.add("active"); + config.title = title; + titleEl.innerHTML = title; + } else { + titleContainerEl.classList.remove("active"); + } +} +function updateDescription(description) { + if (description === undefined || description === "") { + descriptionEl.classList.remove("active"); + } else { + descriptionEl.classList.add("active"); + config.description = description; + descriptionEl.innerHTML = description; + } +} +function updateLoopMode(mode) { + if (mode === undefined || mode === "") { + config.loopModeDefault = "none"; + } else { + config.loopModeDefault = mode; + } + loopSwitch(config.loopModeDefault); +} + +function localStorageSet(key, value) { + try { + localStorage.setItem(key, value); + } catch {} +} + +function localStorageGet(key) { + let value; + try { + value = localStorage.getItem(key); + } catch { + return undefined; + } + return value; +} + +function update(data) { + if (!data) { + data = config; + } + if (!data.theme) { + data.theme = {}; + } + let title = data.title; + let theme = data.theme; + let description = data.description; + config = data; + + loadContent(data); + updateTitle(title); + updateDescription(description); + updateLoopMode(data.loopModeDefault); + updateTheme(theme); + + updateTrackPreview(); + + document.title = titleEl.textContent; + + volume = parseFloat(localStorageGet("volume")); + muted = parseInt(localStorageGet("muted")); + if (volume && typeof volume === "number") { + setVolume(volume, muted); + } else { + volume = 0.8; + muted = false; + localStorageSet("volume", volume); + } +} + +function loadMedia(list) { + if (list.length === 0) { + return; + } + loadedFirst = false; + autoPlay = false; + bigButtonEl.classList.remove("pause"); + media = list.map((entry) => { + //return {file: entry.file, title: entry.title}; + if (!/:\/\//.test(entry.file)) { + //if not a url + entry.file = mediaDir + entry.file; + } + entry.title = entry.title || entry.file; + return entry; + }); + let featureIndex = 0; + tracksEl.textContent = ""; + media.forEach((entry, i) => { + tracksEl.insertAdjacentHTML( + "beforeend", + `
+
+ +
+
${i + 1}.
+
${entry.title}
+
+
+ ${ + entry.info + ? `` + : "" + } +
+
+ ${ + entry.info + ? ` +
+
+ ${entry.info} +
+
+ ` + : "" + } +
` + ); + let trackEl = tracksEl.lastChild; + entry.trackEl = trackEl; + let buttonEl = trackEl.querySelector("button"); + if (entry.feature) { + featureIndex = i; + } + if (entry.locked && featureIndex === i) { + featureIndex++; + } + if (entry.info) { + let infoContainerEl = trackEl.querySelector(".infoContainer"); + trackEl.querySelector(".toggleInfo").addEventListener("click", (e) => { + infoContainerEl.style.height = + trackEl.querySelector(".info").clientHeight + "px"; + entry.infoToggled = infoContainerEl.classList.toggle("active"); + if (entry.info && entry.infoToggled) { + infoContainerEl.removeAttribute("inert"); + } else { + infoContainerEl.setAttribute("inert", ""); + } + if (config.theme.infoStyle === "overlaid-toggle") { + if (entry.info && entry.infoToggled) { + mediaInfoEl.innerHTML = entry.info; + mediaInfoContainer.classList.add("active"); + } else { + mediaInfoEl.innerHTML = ""; + mediaInfoContainer.classList.remove("active"); + } + } + }); + } + if (!entry.previewFade && entry.previewFade !== false) { + entry.previewFade = true; //default true + } + if (typeof entry.loopCount === "number" && entry.loopCount > 0) { + entry.remainingLoops = entry.loopCount; + trackEl.classList.add("looped"); + buttonEl.setAttribute("title", "loop count"); + updateLoops(entry); + } + if (!entry.locked) { + buttonEl.onclick = () => { + loadedFirst = true; + autoPlay = true; + playEntry(entry); + }; + let loaderEl; + if (entry.type === "video") { + loaderEl = document.createElement("video"); + } else { + loaderEl = document.createElement("audio"); + } + if (entry.previewStart || entry.previewEnd) { + entry.preview = true; + } + let needsPreviewEnd = false; + if (!entry.previewEnd) { + needsPreviewEnd = true; + } + entry.originalDuration = + (entry.originalDuration && fromHMS(entry.originalDuration)) || 1; + entry.previewStart = + (entry.previewStart && fromHMS(entry.previewStart)) || 0; + entry.previewEnd = + (entry.previewEnd && fromHMS(entry.previewEnd)) || + entry.originalDuration; + entry.previewDuration = entry.previewEnd - entry.previewStart; + loaderEl.addEventListener("loadedmetadata", (e) => { + entry.duration = e.target.duration; + entry.needsDuration = false; + entry.previewStart = entry.previewStart || 0; + if (needsPreviewEnd) { + entry.previewEnd = entry.duration; + } + entry.originalDuration = Math.max( + entry.originalDuration, + entry.duration, + entry.previewEnd + ); + entry.previewDuration = entry.previewEnd - entry.previewStart; + + //make assumptions about the audio start points + if (entry.duration < entry.previewDuration) { + //smaller than given preview duration + //left align to preview + entry.audioStart = entry.previewStart; + } else if ( + entry.duration < + entry.originalDuration - entry.previewStart + ) { + //else, smaller than region between preview start and original end + //left align to preview + entry.audioStart = entry.previewStart; + } else if (entry.duration < entry.originalDuration) { + //else, smaller than original duration + //right align to original + entry.audioStart = entry.originalDuration - entry.duration; + } else { + //larger than original duration + //left align to original + entry.audioStart = 0; + } + entry.audioEnd = entry.audioStart + entry.duration; + + let durationText = toHMS(entry.duration); + if (entry.preview) { + durationText += " (preview)"; + } + trackEl.querySelector(".duration").textContent = durationText; + if (entry === currentEntry) { + updateTrackPreview(); + // updateScrubPosition(entry.previewStart / entry.originalDuration); + updateScrubPosition(0); + updatePreviewVolume(0); + } + }); + loaderEl.addEventListener("error", (e) => { + entry.error = true; + entry.errorMessage = e.target.error; + removeLoading(entry, true); + buttonEl.classList.add("error", "icon-warning"); + buttonEl.setAttribute("title", "error loading file"); + }); + loaderEl.addEventListener("canplay", (e) => { + removeLoading(entry, true); + + if (entry.feature && entry.autoplay) { + playerEl.play(); + } + }); + loaderEl.volume = 0; + loaderEl.src = entry.file; + entry.started = false; + entry.loading = true; + entry.loaderEl = loaderEl; + } + }); + loadEntry(media[mod(featureIndex, media.length)]); +} + +function loadCover(cover) { + if (cover) { + let src = cover; + if (mediaImageEl.src == src) { + return; //already loaded + } + if (!/:\/\//.test(src)) { + //if not a url + src = mediaDir + src; + } + mediaImageEl.src = src; + mediaImageEl.classList.add("active"); + mediaImageEl.style.visibility = "visible"; + } else { + mediaImageEl.style.visibility = "hidden"; + } +} + +function setCover(cover, size) { + if (cover) { + config.cover = cover; + size && (config.coverSize = size); + loadCover(cover); + } +} + +playerEl.addEventListener("canplay", (e) => { + removeLoading(currentEntry); + if (currentEntry.needsDuration) { + currentEntry.duration = playerEl.duration; + currentEntry.needsDuration = false; + } + if (autoPlay && !currentEntry.started) { + currentEntry.started = true; + if (!currentEntry.needsDuration) { + playerEl.currentTime = + currentEntry.previewStart - currentEntry.audioStart; + } + playerEl.play(); + } + if (!loadedFirst) { + autoPlay = true; + } +}); +playerEl.addEventListener("waiting", (e) => { + setLoading(currentEntry, 0); +}); +playerEl.addEventListener("play", (e) => { + if ( + currentEntry.preview && + playerEl.currentTime < currentEntry.previewStart - currentEntry.audioStart + ) { + playerEl.currentTime = currentEntry.previewStart - currentEntry.audioStart; + } + bigButtonEl.classList.add("pause"); + currentEntry.started = true; + currentEntry.trackEl.querySelector("button").classList.add("pause"); + if (currentEntry.type === "video") { + mediaVideoEl.play(); + } +}); +playerEl.addEventListener("pause", (e) => { + bigButtonEl.classList.remove("pause"); + currentEntry.trackEl.querySelector("button").classList.remove("pause"); + if (currentEntry.type === "video") { + mediaVideoEl.pause(); + } +}); +playerEl.addEventListener("volumechange", (e) => { + if (config.theme.nativePlayer) { + volume = e.target.volume; + localStorageSet("volume", volume); + } + if (currentEntry.type === "video") { + if (config.theme.nativePlayer) { + mediaVideoEl.volume = e.target.volume; + } else { + mediaVideoEl.volume = 0; + } + } +}); +mediaVideoEl.addEventListener("volumechange", (e) => { + if (currentEntry.type === "video" && config.theme.nativePlayer) { + volume = e.target.volume; + localStorageSet("volume", volume); + } +}); +playerEl.addEventListener("timeupdate", (e) => { + let buffer = 0.18; + if (!scrubberDragged) { + if (currentEntry.duration && !currentEntry.needsDuration) { + if (currentEntry.started) { + let time = e.target.currentTime; + if (time > currentEntry.previewEnd - currentEntry.audioStart - buffer) { + nextTrack(false); + } else { + let t = time / currentEntry.duration; + updatePreviewVolume(t); + updateScrubPosition(t); + } + } else { + } + } else { + let time = e.target.currentTime; + if (time > e.target.duration - buffer) { + nextTrack(false); + } + } + } +}); +playerEl.addEventListener("ended", (e) => { + if (!scrubberDragged) { + nextTrack(false); + } +}); +mediaVideoEl.addEventListener("ended", (e) => { + if (currentEntry.type === "video" && config.theme.nativePlayer) { + nextTrack(false); + } +}); + +bigButtonEl.addEventListener("click", (e) => { + playEntry(currentEntry); +}); + +volumeIconEl.addEventListener("click", (e) => { + toggleMute(); +}); + +let volumeDragged = false; +volumeTrackContainerEl.addEventListener("mousedown", (e) => { + volumeDragged = true; + scrubVolume(e.clientX); +}); + +let volumeHovered = false; +volumeContainerEl.addEventListener("mouseenter", (e) => { + if (!scrubberDragged) { + volumeHovered = true; + volumeContainerEl.classList.add("hover"); + } +}); +volumeContainerEl.addEventListener("mouseleave", (e) => { + volumeHovered = false; + if (!volumeDragged) { + volumeContainerEl.classList.remove("hover"); + } +}); + +function toggleMute() { + muted = !muted; + setVolume(volume, muted); +} + +function scrubVolume(x) { + if (volumeDragged) { + let trackX = volumeTrackEl.getBoundingClientRect().x; + x -= trackX; + let scrubberWidth = 6; + let trackWidth = volumeTrackEl.clientWidth; + let t = + 1 - + Math.max( + 0, + Math.min(1, (x - scrubberWidth / 2) / (trackWidth - scrubberWidth)) + ); + setVolume(t); + } +} + +function endVolumeScrub() { + if (!volumeHovered) { + volumeContainerEl.classList.remove("hover"); + } +} + +function setVolume(vol, mute = false) { + volume = vol; + localStorageSet("volume", volume); + localStorageSet("muted", mute ? 1 : 0); + vol = mute ? 0 : vol; + if (currentEntry.type === "video") { + if (config.theme.nativePlayer) { + mediaVideoEl.volume = volume; + playerEl.volume = 0; + } else { + mediaVideoEl.volume = 0; + playerEl.volume = vol; + } + } else { + playerEl.volume = vol; + } + let scrubberWidth = 6; + let trackWidth = volumeTrackEl.clientWidth; + volumeFillEl.style.left = (1 - vol) * (trackWidth - scrubberWidth) + "px"; + volumeIconEl.classList.remove(...volumeIcons); + if (vol <= 0) { + volumeIconEl.classList.add(volumeIcons[0]); + } else if (vol <= 0.5) { + volumeIconEl.classList.add(volumeIcons[1]); + } else { + volumeIconEl.classList.add(volumeIcons[2]); + } +} + +document.addEventListener("keydown", (e) => { + if (e.key === " " && e.target === document.body) { + playEntry(currentEntry); + e.preventDefault(); + } +}); + +let scrubberDragged = false; +scrubberTrackContainerEl.addEventListener("pointerdown", (e) => { + scrubberDragged = true; + currentEntry.started = true; + scrub(e.clientX); +}); +document.addEventListener("pointerup", (e) => { + if (scrubberDragged) { + scrubberDragged = false; + endScrub(); + } + if (volumeDragged) { + volumeDragged = false; + endVolumeScrub(); + } +}); +document.addEventListener("pointermove", (e) => { + scrub(e.clientX); + scrubVolume(e.clientX); +}); +document.addEventListener("pointercancel", (e) => { + console.log(e); +}); + +nextTrackEl.addEventListener("click", (e) => { + nextTrack(); +}); +prevTrackEl.addEventListener("click", (e) => { + prevTrack(); +}); +loopSwitchEl.addEventListener("click", (e) => { + loopSwitch(); +}); + +function updateTrackPreview() { + if (currentEntry.needsDuration) { + return; + } + //reset to prevent compounding width calculation issues + scrubberTrackPreviewEl.style.removeProperty("margin-left"); + scrubberTrackPreviewEl.style.removeProperty("width"); + scrubberEl.style.removeProperty("left"); + scrubberFillEl.style.removeProperty("width"); + if (currentEntry.preview) { + let fullWidth = scrubberEl.parentElement.parentElement.clientWidth; + scrubberTrackPreviewEl.style.marginLeft = + (currentEntry.previewStart / currentEntry.originalDuration) * 100 + "%"; + scrubberTrackPreviewEl.style.width = + ((currentEntry.previewEnd - currentEntry.previewStart) / + currentEntry.originalDuration) * + 100 + + "%"; + } +} + +function updatePreviewVolume(t) { + if (currentEntry.preview && currentEntry.previewFade && !muted) { + if (currentEntry.needsDuration) { + playEntry.volume = 0; + } else { + //rebase t to full (assumed) duration + t = currentEntry.audioStart + t * currentEntry.duration; + //clip to preview + t = Math.max( + currentEntry.previewStart, + Math.min(currentEntry.previewEnd, t) + ); + let inTime = t - currentEntry.previewStart; + let outTime = currentEntry.previewEnd - t; + playerEl.volume = + volume * Math.max(0, Math.min(1, inTime / 1, outTime / 1)); //1 second fade in/out + } + } +} + +//t: 0-1 value in relation to the actual audio start/end +function updateScrubPosition(t) { + if (currentEntry.needsDuration) { + return; + } + //rebase t to full (assumed) duration + t = currentEntry.audioStart + t * currentEntry.duration; + //clip to preview + t = Math.max(currentEntry.previewStart, Math.min(currentEntry.previewEnd, t)); + scrubPosition = (t - currentEntry.audioStart) / currentEntry.duration; + let time = t; + //rebase + t = t / currentEntry.originalDuration; + //relative to preview region + let scrubberT = + (t * currentEntry.originalDuration - currentEntry.previewStart) / + currentEntry.previewDuration; + let scrubberWidth = scrubberEl.clientWidth; + let trackWidth = scrubberEl.parentElement.clientWidth; + + scrubberEl.style.left = + ((scrubberT * (trackWidth - scrubberWidth)) / trackWidth) * 100 + "%"; + scrubberFillEl.style.width = scrubberT * 100 + "%"; + + //let time = timePosition * currentEntry.duration; + let timeText = ""; + if (currentEntry.preview) { + timeText += "(preview)
"; + } + timeText += `${toHMS(time)} / ${ + currentEntry.originalDuration + ? toHMS(currentEntry.originalDuration) + : "0:00" + }`; + controlsEl.querySelector(".time").innerHTML = timeText; +} + +function scrub(x) { + if (scrubberDragged) { + let trackX = scrubberTrackEl.getBoundingClientRect().x; + x -= trackX; + let scrubberWidth = scrubberEl.clientWidth; + let trackWidth = scrubberEl.parentElement.clientWidth; + let t = Math.max( + 0, + Math.min(1, (x - scrubberWidth / 2) / (trackWidth - scrubberWidth)) + ); + if (currentEntry.preview) { + //rebase t from preview to audio start/end + t = + (t * currentEntry.previewDuration + + (currentEntry.previewStart - currentEntry.audioStart)) / + currentEntry.duration; + } + updateScrubPosition(t); + } +} + +function endScrub() { + if (currentEntry.loading) { + return; + } + playerEl.currentTime = scrubPosition * playerEl.duration; + if (currentEntry.type === "video") { + mediaVideoEl.currentTime = scrubPosition * playerEl.duration; + } +} + +function canPlay(entry) { + return !entry.error && !entry.locked; +} + +function nextTrack(manual = true) { + if (!manual && loopMode === "track") { + loadEntry(currentEntry); + } else if (!manual && currentEntry.remainingLoops > 0) { + currentEntry.remainingLoops--; + updateLoops(currentEntry); + loadEntry(currentEntry); + } else { + let loop = manual || loopMode === "playlist"; + let idx = media.indexOf(currentEntry) + 1; + if (!loop && idx >= media.length) { + return; + } + let entry = media[mod(idx, media.length)]; + let i = 0; + while (!canPlay(entry) && i < media.length) { + i++; + idx++; + if (!loop && idx >= media.length) { + return; + } + entry = media[mod(idx, media.length)]; + } + loadEntry(entry); + } +} +function prevTrack() { + if ( + playerEl.currentTime > + currentEntry.previewStart - currentEntry.audioStart + 5 + ) { + playerEl.currentTime = currentEntry.previewStart - currentEntry.audioStart; + } else { + let idx = media.indexOf(currentEntry) - 1; + let entry = media[mod(idx, media.length)]; + let i = 0; + while (!canPlay(entry) && i < media.length) { + i++; + idx--; + entry = media[mod(idx, media.length)]; + } + loadEntry(entry); + } +} +function loopSwitch(mode) { + loopSwitchEl.classList.remove("icon-loop", "icon-loop-1"); + loopSwitchEl.style.opacity = 1; + if (mode) { + loopMode = mode; + } else { + if (loopMode === "none") { + loopMode = "playlist"; + } else if (loopMode === "playlist") { + loopMode = "track"; + } else { + loopMode = "none"; + } + } + + if (loopMode === "none") { + loopSwitchEl.classList.add("icon-loop"); + loopSwitchEl.style.opacity = 0.5; + loopSwitchEl.setAttribute("title", "loop off"); + } else if (loopMode === "playlist") { + loopSwitchEl.classList.add("icon-loop"); + loopSwitchEl.setAttribute("title", "loop playlist"); + } else { + loopSwitchEl.classList.add("icon-loop-1"); + loopSwitchEl.setAttribute("title", "loop track"); + } +} + +function setLoading(entry, delay = 150) { + if (entry.loading) { + delay = 0; + } + if (entry === currentEntry) { + bigButtonEl.classList.add("preloading"); + setTimeout(() => { + if (bigButtonEl.classList.contains("preloading")) { + bigButtonEl.classList.remove("preloading"); + bigButtonEl.classList.add("loading"); + } + }, delay); + } + entry.loading = true; +} + +function removeLoading(entry, track = false) { + if (entry === currentEntry) { + bigButtonEl.classList.remove("loading", "preloading"); + } + if (track) { + entry.trackEl + .querySelector("button") + .classList.remove("loading", "preloading"); + } + entry.loading = false; +} + +function updateLoops(entry) { + if (entry.loopCount > 0) { + let buttonEl = entry.trackEl.querySelector("button"); + buttonEl.setAttribute("loopcount", entry.remainingLoops); + // buttonEl.setAttribute('title', 'loop count'); + } + if (entry === currentEntry) { + if (entry.loopCount > 0) { + bigButtonEl.setAttribute("loopcount", entry.remainingLoops); + } else { + bigButtonEl.removeAttribute("loopcount"); + } + } +} +function resetLoops(entry) { + entry.remainingLoops = entry.loopCount; + updateLoops(entry); +} + +function loadEntry(entry) { + if (entry.error) { + return; + } + if (entry.locked) { + return; + } + if (entry === currentEntry) { + if (entry.type === "video") { + mediaVideoEl.currentTime = 0; + } else { + } + playerEl.currentTime = 0; + playerEl.play(); + return; + } + currentEntry = entry; + media.forEach((thisEntry) => { + thisEntry.trackEl.classList.remove("active"); + thisEntry.trackEl.querySelector("button").classList.remove("pause"); + if (thisEntry !== entry) { + resetLoops(thisEntry); + } + updateLoops(entry); + }); + if (!currentEntry.duration) { + currentEntry.duration = 999; + currentEntry.needsDuration = true; + } + updateTrackPreview(); + if (entry.preview) { + scrubberTrackContainerEl.classList.add("preview"); + updatePreviewVolume(0); + } else { + scrubberTrackContainerEl.classList.remove("preview"); + } + if (entry.loopCount > 0) { + bigButtonEl.classList.add("looped"); + } else { + bigButtonEl.classList.remove("looped"); + } + Array.from(mediaContainerEl.children).forEach((el) => { + el.classList.remove("active"); + }); + if (entry.type === "video") { + mediaVideoEl.src = entry.file; + mediaVideoEl.classList.add("active"); + mediaImageEl.style.visibility = "hidden"; + playerEl.classList.add("video"); + + if (config.theme.nativePlayer) { + mediaVideoEl.volume = volume; + playerEl.volume = 0; + } else { + mediaVideoEl.volume = 0; + playerEl.volume = volume; + } + } else { + mediaImageEl.classList.add("active"); + playerEl.classList.remove("video"); + + playerEl.volume = volume; + mediaVideoEl.pause(); + mediaVideoEl.removeAttribute("src"); + mediaVideoEl.load(); + + if (entry.cover) { + loadCover(entry.cover); + } else { + loadCover(config.cover); + } + } + playerEl.src = entry.file; + entry.started = false; + setLoading(currentEntry); + entry.trackEl.classList.add("active"); + controlsEl.querySelector(".title").innerHTML = entry.title; + if ( + entry.info && + (config.theme.infoStyle !== "overlaid-toggle" || entry.infoToggled) + ) { + mediaInfoEl.innerHTML = entry.info; + mediaInfoContainer.classList.add("active"); + } else { + mediaInfoEl.innerHTML = ""; + mediaInfoContainer.classList.remove("active"); + } +} + +function playEntry(entry) { + if (currentEntry === entry) { + if (entry.loading) { + return; + } + if (playerEl.paused) { + playerEl.play(); + entry.trackEl.querySelector("button").classList.add("pause"); + } else { + playerEl.pause(); + } + } else { + loadEntry(entry); + } +} + +function toHMS(secs) { + if (isNaN(secs)) { + return "00:00"; + } + + let sec_num = Math.max(0, Math.round(secs)); //flooring is more correct, but rounding gives nicer results due to playback event buffering + let hours = Math.floor(sec_num / 3600); + let minutes = Math.floor(sec_num / 60) % 60; + let seconds = sec_num % 60; + + return [hours, minutes, seconds] + .map((v) => (v < 10 ? "0" + v : v)) + .filter((v, i) => v !== "00" || i > 0) + .join(":"); +} + +function fromHMS(hms) { + if (!hms) { + return 0; + } + let groups = ("" + hms).split(":"); + if (groups.length < 1) { + return 0; + } + for (let i = 0; i < groups.length; i++) { + if (groups[i] === "") { + groups[i] = "0"; + continue; + } + if (isNaN(groups[i])) { + return 0; + } + } + let seconds = 0; + let minutes = 0; + let hours = 0; + seconds = parseFloat(groups[groups.length - 1]); + if (groups.length >= 2) { + minutes = parseFloat(groups[groups.length - 2]); + } + if (groups.length >= 3) { + hours = parseFloat(groups[groups.length - 3]); + } + + return (hours * 60 + minutes) * 60 + seconds; +} + +function mod(x, n) { + return ((x % n) + n) % n; +} diff --git a/src/common.css b/src/common.css deleted file mode 100644 index 753e966..0000000 --- a/src/common.css +++ /dev/null @@ -1,35 +0,0 @@ -blockquote { - border-left: 2px solid; - padding-left: 20px; -} - -hr { - border-width: 0; - border-bottom-width: 1px; -} -h1 { - font-size: 2em; -} -h2 { - font-size: 1.5em; -} -h3 { - font-size: 1.17em; -} -h4 { - font-size: 1em; -} -h5 { - font-size: 0.83em; -} -h6 { - font-size: 0.67em; -} - -ol { - list-style: decimal; -} - -ol, ul { - padding-left: 30px; -} \ No newline at end of file diff --git a/src/fonts.css b/src/fonts.css deleted file mode 100644 index 3f27cba..0000000 --- a/src/fonts.css +++ /dev/null @@ -1,172 +0,0 @@ -@font-face { - font-family: 'icons'; - src: url('fonts/icons.eot?7p075h'); - src: url('fonts/icons.eot?7p075h#iefix') format('embedded-opentype'), - url('fonts/icons.ttf?7p075h') format('truetype'), - url('fonts/icons.woff?7p075h') format('woff'), - url('fonts/icons.svg?7p075h#icons') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; -} - -[class^="icon-"], [class*=" icon-"] { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'icons' !important; - speak: never; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - font-size: 20px; - - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-plus-big:before { - content: "\2b"; -} -.icon-drop-big:before { - content: "\2b07"; -} -.icon-loading-big:before { - content: "\25cc"; -} -.icon-loop-edit:before { - content: "\1f504"; -} -.icon-loop-1:before { - content: "\1f502"; -} -.icon-loop:before { - content: "\1f501"; -} -.icon-play-loop:before { - content: "\27f2"; -} -.icon-duration-preview:before { - content: "\1f55b"; -} -.icon-duration:before { - content: "\1f553"; -} -.icon-duration-dot:before { - content: "\23f2"; -} -.icon-end:before { - content: "\23f5"; -} -.icon-start:before { - content: "\23f4"; -} -.icon-cut:before { - content: "\2700"; -} -.icon-marker-help:before { - content: "\2753"; -} -.icon-marker-info:before { - content: "\1f6c8"; -} -.icon-marker-warning:before { - content: "\2757"; -} -.icon-lock-file:before { - content: "\1f513"; -} -.icon-lock:before { - content: "\1f512"; -} -.icon-config:before { - content: "\1f4c3"; -} -.icon-title:before { - content: "\1e6e"; -} -.icon-edit-info:before { - content: "\1f4dd"; -} -.icon-info:before { - content: "\1f5c9"; -} -.icon-lyrics:before { - content: "\1f3bc"; -} -.icon-pull:before { - content: "\2913"; -} -.icon-text:before { - content: "\1f5b9"; -} -.icon-error:before { - content: "\24e7"; -} -.icon-exclamation:before { - content: "\21"; -} -.icon-unknown:before { - content: "\3f"; -} -.icon-warning:before { - content: "\26a0"; -} -.icon-x:before { - content: "\d7"; -} -.icon-cover:before { - content: "\1f4bd"; -} -.icon-star:before { - content: "\2605"; -} -.icon-star-outline:before { - content: "\2606"; -} -.icon-grab:before { - content: "\2630"; -} -.icon-audio:before { - content: "\266b"; -} -.icon-image:before { - content: "\1f5bc"; -} -.icon-trash:before { - content: "\1f5d1"; -} -.icon-video:before { - content: "\1f4f9"; -} -.icon-dots:before { - content: "\22ef"; -} -.icon-loading:before { - content: "\1f506"; -} -.icon-next:before { - content: "\23ed"; -} -.icon-previous:before { - content: "\23ee"; -} -.icon-volume-high:before { - content: "\1f50a"; -} -.icon-volume-low:before { - content: "\1f509"; -} -.icon-volume-none:before { - content: "\1f508"; -} -.icon-volume-x:before { - content: "\1f507"; -} -.icon-pause:before { - content: "\23f8"; -} -.icon-play:before { - content: "\25b6"; -} diff --git a/src/fonts/icons.eot b/src/fonts/icons.eot deleted file mode 100644 index ec320f33958204390242739fc93fe6fec128cefc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10550 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 diff --git a/src/fonts/icons.svg b/src/fonts/icons.svg deleted file mode 100644 index 3d739be..0000000 --- a/src/fonts/icons.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/fonts/icons.ttf b/src/fonts/icons.ttf deleted file mode 100644 index 11d86ba9a0b4f030cc8e60945d7e7adcbc5adb18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10392 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 diff --git a/src/fonts/rubikNumbers-edit.woff2 b/src/fonts/rubikNumbers-edit.woff2 deleted file mode 100644 index 1e2bb9dd7bd2e3b787778103c06effc6b3aea6fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3388 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