deps: upgrade and remove spotify for now

This commit is contained in:
Julien Calixte
2026-01-24 21:19:32 +01:00
parent c433d0d7bf
commit ac8d6a69a2
11 changed files with 152 additions and 797 deletions

View File

@@ -1,643 +0,0 @@
# Guide de Développement - Application Binôme (Stack Moderne)
## 🚀 Vue d'Ensemble
L'application **Binôme** est maintenant basée sur une stack moderne Vue 3 + Vite + Pinia, optimisée pour le développement et la performance.
### Stack Technique
- **Frontend** : Vue 3.5.17 + TypeScript
- **Build Tool** : Vite 7.0.5
- **State Management** : Pinia 3.0.3 avec persistence
- **Routing** : Vue Router 4.5.1
- **Styling** : SCSS avec variables globales
- **PWA** : vite-plugin-pwa
- **Package Manager** : pnpm
- **Node.js** : v20 (LTS)
---
## 🛠️ Prérequis et Installation
### Prérequis Système
```bash
# Node.js version 20 (LTS)
node --version # doit afficher v20.x.x
# pnpm installé globalement
npm install -g pnpm@latest
```
### Installation du Projet
```bash
# Cloner le projet
git clone <repository-url>
cd binome
# Installer les dépendances
pnpm install
# Vérifier l'installation
pnpm dev
```
---
## 📜 Scripts Disponibles
### Scripts de Développement
```bash
# Démarrer le serveur de développement
pnpm dev
# → Lance Vite dev server sur http://localhost:8080
# → Hot Module Replacement (HMR) activé
# → Ouverture automatique du navigateur
# Prévisualiser la build de production
pnpm preview
# → Sert la version buildée localement
# → Utile pour tester avant déploiement
```
### Scripts de Build
```bash
# Build de production
pnpm build
# → Génère le dossier /dist optimisé
# → Minification et tree-shaking automatiques
# → Source maps incluses
# Analyser la build
pnpm build --analyze
# → Affiche la taille des bundles
# → Identifie les dépendances lourdes
```
### Scripts de Qualité
```bash
# Linter ESLint
pnpm lint
# → Vérifie et corrige automatiquement le code
# → Supporte .vue, .ts, .js files
# → Configuration dans .eslintrc.js
# Type checking TypeScript
pnpm type-check
# → Vérifie les types sans compilation
# → Utile en CI/CD
```
---
## 🏗️ Architecture du Projet
### Structure des Dossiers
```
src/
├── assets/ # Ressources statiques (SVG, images)
├── components/ # Composants Vue réutilisables
│ ├── ChilledMusic.vue
│ ├── DevSession.vue
│ ├── IntervalInput.vue
│ ├── SpotifyMusic.vue
│ ├── SWNewVersion.vue
│ └── ZoneMusic.vue
├── hooks/ # Composables Vue 3
│ ├── useInterval.ts
│ ├── useMusic.ts
│ ├── useSpotify.ts
│ ├── useTimer.ts
│ └── useWakeLock.ts
├── lib/ # Bibliothèques externes
│ └── spotify-player.js # ⚠️ CRITIQUE - Ne pas modifier
├── locales/ # Fichiers de traduction i18n
│ ├── en.json
│ └── fr.json
├── router/ # Configuration Vue Router
│ └── index.ts
├── store/ # Store Pinia
│ └── index.ts
├── styles/ # Styles SCSS globaux
│ ├── app.scss
│ ├── plume.scss
│ └── variables.scss
├── types/ # Types TypeScript
│ └── StopwatchState.ts
├── utils/ # Utilitaires
│ ├── notification.ts
│ └── spotify.ts
├── views/ # Pages/Vues principales
│ ├── Home.vue
│ ├── Privacy.vue
│ └── SpotifyCallback.vue
├── App.vue # Composant racine
├── i18n.ts # Configuration internationalisation
└── main.ts # Point d'entrée de l'application
```
---
## 🎯 Patterns de Développement
### 1. Composants Vue 3
#### Composition API avec `<script setup>`
```vue
<template>
<div class="my-component">
<h2>{{ title }}</h2>
<button @click="increment">Count: {{ count }}</button>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
// Props avec TypeScript
interface Props {
title: string
initialCount?: number
}
const props = withDefaults(defineProps<Props>(), {
initialCount: 0
})
// État réactif
const count = ref(props.initialCount)
// Méthodes
const increment = () => {
count.value++
}
// Émissions d'événements
const emit = defineEmits<{
countChanged: [value: number]
}>()
// Watcher
watch(count, (newValue) => {
emit('countChanged', newValue)
})
</script>
<style lang="scss" scoped>
.my-component {
padding: 1rem;
border: 1px solid $primary-color; // Variable SCSS globale
}
</style>
```
#### Composables (Hooks Personnalisés)
```typescript
// hooks/useCounter.ts
import { ref, computed } from 'vue'
export function useCounter(initialValue = 0) {
const count = ref(initialValue)
const increment = () => count.value++
const decrement = () => count.value--
const reset = () => count.value = initialValue
const isEven = computed(() => count.value % 2 === 0)
return {
count: readonly(count),
increment,
decrement,
reset,
isEven
}
}
```
### 2. Store Pinia
#### Définition du Store
```typescript
// store/modules/timer.ts
import { defineStore } from 'pinia'
interface TimerState {
currentTime: number
isRunning: boolean
interval: number
}
export const useTimerStore = defineStore('timer', {
state: (): TimerState => ({
currentTime: 0,
isRunning: false,
interval: 5
}),
getters: {
formattedTime: (state) => {
const minutes = Math.floor(state.currentTime / 60)
const seconds = state.currentTime % 60
return `${minutes}:${seconds.toString().padStart(2, '0')}`
}
},
actions: {
startTimer() {
this.isRunning = true
},
stopTimer() {
this.isRunning = false
},
resetTimer() {
this.currentTime = 0
this.isRunning = false
}
},
// Persistence automatique
persist: {
key: 'timer-store',
storage: localStorage,
paths: ['interval'] // Seuls certains champs
}
})
```
#### Utilisation dans les Composants
```vue
<script setup lang="ts">
import { useTimerStore } from '@/store'
const timerStore = useTimerStore()
// Accès direct aux propriétés réactives
const { currentTime, isRunning, formattedTime } = storeToRefs(timerStore)
// Accès aux actions
const { startTimer, stopTimer, resetTimer } = timerStore
</script>
```
### 3. Internationalisation (i18n)
#### Utilisation dans les Composants
```vue
<template>
<div>
<h1>{{ $t('welcome.title') }}</h1>
<p>{{ $t('welcome.message', { name: userName }) }}</p>
</div>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t, locale } = useI18n()
// Changement de langue
const switchLanguage = (lang: string) => {
locale.value = lang
}
</script>
```
#### Ajout de Nouvelles Traductions
```json
// locales/fr.json
{
"welcome": {
"title": "Bienvenue dans Binôme",
"message": "Bonjour {name}, prêt pour une session de programmation ?"
}
}
```
---
## 🎨 Styling et Thèmes
### Variables SCSS Globales
```scss
// styles/variables.scss
$primary-color: #f8efba;
$secondary-color: #333;
$font-family: 'Arial', sans-serif;
$border-radius: 8px;
$spacing-unit: 1rem;
// Breakpoints
$mobile: 768px;
$tablet: 1024px;
$desktop: 1200px;
```
### Utilisation dans les Composants
```vue
<style lang="scss" scoped>
.component {
background-color: $primary-color;
padding: $spacing-unit;
border-radius: $border-radius;
@media (max-width: $mobile) {
padding: $spacing-unit / 2;
}
}
</style>
```
---
## 🔧 Configuration de Développement
### Vite Configuration ([`vite.config.ts`](vite.config.ts:1))
```typescript
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { VitePWA } from 'vite-plugin-pwa'
export default defineConfig({
plugins: [
vue(),
VitePWA({
registerType: 'autoUpdate',
workbox: {
skipWaiting: true,
clientsClaim: true
}
})
],
resolve: {
alias: {
'@': resolve(__dirname, 'src')
}
},
server: {
port: 8080,
open: true,
hmr: true
}
})
```
### TypeScript Configuration
```json
// tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"moduleResolution": "node",
"strict": true,
"paths": {
"@/*": ["src/*"]
}
}
}
```
---
## 🧪 Tests et Qualité
### ESLint Configuration
```javascript
// .eslintrc.js
module.exports = {
extends: [
'plugin:vue/vue3-essential',
'eslint:recommended',
'@vue/typescript/recommended'
],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
}
}
```
### Commandes de Vérification
```bash
# Vérification complète avant commit
pnpm lint && pnpm type-check && pnpm build
```
---
## 📱 PWA et Service Worker
### Configuration PWA
L'application est configurée comme PWA avec :
- **Manifest** : Icônes, couleurs, mode d'affichage
- **Service Worker** : Cache automatique, mise à jour en arrière-plan
- **Raccourcis** : Accès rapide aux fonctionnalités
### Gestion des Mises à Jour
```vue
<!-- components/SWNewVersion.vue -->
<template>
<div v-if="needRefresh" class="update-banner">
<p>{{ $t('notification.update.body') }}</p>
<button @click="updateSW">{{ $t('update') }}</button>
</div>
</template>
<script setup lang="ts">
import { useRegisterSW } from 'virtual:pwa-register/vue'
const { needRefresh, updateServiceWorker } = useRegisterSW()
const updateSW = async () => {
await updateServiceWorker()
}
</script>
```
---
## 🎵 Intégration Spotify
### Fichier Critique : [`spotify-player.js`](src/lib/spotify-player.js:1)
⚠️ **ATTENTION** : Ce fichier ne doit JAMAIS être modifié
- Contient le SDK Spotify personnalisé
- 571 lignes de code critique
- Toute modification peut casser l'intégration Spotify
### Utilisation du Player Spotify
```typescript
// hooks/useSpotify.ts
import { ref } from 'vue'
export function useSpotify() {
const player = ref<any>(null)
const isReady = ref(false)
const initializePlayer = (token: string) => {
// Utilisation du spotify-player.js
player.value = new window.Spotify.Player({
name: 'Binôme Player',
getOAuthToken: (cb: (token: string) => void) => {
cb(token)
}
})
}
return {
player,
isReady,
initializePlayer
}
}
```
---
## 🚀 Déploiement
### Build de Production
```bash
# Génération des fichiers optimisés
pnpm build
# Vérification de la build
pnpm preview
```
### Netlify (Configuration dans [`netlify.toml`](netlify.toml:1))
```toml
[build]
command = "pnpm build"
publish = "dist"
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
```
### Variables d'Environnement
```bash
# .env.local (non versionné)
VITE_SPOTIFY_CLIENT_ID=your_client_id
VITE_API_BASE_URL=https://api.example.com
```
---
## 🐛 Debugging et Outils
### Vue DevTools
- Extension navigateur pour Vue 3
- Inspection des composants et du store Pinia
- Timeline des événements
### Vite DevTools
- HMR (Hot Module Replacement)
- Source maps automatiques
- Inspection des modules
### Console de Debug
```typescript
// Activation du debug en développement
if (import.meta.env.DEV) {
console.log('Mode développement activé')
// Exposition du store pour debug
window.__PINIA__ = pinia
}
```
---
## 📚 Ressources et Documentation
### Documentation Officielle
- [Vue 3](https://vuejs.org/)
- [Vite](https://vitejs.dev/)
- [Pinia](https://pinia.vuejs.org/)
- [Vue Router](https://router.vuejs.org/)
### Outils Recommandés
- **IDE** : VS Code avec extensions Vue
- **Extensions** : Vetur, TypeScript Vue Plugin
- **Browser** : Chrome/Firefox avec Vue DevTools
---
## 🔄 Workflow de Développement
### 1. Démarrage d'une Nouvelle Fonctionnalité
```bash
# Créer une branche
git checkout -b feature/nouvelle-fonctionnalite
# Démarrer le serveur de dev
pnpm dev
```
### 2. Développement
- Modifier les fichiers dans `src/`
- Tester en temps réel avec HMR
- Utiliser Vue DevTools pour debug
### 3. Tests et Validation
```bash
# Vérification du code
pnpm lint
# Build de test
pnpm build && pnpm preview
```
### 4. Commit et Push
```bash
# Commit avec message descriptif
git add .
git commit -m "feat: ajout de la nouvelle fonctionnalité"
git push origin feature/nouvelle-fonctionnalite
```
---
**Guide créé le 20 juillet 2025**
**Version de l'application** : Stack moderne Vue 3 + Vite + Pinia
**Prochaine mise à jour** : Après résolution des problèmes techniques identifiés

188
pnpm-lock.yaml generated
View File

@@ -1562,9 +1562,9 @@ packages:
resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
browserify-sign@4.2.3: browserify-sign@4.2.5:
resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==}
engines: {node: '>= 0.12'} engines: {node: '>= 0.10'}
browserify-zlib@0.2.0: browserify-zlib@0.2.0:
resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
@@ -1628,8 +1628,8 @@ packages:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'} engines: {node: '>=6'}
caniuse-lite@1.0.30001727: caniuse-lite@1.0.30001766:
resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==}
caseless@0.12.0: caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
@@ -1667,8 +1667,8 @@ packages:
resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
engines: {node: '>=6.0'} engines: {node: '>=6.0'}
cipher-base@1.0.6: cipher-base@1.0.7:
resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
class-utils@0.3.6: class-utils@0.3.6:
@@ -1777,9 +1777,6 @@ packages:
create-ecdh@4.0.4: create-ecdh@4.0.4:
resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
create-hash@1.1.3:
resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==}
create-hash@1.2.0: create-hash@1.2.0:
resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
@@ -1963,8 +1960,8 @@ packages:
resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
hasBin: true hasBin: true
error-ex@1.3.2: error-ex@1.3.4:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
es-abstract@1.24.0: es-abstract@1.24.0:
resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
@@ -2407,13 +2404,14 @@ packages:
resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
hash-base@2.0.2:
resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==}
hash-base@3.0.5: hash-base@3.0.5:
resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
hash-base@3.1.2:
resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==}
engines: {node: '>= 0.8'}
hash.js@1.1.7: hash.js@1.1.7:
resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
@@ -2835,6 +2833,9 @@ packages:
lodash@4.17.21: lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
lodash@4.17.23:
resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==}
loud-rejection@1.6.0: loud-rejection@1.6.0:
resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@@ -2971,8 +2972,8 @@ packages:
mute-stream@0.0.8: mute-stream@0.0.8:
resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
nan@2.23.0: nan@2.24.0:
resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} resolution: {integrity: sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==}
nanoid@3.3.11: nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
@@ -3118,8 +3119,8 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'} engines: {node: '>=6'}
parse-asn1@5.1.7: parse-asn1@5.1.9:
resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
parse-json@2.2.0: parse-json@2.2.0:
@@ -3165,9 +3166,9 @@ packages:
pathe@2.0.3: pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
pbkdf2@3.1.3: pbkdf2@3.1.5:
resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==}
engines: {node: '>=0.12'} engines: {node: '>= 0.10'}
perfect-debounce@1.0.0: perfect-debounce@1.0.0:
resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
@@ -3315,8 +3316,8 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'} engines: {node: '>=6'}
qs@6.14.0: qs@6.14.1:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==}
engines: {node: '>=0.6'} engines: {node: '>=0.6'}
qs@6.5.3: qs@6.5.3:
@@ -3451,6 +3452,11 @@ packages:
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
hasBin: true hasBin: true
resolve@1.22.11:
resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
engines: {node: '>= 0.4'}
hasBin: true
restore-cursor@3.1.0: restore-cursor@3.1.0:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -3479,11 +3485,9 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true hasBin: true
ripemd160@2.0.1: ripemd160@2.0.3:
resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==}
engines: {node: '>= 0.8'}
ripemd160@2.0.2:
resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
rollup@2.79.2: rollup@2.79.2:
resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==}
@@ -3720,8 +3724,8 @@ packages:
spdx-expression-parse@3.0.1: spdx-expression-parse@3.0.1:
resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
spdx-license-ids@3.0.21: spdx-license-ids@3.0.22:
resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==}
speakingurl@14.0.1: speakingurl@14.0.1:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
@@ -3865,7 +3869,7 @@ packages:
tar@2.2.2: tar@2.2.2:
resolution: {integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==} resolution: {integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==}
deprecated: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap. deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me
temp-dir@2.0.0: temp-dir@2.0.0:
resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
@@ -3915,8 +3919,8 @@ packages:
to-arraybuffer@1.0.1: to-arraybuffer@1.0.1:
resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==}
to-buffer@1.2.1: to-buffer@1.2.2:
resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
to-object-path@0.3.0: to-object-path@0.3.0:
@@ -5969,7 +5973,7 @@ snapshots:
browserify-aes@1.2.0: browserify-aes@1.2.0:
dependencies: dependencies:
buffer-xor: 1.0.3 buffer-xor: 1.0.3
cipher-base: 1.0.6 cipher-base: 1.0.7
create-hash: 1.2.0 create-hash: 1.2.0
evp_bytestokey: 1.0.3 evp_bytestokey: 1.0.3
inherits: 2.0.4 inherits: 2.0.4
@@ -5983,7 +5987,7 @@ snapshots:
browserify-des@1.0.2: browserify-des@1.0.2:
dependencies: dependencies:
cipher-base: 1.0.6 cipher-base: 1.0.7
des.js: 1.1.0 des.js: 1.1.0
inherits: 2.0.4 inherits: 2.0.4
safe-buffer: 5.2.1 safe-buffer: 5.2.1
@@ -5994,16 +5998,15 @@ snapshots:
randombytes: 2.1.0 randombytes: 2.1.0
safe-buffer: 5.2.1 safe-buffer: 5.2.1
browserify-sign@4.2.3: browserify-sign@4.2.5:
dependencies: dependencies:
bn.js: 5.2.2 bn.js: 5.2.2
browserify-rsa: 4.1.1 browserify-rsa: 4.1.1
create-hash: 1.2.0 create-hash: 1.2.0
create-hmac: 1.1.7 create-hmac: 1.1.7
elliptic: 6.6.1 elliptic: 6.6.1
hash-base: 3.0.5
inherits: 2.0.4 inherits: 2.0.4
parse-asn1: 5.1.7 parse-asn1: 5.1.9
readable-stream: 2.3.8 readable-stream: 2.3.8
safe-buffer: 5.2.1 safe-buffer: 5.2.1
@@ -6018,7 +6021,7 @@ snapshots:
browserslist@4.25.1: browserslist@4.25.1:
dependencies: dependencies:
caniuse-lite: 1.0.30001727 caniuse-lite: 1.0.30001766
electron-to-chromium: 1.5.187 electron-to-chromium: 1.5.187
node-releases: 2.0.19 node-releases: 2.0.19
update-browserslist-db: 1.1.3(browserslist@4.25.1) update-browserslist-db: 1.1.3(browserslist@4.25.1)
@@ -6096,7 +6099,7 @@ snapshots:
camelcase@5.3.1: camelcase@5.3.1:
optional: true optional: true
caniuse-lite@1.0.30001727: {} caniuse-lite@1.0.30001766: {}
caseless@0.12.0: caseless@0.12.0:
optional: true optional: true
@@ -6163,10 +6166,11 @@ snapshots:
chrome-trace-event@1.0.4: {} chrome-trace-event@1.0.4: {}
cipher-base@1.0.6: cipher-base@1.0.7:
dependencies: dependencies:
inherits: 2.0.4 inherits: 2.0.4
safe-buffer: 5.2.1 safe-buffer: 5.2.1
to-buffer: 1.2.2
class-utils@0.3.6: class-utils@0.3.6:
dependencies: dependencies:
@@ -6278,27 +6282,20 @@ snapshots:
bn.js: 4.12.2 bn.js: 4.12.2
elliptic: 6.6.1 elliptic: 6.6.1
create-hash@1.1.3:
dependencies:
cipher-base: 1.0.6
inherits: 2.0.4
ripemd160: 2.0.2
sha.js: 2.4.12
create-hash@1.2.0: create-hash@1.2.0:
dependencies: dependencies:
cipher-base: 1.0.6 cipher-base: 1.0.7
inherits: 2.0.4 inherits: 2.0.4
md5.js: 1.3.5 md5.js: 1.3.5
ripemd160: 2.0.2 ripemd160: 2.0.3
sha.js: 2.4.12 sha.js: 2.4.12
create-hmac@1.1.7: create-hmac@1.1.7:
dependencies: dependencies:
cipher-base: 1.0.6 cipher-base: 1.0.7
create-hash: 1.2.0 create-hash: 1.2.0
inherits: 2.0.4 inherits: 2.0.4
ripemd160: 2.0.2 ripemd160: 2.0.3
safe-buffer: 5.2.1 safe-buffer: 5.2.1
sha.js: 2.4.12 sha.js: 2.4.12
@@ -6319,14 +6316,14 @@ snapshots:
crypto-browserify@3.12.1: crypto-browserify@3.12.1:
dependencies: dependencies:
browserify-cipher: 1.0.1 browserify-cipher: 1.0.1
browserify-sign: 4.2.3 browserify-sign: 4.2.5
create-ecdh: 4.0.4 create-ecdh: 4.0.4
create-hash: 1.2.0 create-hash: 1.2.0
create-hmac: 1.1.7 create-hmac: 1.1.7
diffie-hellman: 5.0.3 diffie-hellman: 5.0.3
hash-base: 3.0.5 hash-base: 3.0.5
inherits: 2.0.4 inherits: 2.0.4
pbkdf2: 3.1.3 pbkdf2: 3.1.5
public-encrypt: 4.0.3 public-encrypt: 4.0.3
randombytes: 2.1.0 randombytes: 2.1.0
randomfill: 1.0.4 randomfill: 1.0.4
@@ -6498,7 +6495,7 @@ snapshots:
dependencies: dependencies:
prr: 1.0.1 prr: 1.0.1
error-ex@1.3.2: error-ex@1.3.4:
dependencies: dependencies:
is-arrayish: 0.2.1 is-arrayish: 0.2.1
optional: true optional: true
@@ -6915,7 +6912,7 @@ snapshots:
fsevents@1.2.13: fsevents@1.2.13:
dependencies: dependencies:
bindings: 1.5.0 bindings: 1.5.0
nan: 2.23.0 nan: 2.24.0
optional: true optional: true
fsevents@2.3.3: fsevents@2.3.3:
@@ -7017,7 +7014,7 @@ snapshots:
fs.realpath: 1.0.0 fs.realpath: 1.0.0
inflight: 1.0.6 inflight: 1.0.6
inherits: 2.0.4 inherits: 2.0.4
minimatch: 3.1.2 minimatch: 3.0.8
once: 1.4.0 once: 1.4.0
path-is-absolute: 1.0.1 path-is-absolute: 1.0.1
optional: true optional: true
@@ -7043,7 +7040,7 @@ snapshots:
globule@1.3.4: globule@1.3.4:
dependencies: dependencies:
glob: 7.1.7 glob: 7.1.7
lodash: 4.17.21 lodash: 4.17.23
minimatch: 3.0.8 minimatch: 3.0.8
optional: true optional: true
@@ -7107,15 +7104,18 @@ snapshots:
is-number: 3.0.0 is-number: 3.0.0
kind-of: 4.0.0 kind-of: 4.0.0
hash-base@2.0.2:
dependencies:
inherits: 2.0.4
hash-base@3.0.5: hash-base@3.0.5:
dependencies: dependencies:
inherits: 2.0.4 inherits: 2.0.4
safe-buffer: 5.2.1 safe-buffer: 5.2.1
hash-base@3.1.2:
dependencies:
inherits: 2.0.4
readable-stream: 2.3.8
safe-buffer: 5.2.1
to-buffer: 1.2.2
hash.js@1.1.7: hash.js@1.1.7:
dependencies: dependencies:
inherits: 2.0.4 inherits: 2.0.4
@@ -7530,6 +7530,9 @@ snapshots:
lodash@4.17.21: {} lodash@4.17.21: {}
lodash@4.17.23:
optional: true
loud-rejection@1.6.0: loud-rejection@1.6.0:
dependencies: dependencies:
currently-unhandled: 0.4.1 currently-unhandled: 0.4.1
@@ -7711,7 +7714,7 @@ snapshots:
mute-stream@0.0.8: {} mute-stream@0.0.8: {}
nan@2.23.0: nan@2.24.0:
optional: true optional: true
nanoid@3.3.11: {} nanoid@3.3.11: {}
@@ -7794,10 +7797,10 @@ snapshots:
get-stdin: 4.0.1 get-stdin: 4.0.1
glob: 7.2.3 glob: 7.2.3
in-publish: 2.0.1 in-publish: 2.0.1
lodash: 4.17.21 lodash: 4.17.23
meow: 3.7.0 meow: 3.7.0
mkdirp: 0.5.6 mkdirp: 0.5.6
nan: 2.23.0 nan: 2.24.0
node-gyp: 3.8.0 node-gyp: 3.8.0
npmlog: 4.1.2 npmlog: 4.1.2
request: 2.88.2 request: 2.88.2
@@ -7814,7 +7817,7 @@ snapshots:
normalize-package-data@2.5.0: normalize-package-data@2.5.0:
dependencies: dependencies:
hosted-git-info: 2.8.9 hosted-git-info: 2.8.9
resolve: 1.22.10 resolve: 1.22.11
semver: 5.7.2 semver: 5.7.2
validate-npm-package-license: 3.0.4 validate-npm-package-license: 3.0.4
optional: true optional: true
@@ -7928,18 +7931,17 @@ snapshots:
dependencies: dependencies:
callsites: 3.1.0 callsites: 3.1.0
parse-asn1@5.1.7: parse-asn1@5.1.9:
dependencies: dependencies:
asn1.js: 4.10.1 asn1.js: 4.10.1
browserify-aes: 1.2.0 browserify-aes: 1.2.0
evp_bytestokey: 1.0.3 evp_bytestokey: 1.0.3
hash-base: 3.0.5 pbkdf2: 3.1.5
pbkdf2: 3.1.3
safe-buffer: 5.2.1 safe-buffer: 5.2.1
parse-json@2.2.0: parse-json@2.2.0:
dependencies: dependencies:
error-ex: 1.3.2 error-ex: 1.3.4
optional: true optional: true
pascalcase@0.1.1: {} pascalcase@0.1.1: {}
@@ -7973,14 +7975,14 @@ snapshots:
pathe@2.0.3: {} pathe@2.0.3: {}
pbkdf2@3.1.3: pbkdf2@3.1.5:
dependencies: dependencies:
create-hash: 1.1.3 create-hash: 1.2.0
create-hmac: 1.1.7 create-hmac: 1.1.7
ripemd160: 2.0.1 ripemd160: 2.0.3
safe-buffer: 5.2.1 safe-buffer: 5.2.1
sha.js: 2.4.12 sha.js: 2.4.12
to-buffer: 1.2.1 to-buffer: 1.2.2
perfect-debounce@1.0.0: {} perfect-debounce@1.0.0: {}
@@ -8086,7 +8088,7 @@ snapshots:
bn.js: 4.12.2 bn.js: 4.12.2
browserify-rsa: 4.1.1 browserify-rsa: 4.1.1
create-hash: 1.2.0 create-hash: 1.2.0
parse-asn1: 5.1.7 parse-asn1: 5.1.9
randombytes: 2.1.0 randombytes: 2.1.0
safe-buffer: 5.2.1 safe-buffer: 5.2.1
@@ -8110,7 +8112,7 @@ snapshots:
punycode@2.3.1: {} punycode@2.3.1: {}
qs@6.14.0: qs@6.14.1:
dependencies: dependencies:
side-channel: 1.1.0 side-channel: 1.1.0
@@ -8283,6 +8285,13 @@ snapshots:
path-parse: 1.0.7 path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0 supports-preserve-symlinks-flag: 1.0.0
resolve@1.22.11:
dependencies:
is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
optional: true
restore-cursor@3.1.0: restore-cursor@3.1.0:
dependencies: dependencies:
onetime: 5.1.2 onetime: 5.1.2
@@ -8304,14 +8313,9 @@ snapshots:
dependencies: dependencies:
glob: 7.2.3 glob: 7.2.3
ripemd160@2.0.1: ripemd160@2.0.3:
dependencies: dependencies:
hash-base: 2.0.2 hash-base: 3.1.2
inherits: 2.0.4
ripemd160@2.0.2:
dependencies:
hash-base: 3.0.5
inherits: 2.0.4 inherits: 2.0.4
rollup@2.79.2: rollup@2.79.2:
@@ -8390,7 +8394,7 @@ snapshots:
sass-graph@2.2.5: sass-graph@2.2.5:
dependencies: dependencies:
glob: 7.2.3 glob: 7.2.3
lodash: 4.17.21 lodash: 4.17.23
scss-tokenizer: 0.2.3 scss-tokenizer: 0.2.3
yargs: 13.3.2 yargs: 13.3.2
optional: true optional: true
@@ -8488,7 +8492,7 @@ snapshots:
dependencies: dependencies:
inherits: 2.0.4 inherits: 2.0.4
safe-buffer: 5.2.1 safe-buffer: 5.2.1
to-buffer: 1.2.1 to-buffer: 1.2.2
shallow-clone@3.0.1: shallow-clone@3.0.1:
dependencies: dependencies:
@@ -8600,7 +8604,7 @@ snapshots:
spdx-correct@3.2.0: spdx-correct@3.2.0:
dependencies: dependencies:
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
spdx-license-ids: 3.0.21 spdx-license-ids: 3.0.22
optional: true optional: true
spdx-exceptions@2.5.0: spdx-exceptions@2.5.0:
@@ -8609,10 +8613,10 @@ snapshots:
spdx-expression-parse@3.0.1: spdx-expression-parse@3.0.1:
dependencies: dependencies:
spdx-exceptions: 2.5.0 spdx-exceptions: 2.5.0
spdx-license-ids: 3.0.21 spdx-license-ids: 3.0.22
optional: true optional: true
spdx-license-ids@3.0.21: spdx-license-ids@3.0.22:
optional: true optional: true
speakingurl@14.0.1: {} speakingurl@14.0.1: {}
@@ -8869,7 +8873,7 @@ snapshots:
to-arraybuffer@1.0.1: {} to-arraybuffer@1.0.1: {}
to-buffer@1.2.1: to-buffer@1.2.2:
dependencies: dependencies:
isarray: 2.0.5 isarray: 2.0.5
safe-buffer: 5.2.1 safe-buffer: 5.2.1
@@ -9053,7 +9057,7 @@ snapshots:
url@0.11.4: url@0.11.4:
dependencies: dependencies:
punycode: 1.4.1 punycode: 1.4.1
qs: 6.14.0 qs: 6.14.1
use@3.1.1: {} use@3.1.1: {}
@@ -9258,7 +9262,7 @@ snapshots:
wide-align@1.1.5: wide-align@1.1.5:
dependencies: dependencies:
string-width: 4.2.3 string-width: 1.0.2
optional: true optional: true
word-wrap@1.2.5: {} word-wrap@1.2.5: {}

