diff --git a/.gitignore b/.gitignore
index 8c2c770..3054b59 100644
--- a/.gitignore
+++ b/.gitignore
@@ -124,4 +124,3 @@ public/css
public/js
docker-compose.yml
dump
-data
diff --git a/README.md b/README.md
index af9a072..bfc29e6 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
MusicTopus est une application Web (que vous pouvez auto-héberger) et un site Web (sur lequel vous pouvez créer un compte) permettant de gérer votre liste des CDs et Vinyles et de l'utiliser facilement n'importe où.
-Le code source est publié sous licence libre [GNU GPL-3.0-or-later](LICENSE) et est disponible sur [forge.darkou.fr](https://forge.darkou.fr/contact/MusicTopus).
+Le code source est publié sous licence libre [GNU GPL-3.0-or-later](LICENSE) et est disponible sur [git.darkou.fr](https://git.darkou.fr/dbroqua/MusicTopus).
## Utilisation
@@ -33,7 +33,7 @@ En mode standalone il vous faudra :
Quelque que soit la méthode, la première étape est de cloner le projet :
```bash
-git clone https://forge.darkou.fr/contact/MusicTopus.git
+git clone https://git.darkou.fr/dbroqua/MusicTopus.git
```
### Installation
@@ -240,5 +240,5 @@ MAIL_TO # Adresse mail du contact qui recevra les messages de la page "nous cont
## Contributeurs
-- [DarKou](https://darkou.link/) (développeur principal du projet)
-- [Brunus](https://www.brunuslab.net/) (Logo et fournisseur d'idées 😉 )
+- Damien Broqua (développeur principal du projet)
+- Brunus (Logo et fournisseur d'idées :wink: )
diff --git a/docker-compose.yml.dev b/docker-compose.yml.dev
index d33ff77..6b6a0d5 100644
--- a/docker-compose.yml.dev
+++ b/docker-compose.yml.dev
@@ -1,62 +1,61 @@
version: "2.4"
services:
- musictopus-www:
- container_name: musictopus-www
- image: "node:18"
- restart: always
- user: "node"
- working_dir: /home/node/app
- command: >
- bash -c "
- yarn install &&
- yarn watch"
- volumes:
- - ./:/home/node/app
- - /home/node/node_modules
- ports:
- - 3001:3001
- depends_on:
- - musictopus-db
- environment:
- NODE_ENV: ${NODE_ENV}
- PORT: ${PORT}
- MONGODB_URI: ${MONGODB_URI}
- SECRET: ${SECRET}
- DISCOGS_TOKEN: ${DISCOGS_TOKEN}
- FORMSPREE_ID: ${FORMSPREE_ID}
- MATOMO_URL: ${MATOMO_URL}
- MATOMO_ID: ${MATOMO_ID}
- SITE_NAME: ${SITE_NAME}
- AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
- S3_BASEFOLDER: ${S3_BASEFOLDER}
- S3_BUCKET: ${S3_BUCKET}
- S3_ENDPOINT: ${S3_ENDPOINT}
- S3_SIGNATURE: ${S3_SIGNATURE}
- JOBS_HEADER_KEY: ${JOBS_HEADER_KEY}
- JOBS_HEADER_VALUE: ${JOBS_HEADER_VALUE}
- REGISTRATION_OPEN: ${REGISTRATION_OPEN}
- MAIL_METHOD: ${MAIL_METHOD}
- MAIL_HOST: ${MAIL_HOST}
- MAIL_PORT: ${MAIL_PORT}
- MAIL_USER: ${MAIL_USER}
- MAIL_PASSWORD: ${MAIL_PASSWORD}
- MAIL_TO: ${MAIL_TO}
- networks:
- - musictopus
- musictopus-db:
- container_name: musictopus-db
- image: mongo:4.4
- restart: always
- ports:
- - 27617:27017
- networks:
- - musictopus
- volumes:
- - ./dump:/dump
- - ./data:/data/db
+ musictopus-www:
+ container_name: musictopus-www
+ image: "node:18"
+ restart: always
+ user: "node"
+ working_dir: /home/node/app
+ command: >
+ bash -c "
+ yarn install &&
+ yarn watch"
+ volumes:
+ - ./:/home/node/app
+ - /home/node/node_modules
+ ports:
+ - 3001:3001
+ depends_on:
+ - musictopus-db
+ environment:
+ NODE_ENV: ${NODE_ENV}
+ PORT: ${PORT}
+ MONGODB_URI: ${MONGODB_URI}
+ SECRET: ${SECRET}
+ DISCOGS_TOKEN: ${DISCOGS_TOKEN}
+ FORMSPREE_ID: ${FORMSPREE_ID}
+ MATOMO_URL: ${MATOMO_URL}
+ MATOMO_ID: ${MATOMO_ID}
+ SITE_NAME: ${SITE_NAME}
+ AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
+ AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
+ S3_BASEFOLDER: ${S3_BASEFOLDER}
+ S3_BUCKET: ${S3_BUCKET}
+ S3_ENDPOINT: ${S3_ENDPOINT}
+ S3_SIGNATURE: ${S3_SIGNATURE}
+ JOBS_HEADER_KEY: ${JOBS_HEADER_KEY}
+ JOBS_HEADER_VALUE: ${JOBS_HEADER_VALUE}
+ REGISTRATION_OPEN: ${REGISTRATION_OPEN}
+ MAIL_METHOD: ${MAIL_METHOD}
+ MAIL_HOST: ${MAIL_HOST}
+ MAIL_PORT: ${MAIL_PORT}
+ MAIL_USER: ${MAIL_USER}
+ MAIL_PASSWORD: ${MAIL_PASSWORD}
+ MAIL_TO: ${MAIL_TO}
+ networks:
+ - musictopus
+ musictopus-db:
+ container_name: musictopus-db
+ image: mongo:4.4
+ restart: always
+ ports:
+ - 27617:27017
+ networks:
+ - musictopus
+ volumes:
+ - ./dump:/dump
networks:
- musictopus:
- driver: bridge
+ musictopus:
+ driver: bridge
diff --git a/fontello.json b/fontello.json
index efb7b52..11e03d9 100644
--- a/fontello.json
+++ b/fontello.json
@@ -6,12 +6,6 @@
"units_per_em": 1000,
"ascent": 850,
"glyphs": [
- {
- "uid": "ca90da02d2c6a3183f2458e4dc416285",
- "css": "adjust",
- "code": 59408,
- "src": "fontawesome"
- },
{
"uid": "44e04715aecbca7f266a17d5a7863c68",
"css": "plus",
diff --git a/gulpfile.js b/gulpfile.js
index fe1fe6f..8e76f38 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -10,7 +10,6 @@ const babel = require("gulp-babel");
const sourceJs = "javascripts/**/*.js";
const sourceRemoteJS = [
"./node_modules/vue/dist/vue.global.prod.js",
- "./node_modules/chart.js/dist/chart.umd.js",
"./node_modules/axios/dist/axios.min.js",
];
diff --git a/javascripts/ajouter-un-album.js b/javascripts/ajouter-un-album.js
index 3bce60c..02f50d4 100644
--- a/javascripts/ajouter-un-album.js
+++ b/javascripts/ajouter-un-album.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
Vue.createApp({
data() {
return {
@@ -79,12 +78,6 @@ Vue.createApp({
],
};
},
- created() {
- window.addEventListener("keydown", this.keyDown);
- },
- destroyed() {
- window.removeEventListener("keydown", this.keyDown);
- },
methods: {
search(event) {
event.preventDefault();
@@ -178,15 +171,12 @@ Vue.createApp({
this.submitting = true;
return axios
- .post(`/api/v1/${action}`, {
+ .post("/api/v1/albums", {
album: this.details,
share: this.share,
})
.then(() => {
- window.location.href =
- action === "albums"
- ? "/ma-collection"
- : "/ma-liste-de-souhaits";
+ window.location.href = "/ma-collection";
})
.catch((err) => {
this.submitting = false;
@@ -199,13 +189,5 @@ Vue.createApp({
orderedItems(items) {
return items.sort();
},
- keyDown(event) {
- const keycode = event.code;
-
- if (this.modalIsVisible && keycode === "Escape") {
- event.preventDefault();
- this.modalIsVisible = false;
- }
- },
},
}).mount("#ajouter-album");
diff --git a/javascripts/collection.js b/javascripts/collection.js
index 9e222d2..21ff703 100644
--- a/javascripts/collection.js
+++ b/javascripts/collection.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
Vue.createApp({
data() {
return {
@@ -8,8 +7,8 @@ Vue.createApp({
total: 0,
// eslint-disable-next-line no-undef
page: query.page || 1,
- limit: 16,
totalPages: 1,
+ limit: 16,
artist: "",
format: "",
year: "",
@@ -35,18 +34,10 @@ Vue.createApp({
},
created() {
this.fetch();
-
- window.addEventListener("keydown", this.keyDown);
- },
- destroyed() {
- window.removeEventListener("keydown", this.keyDown);
},
methods: {
formatParams(param) {
- return param
- .replace("&", "%26")
- .replace("+", "%2B")
- .replace('"', "%22");
+ return param.replace("&", "%26").replace("+", "%2B");
},
fetch() {
this.loading = true;
@@ -66,7 +57,7 @@ Vue.createApp({
const [key, value] = entry;
switch (key) {
case "artists_sort":
- this.artist = value.replaceAll('"', "%22");
+ this.artist = value;
break;
default:
if (["order", "sort"].indexOf(key) !== -1) {
@@ -78,7 +69,7 @@ Vue.createApp({
this.sortOrder = `${sortOrder.sort}-${sortOrder.order}`;
- let url = `/api/v1/${action}?page=${this.page}&sort=${this.sort}&order=${this.order}`;
+ let url = `/api/v1/albums?page=${this.page}&limit=${this.limit}&sort=${this.sort}&order=${this.order}`;
if (this.artist) {
url += `&artist=${this.formatParams(this.artist)}`;
}
@@ -103,7 +94,6 @@ Vue.createApp({
.get(url)
.then((response) => {
this.items = response.data.rows;
- this.limit = response.data.limit;
this.total = response.data.count || 0;
this.totalPages =
parseInt(response.data.count / this.limit, 10) +
@@ -190,7 +180,7 @@ Vue.createApp({
return false;
}
return axios
- .delete(`/api/v1/${action}/${this.itemId}`)
+ .delete(`/api/v1/albums/${this.itemId}`)
.then(() => {
this.fetch();
})
@@ -250,16 +240,5 @@ Vue.createApp({
return render;
},
- keyDown(event) {
- const keycode = event.code;
- if (this.showModalDelete && keycode === "Escape") {
- event.preventDefault();
- this.showModalDelete = false;
- }
- if (this.showModalShare && keycode === "Escape") {
- event.preventDefault();
- this.showModalShare = false;
- }
- },
},
}).mount("#collection");
diff --git a/javascripts/mon-compte/index.js b/javascripts/mon-compte/index.js
index 464c8b6..2fb6f0f 100644
--- a/javascripts/mon-compte/index.js
+++ b/javascripts/mon-compte/index.js
@@ -1,3 +1,4 @@
+
if (typeof email !== "undefined" && typeof username !== "undefined") {
Vue.createApp({
data() {
@@ -11,21 +12,15 @@ if (typeof email !== "undefined" && typeof username !== "undefined") {
password: "",
passwordConfirm: "",
// eslint-disable-next-line no-undef
- pagination,
- // eslint-disable-next-line no-undef
mastodon: mastodon || {
publish: false,
url: "",
token: "",
message:
"Je viens d'ajouter {artist} - {album} à ma collection !",
- wantlist:
- "Je viens d'ajouter {artist} - {album} à ma liste de souhaits !",
},
- delete: false,
},
loading: false,
- deleting: false,
errors: [],
};
},
@@ -62,13 +57,8 @@ if (typeof email !== "undefined" && typeof username !== "undefined") {
// eslint-disable-next-line no-unused-vars
async updateProfil() {
this.errors = [];
- const {
- oldPassword,
- password,
- passwordConfirm,
- mastodon,
- pagination,
- } = this.formData;
+ const { oldPassword, password, passwordConfirm, mastodon } =
+ this.formData;
if (password && !oldPassword) {
this.errors.push("emptyPassword");
@@ -93,8 +83,6 @@ if (typeof email !== "undefined" && typeof username !== "undefined") {
data.oldPassword = oldPassword;
}
- data.pagination = pagination;
-
try {
await axios.patch(`/api/v1/me`, data);
@@ -110,20 +98,6 @@ if (typeof email !== "undefined" && typeof username !== "undefined") {
return true;
},
- async deleteAccount() {
- try {
- await axios.delete(`/api/v1/me`);
-
- showToastr("Compte supprimé", true);
-
- window.location.href = "/se-deconnecter";
- } catch (err) {
- showToastr(
- err.response?.data?.message ||
- "Impossible de mettre à jour votre profil"
- );
- }
- },
},
}).mount("#mon-compte");
}
diff --git a/javascripts/mon-compte/ma-collection/details.js b/javascripts/mon-compte/ma-collection/details.js
index 2297bdd..af0414f 100644
--- a/javascripts/mon-compte/ma-collection/details.js
+++ b/javascripts/mon-compte/ma-collection/details.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
if (typeof item !== "undefined") {
Vue.createApp({
data() {
@@ -26,10 +25,10 @@ if (typeof item !== "undefined") {
this.setTrackList();
this.setIdentifiers();
- window.addEventListener("keydown", this.keyDown);
+ window.addEventListener("keydown", this.changeImage);
},
destroyed() {
- window.removeEventListener("keydown", this.keyDown);
+ window.removeEventListener("keydown", this.changeImage);
},
watch: {
shareMessage(message) {
@@ -41,8 +40,6 @@ if (typeof item !== "undefined") {
this.shareMessageTransformed = message
.replaceAll("{artist}", this.item.artists[0].name)
.replaceAll("{format}", this.item.formats[0].name)
- .replaceAll("{genres}", this.item.genres.join(", "))
- .replaceAll("{styles}", this.item.styles.join(", "))
.replaceAll("{year}", this.item.year)
.replaceAll("{video}", video)
.replaceAll("{album}", this.item.title);
@@ -142,12 +139,12 @@ if (typeof item !== "undefined") {
this.setImage();
},
changeImage(event) {
- event.preventDefault();
const direction = event.code;
if (
+ this.modalIsVisible &&
["ArrowRight", "ArrowLeft", "Escape"].indexOf(direction) !==
- -1
+ -1
) {
switch (direction) {
case "ArrowRight":
@@ -162,20 +159,6 @@ if (typeof item !== "undefined") {
return true;
},
- keyDown(event) {
- const keycode = event.code;
- if (this.modalIsVisible) {
- this.changeImage(event);
- }
- if (this.showModalDelete && keycode === "Escape") {
- event.preventDefault();
- this.showModalDelete = false;
- }
- if (this.showModalShare && keycode === "Escape") {
- event.preventDefault();
- this.showModalShare = false;
- }
- },
showAllIdentifiers() {
this.identifiersMode = "all";
this.setIdentifiers();
@@ -197,7 +180,7 @@ if (typeof item !== "undefined") {
updateItem() {
showToastr("Mise à jour en cours…", true);
axios
- .patch(`/api/v1/${action}/${this.item._id}`)
+ .patch(`/api/v1/albums/${this.item._id}`)
.then((res) => {
showToastr("Mise à jour réalisée avec succès", true);
this.item = res.data;
@@ -216,12 +199,9 @@ if (typeof item !== "undefined") {
},
deleteItem() {
axios
- .delete(`/api/v1/${action}/${this.item._id}`)
+ .delete(`/api/v1/albums/${this.item._id}`)
.then(() => {
- window.location.href =
- action === "albums"
- ? "/ma-collection"
- : "/ma-liste-de-souhaits";
+ window.location.href = "/ma-collection";
})
.catch((err) => {
showToastr(
@@ -242,7 +222,7 @@ if (typeof item !== "undefined") {
}
this.shareSubmiting = true;
axios
- .post(`/api/v1/${action}/${this.item._id}/share`, {
+ .post(`/api/v1/albums/${this.item._id}/share`, {
message: this.shareMessageTransformed,
})
.then(() => {
diff --git a/javascripts/mon-compte/ma-collection/exporter.js b/javascripts/mon-compte/ma-collection/exporter.js
index 90ef809..b391436 100644
--- a/javascripts/mon-compte/ma-collection/exporter.js
+++ b/javascripts/mon-compte/ma-collection/exporter.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
Vue.createApp({
data() {
return {
@@ -11,10 +10,7 @@ Vue.createApp({
exportCollection(event) {
event.preventDefault();
- window.open(
- `/api/v1/${action}?exportFormat=${this.format}`,
- "_blank"
- );
+ window.open(`/api/v1/albums?exportFormat=${this.format}`, "_blank");
},
},
}).mount("#exporter");
diff --git a/javascripts/mon-compte/ma-collection/importer.js b/javascripts/mon-compte/ma-collection/importer.js
index 6103bfa..08f2b6f 100644
--- a/javascripts/mon-compte/ma-collection/importer.js
+++ b/javascripts/mon-compte/ma-collection/importer.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-undef */
Vue.createApp({
data() {
return {
@@ -67,11 +66,11 @@ Vue.createApp({
try {
const res = await axios.get(
- `/api/v1/${action}?discogsId=${release_id}`
+ `/api/v1/albums?discogsId=${release_id}`
);
if (res.status === 204) {
- await axios.post(`/api/v1/${action}`, {
+ await axios.post("/api/v1/albums", {
discogsId: release_id,
share: false,
});
diff --git a/javascripts/theme.js b/javascripts/theme.js
index e39836b..4625673 100644
--- a/javascripts/theme.js
+++ b/javascripts/theme.js
@@ -1,3 +1,19 @@
+/**
+ * Fonction permettant de sauvegarder dans le stockage local le choix du thème
+ * @param {String} scheme
+ */
+function saveColorScheme(scheme) {
+ localStorage.setItem("theme", scheme);
+}
+
+/**
+ * Fonction permettant de changer le thème du site
+ * @param {String} scheme
+ */
+function setColorScheme(scheme) {
+ document.documentElement.setAttribute("data-theme", scheme);
+}
+
/**
* Fonction permettant de récupérer le thème du système
* @return {String}
@@ -12,56 +28,10 @@ function getPreferredColorScheme() {
return "light";
}
-/**
- * @param {String} scheme
- */
-function setPictoOnMenu(scheme) {
- document.querySelectorAll(".icon-theme").forEach((item) => {
- item.classList.add("hidden");
- });
- document
- .querySelector(`.icon-theme.theme-${scheme}`)
- .classList.remove("hidden");
-}
-
-/**
- * Fonction permettant de sauvegarder dans le stockage local le choix du thème
- * @param {String} scheme
- */
-function saveColorScheme(scheme) {
- localStorage.setItem("theme", scheme);
-}
-
-/**
- * Fonction permettant de changer le thème du site
- * @param {String} scheme
- */
-function setColorScheme(scheme) {
- document.documentElement.setAttribute(
- "data-theme",
- scheme === "system" ? getPreferredColorScheme() : scheme
- );
-
- setPictoOnMenu(scheme);
-}
-
-/**
- * Fonction déclenchée lorsqu'un utilisateur clique sur un bouton dans le menu déroulant
- * @param {Object} e
- */
-function changeTheme(e) {
- e.preventDefault();
-
- const scheme = this.dataset.value;
-
- saveColorScheme(scheme);
- setColorScheme(scheme);
-}
-
// INFO: On place un event sur le bouton
-const buttonsTheme = document.getElementsByClassName("theme");
-// INFO: On récupère du local storage (ou des préférences navigateur) le thème actuel
-const currentTheme = localStorage.getItem("theme") || getPreferredColorScheme();
+const toggleSwitch = document.querySelector(
+ '.theme-switch input[type="checkbox"]'
+);
/**
* Event permettant de détecter les changements de thème du système
@@ -74,14 +44,28 @@ if (window.matchMedia) {
if (selectedColorScheme === "system") {
const preferedColorScheme = getPreferredColorScheme();
setColorScheme(preferedColorScheme);
+
+ toggleSwitch.checked = preferedColorScheme === "dark";
}
});
}
+const currentTheme = localStorage.getItem("theme") || getPreferredColorScheme();
+
// INFO: Au chargement de la page on détecte le thème à charger
setColorScheme(currentTheme);
-// INFO: On place un event au click sur chacun des boutons du menu
-for (let i = 0; i < buttonsTheme.length; i += 1) {
- buttonsTheme[i].addEventListener("click", changeTheme, false);
-}
+toggleSwitch.checked = currentTheme === "dark";
+
+toggleSwitch.addEventListener(
+ "change",
+ (e) => {
+ e.preventDefault();
+
+ const scheme = e.target.checked ? "dark" : "light";
+
+ saveColorScheme(scheme);
+ setColorScheme(scheme);
+ },
+ false
+);
diff --git a/package-lock.json b/package-lock.json
index 64fdc92..1a49ca9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,6 @@
"@babel/core": "^7.17.2",
"@babel/preset-env": "^7.16.11",
"axios": "^0.26.0",
- "chart.js": "^4.4.1",
"connect-ensure-login": "^0.1.1",
"connect-flash": "^0.1.1",
"connect-mongo": "^4.6.0",
@@ -5258,11 +5257,6 @@
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"license": "MIT"
},
- "node_modules/@kurkle/color": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz",
- "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
- },
"node_modules/@mongodb-js/saslprep": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz",
@@ -7919,17 +7913,6 @@
"node": ">=4"
}
},
- "node_modules/chart.js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz",
- "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==",
- "dependencies": {
- "@kurkle/color": "^0.3.0"
- },
- "engines": {
- "pnpm": ">=7"
- }
- },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
diff --git a/package.json b/package.json
index b9cba5b..e8815fb 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,7 @@
},
"repository": {
"type": "git",
- "url": "git@forge.darkou.fr:contact/MusicTopus.git"
+ "url": "git@git.darkou.fr:dbroqua/MusicTopus.git"
},
"author": {
"name": "Damien Broqua",
@@ -45,7 +45,6 @@
"@babel/core": "^7.17.2",
"@babel/preset-env": "^7.16.11",
"axios": "^0.26.0",
- "chart.js": "^4.4.1",
"connect-ensure-login": "^0.1.1",
"connect-flash": "^0.1.1",
"connect-mongo": "^4.6.0",
diff --git a/public/500.html b/public/500.html
index 0de99d6..76eb123 100644
--- a/public/500.html
+++ b/public/500.html
@@ -17,7 +17,7 @@
-
+
Nous sommes désolé mais quelque chose a mal tourné de notre côté.
diff --git a/public/font/icon.eot b/public/font/icon.eot
index 20368e4..424368f 100644
Binary files a/public/font/icon.eot and b/public/font/icon.eot differ
diff --git a/public/font/icon.svg b/public/font/icon.svg
index 04a06e1..52ad914 100644
--- a/public/font/icon.svg
+++ b/public/font/icon.svg
@@ -1,7 +1,7 @@