1
.env.example
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
PORT=5173
|
||||||
28
.forgejo/workflows/deploy-prod.yml
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
name: Deploy Sokko G
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
runs-on: docker
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Deploy on WebApps
|
||||||
|
env:
|
||||||
|
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
|
||||||
|
run: |
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y openssh-client
|
||||||
|
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
printf '%s\n' "$DEPLOY_SSH_KEY" > ~/.ssh/id_ed25519
|
||||||
|
chmod 600 ~/.ssh/id_ed25519
|
||||||
|
|
||||||
|
ssh -o StrictHostKeyChecking=no \
|
||||||
|
-i ~/.ssh/id_ed25519 \
|
||||||
|
-p 2911 \
|
||||||
|
shinuwa@192.168.0.100 \
|
||||||
|
"sudo /usr/local/bin/deploy-sokko-g"
|
||||||
3
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
node_modules/
|
||||||
|
.env
|
||||||
|
.DS_Store
|
||||||
921
DESIGN_SYSTEM.md
Normal file
|
|
@ -0,0 +1,921 @@
|
||||||
|
# Design System - Sokko G
|
||||||
|
|
||||||
|
Ce document est la source de verite visuelle du projet Sokko G. Toute nouvelle interface doit respecter le theme **Nebula Command**.
|
||||||
|
|
||||||
|
## 1. Vision
|
||||||
|
|
||||||
|
Sokko G est une webapp gaming pensee pour des groupes d'amis pendant leurs sessions de jeu. Elle doit permettre de consulter rapidement des informations, gerer des toolboxes, notes, checklists, captures d'ecran, liens, ressources et pages informatives.
|
||||||
|
|
||||||
|
L'interface doit etre sombre, moderne, immersive, lisible sur desktop et mobile, agreable pendant de longues sessions, inspiree par l'espace, les nebuleuses et les interfaces gaming premium.
|
||||||
|
|
||||||
|
Eviter le style RGB agressif. L'ambiance recherchee est celle d'une galaxie calme, profonde et lumineuse.
|
||||||
|
|
||||||
|
## 2. Direction Artistique
|
||||||
|
|
||||||
|
Nom du theme : **Nebula Command**
|
||||||
|
|
||||||
|
Mots-cles :
|
||||||
|
|
||||||
|
- galaxie ;
|
||||||
|
- nebuleuse ;
|
||||||
|
- espace profond ;
|
||||||
|
- violet electrique ;
|
||||||
|
- bleu cosmique ;
|
||||||
|
- verre teinte ;
|
||||||
|
- lumiere diffuse ;
|
||||||
|
- interface futuriste ;
|
||||||
|
- collaboration ;
|
||||||
|
- gaming premium.
|
||||||
|
|
||||||
|
Principes :
|
||||||
|
|
||||||
|
- l'arriere-plan principal est tres sombre, legerement bleute ;
|
||||||
|
- le violet et le bleu servent aux actions, etats actifs, informations importantes et effets de profondeur ;
|
||||||
|
- les effets lumineux restent subtils et ne doivent jamais reduire la lisibilite ;
|
||||||
|
- l'interface doit etre elegante, dense et exploitable pendant une session de jeu.
|
||||||
|
|
||||||
|
## 3. Tokens CSS
|
||||||
|
|
||||||
|
Utiliser ces variables comme base. Ne pas coder les couleurs en dur dans les composants.
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
color-scheme: dark;
|
||||||
|
|
||||||
|
--color-bg-page: #070913;
|
||||||
|
--color-bg-deep: #050711;
|
||||||
|
--color-bg-sidebar: #0b0e1b;
|
||||||
|
--color-bg-surface: #101426;
|
||||||
|
--color-bg-surface-alt: #151a30;
|
||||||
|
--color-bg-elevated: #1a2038;
|
||||||
|
--color-bg-hover: #202745;
|
||||||
|
|
||||||
|
--color-primary: #8b5cf6;
|
||||||
|
--color-primary-hover: #9f7aea;
|
||||||
|
--color-primary-active: #7347dc;
|
||||||
|
--color-primary-soft: rgba(139, 92, 246, 0.14);
|
||||||
|
--color-primary-border: rgba(139, 92, 246, 0.45);
|
||||||
|
|
||||||
|
--color-secondary: #3b82f6;
|
||||||
|
--color-secondary-hover: #60a5fa;
|
||||||
|
--color-secondary-active: #2563eb;
|
||||||
|
--color-secondary-soft: rgba(59, 130, 246, 0.14);
|
||||||
|
|
||||||
|
--color-accent-cyan: #22d3ee;
|
||||||
|
--color-accent-pink: #d946ef;
|
||||||
|
--color-accent-indigo: #6366f1;
|
||||||
|
|
||||||
|
--color-text-primary: #f5f7ff;
|
||||||
|
--color-text-secondary: #b4bdd3;
|
||||||
|
--color-text-muted: #7d879f;
|
||||||
|
--color-text-disabled: #555e73;
|
||||||
|
--color-text-inverse: #080a13;
|
||||||
|
|
||||||
|
--color-border: rgba(150, 165, 205, 0.14);
|
||||||
|
--color-border-hover: rgba(150, 165, 205, 0.28);
|
||||||
|
--color-border-strong: rgba(167, 139, 250, 0.42);
|
||||||
|
|
||||||
|
--color-success: #34d399;
|
||||||
|
--color-success-soft: rgba(52, 211, 153, 0.13);
|
||||||
|
--color-warning: #fbbf24;
|
||||||
|
--color-warning-soft: rgba(251, 191, 36, 0.13);
|
||||||
|
--color-danger: #fb7185;
|
||||||
|
--color-danger-soft: rgba(251, 113, 133, 0.13);
|
||||||
|
--color-info: #38bdf8;
|
||||||
|
--color-info-soft: rgba(56, 189, 248, 0.13);
|
||||||
|
|
||||||
|
--gradient-brand: linear-gradient(135deg, #8b5cf6 0%, #6366f1 45%, #3b82f6 100%);
|
||||||
|
--gradient-nebula: linear-gradient(
|
||||||
|
135deg,
|
||||||
|
rgba(139, 92, 246, 0.28),
|
||||||
|
rgba(59, 130, 246, 0.18),
|
||||||
|
rgba(217, 70, 239, 0.12)
|
||||||
|
);
|
||||||
|
--gradient-page:
|
||||||
|
radial-gradient(circle at 20% 10%, rgba(124, 58, 237, 0.16), transparent 34%),
|
||||||
|
radial-gradient(circle at 85% 20%, rgba(37, 99, 235, 0.12), transparent 30%),
|
||||||
|
radial-gradient(circle at 55% 90%, rgba(217, 70, 239, 0.08), transparent 35%),
|
||||||
|
#070913;
|
||||||
|
|
||||||
|
--font-size-xs: 0.75rem;
|
||||||
|
--font-size-sm: 0.875rem;
|
||||||
|
--font-size-base: 1rem;
|
||||||
|
--font-size-lg: 1.125rem;
|
||||||
|
--font-size-xl: 1.25rem;
|
||||||
|
--font-size-2xl: 1.5rem;
|
||||||
|
--font-size-3xl: 2rem;
|
||||||
|
--font-size-4xl: 2.5rem;
|
||||||
|
|
||||||
|
--font-weight-regular: 400;
|
||||||
|
--font-weight-medium: 500;
|
||||||
|
--font-weight-semibold: 600;
|
||||||
|
--font-weight-bold: 700;
|
||||||
|
|
||||||
|
--space-1: 0.25rem;
|
||||||
|
--space-2: 0.5rem;
|
||||||
|
--space-3: 0.75rem;
|
||||||
|
--space-4: 1rem;
|
||||||
|
--space-5: 1.25rem;
|
||||||
|
--space-6: 1.5rem;
|
||||||
|
--space-8: 2rem;
|
||||||
|
--space-10: 2.5rem;
|
||||||
|
--space-12: 3rem;
|
||||||
|
--space-16: 4rem;
|
||||||
|
|
||||||
|
--radius-sm: 6px;
|
||||||
|
--radius-md: 10px;
|
||||||
|
--radius-lg: 14px;
|
||||||
|
--radius-xl: 18px;
|
||||||
|
--radius-2xl: 24px;
|
||||||
|
--radius-pill: 999px;
|
||||||
|
|
||||||
|
--shadow-sm: 0 4px 12px rgba(0, 0, 0, 0.22);
|
||||||
|
--shadow-md: 0 12px 30px rgba(0, 0, 0, 0.3);
|
||||||
|
--shadow-lg: 0 24px 60px rgba(0, 0, 0, 0.42);
|
||||||
|
--shadow-primary: 0 0 28px rgba(139, 92, 246, 0.22);
|
||||||
|
--shadow-secondary: 0 0 28px rgba(59, 130, 246, 0.18);
|
||||||
|
|
||||||
|
--duration-fast: 120ms;
|
||||||
|
--duration-normal: 180ms;
|
||||||
|
--duration-slow: 260ms;
|
||||||
|
--ease-standard: cubic-bezier(0.2, 0.8, 0.2, 1);
|
||||||
|
|
||||||
|
--breakpoint-sm: 640px;
|
||||||
|
--breakpoint-md: 768px;
|
||||||
|
--breakpoint-lg: 1024px;
|
||||||
|
--breakpoint-xl: 1280px;
|
||||||
|
--breakpoint-2xl: 1536px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. Typographie
|
||||||
|
|
||||||
|
Police principale :
|
||||||
|
|
||||||
|
```css
|
||||||
|
font-family: "Inter", "Segoe UI", system-ui, sans-serif;
|
||||||
|
```
|
||||||
|
|
||||||
|
Police d'accent optionnelle pour logo, grands titres, compteurs et titres de toolboxes :
|
||||||
|
|
||||||
|
```css
|
||||||
|
font-family: "Space Grotesk", "Inter", sans-serif;
|
||||||
|
```
|
||||||
|
|
||||||
|
Regles :
|
||||||
|
|
||||||
|
- corps de texte : 14 a 16 px ;
|
||||||
|
- titres de cartes : 15 a 18 px ;
|
||||||
|
- titres de page : 28 a 36 px ;
|
||||||
|
- hauteur de ligne : 1.5 a 1.65 ;
|
||||||
|
- paragraphes longs limites a environ 70 caracteres ;
|
||||||
|
- eviter les gris trop sombres sur fond noir.
|
||||||
|
|
||||||
|
## 5. Layout Application
|
||||||
|
|
||||||
|
Desktop :
|
||||||
|
|
||||||
|
- sidebar gauche : `248px`, reductible a environ `72px` ;
|
||||||
|
- zone centrale : flexible, `max-width: 1600px` ;
|
||||||
|
- panneau contextuel droit facultatif : `320px`, repliable.
|
||||||
|
|
||||||
|
La sidebar contient le logo, le nom de l'application, la creation de toolbox, la liste des toolboxes, les raccourcis vers les pages informatives, les parametres et le profil.
|
||||||
|
|
||||||
|
La zone centrale contient le titre, les actions principales, les outils, les resultats et les contenus.
|
||||||
|
|
||||||
|
Le panneau droit peut afficher membres, activite recente, details, filtres, historique ou options de partage.
|
||||||
|
|
||||||
|
Mobile :
|
||||||
|
|
||||||
|
- navigation inferieure ou menu lateral ;
|
||||||
|
- contenu en une colonne ;
|
||||||
|
- boutons importants pleine largeur ;
|
||||||
|
- modales quasi plein ecran ;
|
||||||
|
- filtres dans un panneau bas ;
|
||||||
|
- cibles tactiles d'au moins `44px`.
|
||||||
|
|
||||||
|
## 6. Navigation
|
||||||
|
|
||||||
|
Element de navigation :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.nav-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
min-height: 42px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-radius: 10px;
|
||||||
|
color: var(--color-text-secondary);
|
||||||
|
transition: 160ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-item:hover {
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
background: var(--color-bg-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-item.active {
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
background: var(--color-primary-soft);
|
||||||
|
border: 1px solid var(--color-primary-border);
|
||||||
|
box-shadow: inset 3px 0 0 var(--color-primary);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
L'etat actif doit etre clair sans fond violet trop sature.
|
||||||
|
|
||||||
|
## 7. Topbar
|
||||||
|
|
||||||
|
La barre superieure de la zone centrale peut contenir titre de page, toolbox active, recherche globale, avatars, notifications, partage et menu utilisateur.
|
||||||
|
|
||||||
|
```css
|
||||||
|
.topbar {
|
||||||
|
min-height: 68px;
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 20;
|
||||||
|
backdrop-filter: blur(18px);
|
||||||
|
background: rgba(7, 9, 19, 0.78);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. Cartes
|
||||||
|
|
||||||
|
```css
|
||||||
|
.card {
|
||||||
|
background: rgba(16, 20, 38, 0.88);
|
||||||
|
border: 1px solid var(--color-border);
|
||||||
|
border-radius: var(--radius-lg);
|
||||||
|
box-shadow: var(--shadow-sm);
|
||||||
|
padding: 20px;
|
||||||
|
transition:
|
||||||
|
transform var(--duration-fast) var(--ease-standard),
|
||||||
|
border-color var(--duration-fast) var(--ease-standard),
|
||||||
|
background-color var(--duration-fast) var(--ease-standard);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
border-color: var(--color-border-hover);
|
||||||
|
background: rgba(21, 26, 48, 0.96);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card.selected {
|
||||||
|
border-color: var(--color-primary-border);
|
||||||
|
box-shadow: var(--shadow-md), var(--shadow-primary);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Une carte peut contenir icone, titre, description courte, statut, date/auteur, actions secondaires, contenu et pied de carte.
|
||||||
|
|
||||||
|
## 9. Boutons
|
||||||
|
|
||||||
|
Bouton principal :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.button-primary {
|
||||||
|
min-height: 42px;
|
||||||
|
padding: 0 18px;
|
||||||
|
border: none;
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
color: white;
|
||||||
|
font-weight: 600;
|
||||||
|
background: var(--gradient-brand);
|
||||||
|
box-shadow: 0 8px 22px rgba(99, 102, 241, 0.22);
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-primary:hover {
|
||||||
|
filter: brightness(1.08);
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 10px 28px rgba(139, 92, 246, 0.3);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Bouton secondaire :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.button-secondary {
|
||||||
|
min-height: 42px;
|
||||||
|
padding: 0 18px;
|
||||||
|
border: 1px solid var(--color-border);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
background: var(--color-bg-surface-alt);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Bouton fantome :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.button-ghost {
|
||||||
|
min-height: 38px;
|
||||||
|
padding: 0 12px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
color: var(--color-text-secondary);
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-ghost:hover {
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
background: var(--color-bg-hover);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Bouton danger : reserve aux actions destructrices, avec confirmation si l'action est irreversible.
|
||||||
|
|
||||||
|
Bouton icone :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.icon-button {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 10px;
|
||||||
|
color: var(--color-text-secondary);
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. Formulaires
|
||||||
|
|
||||||
|
```css
|
||||||
|
.input {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 44px;
|
||||||
|
padding: 0 14px;
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
border: 1px solid var(--color-border);
|
||||||
|
background: #0c1020;
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input::placeholder {
|
||||||
|
color: var(--color-text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.input:focus {
|
||||||
|
border-color: var(--color-primary);
|
||||||
|
box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.16);
|
||||||
|
}
|
||||||
|
|
||||||
|
.input.error {
|
||||||
|
border-color: var(--color-danger);
|
||||||
|
box-shadow: 0 0 0 3px var(--color-danger-soft);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Textarea :
|
||||||
|
|
||||||
|
- hauteur minimale `180px` ;
|
||||||
|
- `resize: vertical` ;
|
||||||
|
- `line-height: 1.6` ;
|
||||||
|
- style coherent avec les autres champs.
|
||||||
|
|
||||||
|
## 11. Outils Toolbox
|
||||||
|
|
||||||
|
### Bloc-note
|
||||||
|
|
||||||
|
Prevoir titre, contenu, auteur, date de derniere modification, autosauvegarde, statut de sauvegarde, epinglage, partage, suppression, lecture/edition et historique eventuel.
|
||||||
|
|
||||||
|
```css
|
||||||
|
.note-editor {
|
||||||
|
background: rgba(5, 7, 17, 0.56);
|
||||||
|
border: 1px solid var(--color-border);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Checklist
|
||||||
|
|
||||||
|
Chaque tache peut comprendre case a cocher, titre, description, responsable, priorite, echeance et menu d'actions.
|
||||||
|
|
||||||
|
```css
|
||||||
|
.checkbox {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
border-radius: 6px;
|
||||||
|
border: 1px solid var(--color-border-hover);
|
||||||
|
background: var(--color-bg-deep);
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox.checked {
|
||||||
|
border-color: transparent;
|
||||||
|
background: var(--gradient-brand);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Priorites :
|
||||||
|
|
||||||
|
- faible : bleu ;
|
||||||
|
- normale : violet ;
|
||||||
|
- elevee : orange ;
|
||||||
|
- critique : rouge.
|
||||||
|
|
||||||
|
Ne jamais utiliser uniquement la couleur pour communiquer la priorite.
|
||||||
|
|
||||||
|
### Captures d'ecran
|
||||||
|
|
||||||
|
La galerie doit etre responsive :
|
||||||
|
|
||||||
|
- mobile : 1 colonne ;
|
||||||
|
- tablette : 2 colonnes ;
|
||||||
|
- desktop : 3 ou 4 colonnes.
|
||||||
|
|
||||||
|
Carte de capture : apercu, nom, auteur, date, tags, copier le lien, telecharger, ouvrir en grand, supprimer selon permissions.
|
||||||
|
|
||||||
|
Dropzone :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.dropzone {
|
||||||
|
min-height: 160px;
|
||||||
|
border: 1px dashed rgba(139, 92, 246, 0.52);
|
||||||
|
border-radius: var(--radius-lg);
|
||||||
|
background: var(--color-primary-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropzone.drag-active {
|
||||||
|
border-color: var(--color-accent-cyan);
|
||||||
|
background: rgba(34, 211, 238, 0.1);
|
||||||
|
box-shadow: 0 0 30px rgba(34, 211, 238, 0.12);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Visionneuse : fond presque noir, image centree, zoom, navigation entre images, metadonnees en panneau lateral, fermeture avec `Escape`.
|
||||||
|
|
||||||
|
## 12. Toolboxes
|
||||||
|
|
||||||
|
Une toolbox represente un espace de jeu. Une carte de toolbox affiche nom, icone/image, couleur, nombre de membres, nombre d'outils, derniere activite, avatars et statut prive/public. Les toolboxes ne portent pas de champ description.
|
||||||
|
|
||||||
|
La toolbox active peut utiliser une bordure en degrade, une lueur violette subtile, une pastille active et un fond legerement plus lumineux.
|
||||||
|
|
||||||
|
Creation d'une toolbox :
|
||||||
|
|
||||||
|
- nom ;
|
||||||
|
- icone ;
|
||||||
|
- couleur d'accent ;
|
||||||
|
- confidentialite ;
|
||||||
|
- membres ;
|
||||||
|
- outils ajoutes immediatement.
|
||||||
|
|
||||||
|
Couleurs d'accent proposees : violet, bleu, cyan, indigo, rose cosmique, vert emeraude.
|
||||||
|
|
||||||
|
## 13. Pages Informatives
|
||||||
|
|
||||||
|
Les pages informatives presentent des donnees structurees : objets, cartes, ressources, personnages, statistiques, strategies, equipements, recettes, quetes, evenements et liens utiles.
|
||||||
|
|
||||||
|
Structure recommandee :
|
||||||
|
|
||||||
|
1. titre ;
|
||||||
|
2. description ;
|
||||||
|
3. recherche ;
|
||||||
|
4. filtres ;
|
||||||
|
5. selecteur d'affichage ;
|
||||||
|
6. grille ou tableau ;
|
||||||
|
7. pagination ;
|
||||||
|
8. panneau de detail.
|
||||||
|
|
||||||
|
La structure visuelle doit rester independante de la source de donnees JSON ou API.
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": "item-001",
|
||||||
|
"name": "Nom de l'element",
|
||||||
|
"category": "Categorie",
|
||||||
|
"rarity": "epic",
|
||||||
|
"tags": ["support", "coop"],
|
||||||
|
"image": "/images/item-001.webp",
|
||||||
|
"description": "Description de l'element",
|
||||||
|
"stats": {
|
||||||
|
"power": 85,
|
||||||
|
"speed": 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 14. Filtres Et Tableaux
|
||||||
|
|
||||||
|
Filtres possibles : recherche textuelle, categorie, rarete, jeu, type, auteur, date, tags, statut et favoris.
|
||||||
|
|
||||||
|
Desktop : barre horizontale, panneau lateral droit ou zone repliable au-dessus du contenu.
|
||||||
|
|
||||||
|
Mobile : panneau venant du bas.
|
||||||
|
|
||||||
|
```css
|
||||||
|
.filter-chip.active {
|
||||||
|
color: #fff;
|
||||||
|
background: var(--color-primary-soft);
|
||||||
|
border-color: var(--color-primary-border);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Afficher le nombre de filtres actifs et prevoir une action de reinitialisation.
|
||||||
|
|
||||||
|
Tableaux :
|
||||||
|
|
||||||
|
- en-tete lisible en dark mode ;
|
||||||
|
- ligne separee par `var(--color-border)` ;
|
||||||
|
- hover discret `rgba(139, 92, 246, 0.06)` ;
|
||||||
|
- en-tete fixe pour les longs tableaux ;
|
||||||
|
- tri indique par une fleche ;
|
||||||
|
- valeurs numeriques alignees a droite ;
|
||||||
|
- mobile : cartes ou scroll horizontal.
|
||||||
|
|
||||||
|
## 15. Badges, Avatars, Presence
|
||||||
|
|
||||||
|
Badge :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.badge {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
min-height: 24px;
|
||||||
|
padding: 3px 9px;
|
||||||
|
border-radius: var(--radius-pill);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
- en ligne : `background: var(--color-success-soft); color: var(--color-success);`
|
||||||
|
- prive : `background: var(--color-primary-soft); color: #b69cff;`
|
||||||
|
- nouveau : `background: var(--color-info-soft); color: var(--color-info);`
|
||||||
|
- attention : `background: var(--color-warning-soft); color: var(--color-warning);`
|
||||||
|
|
||||||
|
Tailles avatar :
|
||||||
|
|
||||||
|
```css
|
||||||
|
--avatar-xs: 24px;
|
||||||
|
--avatar-sm: 32px;
|
||||||
|
--avatar-md: 40px;
|
||||||
|
--avatar-lg: 52px;
|
||||||
|
```
|
||||||
|
|
||||||
|
Presence :
|
||||||
|
|
||||||
|
- vert : en ligne ;
|
||||||
|
- bleu : en jeu ;
|
||||||
|
- jaune : absent ;
|
||||||
|
- gris : hors ligne ;
|
||||||
|
- rouge : ne pas deranger.
|
||||||
|
|
||||||
|
Ne pas reposer uniquement sur la couleur. Ajouter un tooltip ou un libelle accessible.
|
||||||
|
|
||||||
|
## 16. Notifications, Modales, Menus
|
||||||
|
|
||||||
|
Toasts :
|
||||||
|
|
||||||
|
- position : `right: 20px; bottom: 20px;`
|
||||||
|
- information : 4 s ;
|
||||||
|
- succes : 3 a 4 s ;
|
||||||
|
- avertissement : 6 s ;
|
||||||
|
- erreur : persistante ou 8 s.
|
||||||
|
|
||||||
|
Les notifications ne doivent pas masquer les actions principales.
|
||||||
|
|
||||||
|
Modales :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.modal-backdrop {
|
||||||
|
background: rgba(2, 3, 9, 0.76);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal {
|
||||||
|
width: min(560px, calc(100vw - 32px));
|
||||||
|
max-height: calc(100vh - 48px);
|
||||||
|
overflow-y: auto;
|
||||||
|
border: 1px solid var(--color-border);
|
||||||
|
border-radius: var(--radius-xl);
|
||||||
|
background: var(--color-bg-surface);
|
||||||
|
box-shadow: var(--shadow-lg);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Les actions de modale sont regroupees en bas a droite. Sur mobile, une modale peut devenir un panneau plein ecran.
|
||||||
|
|
||||||
|
Menus contextuels :
|
||||||
|
|
||||||
|
- fond eleve ;
|
||||||
|
- ombre forte ;
|
||||||
|
- separateurs fins ;
|
||||||
|
- rayon 10 a 12 px ;
|
||||||
|
- largeur minimale 180 px ;
|
||||||
|
- action dangereuse isolee visuellement.
|
||||||
|
|
||||||
|
## 17. Etats UI
|
||||||
|
|
||||||
|
Etats vides :
|
||||||
|
|
||||||
|
- icone ou illustration simple ;
|
||||||
|
- titre ;
|
||||||
|
- explication courte ;
|
||||||
|
- action claire ;
|
||||||
|
- jamais de section completement vide.
|
||||||
|
|
||||||
|
Chargement :
|
||||||
|
|
||||||
|
- skeletons pour cartes, listes, tableaux, galeries, profils ;
|
||||||
|
- spinner reserve aux petites actions ;
|
||||||
|
- bouton en chargement conserve sa largeur.
|
||||||
|
|
||||||
|
Erreur :
|
||||||
|
|
||||||
|
- icone ;
|
||||||
|
- titre clair ;
|
||||||
|
- explication comprehensible ;
|
||||||
|
- detail technique secondaire si utile ;
|
||||||
|
- bouton pour reessayer.
|
||||||
|
|
||||||
|
## 18. Icones
|
||||||
|
|
||||||
|
Bibliotheque recommandee : Lucide Icons. Ne pas melanger plusieurs bibliotheques.
|
||||||
|
|
||||||
|
Style :
|
||||||
|
|
||||||
|
- contour ;
|
||||||
|
- epaisseur reguliere ;
|
||||||
|
- taille 18 a 22 px ;
|
||||||
|
- coins legerement arrondis.
|
||||||
|
|
||||||
|
Mappings recommandes :
|
||||||
|
|
||||||
|
- toolbox : `Package`, `Boxes`, `Briefcase` ;
|
||||||
|
- bloc-note : `NotebookPen` ;
|
||||||
|
- checklist : `ListChecks` ;
|
||||||
|
- screenshot : `Image` ;
|
||||||
|
- membres : `Users` ;
|
||||||
|
- informations : `Database`, `BookOpen` ;
|
||||||
|
- parametres : `Settings` ;
|
||||||
|
- filtre : `SlidersHorizontal` ;
|
||||||
|
- recherche : `Search` ;
|
||||||
|
- partager : `Share2` ;
|
||||||
|
- ajouter : `Plus`.
|
||||||
|
|
||||||
|
## 19. Animations
|
||||||
|
|
||||||
|
Animations rapides et discretes uniquement :
|
||||||
|
|
||||||
|
- leger deplacement vertical au survol ;
|
||||||
|
- fondu ;
|
||||||
|
- changement de couleur ;
|
||||||
|
- ouverture fluide d'un panneau ;
|
||||||
|
- apparition d'un menu ;
|
||||||
|
- legere pulsation d'un statut en ligne ;
|
||||||
|
- transition entre vues grille/liste.
|
||||||
|
|
||||||
|
Eviter animations permanentes, rotations gratuites, zooms importants, flashes et effets neon agressifs.
|
||||||
|
|
||||||
|
```css
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
animation-duration: 0.01ms !important;
|
||||||
|
animation-iteration-count: 1 !important;
|
||||||
|
transition-duration: 0.01ms !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 20. Scrollbars
|
||||||
|
|
||||||
|
Les zones scrollables doivent reprendre le style de l'ancien site : piste sombre, ombre interne claire et pouce avec degrade violet/indigo. Pour l'integration **Nebula Command**, le rail noir historique est remplace par un bleu-noir profond.
|
||||||
|
|
||||||
|
Version globale recommandee :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.legacy-scrollbar::-webkit-scrollbar {
|
||||||
|
background-color: transparent;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legacy-scrollbar::-webkit-scrollbar-track {
|
||||||
|
background-color: transparent;
|
||||||
|
border-radius: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legacy-scrollbar::-webkit-scrollbar-thumb {
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.5, rgb(79, 26, 114)), color-stop(1, rgb(44, 1, 135)));
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dimensions recommandees :
|
||||||
|
|
||||||
|
- scrollbar principale, panneau lateral, drawer, liste de filtres ou tableau : `6px` ;
|
||||||
|
- rail transparent pour eviter les doubles bordures avec les panneaux ;
|
||||||
|
- thumb arrondi sans bordure interne ;
|
||||||
|
- sur un panneau borde, ajouter un leger `padding-right` au contenu scrollable pour separer le thumb de la bordure du panneau ;
|
||||||
|
- ne pas utiliser de scrollbar trop lumineuse sur les zones de lecture longues.
|
||||||
|
|
||||||
|
Les scrollbars doivent etre appliquees aux panneaux, menus, drawers, listes de filtres, tableaux et zones de details. Utiliser la classe `.legacy-scrollbar` sur les zones internes qui doivent reprendre explicitement l'ancien rendu. Eviter les overrides globaux comme `scrollbar-width` ou `scrollbar-color`, car ils changent l'aspect par rapport a l'ancien site.
|
||||||
|
|
||||||
|
## 21. Accessibilite
|
||||||
|
|
||||||
|
Minimum WCAG AA.
|
||||||
|
|
||||||
|
Regles :
|
||||||
|
|
||||||
|
- contraste suffisant ;
|
||||||
|
- navigation clavier complete ;
|
||||||
|
- focus visible ;
|
||||||
|
- labels de champs ;
|
||||||
|
- textes alternatifs aux images ;
|
||||||
|
- ne jamais utiliser uniquement la couleur pour transmettre une information ;
|
||||||
|
- boutons reels pour actions ;
|
||||||
|
- liens reels pour navigation ;
|
||||||
|
- hierarchie correcte `h1`, `h2`, `h3` ;
|
||||||
|
- notifications importantes annoncees aux lecteurs d'ecran ;
|
||||||
|
- modales correctement gerees au clavier.
|
||||||
|
|
||||||
|
```css
|
||||||
|
:focus-visible {
|
||||||
|
outline: 2px solid var(--color-accent-cyan);
|
||||||
|
outline-offset: 3px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 22. Fond Galaxie Et Effet Verre
|
||||||
|
|
||||||
|
Fond recommande :
|
||||||
|
|
||||||
|
- gradient CSS ;
|
||||||
|
- pseudo-element avec motif discret ;
|
||||||
|
- particules statiques seulement ;
|
||||||
|
- aucun canvas anime en permanence par defaut.
|
||||||
|
|
||||||
|
```css
|
||||||
|
body {
|
||||||
|
min-height: 100vh;
|
||||||
|
color: var(--color-text-primary);
|
||||||
|
background: var(--gradient-page);
|
||||||
|
}
|
||||||
|
|
||||||
|
body::before {
|
||||||
|
content: "";
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0.25;
|
||||||
|
background-image:
|
||||||
|
radial-gradient(circle, rgba(255, 255, 255, 0.5) 1px, transparent 1px),
|
||||||
|
radial-gradient(circle, rgba(139, 92, 246, 0.35) 1px, transparent 1px);
|
||||||
|
background-size: 90px 90px, 140px 140px;
|
||||||
|
background-position: 0 0, 35px 60px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Effet verre autorise sur topbar, modales, panneaux flottants, barre de filtres et menus. Ne pas l'appliquer a toutes les cartes.
|
||||||
|
|
||||||
|
```css
|
||||||
|
.glass-panel {
|
||||||
|
background: rgba(16, 20, 38, 0.72);
|
||||||
|
border: 1px solid rgba(165, 180, 252, 0.14);
|
||||||
|
backdrop-filter: blur(18px);
|
||||||
|
-webkit-backdrop-filter: blur(18px);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 23. Ecrans Cibles
|
||||||
|
|
||||||
|
Accueil :
|
||||||
|
|
||||||
|
- message de bienvenue ;
|
||||||
|
- toolbox recemment utilisee ;
|
||||||
|
- bouton creer une toolbox ;
|
||||||
|
- bouton rejoindre une toolbox si collaboration activee ;
|
||||||
|
- section Mes toolboxes ;
|
||||||
|
- activite recente ;
|
||||||
|
- outils rapides.
|
||||||
|
|
||||||
|
Page toolbox :
|
||||||
|
|
||||||
|
- nom, icone ;
|
||||||
|
- membres ;
|
||||||
|
- inviter, partager, options ;
|
||||||
|
- onglets : vue d'ensemble, notes, checklists, captures, fichiers, informations, activite ;
|
||||||
|
- vue d'ensemble avec outils epingles, notes recentes, taches en cours, dernieres captures et activite.
|
||||||
|
|
||||||
|
Pages informatives :
|
||||||
|
|
||||||
|
- recherche ;
|
||||||
|
- filtres ;
|
||||||
|
- vue grille/table ;
|
||||||
|
- detail ;
|
||||||
|
- association rapide a une toolbox.
|
||||||
|
|
||||||
|
## 24. Permissions Et Themes Par Toolbox
|
||||||
|
|
||||||
|
Roles visuels a prevoir :
|
||||||
|
|
||||||
|
- proprietaire ;
|
||||||
|
- administrateur ;
|
||||||
|
- membre ;
|
||||||
|
- lecteur.
|
||||||
|
|
||||||
|
Actions indisponibles :
|
||||||
|
|
||||||
|
- masquer si cela simplifie l'interface ;
|
||||||
|
- sinon desactiver avec tooltip explicatif.
|
||||||
|
|
||||||
|
Chaque toolbox peut definir une couleur d'accent :
|
||||||
|
|
||||||
|
```css
|
||||||
|
.toolbox-theme {
|
||||||
|
--toolbox-accent: #8b5cf6;
|
||||||
|
--toolbox-accent-soft: rgba(139, 92, 246, 0.14);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette couleur peut etre utilisee pour icone, bordure active, badges, graphiques, titre et certains boutons secondaires. La couleur principale de l'application doit rester coherente.
|
||||||
|
|
||||||
|
## 25. Recommandations Techniques
|
||||||
|
|
||||||
|
Stack suggeree pour une refonte propre :
|
||||||
|
|
||||||
|
- React ou Next.js ;
|
||||||
|
- TypeScript strict ;
|
||||||
|
- Tailwind CSS ou CSS Modules ;
|
||||||
|
- Lucide React pour les icones ;
|
||||||
|
- Radix UI ou shadcn/ui pour les composants accessibles ;
|
||||||
|
- Framer Motion uniquement pour quelques transitions utiles ;
|
||||||
|
- React Hook Form pour les formulaires ;
|
||||||
|
- Zod pour la validation ;
|
||||||
|
- TanStack Query pour les donnees distantes ;
|
||||||
|
- TanStack Table pour les tableaux ;
|
||||||
|
- Zustand ou Context API pour un etat global leger.
|
||||||
|
|
||||||
|
Organisation cible :
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/
|
||||||
|
components/
|
||||||
|
ui/
|
||||||
|
Button
|
||||||
|
Input
|
||||||
|
Textarea
|
||||||
|
Modal
|
||||||
|
Dropdown
|
||||||
|
Badge
|
||||||
|
Avatar
|
||||||
|
Tooltip
|
||||||
|
Tabs
|
||||||
|
Card
|
||||||
|
Toast
|
||||||
|
Skeleton
|
||||||
|
layout/
|
||||||
|
AppShell
|
||||||
|
Sidebar
|
||||||
|
Topbar
|
||||||
|
MobileNavigation
|
||||||
|
ContextPanel
|
||||||
|
toolbox/
|
||||||
|
ToolboxCard
|
||||||
|
ToolboxHeader
|
||||||
|
ToolboxMembers
|
||||||
|
ToolboxSettings
|
||||||
|
CreateToolboxModal
|
||||||
|
tools/
|
||||||
|
NoteTool
|
||||||
|
ChecklistTool
|
||||||
|
ScreenshotTool
|
||||||
|
FileTool
|
||||||
|
information/
|
||||||
|
FilterBar
|
||||||
|
DataCard
|
||||||
|
DataTable
|
||||||
|
DataDetailsPanel
|
||||||
|
EmptyResults
|
||||||
|
pages/
|
||||||
|
hooks/
|
||||||
|
services/
|
||||||
|
stores/
|
||||||
|
styles/
|
||||||
|
types/
|
||||||
|
```
|
||||||
|
|
||||||
|
Regles de developpement :
|
||||||
|
|
||||||
|
- creer les composants UI de base avant les pages ;
|
||||||
|
- centraliser les couleurs en variables CSS ;
|
||||||
|
- gerer les etats normal, hover, active, focus, disabled, loading et error ;
|
||||||
|
- concevoir mobile-first ;
|
||||||
|
- ajouter des donnees fictives JSON pour tester les vues ;
|
||||||
|
- separer les composants visuels de la recuperation des donnees ;
|
||||||
|
- prevoir les permissions ;
|
||||||
|
- traiter l'accessibilite des le debut ;
|
||||||
|
- eviter les composants de plus de 250 a 300 lignes ;
|
||||||
|
- ajouter des tests sur les composants critiques.
|
||||||
95
README.md
|
|
@ -0,0 +1,95 @@
|
||||||
|
# Sokko G
|
||||||
|
|
||||||
|
Webapp locale pour préparer et accompagner des sessions gaming sur second écran.
|
||||||
|
|
||||||
|
Sokko G propose des toolboxes modulaires stockées dans le navigateur, ainsi que des pages de guides de jeu maintenues dans le dépôt. Aucune donnée utilisateur n’est envoyée côté serveur.
|
||||||
|
|
||||||
|
## Fonctionnalités
|
||||||
|
|
||||||
|
- Toolboxes locales stockées dans `localStorage`.
|
||||||
|
- Outils disponibles : bloc notes, checklist avec quantités, screenshots.
|
||||||
|
- Import/export d’une toolbox.
|
||||||
|
- Import/export global de toutes les toolboxes.
|
||||||
|
- Association locale entre une page jeu et une toolbox.
|
||||||
|
- Panneau latéral redimensionnable sur les pages jeux.
|
||||||
|
- Suivi et contrôle du quota localStorage.
|
||||||
|
- Pages de guides de jeu éditables via JSON.
|
||||||
|
|
||||||
|
## Démarrage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Par défaut, le site démarre sur `http://localhost:5173`.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Le serveur lit automatiquement un fichier `.env` à la racine du projet.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```env
|
||||||
|
PORT=5173
|
||||||
|
```
|
||||||
|
|
||||||
|
Le fichier `.env` est ignoré par git. Pour changer le port localement, modifier `PORT`.
|
||||||
|
|
||||||
|
## Vérifications
|
||||||
|
|
||||||
|
Avant un push ou une mise en ligne :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run check
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette commande vérifie la syntaxe de `website/src/app.js`, celle de `server.mjs`, puis lance les tests.
|
||||||
|
|
||||||
|
## Contenu éditable
|
||||||
|
|
||||||
|
Les contenus maintenus à la main sont regroupés dans `website/public/data`.
|
||||||
|
|
||||||
|
| Fichier | Rôle |
|
||||||
|
| --- | --- |
|
||||||
|
| `website/public/data/site.json` | Textes généraux du site : home, navigation, sidebar, page toolboxes. |
|
||||||
|
| `website/public/data/games.json` | Liste des jeux affichés sur `/games` et contenus des cards jeux. |
|
||||||
|
| `website/public/data/mhwilds/monsters.json` | Données des monstres Monster Hunter Wilds. |
|
||||||
|
| `website/public/data/mhwilds/endemic_life.json` | Données de la faune Monster Hunter Wilds. |
|
||||||
|
| `website/public/data/mhwilds/i18n/fr.json` | Traductions françaises des données MHWilds. |
|
||||||
|
| `website/public/data/mhwilds/i18n/en.json` | Traductions anglaises des données MHWilds. |
|
||||||
|
| `website/public/data/toolbox-icons.json` | Manifeste des icônes SVG réutilisables. |
|
||||||
|
|
||||||
|
Les images publiques sont dans `website/public/static`.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```text
|
||||||
|
.
|
||||||
|
├── DESIGN_SYSTEM.md
|
||||||
|
├── package.json
|
||||||
|
├── server.mjs
|
||||||
|
├── tests/
|
||||||
|
└── website/
|
||||||
|
├── public/
|
||||||
|
│ ├── data/
|
||||||
|
│ ├── static/
|
||||||
|
│ └── index.html
|
||||||
|
└── src/
|
||||||
|
├── app.js
|
||||||
|
└── styles.css
|
||||||
|
```
|
||||||
|
|
||||||
|
## Stockage local
|
||||||
|
|
||||||
|
Clés principales :
|
||||||
|
|
||||||
|
- `sokkog:toolboxes` : registre local des toolboxes.
|
||||||
|
- `sokkog:game-toolbox-links` : associations locales jeu -> toolbox.
|
||||||
|
- `sokkog:toolbox:{toolboxId}:module:{moduleId}` : données de chaque outil.
|
||||||
|
- `sokkog:drawer-width` : largeur du panneau latéral.
|
||||||
|
|
||||||
|
Le quota applicatif est contrôlé côté navigateur avant écriture. Les imports globaux simulent l’espace nécessaire avant de modifier les données locales.
|
||||||
12
package.json
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"name": "sokko-g",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node server.mjs",
|
||||||
|
"dev": "node server.mjs",
|
||||||
|
"check": "node --check website/src/app.js && node --check server.mjs && npm test",
|
||||||
|
"test": "node --test"
|
||||||
|
}
|
||||||
|
}
|
||||||
96
server.mjs
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
import { createReadStream, existsSync, readFileSync, statSync } from "node:fs";
|
||||||
|
import { createServer } from "node:http";
|
||||||
|
import { extname, join, relative, resolve } from "node:path";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
|
||||||
|
const root = resolve(fileURLToPath(new URL(".", import.meta.url)), "website");
|
||||||
|
const publicRoot = join(root, "public");
|
||||||
|
|
||||||
|
function loadEnvFile(file = ".env") {
|
||||||
|
if (!existsSync(file)) return;
|
||||||
|
|
||||||
|
const lines = readFileSync(file, "utf8").split(/\r?\n/);
|
||||||
|
lines.forEach((line) => {
|
||||||
|
const trimmed = line.trim();
|
||||||
|
if (!trimmed || trimmed.startsWith("#")) return;
|
||||||
|
|
||||||
|
const separatorIndex = trimmed.indexOf("=");
|
||||||
|
if (separatorIndex < 1) return;
|
||||||
|
|
||||||
|
const key = trimmed.slice(0, separatorIndex).trim();
|
||||||
|
const value = trimmed.slice(separatorIndex + 1).trim().replace(/^["']|["']$/g, "");
|
||||||
|
if (!process.env[key]) process.env[key] = value;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
loadEnvFile();
|
||||||
|
|
||||||
|
const port = Number(process.env.PORT || 5173);
|
||||||
|
|
||||||
|
const types = {
|
||||||
|
".html": "text/html; charset=utf-8",
|
||||||
|
".css": "text/css; charset=utf-8",
|
||||||
|
".js": "text/javascript; charset=utf-8",
|
||||||
|
".json": "application/json; charset=utf-8",
|
||||||
|
".svg": "image/svg+xml",
|
||||||
|
".ico": "image/x-icon",
|
||||||
|
".png": "image/png",
|
||||||
|
".jpg": "image/jpeg",
|
||||||
|
".jpeg": "image/jpeg",
|
||||||
|
".webp": "image/webp"
|
||||||
|
};
|
||||||
|
|
||||||
|
function isInsideRoot(parent, file) {
|
||||||
|
const relativePath = relative(parent, file);
|
||||||
|
return Boolean(relativePath) && !relativePath.startsWith("..") && !relativePath.startsWith("/");
|
||||||
|
}
|
||||||
|
|
||||||
|
function fileIfReadable(file) {
|
||||||
|
return isInsideRoot(root, file) && existsSync(file) && statSync(file).isFile() ? file : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolvePath(url) {
|
||||||
|
let requested;
|
||||||
|
try {
|
||||||
|
requested = decodeURIComponent(new URL(url, "http://localhost").pathname);
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const candidate = fileIfReadable(resolve(root, `.${requested}`));
|
||||||
|
if (candidate) return candidate;
|
||||||
|
|
||||||
|
const publicCandidate = fileIfReadable(resolve(publicRoot, `.${requested}`));
|
||||||
|
if (publicCandidate && isInsideRoot(publicRoot, publicCandidate)) return publicCandidate;
|
||||||
|
|
||||||
|
return join(publicRoot, "index.html");
|
||||||
|
}
|
||||||
|
|
||||||
|
const server = createServer((req, res) => {
|
||||||
|
const file = resolvePath(req.url || "/");
|
||||||
|
if (!file || !existsSync(file)) {
|
||||||
|
res.writeHead(404);
|
||||||
|
res.end("Not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
res.writeHead(200, {
|
||||||
|
"Content-Type": types[extname(file)] || "application/octet-stream",
|
||||||
|
"Cache-Control": "no-store"
|
||||||
|
});
|
||||||
|
createReadStream(file).pipe(res);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("error", (error) => {
|
||||||
|
if (error.code === "EADDRINUSE") {
|
||||||
|
console.error(`Port ${port} is already in use. Set PORT to another value.`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.listen(port, () => {
|
||||||
|
console.log(`Sokko G dev server running at http://localhost:${port}`);
|
||||||
|
});
|
||||||
108
tests/static-smoke.test.mjs
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
import { readFile } from "node:fs/promises";
|
||||||
|
import { test } from "node:test";
|
||||||
|
import assert from "node:assert/strict";
|
||||||
|
|
||||||
|
test("static entrypoint loads the application assets", async () => {
|
||||||
|
const html = await readFile("website/public/index.html", "utf8");
|
||||||
|
|
||||||
|
assert.match(html, /<div id="app"><\/div>/);
|
||||||
|
assert.match(html, /\/favicon\.ico/);
|
||||||
|
assert.match(html, /\/src\/app\.js/);
|
||||||
|
assert.match(html, /\/src\/styles\.css/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("application defines the expected local toolbox primitives", async () => {
|
||||||
|
const source = await readFile("website/src/app.js", "utf8");
|
||||||
|
|
||||||
|
assert.match(source, /sokkog:toolboxes/);
|
||||||
|
assert.match(source, /sokkog:game-toolbox-links/);
|
||||||
|
assert.match(source, /DEFAULT_SITE_CONTENT/);
|
||||||
|
assert.match(source, /function loadSiteContent/);
|
||||||
|
assert.match(source, /\/data\/site\.json/);
|
||||||
|
assert.match(source, /APP_STORAGE_LIMIT_BYTES/);
|
||||||
|
assert.match(source, /function renderStorageQuota/);
|
||||||
|
assert.match(source, /function writeStorageValue/);
|
||||||
|
assert.match(source, /role="progressbar"/);
|
||||||
|
assert.match(source, /export-all-toolboxes/);
|
||||||
|
assert.match(source, /import-all-toolboxes/);
|
||||||
|
assert.match(source, /function createGlobalExportPayload/);
|
||||||
|
assert.match(source, /function importAllToolboxes/);
|
||||||
|
assert.match(source, /open-link-toolbox-modal/);
|
||||||
|
assert.match(source, /function showToolboxLinkModal/);
|
||||||
|
assert.match(source, /data-game-id/);
|
||||||
|
assert.match(source, /notepad/);
|
||||||
|
assert.match(source, /checklist/);
|
||||||
|
assert.match(source, /screenshots/);
|
||||||
|
assert.doesNotMatch(source, /description: _description/);
|
||||||
|
assert.match(source, /function showToolboxCreateModal/);
|
||||||
|
assert.match(source, /data-action="toolbox-create-form"/);
|
||||||
|
assert.match(source, /function getToolboxGameId/);
|
||||||
|
assert.match(source, /dragon\.png/);
|
||||||
|
assert.match(source, /const game = getToolboxGame\(toolbox\)/);
|
||||||
|
assert.match(source, /moduleColumns/);
|
||||||
|
assert.match(source, /data-action="set-module-layout"/);
|
||||||
|
assert.match(source, /data-action="edit-toolbox-title"/);
|
||||||
|
assert.match(source, /function renderToolboxModules/);
|
||||||
|
assert.match(source, /function moveToolboxModule/);
|
||||||
|
assert.match(source, /dragstart/);
|
||||||
|
assert.match(source, /qtyTarget/);
|
||||||
|
assert.match(source, /qtyCurrent/);
|
||||||
|
assert.match(source, /adjust-check-qty/);
|
||||||
|
assert.match(source, /paste-screenshot/);
|
||||||
|
assert.match(source, /clipboardData/);
|
||||||
|
assert.match(source, /function addScreenshotFiles/);
|
||||||
|
assert.match(source, /view-screenshot/);
|
||||||
|
assert.match(source, /function showScreenshotViewer/);
|
||||||
|
assert.match(source, /drop-screenshot/);
|
||||||
|
assert.match(source, /dataTransfer\.files/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("mhwilds data and assets are available", async () => {
|
||||||
|
const site = JSON.parse(await readFile("website/public/data/site.json", "utf8"));
|
||||||
|
const games = JSON.parse(await readFile("website/public/data/games.json", "utf8"));
|
||||||
|
const monsters = JSON.parse(await readFile("website/public/data/mhwilds/monsters.json", "utf8"));
|
||||||
|
const endemicLife = JSON.parse(await readFile("website/public/data/mhwilds/endemic_life.json", "utf8"));
|
||||||
|
const translations = JSON.parse(await readFile("website/public/data/mhwilds/i18n/fr.json", "utf8"));
|
||||||
|
const appSource = await readFile("website/src/app.js", "utf8");
|
||||||
|
|
||||||
|
assert.equal(site.brand.name, "Sokko G");
|
||||||
|
assert.equal(site.home.hero.title, "Sokko G");
|
||||||
|
assert.ok(site.toolboxes.storageHelp.items.length >= 3);
|
||||||
|
assert.equal(games.games[0].id, "mhwilds");
|
||||||
|
assert.equal(games.games[0].eyebrow, "Guide de jeu");
|
||||||
|
assert.match(games.games[0].image, /mhwilds\.png/);
|
||||||
|
assert.ok(monsters.monsters.length > 0);
|
||||||
|
assert.ok(endemicLife.endemicLife.length > 0);
|
||||||
|
assert.equal(translations.monsters, "monstres");
|
||||||
|
assert.match(appSource, /renderMhwildsListing/);
|
||||||
|
assert.match(appSource, /flip-monster-card/);
|
||||||
|
await readFile("website/public/static/img/mhwilds/chatacabra.png");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("server supports local env configuration", async () => {
|
||||||
|
const server = await readFile("server.mjs", "utf8");
|
||||||
|
const envExample = await readFile(".env.example", "utf8");
|
||||||
|
|
||||||
|
assert.match(server, /function loadEnvFile/);
|
||||||
|
assert.match(server, /process\.env\.PORT/);
|
||||||
|
assert.match(envExample, /PORT=5173/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("legacy svg icons are available for reuse", async () => {
|
||||||
|
const manifest = JSON.parse(await readFile("website/public/data/toolbox-icons.json", "utf8"));
|
||||||
|
|
||||||
|
assert.ok(manifest.icons.length >= 4);
|
||||||
|
await readFile("website/public/static/icons/home.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/checklist.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/close.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/columns.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/export.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/notepad.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/picture.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/rows.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/rubber.svg", "utf8");
|
||||||
|
await readFile("website/public/static/icons/trashcan.svg", "utf8");
|
||||||
|
await readFile("website/public/favicon.ico");
|
||||||
|
await readFile("website/public/static/img/dragon.png");
|
||||||
|
await readFile("website/public/static/img/toolbox-icons/controller.svg", "utf8");
|
||||||
|
});
|
||||||
38
website/public/data/games.json
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
{
|
||||||
|
"games": [
|
||||||
|
{
|
||||||
|
"id": "mhwilds",
|
||||||
|
"title": "Monster Hunter Wilds",
|
||||||
|
"eyebrow": "Guide de jeu",
|
||||||
|
"cover": "linear-gradient(135deg, rgba(139, 92, 246, 0.88) 0%, rgba(99, 102, 241, 0.82) 48%, rgba(34, 211, 238, 0.72) 100%)",
|
||||||
|
"image": "/static/img/mhwilds.png",
|
||||||
|
"summary": "Repères rapides pour préparer une chasse, suivre les priorités et garder les infos utiles sur un second écran.",
|
||||||
|
"sections": [
|
||||||
|
{
|
||||||
|
"title": "Préparation",
|
||||||
|
"items": [
|
||||||
|
"Choisir un repas adapté",
|
||||||
|
"Vérifier les pièges et consommables",
|
||||||
|
"Préparer un set anti-statuts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Pendant la chasse",
|
||||||
|
"items": [
|
||||||
|
"Marquer les parties cassables",
|
||||||
|
"Noter les timings de rage",
|
||||||
|
"Garder un oeil sur les objectifs secondaires"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Après mission",
|
||||||
|
"items": [
|
||||||
|
"Capturer les drops rares",
|
||||||
|
"Mettre à jour les crafts suivis",
|
||||||
|
"Archiver les screenshots importants"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
1129
website/public/data/mhwilds/endemic_life.json
Normal file
217
website/public/data/mhwilds/i18n/en.json
Normal file
|
|
@ -0,0 +1,217 @@
|
||||||
|
{
|
||||||
|
"and": "and",
|
||||||
|
"or": "or",
|
||||||
|
"reset": "reset",
|
||||||
|
"create checklist": "create checklist",
|
||||||
|
"to be completed": "to be completed",
|
||||||
|
"monsters": "monsters",
|
||||||
|
"endemic life": "endemic life",
|
||||||
|
"name": "name",
|
||||||
|
"weaknesses": "weaknesses",
|
||||||
|
"locations": "locations",
|
||||||
|
"ailments": "ailments",
|
||||||
|
"cut": "cut",
|
||||||
|
"blunt": "blunt",
|
||||||
|
"ammo": "ammo",
|
||||||
|
"windward plains": "windward plains",
|
||||||
|
"scarlet forest": "scarlet forest",
|
||||||
|
"ruins of wyveria": "ruins of wyveria",
|
||||||
|
"oilwell basin": "oilwell basin",
|
||||||
|
"iceshard cliffs": "iceshard cliffs",
|
||||||
|
"dragon": "dragon",
|
||||||
|
"fire": "fire",
|
||||||
|
"ice": "ice",
|
||||||
|
"thunder": "thunder",
|
||||||
|
"water": "water",
|
||||||
|
"dragonblight": "dragonblight",
|
||||||
|
"fireblight": "fireblight",
|
||||||
|
"iceblight": "iceblight",
|
||||||
|
"thunderblight": "thunderblight",
|
||||||
|
"waterblight": "waterblight",
|
||||||
|
"frostblight": "frostblight",
|
||||||
|
"bubbleblight": "bubbleblight",
|
||||||
|
"stench": "stench",
|
||||||
|
"sleep": "sleep",
|
||||||
|
"paralysis": "paralysis",
|
||||||
|
"blast": "blast",
|
||||||
|
"poison": "poison",
|
||||||
|
"webbed": "webbed",
|
||||||
|
"bleeding": "bleeding",
|
||||||
|
"stun": "stun",
|
||||||
|
"frenzy virus": "frenzy virus",
|
||||||
|
"defense down": "defense down",
|
||||||
|
"minor wind pressure": "minor wind pressure",
|
||||||
|
"dragon wind pressure": "dragon wind pressure",
|
||||||
|
"minor tremor": "minor tremor",
|
||||||
|
"weak roar": "weak roar",
|
||||||
|
"strong roar": "strong roar",
|
||||||
|
"mantle broken": "mantle broken",
|
||||||
|
"head": "head",
|
||||||
|
"nose": "nose",
|
||||||
|
"antenna": "antenna",
|
||||||
|
"neck": "neck",
|
||||||
|
"mouth": "mouth",
|
||||||
|
"torso": "torso",
|
||||||
|
"membrane": "membrane",
|
||||||
|
"tongue": "tongue",
|
||||||
|
"chest": "chest",
|
||||||
|
"belly": "belly",
|
||||||
|
"tentacle": "tentacle",
|
||||||
|
"back": "back",
|
||||||
|
"left wingarm": "left wingarm",
|
||||||
|
"right wingarm": "right wingarm",
|
||||||
|
"front left arm": "front left arm",
|
||||||
|
"front right arm": "front right arm",
|
||||||
|
"middle left arm": "middle left arm",
|
||||||
|
"middle right arm": "middle right arm",
|
||||||
|
"rear left arm": "rear left arm",
|
||||||
|
"rear right arm": "rear right arm",
|
||||||
|
"left wing": "left wing",
|
||||||
|
"right wing": "right wing",
|
||||||
|
"left leg": "left leg",
|
||||||
|
"right leg": "right leg",
|
||||||
|
"forelegs": "forelegs",
|
||||||
|
"left foreleg": "left foreleg",
|
||||||
|
"right foreleg": "right foreleg",
|
||||||
|
"hindlegs": "hindlegs",
|
||||||
|
"left hindleg": "left hindleg",
|
||||||
|
"right hindleg": "right hindleg",
|
||||||
|
"left chainblade": "left chainblade",
|
||||||
|
"right chainblade": "right chainblade",
|
||||||
|
"left claw": "left claw",
|
||||||
|
"right claw": "right claw",
|
||||||
|
"abdominal iceplate": "abdominal iceplate",
|
||||||
|
"large iceplate(hidden)": "large iceplate(hidden)",
|
||||||
|
"large iceplate(exposed)": "large iceplate(exposed)",
|
||||||
|
"head (crystallized)": "head (crystallized)",
|
||||||
|
"left wingarm (crystallized)": "left wingarm (crystallized)",
|
||||||
|
"right wingarm (crystallized)": "right wingarm (crystallized)",
|
||||||
|
"back fin": "back fin",
|
||||||
|
"stinger": "stinger",
|
||||||
|
"mantle": "mantle",
|
||||||
|
"petals": "petals",
|
||||||
|
"tail": "tail",
|
||||||
|
"tail hair": "tail hair",
|
||||||
|
"rear": "rear",
|
||||||
|
"tail tip": "tail tip",
|
||||||
|
"flying wyvern": "flying wyvern",
|
||||||
|
"fanged beast": "fanged beast",
|
||||||
|
"construct": "construct",
|
||||||
|
"chatacabra": "chatacabra",
|
||||||
|
"quematrice": "quematrice",
|
||||||
|
"lala barina": "lala barina",
|
||||||
|
"congalala": "congalala",
|
||||||
|
"balahara": "balahara",
|
||||||
|
"doshaguma": "doshaguma",
|
||||||
|
"uth duna": "uth duna",
|
||||||
|
"rompopolo": "rompopolo",
|
||||||
|
"rey dau": "rey dau",
|
||||||
|
"nerscylla": "nerscylla",
|
||||||
|
"hirabami": "hirabami",
|
||||||
|
"ajarakan": "ajarakan",
|
||||||
|
"nu udra": "nu udra",
|
||||||
|
"jin dahaad": "jin dahaad",
|
||||||
|
"xu wu": "xu wu",
|
||||||
|
"zoh shia": "zoh shia",
|
||||||
|
"yian kut-ku": "yian kut-ku",
|
||||||
|
"gypceros": "gypceros",
|
||||||
|
"rathian": "rathian",
|
||||||
|
"rathalos": "rathalos",
|
||||||
|
"gravios": "gravios",
|
||||||
|
"blangonga": "blangonga",
|
||||||
|
"gore magala": "gore magala",
|
||||||
|
"arkveld": "arkveld",
|
||||||
|
"mizutsune": "mizutsune",
|
||||||
|
"guardian doshaguma": "guardian doshaguma",
|
||||||
|
"guardian rathalos": "guardian rathalos",
|
||||||
|
"guardian ebony odogaron": "guardian ebony odogaron",
|
||||||
|
"guardian arkveld": "guardian arkveld",
|
||||||
|
"guardian fulgur anjanath": "guardian fulgur anjanath",
|
||||||
|
"vigorwasp": "vigorwasp",
|
||||||
|
"giant vigorwasp": "giant vigorwasp",
|
||||||
|
"purewasp": "purewasp",
|
||||||
|
"vigormantle bug": "vigormantle bug",
|
||||||
|
"chillmantle bug": "chillmantle bug",
|
||||||
|
"heatmantle bug": "heatmantle bug",
|
||||||
|
"wiggly litchi": "wiggly litchi",
|
||||||
|
"paratoad": "paratoad",
|
||||||
|
"nitrotoad": "nitrotoad",
|
||||||
|
"sleeptoad": "sleeptoad",
|
||||||
|
"flashflies": "flashflies",
|
||||||
|
"dung beetle": "dung beetle",
|
||||||
|
"bomb beetle": "bomb beetle",
|
||||||
|
"rime beetle": "rime beetle",
|
||||||
|
"thunderbug": "thunderbug",
|
||||||
|
"great thunderbugs": "great thunderbugs",
|
||||||
|
"flashbug": "flashbug",
|
||||||
|
"godbug": "godbug",
|
||||||
|
"bitterbug": "bitterbug",
|
||||||
|
"dark hornet": "dark hornet",
|
||||||
|
"wedge beetle": "wedge beetle",
|
||||||
|
"windrustler": "windrustler",
|
||||||
|
"black windrustler": "black windrustler",
|
||||||
|
"nothpecker": "nothpecker",
|
||||||
|
"landlight shrimp": "landlight shrimp",
|
||||||
|
"amstrigian": "amstrigian",
|
||||||
|
"hymstrigian": "hymstrigian",
|
||||||
|
"rufflizard": "rufflizard",
|
||||||
|
"tracktail lizard": "tracktail lizard",
|
||||||
|
"pallbug": "pallbug",
|
||||||
|
"quatreflies": "quatreflies",
|
||||||
|
"emperor hopper": "emperor hopper",
|
||||||
|
"tyrant hopper": "tyrant hopper",
|
||||||
|
"sandstar": "sandstar",
|
||||||
|
"leaflugger ant": "leaflugger ant",
|
||||||
|
"florashell crab": "florashell crab",
|
||||||
|
"crudeshell crab": "crudeshell crab",
|
||||||
|
"curioshell crab": "curioshell crab",
|
||||||
|
"smokeshroud gekko": "smokeshroud gekko",
|
||||||
|
"dapperwing": "dapperwing",
|
||||||
|
"dazzlewing": "dazzlewing",
|
||||||
|
"mimiphyta": "mimiphyta",
|
||||||
|
"scarlet joyperch": "scarlet joyperch",
|
||||||
|
"starduster": "starduster",
|
||||||
|
"vaporonid": "vaporonid",
|
||||||
|
"omenfly": "omenfly",
|
||||||
|
"myriads": "myriads",
|
||||||
|
"jewel scarab": "jewel scarab",
|
||||||
|
"regal jewel scarab": "regal jewel scarab",
|
||||||
|
"pink landlight shrimp": "pink landlight shrimp",
|
||||||
|
"ember rufflizard": "ember rufflizard",
|
||||||
|
"azure rufflizard": "azure rufflizard",
|
||||||
|
"gloom gekko": "gloom gekko",
|
||||||
|
"scalebat": "scalebat",
|
||||||
|
"blink angler": "blink angler",
|
||||||
|
"sparklerjelly": "sparklerjelly",
|
||||||
|
"peony sparklerjelly": "peony sparklerjelly",
|
||||||
|
"nu yaya": "nu yaya",
|
||||||
|
"gawkie": "gawkie",
|
||||||
|
"solanaria": "solanaria",
|
||||||
|
"pillopod": "pillopod",
|
||||||
|
"gillopod": "gillopod",
|
||||||
|
"petalfly": "petalfly",
|
||||||
|
"xu yo": "xu yo",
|
||||||
|
"downy crake": "downy crake",
|
||||||
|
"hercudrome": "hercudrome",
|
||||||
|
"gold hercudrome": "gold hercudrome",
|
||||||
|
"prism hercudrome": "prism hercudrome",
|
||||||
|
"virid bowfin": "virid bowfin",
|
||||||
|
"sushifish": "sushifish",
|
||||||
|
"whetfish": "whetfish",
|
||||||
|
"goldenfish": "goldenfish",
|
||||||
|
"platinumfish": "platinumfish",
|
||||||
|
"burst arowana": "burst arowana",
|
||||||
|
"bomb arowana": "bomb arowana",
|
||||||
|
"goldenfry": "goldenfry",
|
||||||
|
"gunpowderfish": "gunpowderfish",
|
||||||
|
"gravid bowfin": "gravid bowfin",
|
||||||
|
"escunite": "escunite",
|
||||||
|
"grand escunite": "grand escunite",
|
||||||
|
"glass parexus": "glass parexus",
|
||||||
|
"blind perch": "blind perch",
|
||||||
|
"gastronome tuna": "gastronome tuna",
|
||||||
|
"goliath squid": "goliath squid",
|
||||||
|
"great trevally": "great trevally",
|
||||||
|
"gajau": "gajau",
|
||||||
|
"speartuna": "speartuna"
|
||||||
|
}
|
||||||
217
website/public/data/mhwilds/i18n/fr.json
Normal file
|
|
@ -0,0 +1,217 @@
|
||||||
|
{
|
||||||
|
"and": "et",
|
||||||
|
"or": "ou",
|
||||||
|
"reset": "réinitialiser",
|
||||||
|
"create checklist": "créer checklist",
|
||||||
|
"to be completed": "à compléter",
|
||||||
|
"monsters": "monstres",
|
||||||
|
"endemic life": "faune endémique",
|
||||||
|
"name": "nom",
|
||||||
|
"weaknesses": "faiblesses",
|
||||||
|
"locations": "localisations",
|
||||||
|
"ailments": "afflictions",
|
||||||
|
"cut": "tranchant",
|
||||||
|
"blunt": "contondant",
|
||||||
|
"ammo": "projectiles",
|
||||||
|
"windward plains": "plaines venteuses",
|
||||||
|
"scarlet forest": "forêt écarlate",
|
||||||
|
"ruins of wyveria": "ruines de wyveria",
|
||||||
|
"oilwell basin": "bassin pétrolier",
|
||||||
|
"iceshard cliffs": "falaises de glaces",
|
||||||
|
"dragon": "dragon",
|
||||||
|
"fire": "feu",
|
||||||
|
"ice": "glace",
|
||||||
|
"thunder": "foudre",
|
||||||
|
"water": "eau",
|
||||||
|
"dragonblight": "fléau-dragon",
|
||||||
|
"fireblight": "fléau-feu",
|
||||||
|
"iceblight": "fléau-glace",
|
||||||
|
"thunderblight": "fléau-foudre",
|
||||||
|
"waterblight": "fléau-eau",
|
||||||
|
"frostblight": "fléau-givre",
|
||||||
|
"bubbleblight": "fléau-bulles",
|
||||||
|
"stench": "puanteur",
|
||||||
|
"sleep": "sommeil",
|
||||||
|
"paralysis": "paralysie",
|
||||||
|
"blast": "explosion",
|
||||||
|
"poison": "poison",
|
||||||
|
"webbed": "toile",
|
||||||
|
"bleeding": "hémorragie",
|
||||||
|
"stun": "flash",
|
||||||
|
"frenzy virus": "furie",
|
||||||
|
"defense down": "baisse de défense",
|
||||||
|
"minor wind pressure": "bourrasque mineure",
|
||||||
|
"dragon wind pressure": "bourrasque draconique",
|
||||||
|
"minor tremor": "secousse mineure",
|
||||||
|
"weak roar": "rugissement faible",
|
||||||
|
"strong roar": "rugissement fort",
|
||||||
|
"mantle broken": "manteau brisé",
|
||||||
|
"head": "tête",
|
||||||
|
"nose": "nez",
|
||||||
|
"antenna": "antenne",
|
||||||
|
"neck": "cou",
|
||||||
|
"mouth": "bouche",
|
||||||
|
"torso": "torse",
|
||||||
|
"membrane": "membrane",
|
||||||
|
"tongue": "langue",
|
||||||
|
"chest": "poitrine",
|
||||||
|
"belly": "ventre",
|
||||||
|
"tentacle": "tentacule",
|
||||||
|
"back": "dos",
|
||||||
|
"left wingarm": "patte ailée G",
|
||||||
|
"right wingarm": "patte ailée D",
|
||||||
|
"front left arm": "patte av. G",
|
||||||
|
"front right arm": "patte av. D",
|
||||||
|
"middle left arm": "patte mid. G",
|
||||||
|
"middle right arm": "patte mid. D",
|
||||||
|
"rear left arm": "patte ar. G",
|
||||||
|
"rear right arm": "patte ar. D",
|
||||||
|
"left wing": "aile gauche",
|
||||||
|
"right wing": "aile droite",
|
||||||
|
"left leg": "patte gauche",
|
||||||
|
"right leg": "patte droite",
|
||||||
|
"forelegs": "pattes av.",
|
||||||
|
"left foreleg": "patte av. G",
|
||||||
|
"right foreleg": "patte av. D",
|
||||||
|
"hindlegs": "pattes ar.",
|
||||||
|
"left hindleg": "patte ar. G",
|
||||||
|
"right hindleg": "patte ar. D",
|
||||||
|
"left chainblade": "chaines G",
|
||||||
|
"right chainblade": "chaines D",
|
||||||
|
"left claw": "griffes G",
|
||||||
|
"right claw": "griffes D",
|
||||||
|
"abdominal iceplate": "plaque gelée(flancs)",
|
||||||
|
"large iceplate(hidden)": "gde plaque gelée (cachée)",
|
||||||
|
"large iceplate(exposed)": "gde plaque gelée (visible)",
|
||||||
|
"head (crystallized)": "tête (cristallisée)",
|
||||||
|
"left wingarm (crystallized)": "patte ailée G (cristallisée)",
|
||||||
|
"right wingarm (crystallized)": "patte ailée D (cristallisée)",
|
||||||
|
"back fin": "nageoire dorsale",
|
||||||
|
"stinger": "dard",
|
||||||
|
"mantle": "manteau",
|
||||||
|
"petals": "petales",
|
||||||
|
"tail": "queue",
|
||||||
|
"tail hair": "poils de queue",
|
||||||
|
"rear": "arrière",
|
||||||
|
"tail tip": "Bout de queue",
|
||||||
|
"flying wyvern": "wyverne volante",
|
||||||
|
"fanged beast": "bête à crocs",
|
||||||
|
"construct": "artificiel",
|
||||||
|
"chatacabra": "chatacabra",
|
||||||
|
"quematrice": "quematrice",
|
||||||
|
"lala barina": "lala barina",
|
||||||
|
"congalala": "congalala",
|
||||||
|
"balahara": "balahara",
|
||||||
|
"doshaguma": "doshaguma",
|
||||||
|
"uth duna": "uth duna",
|
||||||
|
"rompopolo": "rompopolo",
|
||||||
|
"rey dau": "rey dau",
|
||||||
|
"nerscylla": "nerscylla",
|
||||||
|
"hirabami": "hirabami",
|
||||||
|
"ajarakan": "ajarakan",
|
||||||
|
"nu udra": "nu udra",
|
||||||
|
"jin dahaad": "jin dahaad",
|
||||||
|
"xu wu": "xu wu",
|
||||||
|
"zoh shia": "zoh shia",
|
||||||
|
"yian kut-ku": "yian kut-ku",
|
||||||
|
"gypceros": "gypceros",
|
||||||
|
"rathian": "rathian",
|
||||||
|
"rathalos": "rathalos",
|
||||||
|
"gravios": "gravios",
|
||||||
|
"blangonga": "blangonga",
|
||||||
|
"gore magala": "gore magala",
|
||||||
|
"arkveld": "arkveld",
|
||||||
|
"mizutsune": "mizutsune",
|
||||||
|
"guardian doshaguma": "doshaguma gardien",
|
||||||
|
"guardian rathalos": "rathalos gardien",
|
||||||
|
"guardian ebony odogaron": "odogaron désastre gardien",
|
||||||
|
"guardian arkveld": "arkveld gardien",
|
||||||
|
"guardian fulgur anjanath": "anjanath fulgurant gardien",
|
||||||
|
"vigorwasp": "vitaguêpe",
|
||||||
|
"giant vigorwasp": "grande vitaguêpe",
|
||||||
|
"purewasp": "curaguêpe",
|
||||||
|
"vigormantle bug": "vitanille",
|
||||||
|
"chillmantle bug": "glacianille",
|
||||||
|
"heatmantle bug": "calonille",
|
||||||
|
"wiggly litchi": "chenille-litchi",
|
||||||
|
"paratoad": "paralycrapaud",
|
||||||
|
"nitrotoad": "nitrocrapaud",
|
||||||
|
"sleeptoad": "somnicrapaud",
|
||||||
|
"flashflies": "flashinsectes",
|
||||||
|
"dung beetle": "",
|
||||||
|
"bomb beetle": "scarabombe",
|
||||||
|
"rime beetle": "scarabée des neiges",
|
||||||
|
"thunderbug": "foudrinsectes",
|
||||||
|
"great thunderbugs": "grands foudrinsectes",
|
||||||
|
"flashbug": "scaralux",
|
||||||
|
"godbug": "insecte immortel",
|
||||||
|
"bitterbug": "amerinsecte",
|
||||||
|
"dark hornet": "frelon clair-obscur",
|
||||||
|
"wedge beetle": "scaragrappin",
|
||||||
|
"windrustler": "filovent",
|
||||||
|
"black windrustler": "filovent noir",
|
||||||
|
"nothpecker": "",
|
||||||
|
"landlight shrimp": "crevette terralux",
|
||||||
|
"amstrigian": "amstrigien",
|
||||||
|
"hymstrigian": "",
|
||||||
|
"rufflizard": "gonflézard",
|
||||||
|
"tracktail lizard": "lézard markoda",
|
||||||
|
"pallbug": "charoptère",
|
||||||
|
"quatreflies": "trèflémères",
|
||||||
|
"emperor hopper": "criquet empereur",
|
||||||
|
"tyrant hopper": "criquet tyran",
|
||||||
|
"sandstar": "étoile des sables",
|
||||||
|
"leaflugger ant": "fourmifolia",
|
||||||
|
"florashell crab": "floracrabe",
|
||||||
|
"crudeshell crab": "pétrocrabe",
|
||||||
|
"curioshell crab": "curiocrabe",
|
||||||
|
"smokeshroud gekko": "",
|
||||||
|
"dapperwing": "bellaile",
|
||||||
|
"dazzlewing": "",
|
||||||
|
"mimiphyta": "mimiflore",
|
||||||
|
"scarlet joyperch": "perche rampante",
|
||||||
|
"starduster": "stellardine",
|
||||||
|
"vaporonid": "",
|
||||||
|
"omenfly": "libellule divinatoire",
|
||||||
|
"myriads": "myriades",
|
||||||
|
"jewel scarab": "scarajoyau",
|
||||||
|
"regal jewel scarab": "scarajoyau royal",
|
||||||
|
"pink landlight shrimp": "crevette terralux rose",
|
||||||
|
"ember rufflizard": "gonflézard incandescent",
|
||||||
|
"azure rufflizard": "",
|
||||||
|
"gloom gekko": "gecko nocturne",
|
||||||
|
"scalebat": "chauve-souris à écailles",
|
||||||
|
"blink angler": "poisson cillant",
|
||||||
|
"sparklerjelly": "flaméduse",
|
||||||
|
"peony sparklerjelly": "",
|
||||||
|
"nu yaya": "nu yaya",
|
||||||
|
"gawkie": "zieuteur",
|
||||||
|
"solanaria": "solanaria",
|
||||||
|
"pillopod": "plalimace",
|
||||||
|
"gillopod": "glalimace",
|
||||||
|
"petalfly": "pétaluciole",
|
||||||
|
"xu yo": "",
|
||||||
|
"downy crake": "",
|
||||||
|
"hercudrome": "",
|
||||||
|
"gold hercudrome": "",
|
||||||
|
"prism hercudrome": "",
|
||||||
|
"virid bowfin": "amie émeraude",
|
||||||
|
"sushifish": "sushipoisson",
|
||||||
|
"whetfish": "poissaiguiseur",
|
||||||
|
"goldenfish": "poisson d'or",
|
||||||
|
"platinumfish": "poisson platine",
|
||||||
|
"burst arowana": "arowana explosif",
|
||||||
|
"bomb arowana": "arowana bombe",
|
||||||
|
"goldenfry": "poisson rouge",
|
||||||
|
"gunpowderfish": "poisson-poudre",
|
||||||
|
"gravid bowfin": "amie gravide",
|
||||||
|
"escunite": "escunite",
|
||||||
|
"grand escunite": "grande escunite",
|
||||||
|
"glass parexus": "parexus de verre",
|
||||||
|
"blind perch": "perche aveugle",
|
||||||
|
"gastronome tuna": "thon glouton",
|
||||||
|
"goliath squid": "calmar titan",
|
||||||
|
"great trevally": "",
|
||||||
|
"gajau": "gajau",
|
||||||
|
"speartuna": ""
|
||||||
|
}
|
||||||
4437
website/public/data/mhwilds/monsters.json
Normal file
92
website/public/data/site.json
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
{
|
||||||
|
"brand": {
|
||||||
|
"name": "Sokko G",
|
||||||
|
"homeAriaLabel": "Accueil Sokko G"
|
||||||
|
},
|
||||||
|
"navigation": {
|
||||||
|
"home": "Accueil",
|
||||||
|
"toolboxes": "Toolboxes",
|
||||||
|
"games": "Pages jeux",
|
||||||
|
"mobileGames": "Infos"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"badge": "Local only",
|
||||||
|
"note": "Données stockées dans ce navigateur."
|
||||||
|
},
|
||||||
|
"topbar": {
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"toolbox": "Toolbox active",
|
||||||
|
"games": "Informations jeu"
|
||||||
|
},
|
||||||
|
"home": {
|
||||||
|
"hero": {
|
||||||
|
"eyebrow": "Session gaming efficace",
|
||||||
|
"title": "Sokko G",
|
||||||
|
"description": "Centralisez vos outils et repères de jeu dans une interface locale, rapide à consulter, pensée pour accompagner vos sessions sans interrompre l’action.",
|
||||||
|
"primaryAction": "Voir les toolboxes",
|
||||||
|
"secondaryAction": "Voir les jeux"
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"toolboxSingular": "toolbox créée",
|
||||||
|
"toolboxPlural": "toolboxs créées",
|
||||||
|
"toolSingular": "outil disponible",
|
||||||
|
"toolPlural": "outils disponibles"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"eyebrow": "Origine du nom",
|
||||||
|
"title": "Pourquoi Sokko G ?",
|
||||||
|
"visualAlt": "Dragon Sokko G",
|
||||||
|
"dialogueAriaLabel": "Dialogue d’origine du nom Sokko G",
|
||||||
|
"caption": "\"G\" c'est pour Gaming",
|
||||||
|
"lines": [
|
||||||
|
{
|
||||||
|
"speaker": "user",
|
||||||
|
"text": "Yo !\nComment peut on traduire en un minimum de mots :\n\"faire qqch de manière efficace et rapide\" en japonais ?"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"speaker": "app",
|
||||||
|
"text": "Une traduction concise en japonais serait :\n効率よく素早くやる <i>(Kōritsu yoku subayaku yaru)</i>\nCela signifie littéralement \"le faire efficacement et rapidement.\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"speaker": "user",
|
||||||
|
"text": "En plus court stp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"speaker": "app",
|
||||||
|
"text": "迅速効率 <i>(Jinsoku Kōritsu)</i>\nCela signifie \"rapidité et efficacité\" en un minimum de mots."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"speaker": "user",
|
||||||
|
"text": "Encore plus court !"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"speaker": "app",
|
||||||
|
"text": "速効 <i>(Sokkō)</i>\nCela signifie \"efficacité rapide\" ou \"effet immédiat,\" selon le contexte."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"speaker": "user",
|
||||||
|
"text": "Merci ! :)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toolboxes": {
|
||||||
|
"eyebrow": "Données locales",
|
||||||
|
"title": "Toolboxes",
|
||||||
|
"newButton": "Nouvelle toolbox",
|
||||||
|
"importAll": "Importer tout",
|
||||||
|
"exportAll": "Exporter tout",
|
||||||
|
"importOne": "Importer une toolbox",
|
||||||
|
"storageHelp": {
|
||||||
|
"title": "Sauvegardes locales",
|
||||||
|
"text": "Vos toolboxes restent sur cet appareil, dans ce navigateur. Rien n’est envoyé sur un serveur.",
|
||||||
|
"items": [
|
||||||
|
"Un nettoyage du navigateur ou un changement d’appareil peut supprimer les données.",
|
||||||
|
"Surveillez le quota, surtout si vous ajoutez des screenshots.",
|
||||||
|
"Faites un export global régulier pour garder une sauvegarde."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"emptyTitle": "Aucune toolbox",
|
||||||
|
"emptyText": "Créez une première toolbox pour stocker vos outils dans ce navigateur."
|
||||||
|
}
|
||||||
|
}
|
||||||
24
website/public/data/toolbox-icons.json
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"id": "default",
|
||||||
|
"label": "Toolbox",
|
||||||
|
"src": "/static/img/toolbox-icons/default.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "controller",
|
||||||
|
"label": "Controller",
|
||||||
|
"src": "/static/img/toolbox-icons/controller.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "quest",
|
||||||
|
"label": "Quest",
|
||||||
|
"src": "/static/img/toolbox-icons/quest.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "target",
|
||||||
|
"label": "Target",
|
||||||
|
"src": "/static/img/toolbox-icons/target.svg"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
website/public/favicon.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
21
website/public/index.html
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta
|
||||||
|
name="description"
|
||||||
|
content="Sokko G centralise des toolboxes locales et des guides de jeu pour accompagner les sessions gaming sur second ecran."
|
||||||
|
/>
|
||||||
|
<meta name="theme-color" content="#070913" />
|
||||||
|
<title>Sokko G</title>
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="any" />
|
||||||
|
<link rel="preload" href="/src/styles.css" as="style" />
|
||||||
|
<link rel="modulepreload" href="/src/app.js" />
|
||||||
|
<link rel="stylesheet" href="/src/styles.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/app.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
9
website/public/static/icons/checklist.svg
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M2 5.5L3.21429 7L7.5 3" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M2 12.5L3.21429 14L7.5 10" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M2 19.5L3.21429 21L7.5 17" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M22 12H17M12 12H13.5" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M12 19H17M20.5 19H22" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M22 5L12 5" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 861 B |
4
website/public/static/icons/close.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M20.7457 3.32851C20.3552 2.93798 19.722 2.93798 19.3315 3.32851L12.0371 10.6229L4.74275 3.32851C4.35223 2.93798 3.71906 2.93798 3.32854 3.32851C2.93801 3.71903 2.93801 4.3522 3.32854 4.74272L10.6229 12.0371L3.32856 19.3314C2.93803 19.722 2.93803 20.3551 3.32856 20.7457C3.71908 21.1362 4.35225 21.1362 4.74277 20.7457L12.0371 13.4513L19.3315 20.7457C19.722 21.1362 20.3552 21.1362 20.7457 20.7457C21.1362 20.3551 21.1362 19.722 20.7457 19.3315L13.4513 12.0371L20.7457 4.74272C21.1362 4.3522 21.1362 3.71903 20.7457 3.32851Z" fill="#0F0F0F"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 781 B |
5
website/public/static/icons/columns.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M10.5 19.9V4.1C10.5 2.6 9.86 2 8.27 2H4.23C2.64 2 2 2.6 2 4.1V19.9C2 21.4 2.64 22 4.23 22H8.27C9.86 22 10.5 21.4 10.5 19.9Z" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M22 19.9V4.1C22 2.6 21.36 2 19.77 2H15.73C14.14 2 13.5 2.6 13.5 4.1V19.9C13.5 21.4 14.14 22 15.73 22H19.77C21.36 22 22 21.4 22 19.9Z" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 678 B |
3
website/public/static/icons/controller.svg
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||||
|
<path d="M447.303 128.681c-.427-1.259-.875-3.264-1.408-5.525-3.52-14.315-6.827-27.84-19.904-32.832l-62.08-23.616a38.942 38.942 0 00-36.139 4.48l-3.84 3.435c-3.115 3.563-7.339 8.021-10.347 10.88H199.197c-2.539-2.667-5.931-6.592-8.768-10.112l-4.437-4.16c-10.624-7.424-24.149-9.131-36.117-4.523L87.73 90.324c-13.013 4.949-16.277 18.325-19.755 32.512-.533 2.155-.981 4.117-.811 4.117 0 0 .021 0 .043-.021C46.045 168.66-54.606 379.902 39.623 442.26c13.483 8.917 31.424 7.509 43.691-3.456l73.856-66.219c6.507-5.845 14.784-9.067 23.275-9.067h152.853c8.491 0 16.747 3.221 23.275 9.067l73.856 66.219c6.955 6.229 15.616 9.408 24.277 9.408a34.389 34.389 0 0019.883-6.293c83.157-58.347 8.234-239.425-27.286-313.238zm-105.834 20.821c11.776 0 21.333 9.557 21.333 21.333 0 11.776-9.557 21.333-21.333 21.333s-21.333-9.557-21.333-21.333 9.557-21.333 21.333-21.333zm-128 106.667h-21.333v21.333c0 11.776-9.536 21.333-21.333 21.333s-21.333-9.557-21.333-21.333v-21.333h-21.333c-11.797 0-21.333-9.557-21.333-21.333s9.536-21.333 21.333-21.333h21.333V192.17c0-11.776 9.536-21.333 21.333-21.333s21.333 9.557 21.333 21.333v21.333h21.333c11.797 0 21.333 9.557 21.333 21.333s-9.536 21.333-21.333 21.333zm85.333-21.333c-11.776 0-21.333-9.557-21.333-21.333s9.557-21.333 21.333-21.333 21.333 9.557 21.333 21.333-9.557 21.333-21.333 21.333zm42.667 42.666c-11.776 0-21.333-9.557-21.333-21.333s9.557-21.333 21.333-21.333 21.333 9.557 21.333 21.333-9.557 21.333-21.333 21.333zm42.666-42.666c-11.776 0-21.333-9.557-21.333-21.333s9.557-21.333 21.333-21.333 21.333 9.557 21.333 21.333-9.557 21.333-21.333 21.333z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
4
website/public/static/icons/copy.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.5 16.5L19.5 4.5L18.75 3.75H9L8.25 4.5L8.25 7.5L5.25 7.5L4.5 8.25V20.25L5.25 21H15L15.75 20.25V17.25H18.75L19.5 16.5ZM15.75 15.75L15.75 8.25L15 7.5L9.75 7.5V5.25L18 5.25V15.75H15.75ZM6 9L14.25 9L14.25 19.5L6 19.5L6 9Z" fill="#080341"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 518 B |
4
website/public/static/icons/edit.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.8477 1.87868C19.6761 0.707109 17.7766 0.707105 16.605 1.87868L2.44744 16.0363C2.02864 16.4551 1.74317 16.9885 1.62702 17.5692L1.03995 20.5046C0.760062 21.904 1.9939 23.1379 3.39334 22.858L6.32868 22.2709C6.90945 22.1548 7.44285 21.8693 7.86165 21.4505L22.0192 7.29289C23.1908 6.12132 23.1908 4.22183 22.0192 3.05025L20.8477 1.87868ZM18.0192 3.29289C18.4098 2.90237 19.0429 2.90237 19.4335 3.29289L20.605 4.46447C20.9956 4.85499 20.9956 5.48815 20.605 5.87868L17.9334 8.55027L15.3477 5.96448L18.0192 3.29289ZM13.9334 7.3787L3.86165 17.4505C3.72205 17.5901 3.6269 17.7679 3.58818 17.9615L3.00111 20.8968L5.93645 20.3097C6.13004 20.271 6.30784 20.1759 6.44744 20.0363L16.5192 9.96448L13.9334 7.3787Z" fill="#0F0F0F"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 998 B |
29
website/public/static/icons/export.svg
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
viewBox="0 0 366.999 366.999" xml:space="preserve">
|
||||||
|
<path id="XMLID_223_" d="M363.598,247.01c0.146-0.177,0.272-0.365,0.409-0.547c0.157-0.209,0.319-0.414,0.464-0.632
|
||||||
|
c0.145-0.216,0.27-0.441,0.402-0.662c0.118-0.198,0.243-0.392,0.352-0.596c0.121-0.225,0.223-0.458,0.332-0.688
|
||||||
|
c0.101-0.213,0.207-0.423,0.298-0.643c0.092-0.223,0.167-0.451,0.248-0.678c0.085-0.235,0.175-0.467,0.248-0.708
|
||||||
|
c0.068-0.226,0.118-0.454,0.176-0.683c0.062-0.246,0.131-0.49,0.181-0.741c0.052-0.261,0.082-0.524,0.12-0.788
|
||||||
|
c0.032-0.221,0.074-0.439,0.096-0.664c0.048-0.485,0.073-0.973,0.074-1.46c0-0.007,0.001-0.013,0.001-0.02
|
||||||
|
c0-0.008-0.001-0.017-0.001-0.025c0-0.486-0.025-0.971-0.073-1.455c-0.022-0.225-0.064-0.442-0.096-0.664
|
||||||
|
c-0.038-0.263-0.068-0.526-0.12-0.787c-0.05-0.253-0.12-0.499-0.182-0.747c-0.057-0.226-0.107-0.453-0.174-0.677
|
||||||
|
c-0.073-0.242-0.164-0.476-0.25-0.713c-0.081-0.225-0.155-0.452-0.246-0.673c-0.092-0.221-0.199-0.432-0.3-0.647
|
||||||
|
c-0.108-0.229-0.209-0.459-0.329-0.683c-0.11-0.206-0.236-0.401-0.355-0.6c-0.131-0.221-0.256-0.443-0.4-0.658
|
||||||
|
c-0.147-0.219-0.31-0.424-0.467-0.635c-0.136-0.182-0.262-0.368-0.407-0.544c-0.299-0.365-0.616-0.714-0.948-1.049
|
||||||
|
c-0.016-0.016-0.029-0.034-0.045-0.05l-37.499-37.501c-5.857-5.857-15.355-5.858-21.213-0.001c-5.858,5.858-5.858,15.355,0,21.213
|
||||||
|
l11.894,11.895L270,222.501v-78.605c0.003-0.133,0.02-0.263,0.02-0.396c0-3.606-1.287-6.903-3.407-9.49
|
||||||
|
c-0.021-0.026-0.042-0.053-0.064-0.079c-0.276-0.332-0.567-0.65-0.871-0.958c-0.043-0.044-0.087-0.089-0.131-0.133
|
||||||
|
c-0.132-0.131-0.255-0.272-0.393-0.398L155.609,22.896c-0.005-0.004-0.01-0.009-0.015-0.014c-0.307-0.306-0.627-0.593-0.955-0.868
|
||||||
|
c-0.104-0.087-0.212-0.169-0.318-0.253c-0.24-0.19-0.483-0.374-0.733-0.548c-0.125-0.088-0.251-0.174-0.379-0.258
|
||||||
|
c-0.263-0.172-0.53-0.333-0.802-0.487c-0.112-0.063-0.22-0.132-0.334-0.193c-0.363-0.194-0.733-0.372-1.109-0.534
|
||||||
|
c-0.154-0.067-0.311-0.124-0.467-0.186c-0.25-0.099-0.501-0.192-0.756-0.277c-0.175-0.058-0.35-0.114-0.527-0.166
|
||||||
|
c-0.289-0.084-0.581-0.158-0.875-0.225c-0.131-0.029-0.259-0.066-0.392-0.093c-0.42-0.084-0.844-0.146-1.27-0.193
|
||||||
|
c-0.13-0.015-0.262-0.023-0.393-0.035c-0.353-0.031-0.706-0.048-1.06-0.054C145.148,18.51,145.076,18.5,145,18.5H15
|
||||||
|
c-8.284,0-15,6.716-15,15v300c0,8.284,6.716,15,15,15h240c8.284,0,15-6.716,15-15v-80.999l45.786,0.001l-11.893,11.893
|
||||||
|
c-5.858,5.858-5.858,15.355,0,21.213c2.929,2.929,6.768,4.394,10.606,4.394s7.678-1.464,10.606-4.394l37.499-37.499
|
||||||
|
c0.008-0.008,0.014-0.016,0.021-0.023C362.968,247.742,363.292,247.383,363.598,247.01z M160,69.713l58.787,58.787H160V69.713z
|
||||||
|
M240,318.5H30v-270h100v95c0,8.284,6.716,15,15,15h95v64.001l-65.001-0.001c-8.284,0-15,6.716-15,15c0,8.284,6.716,15,15,15
|
||||||
|
L240,252.501V318.5z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.9 KiB |
10
website/public/static/icons/home.svg
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M22 22L2 22" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M2 11L10.1259 4.49931C11.2216 3.62279 12.7784 3.62279 13.8741 4.49931L22 11" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M15.5 5.5V3.5C15.5 3.22386 15.7239 3 16 3H18.5C18.7761 3 19 3.22386 19 3.5V8.5" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M4 22V9.5" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M20 22V9.5" stroke="#1C274C" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M15 22V17C15 15.5858 15 14.8787 14.5607 14.4393C14.1213 14 13.4142 14 12 14C10.5858 14 9.87868 14 9.43934 14.4393C9 14.8787 9 15.5858 9 17V22" stroke="#1C274C" stroke-width="1.5"/>
|
||||||
|
<path d="M14 9.5C14 10.6046 13.1046 11.5 12 11.5C10.8954 11.5 10 10.6046 10 9.5C10 8.39543 10.8954 7.5 12 7.5C13.1046 7.5 14 8.39543 14 9.5Z" stroke="#1C274C" stroke-width="1.5"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
2
website/public/static/icons/import.svg
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m22.909 14.837h-3.272v-5.717c0-.009 0-.019 0-.029 0-.263-.093-.504-.249-.692l.001.002-.003-.006c-.02-.024-.041-.047-.063-.069l-.009-.009c-.009-.009-.019-.02-.028-.029l-7.966-7.966c-.025-.024-.048-.045-.072-.063l-.026-.02c-.017-.014-.035-.027-.053-.04l-.026-.019c-.019-.012-.039-.024-.058-.035l-.024-.014q-.039-.021-.081-.039l-.034-.015-.055-.02-.039-.012-.063-.016-.029-.007c-.031-.006-.062-.01-.093-.014h-.028c-.026 0-.051 0-.077 0h-9.47c-.6 0-1.087.484-1.091 1.083v21.818c0 .603.489 1.091 1.091 1.091h17.454c.603 0 1.091-.489 1.091-1.091v-5.891h3.273.031c.603 0 1.091-.489 1.091-1.091s-.489-1.091-1.091-1.091c-.011 0-.021 0-.032 0h.002zm-11.273-11.113 4.275 4.276h-4.275zm5.818 18.093h-15.272v-19.636h7.273v6.909c0 .603.489 1.091 1.091 1.091h6.909v4.655h-4.276l.865-.865c.178-.193.287-.453.287-.737 0-.603-.489-1.091-1.091-1.091-.285 0-.544.109-.738.287l.001-.001-2.738 2.74c-.021.021-.041.043-.06.066l-.02.026c-.015.02-.031.039-.045.06l-.014.022c-.015.023-.029.045-.042.069l-.008.016c-.014.027-.027.053-.038.081v.011c-.012.029-.023.059-.032.086v.012c-.009.03-.017.06-.023.091v.027c-.004.026-.009.052-.012.079-.004.033-.006.07-.006.109s.002.076.006.113v-.005c0 .027.007.052.012.079v.027c.006.032.015.062.023.093v.011c.009.031.021.061.033.09v.01c.012.027.025.055.039.081l.008.015c.013.024.027.047.042.07l.013.021c.015.021.03.042.046.063l.018.024c.021.026.043.05.066.074l.005.006 2.727 2.727c.2.218.486.354.804.354.603 0 1.091-.489 1.091-1.091 0-.318-.136-.604-.353-.804l-.001-.001-.865-.865h4.275z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
4
website/public/static/icons/link.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M14 7H16C18.7614 7 21 9.23858 21 12C21 14.7614 18.7614 17 16 17H14M10 7H8C5.23858 7 3 9.23858 3 12C3 14.7614 5.23858 17 8 17H10M8 12H16" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 459 B |
4
website/public/static/icons/notepad.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 256 256" id="Flat" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M172,124.00586a12.00028,12.00028,0,0,1-12,12H96a12,12,0,1,1,0-24h64A12.00028,12.00028,0,0,1,172,124.00586Zm-12,28H96a12,12,0,1,0,0,24h64a12,12,0,0,0,0-24Zm60-104v152a36.04061,36.04061,0,0,1-36,36H72a36.04061,36.04061,0,0,1-36-36v-152a20.02229,20.02229,0,0,1,20-20H72v-4a12,12,0,0,1,24,0v4h20v-4a12,12,0,0,1,24,0v4h20v-4a12,12,0,0,1,24,0v4h16A20.02229,20.02229,0,0,1,220,48.00586Zm-24,4H184v4a12,12,0,0,1-24,0v-4H140v4a12,12,0,0,1-24,0v-4H96v4a12,12,0,0,1-24,0v-4H60v148a12.01312,12.01312,0,0,0,12,12H184a12.01312,12.01312,0,0,0,12-12Z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 791 B |
4
website/public/static/icons/open.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M1 5C1 3.34315 2.34315 2 4 2H8.55848C9.84977 2 10.9962 2.82629 11.4045 4.05132L11.7208 5H20C21.1046 5 22 5.89543 22 7V9.00961C23.1475 9.12163 23.9808 10.196 23.7695 11.3578L22.1332 20.3578C21.9603 21.3087 21.132 22 20.1654 22H3C1.89543 22 1 21.1046 1 20V5ZM20 9V7H11.7208C10.8599 7 10.0956 6.44914 9.82339 5.63246L9.50716 4.68377C9.37105 4.27543 8.98891 4 8.55848 4H4C3.44772 4 3 4.44772 3 5V12.2709L3.35429 10.588C3.54913 9.66249 4.36562 9 5.31139 9H20ZM3.36634 20C3.41777 19.9109 3.4562 19.8122 3.47855 19.706L5.31139 11L21 11H21.8018L20.1654 20L3.36634 20Z" fill="#000000"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 857 B |
5
website/public/static/icons/picture.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M8.5 10C9.32843 10 10 9.32843 10 8.5C10 7.67157 9.32843 7 8.5 7C7.67157 7 7 7.67157 7 8.5C7 9.32843 7.67157 10 8.5 10Z" fill="#0F1729"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.0055 2H12.9945C14.3805 1.99999 15.4828 1.99999 16.3716 2.0738C17.2819 2.14939 18.0575 2.30755 18.7658 2.67552C19.8617 3.24477 20.7552 4.1383 21.3245 5.23415C21.6925 5.94253 21.8506 6.71811 21.9262 7.62839C22 8.5172 22 9.61946 22 11.0054V12.9945C22 13.6854 22 14.306 21.9909 14.8646C22.0049 14.9677 22.0028 15.0726 21.9846 15.175C21.9741 15.6124 21.9563 16.0097 21.9262 16.3716C21.8506 17.2819 21.6925 18.0575 21.3245 18.7658C20.7552 19.8617 19.8617 20.7552 18.7658 21.3245C18.0575 21.6925 17.2819 21.8506 16.3716 21.9262C15.4828 22 14.3805 22 12.9946 22H11.0055C9.61955 22 8.5172 22 7.62839 21.9262C6.71811 21.8506 5.94253 21.6925 5.23415 21.3245C4.43876 20.9113 3.74996 20.3273 3.21437 19.6191C3.20423 19.6062 3.19444 19.5932 3.185 19.5799C2.99455 19.3238 2.82401 19.0517 2.67552 18.7658C2.30755 18.0575 2.14939 17.2819 2.0738 16.3716C1.99999 15.4828 1.99999 14.3805 2 12.9945V11.0055C1.99999 9.61949 1.99999 8.51721 2.0738 7.62839C2.14939 6.71811 2.30755 5.94253 2.67552 5.23415C3.24477 4.1383 4.1383 3.24477 5.23415 2.67552C5.94253 2.30755 6.71811 2.14939 7.62839 2.0738C8.51721 1.99999 9.61949 1.99999 11.0055 2ZM20 11.05V12.5118L18.613 11.065C17.8228 10.2407 16.504 10.2442 15.7182 11.0727L11.0512 15.9929L9.51537 14.1359C8.69326 13.1419 7.15907 13.1746 6.38008 14.2028L4.19042 17.0928C4.13682 16.8463 4.09606 16.5568 4.06694 16.2061C4.0008 15.4097 4 14.3905 4 12.95V11.05C4 9.60949 4.0008 8.59025 4.06694 7.79391C4.13208 7.00955 4.25538 6.53142 4.45035 6.1561C4.82985 5.42553 5.42553 4.82985 6.1561 4.45035C6.53142 4.25538 7.00955 4.13208 7.79391 4.06694C8.59025 4.0008 9.60949 4 11.05 4H12.95C14.3905 4 15.4097 4.0008 16.2061 4.06694C16.9905 4.13208 17.4686 4.25538 17.8439 4.45035C18.5745 4.82985 19.1702 5.42553 19.5497 6.1561C19.7446 6.53142 19.8679 7.00955 19.9331 7.79391C19.9992 8.59025 20 9.60949 20 11.05ZM6.1561 19.5497C5.84198 19.3865 5.55279 19.1833 5.295 18.9467L7.97419 15.4106L9.51005 17.2676C10.2749 18.1924 11.6764 18.24 12.5023 17.3693L17.1693 12.449L19.9782 15.3792C19.9683 15.6812 19.9539 15.9547 19.9331 16.2061C19.8679 16.9905 19.7446 17.4686 19.5497 17.8439C19.1702 18.5745 18.5745 19.1702 17.8439 19.5497C17.4686 19.7446 16.9905 19.8679 16.2061 19.9331C15.4097 19.9992 14.3905 20 12.95 20H11.05C9.60949 20 8.59025 19.9992 7.79391 19.9331C7.00955 19.8679 6.53142 19.7446 6.1561 19.5497Z" fill="#0F1729"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.7 KiB |
5
website/public/static/icons/rows.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M19.9 13.5H4.1C2.6 13.5 2 14.14 2 15.73V19.77C2 21.36 2.6 22 4.1 22H19.9C21.4 22 22 21.36 22 19.77V15.73C22 14.14 21.4 13.5 19.9 13.5Z" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M19.9 2H4.1C2.6 2 2 2.64 2 4.23V8.27C2 9.86 2.6 10.5 4.1 10.5H19.9C21.4 10.5 22 9.86 22 8.27V4.23C22 2.64 21.4 2 19.9 2Z" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 677 B |
2
website/public/static/icons/rubber.svg
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" width="800px" height="800px" viewBox="-1.5 -2.5 24 24" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin" class="jam jam-rubber"><path d='M12.728 12.728L8.485 8.485l-5.657 5.657 2.122 2.121a3 3 0 0 0 4.242 0l3.536-3.535zM11.284 17H14a1 1 0 0 1 0 2H3a1 1 0 0 1-.133-1.991l-1.453-1.453a2 2 0 0 1 0-2.828L12.728 1.414a2 2 0 0 1 2.828 0L19.8 5.657a2 2 0 0 1 0 2.828L11.284 17z'/></svg>
|
||||||
|
After Width: | Height: | Size: 535 B |
4
website/public/static/icons/save.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.1716 1C18.702 1 19.2107 1.21071 19.5858 1.58579L22.4142 4.41421C22.7893 4.78929 23 5.29799 23 5.82843V20C23 21.6569 21.6569 23 20 23H4C2.34315 23 1 21.6569 1 20V4C1 2.34315 2.34315 1 4 1H18.1716ZM4 3C3.44772 3 3 3.44772 3 4V20C3 20.5523 3.44772 21 4 21L5 21L5 15C5 13.3431 6.34315 12 8 12L16 12C17.6569 12 19 13.3431 19 15V21H20C20.5523 21 21 20.5523 21 20V6.82843C21 6.29799 20.7893 5.78929 20.4142 5.41421L18.5858 3.58579C18.2107 3.21071 17.702 3 17.1716 3H17V5C17 6.65685 15.6569 8 14 8H10C8.34315 8 7 6.65685 7 5V3H4ZM17 21V15C17 14.4477 16.5523 14 16 14L8 14C7.44772 14 7 14.4477 7 15L7 21L17 21ZM9 3H15V5C15 5.55228 14.5523 6 14 6H10C9.44772 6 9 5.55228 9 5V3Z" fill="#0F0F0F"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 968 B |
4
website/public/static/icons/toolbox.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M21 14V18C21 18.5523 20.5523 19 20 19H4C3.44772 19 3 18.5523 3 18V14M21 14V11C21 9.89543 20.1046 9 19 9H16M21 14H17M3 14V11C3 9.89543 3.89543 9 5 9H8M3 14H7M7 14V13M7 14V15M7 14H17M17 14V15V13M16 9V7C16 5.89543 15.1046 5 14 5H10C8.89543 5 8 5.89543 8 7V9M16 9H8" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 585 B |
4
website/public/static/icons/trashcan.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4 6H20M16 6L15.7294 5.18807C15.4671 4.40125 15.3359 4.00784 15.0927 3.71698C14.8779 3.46013 14.6021 3.26132 14.2905 3.13878C13.9376 3 13.523 3 12.6936 3H11.3064C10.477 3 10.0624 3 9.70951 3.13878C9.39792 3.26132 9.12208 3.46013 8.90729 3.71698C8.66405 4.00784 8.53292 4.40125 8.27064 5.18807L8 6M18 6V16.2C18 17.8802 18 18.7202 17.673 19.362C17.3854 19.9265 16.9265 20.3854 16.362 20.673C15.7202 21 14.8802 21 13.2 21H10.8C9.11984 21 8.27976 21 7.63803 20.673C7.07354 20.3854 6.6146 19.9265 6.32698 19.362C6 18.7202 6 17.8802 6 16.2V6M14 10V17M10 10V17" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 877 B |
BIN
website/public/static/img/dragon.png
Normal file
|
After Width: | Height: | Size: 469 KiB |
BIN
website/public/static/img/mhwilds.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
website/public/static/img/mhwilds/0-stars.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
website/public/static/img/mhwilds/1-stars.png
Normal file
|
After Width: | Height: | Size: 1,010 B |
BIN
website/public/static/img/mhwilds/2-stars.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
website/public/static/img/mhwilds/3-stars.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
website/public/static/img/mhwilds/4-stars.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
website/public/static/img/mhwilds/ajarakan.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
website/public/static/img/mhwilds/ammo.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
website/public/static/img/mhwilds/amstrigian.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
website/public/static/img/mhwilds/arkveld.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
website/public/static/img/mhwilds/azure rufflizard.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
website/public/static/img/mhwilds/balahara.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
website/public/static/img/mhwilds/bitterbug.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/black windrustler.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
website/public/static/img/mhwilds/blangonga.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
website/public/static/img/mhwilds/blast.png
Normal file
|
After Width: | Height: | Size: 3 KiB |
BIN
website/public/static/img/mhwilds/bleeding.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
website/public/static/img/mhwilds/blind perch.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
website/public/static/img/mhwilds/blink angler.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
website/public/static/img/mhwilds/blunt.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
website/public/static/img/mhwilds/bomb arowana.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/bomb beetle.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
website/public/static/img/mhwilds/bubbleblight.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
website/public/static/img/mhwilds/burst arowana.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/chatacabra.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
website/public/static/img/mhwilds/chillmantle bug.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/congalala.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
website/public/static/img/mhwilds/crudeshell crab.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/curioshell crab.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
website/public/static/img/mhwilds/cut.png
Normal file
|
After Width: | Height: | Size: 2 KiB |
BIN
website/public/static/img/mhwilds/dapperwing.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
website/public/static/img/mhwilds/dark hornet.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
website/public/static/img/mhwilds/dazzlewing.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
website/public/static/img/mhwilds/defense down.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
website/public/static/img/mhwilds/doshaguma.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
website/public/static/img/mhwilds/downy crake.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
website/public/static/img/mhwilds/dragon wind pressure.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
website/public/static/img/mhwilds/dragon.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
website/public/static/img/mhwilds/dragonblight.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
website/public/static/img/mhwilds/dung beetle.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
website/public/static/img/mhwilds/ember rufflizard.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
website/public/static/img/mhwilds/emperor hopper.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
website/public/static/img/mhwilds/escunite.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/fire.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
website/public/static/img/mhwilds/fireblight.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
website/public/static/img/mhwilds/flashbug.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/flashflies.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/florashell crab.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
website/public/static/img/mhwilds/frenzy virus.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
website/public/static/img/mhwilds/frostblight.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
website/public/static/img/mhwilds/gajau.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/gastronome tuna.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
website/public/static/img/mhwilds/gawkie.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
website/public/static/img/mhwilds/giant vigorwasp.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
website/public/static/img/mhwilds/gillopod.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
website/public/static/img/mhwilds/glass parexus.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
website/public/static/img/mhwilds/gloom gekko.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
website/public/static/img/mhwilds/godbug.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/gogmazios.png
Normal file
|
After Width: | Height: | Size: 157 KiB |
BIN
website/public/static/img/mhwilds/gold hercudrome.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
website/public/static/img/mhwilds/goldenfish.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
website/public/static/img/mhwilds/goldenfry.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
website/public/static/img/mhwilds/goliath squid.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
website/public/static/img/mhwilds/gore magala.png
Normal file
|
After Width: | Height: | Size: 32 KiB |