View File

@@ -1,13 +1,11 @@
<template> <template>
<div class="chilled-music"> <div class="chilled-music">
<transition name="fade"> <img
<img v-show="!ready"
v-show="!ready" class="loader"
class="loader" src="@/assets/loader.svg"
src="@/assets/loader.svg" :alt="$t('music.loading')"
:alt="$t('music.loading')" />
/>
</transition>
<section v-show="false"> <section v-show="false">
<div <div
class="chilled-music plyr__video-embed" class="chilled-music plyr__video-embed"

View File

@@ -14,9 +14,9 @@
</transition> </transition>
</div> </div>
<h3 v-if="isMinuteSession"> <h3 v-if="isMinuteSession">
{{ $t('minuteSession', { interval }, interval) }} {{ $t('interval.minuteSession', { interval }, interval) }}
</h3> </h3>
<h3 v-else>{{ $t('secondSession') }}</h3> <h3 v-else>{{ $t('interval.secondSession') }}</h3>
<div class="button-container plus"> <div class="button-container plus">
<transition name="fade" mode="out-in"> <transition name="fade" mode="out-in">
<button v-if="editable" key="plus-button" class="spacer" @click="plus"> <button v-if="editable" key="plus-button" class="spacer" @click="plus">
@@ -91,16 +91,3 @@ $button-size: 50px;
} }
} }
</style> </style>
<i18n>
{
"en": {
"minuteSession": "{interval} minute session",
"secondSession": "30 second session"
},
"fr": {
"minuteSession": "session de {interval} minute | session de {interval} minutes",
"secondSession": "session de 30 secondes"
}
}
</i18n>

View File

@@ -1,13 +1,11 @@
<template> <template>
<div class="spotify-music"> <div class="spotify-music">
<transition name="fade"> <img
<img v-show="!ready"
v-show="!ready" class="loader"
class="loader" src="@/assets/loader.svg"
src="@/assets/loader.svg" :alt="$t('music.loading')"
:alt="$t('music.loading')" />
/>
</transition>
</div> </div>
</template> </template>

View File

@@ -5,7 +5,7 @@
<span <span
class="focus" class="focus"
:class="{ selected: !hasMusic, disabled: hasMusic }" :class="{ selected: !hasMusic, disabled: hasMusic }"
v-t="'focus'" v-t="'music.focus'"
></span> ></span>
<input <input
type="checkbox" type="checkbox"
@@ -19,7 +19,7 @@
class="chill" class="chill"
:class="{ selected: hasMusic, disabled: !hasMusic }" :class="{ selected: hasMusic, disabled: !hasMusic }"
> >
<span v-t="'chill'"></span> <span v-t="'music.chill'"></span>
<SpotifyMusic <SpotifyMusic
v-if="hasSpotify" v-if="hasSpotify"
:play="play && hasMusic" :play="play && hasMusic"
@@ -149,7 +149,7 @@ label[data-pm-holder] {
margin-bottom: 0; margin-bottom: 0;
} }
.disabled { .disabled {
color: desaturate($color, 70%); color: $color-desaturated;
} }
p { p {
@@ -173,16 +173,3 @@ button {
font-style: italic; font-style: italic;
} }
</style> </style>
<i18n>
{
"en": {
"focus": "focus",
"chill": "chill"
},
"fr": {
"focus": "concentré",
"chill": "détendu"
}
}
</i18n>

View File

@@ -13,6 +13,14 @@
"loading": "loading...", "loading": "loading...",
"useSpotify": "For a pure experience, connect to", "useSpotify": "For a pure experience, connect to",
"nowPlaying": "Now playing:", "nowPlaying": "Now playing:",
"codeAndChill": "Code and chill, chill and code..." "codeAndChill": "Code and chill, chill and code...",
"focus": "Focus",
"chill": "Chill"
},
"interval": {
"minuteSession": "{interval} minute|{interval} minutes",
"secondSession": "30 seconds",
"plus": "Plus",
"minus": "Minus"
} }
} }

View File

@@ -13,6 +13,14 @@
"loading": "loading...", "loading": "loading...",
"useSpotify": "Pour une meilleure expérience, utilisez", "useSpotify": "Pour une meilleure expérience, utilisez",
"nowPlaying": "Lecture en cours :", "nowPlaying": "Lecture en cours :",
"codeAndChill": "Codez, zen..." "codeAndChill": "Codez, zen...",
"focus": "Concentration",
"chill": "Détente"
},
"interval": {
"minuteSession": "{interval} minute|{interval} minutes",
"secondSession": "30 secondes",
"plus": "Plus",
"minus": "Moins"
} }
} }

View File

@@ -1,24 +1,25 @@
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond&family=Major+Mono+Display&display=swap'); @use './variables' as vars;
@use './plume';
@use 'sass:color';
@import './variables'; @import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond&family=Major+Mono+Display&display=swap');
@import './plume';
body { body {
text-align: center; text-align: center;
font-family: $font-family; font-family: vars.$font-family;
background-color: #2c3a47; background-color: #2c3a47;
color: $color; color: vars.$color;
margin: 0; margin: 0;
user-select: none; user-select: none;
} }
button { button {
font-family: $font-family; font-family: vars.$font-family;
border: none; border: none;
padding: 1rem; padding: 1rem;
text-decoration: none; text-decoration: none;
background: $color; background: vars.$color;
color: $bgcolor; color: vars.$bgcolor;
cursor: pointer; cursor: pointer;
transition: background 250ms ease-in-out, transform 150ms ease; transition: background 250ms ease-in-out, transform 150ms ease;
border-radius: 0.5rem; border-radius: 0.5rem;
@@ -26,7 +27,7 @@ button {
button:hover, button:hover,
button:focus { button:focus {
background: darken($color, 15); background: color.adjust(vars.$color, $lightness: -15%);
} }
button:active { button:active {
@@ -56,6 +57,7 @@ a {
.fade-leave-active { .fade-leave-active {
transition: opacity 0.25s ease-out; transition: opacity 0.25s ease-out;
} }
.fade-enter, .fade-enter,
.fade-leave-to { .fade-leave-to {
opacity: 0; opacity: 0;
@@ -65,6 +67,7 @@ a {
from { from {
transform: rotate(0deg); transform: rotate(0deg);
} }
to { to {
transform: rotate(360deg); transform: rotate(360deg);
} }

View File

@@ -1,8 +1,13 @@
@use 'sass:color';
$color: #f8efba; $color: #f8efba;
$bgcolor: #2c3a47; $bgcolor: #2c3a47;
$font-family: 'Major Mono Display', monospace; $font-family: 'Major Mono Display', monospace;
$serif-font-family: 'Cormorant Garamond', serif; $serif-font-family: 'Cormorant Garamond', serif;
// Fonction utilitaire pour remplacer desaturate()
$color-desaturated: color.adjust($color, $saturation: -70%);
:root { :root {
--pm-app-surface-color: #{#2c3a47}; --pm-app-surface-color: #{#2c3a47};
--pm-primary-color: #{$color}; --pm-primary-color: #{$color};

View File

@@ -41,12 +41,12 @@
<img src="@/assets/stop.svg" alt="stop" width="50px" height="50px" /> <img src="@/assets/stop.svg" alt="stop" width="50px" height="50px" />
</button> </button>
</div> </div>
<ZoneMusic <!-- <ZoneMusic
class="music" class="music"
:play="timeState === 'started'" :play="timeState === 'started'"
@play="start" @play="start"
@pause="pause" @pause="pause"
/> /> -->
<footer v-if="false"> <footer v-if="false">
Made by Made by
<a <a