DavidKRK commited on
Commit
6140987
·
verified ·
1 Parent(s): fa470ee

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. -i +1 -0
  2. .devcontainer/devcontainer.json +29 -0
  3. .gitattributes +5 -35
  4. .github/dependabot.yml +12 -0
  5. .github/import { test, expect } from '@playwrigh.txt +7 -0
  6. .github/test_dependabot.yml +0 -0
  7. .github/workflows/ci-cd.yml +92 -0
  8. .gitignore +23 -0
  9. .hintrc +5 -0
  10. .htaccess +35 -0
  11. .stylelintignore +2 -0
  12. .stylelintrc.json +18 -0
  13. CNAME +1 -0
  14. README.md +1 -12
  15. assets/css/style.css +43 -0
  16. bio.html +693 -0
  17. cleanDuplicates.js +76 -0
  18. file_list.txt +0 -0
  19. git-error-1743827686154 +1 -0
  20. images/david_krk_logo.png +0 -0
  21. images/dj_blue_lights.jpg +3 -0
  22. images/dj_crew.jpg +0 -0
  23. images/dj_crowd.jpg +3 -0
  24. images/dj_crowd_view.jpg +3 -0
  25. images/dj_red_lights.jpg +3 -0
  26. images/logo 30-01-25.png +0 -0
  27. images/optimized/david_krk_logo.webp +0 -0
  28. images/optimized/dj_blue_lights.webp +0 -0
  29. images/optimized/dj_crew.webp +0 -0
  30. images/optimized/dj_crowd.webp +3 -0
  31. images/optimized/dj_crowd_view.webp +3 -0
  32. images/optimized/dj_red_lights.webp +3 -0
  33. images/optimized/logo.webp +0 -0
  34. images/optimized/received_921630123191476.webp +0 -0
  35. images/optimized/vinyl_crate.webp +0 -0
  36. images/received_921630123191476.jpeg +0 -0
  37. images/vinyl_crate.jpg +0 -0
  38. index.html +461 -0
  39. music.html +426 -0
  40. node +0 -0
  41. optimize-images.js +44 -0
  42. package.json +31 -0
  43. playwright-report/data/3d6a3d1a8bb6714f575631aa577f179974dc2f76.md +27 -0
  44. playwright-report/data/ca4adf35189c26b25c9d073ecdd17f6ca35d558c.md +27 -0
  45. playwright-report/index.html +0 -0
  46. playwright-report/report.json +21 -0
  47. playwright.config.ts +11 -0
  48. robots.txt +4 -0
  49. sitemap.xml +21 -0
  50. src/input.css +146 -0
-i ADDED
@@ -0,0 +1 @@
 
 
1
+ 619be34767d0f5c4c0bb6686d5502c2078b2e0a2<|ENT|><|RY|>Update website with improved design and multi-language support<|COM|><|MIT|>
.devcontainer/devcontainer.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
+ // README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node
3
+ {
4
+ "name": "Node.js & TypeScript",
5
+ // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
6
+ "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
7
+ "customizations": {
8
+ "vscode": {
9
+ "extensions": [
10
+ "Codeium.codeium"
11
+ ]
12
+ }
13
+ }
14
+
15
+ // Features to add to the dev container. More info: https://containers.dev/features.
16
+ // "features": {},
17
+
18
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
19
+ // "forwardPorts": [],
20
+
21
+ // Use 'postCreateCommand' to run commands after the container is created.
22
+ // "postCreateCommand": "yarn install",
23
+
24
+ // Configure tool-specific properties.
25
+ // "customizations": {},
26
+
27
+ // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
28
+ // "remoteUser": "root"
29
+ }
.gitattributes CHANGED
@@ -1,35 +1,5 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ * text=auto
2
+ *.jpg filter=lfs diff=lfs merge=lfs -text
3
+ images/optimized/dj_crowd.webp filter=lfs diff=lfs merge=lfs -text
4
+ images/optimized/dj_crowd_view.webp filter=lfs diff=lfs merge=lfs -text
5
+ images/optimized/dj_red_lights.webp filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/dependabot.yml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # Please see the documentation for more information:
4
+ # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5
+ # https://containers.dev/guide/dependabot
6
+
7
+ version: 2
8
+ updates:
9
+ - package-ecosystem: "devcontainers"
10
+ directory: "/"
11
+ schedule:
12
+ interval: weekly
.github/import { test, expect } from '@playwrigh.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { test, expect } from '@playwright/test';
2
+
3
+ test('vérifie le chargement de la page', async ({ page }) => {
4
+ await page.goto('http://localhost:3000');
5
+ const title = await page.title();
6
+ expect(title).toBe('David KRK - Techno DJ & Producer'); // Mettez à jour le titre attendu
7
+ });
.github/test_dependabot.yml ADDED
File without changes
.github/workflows/ci-cd.yml ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: CI/CD
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ quality-checks:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - name: Setup Node.js
16
+ uses: actions/setup-node@v4
17
+ with:
18
+ node-version: '20'
19
+ cache: 'npm'
20
+
21
+ - run: npm install
22
+ - run: npm run validate
23
+
24
+ build:
25
+ needs: quality-checks
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+
30
+ - uses: actions/setup-node@v4
31
+ with:
32
+ node-version: '20'
33
+ cache: 'npm'
34
+
35
+ - run: npm install
36
+ - run: npm run build
37
+
38
+ - name: List contents of dist/images/optimized
39
+ run: |
40
+ ls -l dist/images/optimized || echo "No optimized images found"
41
+
42
+ - uses: actions/upload-artifact@v3
43
+ with:
44
+ name: dist
45
+ path: dist
46
+
47
+ deploy:
48
+ needs: build
49
+ if: github.ref == 'refs/heads/main'
50
+ runs-on: ubuntu-latest
51
+ steps:
52
+ - uses: actions/checkout@v4
53
+
54
+ - uses: actions/download-artifact@v3
55
+ with:
56
+ name: dist
57
+ path: dist
58
+
59
+ - name: List contents of dist/images/optimized before deploy
60
+ run: |
61
+ ls -l dist/images/optimized || echo "No optimized images found"
62
+
63
+ - uses: peaceiris/actions-gh-pages@v3
64
+ with:
65
+ github_token: ${{ secrets.GITHUB_TOKEN }}
66
+ publish_dir: ./dist
67
+ publish_branch: gh-pages
68
+ commit_message: "Deploy: ${{ github.event.head_commit.message }}"
69
+
70
+ - name: Discord Notification
71
+ if: success()
72
+ uses: Ilshidur/action-discord@master
73
+ with:
74
+ args: "🚀 Déploiement réussi: ${{ github.repository }}"
75
+ env:
76
+ DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
77
+
78
+ sync:
79
+ needs: deploy
80
+ runs-on: ubuntu-latest
81
+ steps:
82
+ - uses: actions/checkout@v4
83
+
84
+ - name: Sync files
85
+ uses: repo-sync/github-sync@v2
86
+ with:
87
+ source_repo: 'DavidKRK/DavidKRK.github.io'
88
+ source_branch: 'main'
89
+ destination_branch: 'gh-pages'
90
+ file_patterns: 'images/optimized/*'
91
+ env:
92
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
.gitignore ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <<<<<<< HEAD
2
+ .aider*
3
+ =======
4
+ # Dependencies
5
+ node_modules/
6
+ package-lock.json
7
+
8
+ # Build output
9
+ dist/
10
+ *.log
11
+
12
+ # IDE
13
+ .vscode/
14
+ .idea/
15
+
16
+ # OS
17
+ .DS_Store
18
+ Thumbs.db
19
+
20
+ # Environment
21
+ .env
22
+ .env.local
23
+ >>>>>>> 0493f4993fce6719914b5aacb418e45a7baaddf2
.hintrc ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "extends": [
3
+ "development"
4
+ ]
5
+ }
.htaccess ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Enable GZIP compression
2
+ <IfModule mod_deflate.c>
3
+ AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json
4
+ </IfModule>
5
+
6
+ # Browser caching
7
+ <IfModule mod_expires.c>
8
+ ExpiresActive On
9
+ ExpiresByType image/jpg "access plus 1 year"
10
+ ExpiresByType image/jpeg "access plus 1 year"
11
+ ExpiresByType image/png "access plus 1 year"
12
+ ExpiresByType image/webp "access plus 1 year"
13
+ ExpiresByType text/css "access plus 1 month"
14
+ ExpiresByType application/javascript "access plus 1 month"
15
+ ExpiresByType text/javascript "access plus 1 month"
16
+ ExpiresByType application/x-javascript "access plus 1 month"
17
+ ExpiresByType image/x-icon "access plus 1 year"
18
+ ExpiresDefault "access plus 2 days"
19
+ </IfModule>
20
+
21
+ # Security headers
22
+ <IfModule mod_headers.c>
23
+ Header set X-Content-Type-Options "nosniff"
24
+ Header set X-Frame-Options "DENY"
25
+ Header set X-XSS-Protection "1; mode=block"
26
+ Header set Referrer-Policy "strict-origin-when-cross-origin"
27
+ Header set Permissions-Policy "geolocation=(), microphone=(), camera=()"
28
+ </IfModule>
29
+
30
+ # Redirect www to non-www
31
+ <IfModule mod_rewrite.c>
32
+ RewriteEngine On
33
+ RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
34
+ RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
35
+ </IfModule>
.stylelintignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Ignore CSS build output (generated by Tailwind, PostCSS, etc.)
2
+ dist/output.css
.stylelintrc.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "extends": "stylelint-config-standard",
3
+ "rules": {
4
+ "at-rule-no-unknown": [
5
+ true,
6
+ {
7
+ "ignoreAtRules": [
8
+ "tailwind",
9
+ "apply",
10
+ "variants",
11
+ "responsive",
12
+ "screen",
13
+ "layer"
14
+ ]
15
+ }
16
+ ]
17
+ }
18
+ }
CNAME ADDED
@@ -0,0 +1 @@
 
 
1
+ www.davidkrk.com
README.md CHANGED
@@ -1,12 +1 @@
1
- ---
2
- title: Https Huggingface Co Davidkrk
3
- emoji: 📚
4
- colorFrom: red
5
- colorTo: indigo
6
- sdk: gradio
7
- sdk_version: 5.29.0
8
- app_file: app.py
9
- pinned: false
10
- ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ # DavidKRK.github.io
 
 
 
 
 
 
 
 
 
 
 
assets/css/style.css ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Ensure :root variables are defined, e.g., in index.html's inline style or move them here */
2
+
3
+ /*
4
+ :root {
5
+ --neon-red: #FF0000;
6
+ }
7
+ */
8
+
9
+ /* Footer Social Links Styles */
10
+ .footer-social-links a {
11
+ color: #ccc;
12
+ margin: 0 10px;
13
+ font-size: 1.5rem;
14
+ transition: all 0.3s ease; /* Apply transition to all properties */
15
+ display: inline-block; /* Required for transform to work correctly */
16
+ }
17
+
18
+ .footer-social-links a:hover {
19
+ color: white;
20
+ text-shadow: 0 0 10px var(--neon-red); /* Simplified neon glow */
21
+ transform: scale(1.1); /* Scale animation on hover */
22
+ }
23
+
24
+ /* Media Queries for Footer Social Links */
25
+ @media (width <= 768px) {
26
+ .footer-social-links a {
27
+ font-size: 1.3rem;
28
+ margin: 0 8px;
29
+ }
30
+ }
31
+
32
+ @media (width <= 480px) {
33
+ .footer-social-links { /* Ensure flex display is maintained if needed */
34
+ display: flex;
35
+ justify-content: center;
36
+ margin-bottom: 8px; /* Keep margin from original inline style */
37
+ }
38
+
39
+ .footer-social-links a {
40
+ font-size: 1.2rem;
41
+ margin: 0 8px;
42
+ }
43
+ }
bio.html ADDED
@@ -0,0 +1,693 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <!-- Favicon -->
8
+ <link rel="icon" type="image/png" href="images/logo%2030-01-25.png">
9
+ <title>David KRK · Biographie - DJ Techno &amp; Producteur</title>
10
+ <!-- Meta tags for SEO -->
11
+ <meta name="description" content="Découvrez l'histoire de David KRK, DJ Techno international se produisant en France, Espagne et Pays Basque depuis 2000. Trance, Tech Trance et Techno.">
12
+ <meta name="keywords" content="David KRK, biographie, DJ techno, producteur, France, Espagne, Pays Basque, Trance, Tech Trance">
13
+ <meta name="author" content="David KRK">
14
+ <!-- Open Graph / Social Media -->
15
+ <meta property="og:title" content="David KRK · Biographie - DJ Techno &amp; Producteur">
16
+ <meta property="og:description" content="Découvrez l'histoire de David KRK, DJ Techno international se produisant en France, Espagne et Pays Basque depuis 2000.">
17
+ <meta property="og:image" content="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
18
+ <meta property="og:url" content="https://davidkrk.com/bio.html">
19
+ <!-- Twitter Card -->
20
+ <meta name="twitter:card" content="summary_large_image">
21
+ <meta name="twitter:title" content="David KRK · Biographie">
22
+ <meta name="twitter:description" content="DJ Techno international - France, Espagne, Pays Basque">
23
+ <meta name="twitter:image" content="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
24
+ <!-- Preload critical resources -->
25
+ <link rel="preload" href="https://fonts.googleapis.com/css2?family=Russo+One&amp;display=swap" as="style">
26
+ <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" as="style">
27
+ <link rel="preload" href="dist/output.css" as="style">
28
+ <!-- Stylesheets -->
29
+ <link href="https://fonts.googleapis.com/css2?family=Russo+One&amp;display=swap" rel="stylesheet">
30
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
31
+ <link rel="stylesheet" href="dist/output.css">
32
+ <style>
33
+ /* Styles de base */
34
+ body {
35
+ background: linear-gradient(135deg, #141414, #000000);
36
+ font-family: 'Russo One', sans-serif;
37
+ color: #FFFFFF;
38
+ margin: 0;
39
+ padding: 0;
40
+ min-height: 100vh;
41
+ }
42
+
43
+ <title>David KRK · Biographie - DJ Techno &amp; Producteur</title>
44
+
45
+ <!-- Meta tags for SEO -->
46
+ <meta name="description" content="Découvrez l'histoire de David KRK, DJ Techno international se produisant en France, Espagne et Pays Basque depuis 2000. Trance, Tech Trance et Techno.">
47
+ <meta name="keywords" content="David KRK, biographie, DJ techno, producteur, France, Espagne, Pays Basque, Trance, Tech Trance">
48
+ <meta name="author" content="David KRK">
49
+
50
+ <!-- Open Graph / Social Media -->
51
+ <meta property="og:title" content="David KRK · Biographie - DJ Techno &amp; Producteur">
52
+ <meta property="og:description" content="Découvrez l'histoire de David KRK, DJ Techno international se produisant en France, Espagne et Pays Basque depuis 2000.">
53
+ <meta property="og:image" content="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
54
+ <meta property="og:url" content="https://davidkrk.com/bio.html">
55
+
56
+ <!-- Twitter Card -->
57
+ <meta name="twitter:card" content="summary_large_image">
58
+ <meta name="twitter:title" content="David KRK · Biographie">
59
+ <meta name="twitter:description" content="DJ Techno international - France, Espagne, Pays Basque">
60
+ <meta name="twitter:image" content="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
61
+
62
+ <!-- Preload critical resources -->
63
+ <link rel="preload" href="https://fonts.googleapis.com/css2?family=Russo+One&display=swap" as="style">
64
+ <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" as="style">
65
+ <link rel="preload" href="dist/output.css" as="style">
66
+
67
+ <!-- Stylesheets -->
68
+ <link href="https://fonts.googleapis.com/css2?family=Russo+One&display=swap" rel="stylesheet">
69
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
70
+ <link rel="stylesheet" href="dist/output.css">
71
+ <style>
72
+ /* Styles de base */
73
+ body {
74
+ background: linear-gradient(135deg, #141414, #000000);
75
+ font-family: 'Russo One', sans-serif;
76
+ color: #FFFFFF;
77
+ margin: 0;
78
+ padding: 0;
79
+ min-height: 100vh;
80
+ }
81
+
82
+ .container {
83
+ max-width: 1200px;
84
+ margin: 0 auto;
85
+ padding: 0 1rem;
86
+ }
87
+
88
+ .text-center {
89
+ text-align: center;
90
+ }
91
+
92
+ .mb-4 {
93
+ margin-bottom: 1rem;
94
+ }
95
+
96
+ .mt-4 {
97
+ margin-top: 1rem;
98
+ }
99
+
100
+ .text-8xl {
101
+ font-size: 6rem;
102
+ }
103
+
104
+ .text-2xl {
105
+ font-size: 1.5rem;
106
+ }
107
+
108
+ .font-bold {
109
+ font-weight: bold;
110
+ }
111
+
112
+ .main-content-area {
113
+ flex-grow: 1;
114
+ opacity: 0;
115
+ animation: fadeIn 0.5s ease-in-out forwards;
116
+ animation-delay: 0.3s;
117
+ }
118
+
119
+ .hover-underline-animation {
120
+ background: linear-gradient(to right, #FF69B4, #FFC67D, #8BC34A, #03A9F4, #FF69B4);
121
+ background-clip: text;
122
+ -webkit-background-clip: text;
123
+ color: transparent;
124
+ animation: gradient 10s ease infinite;
125
+ background-size: 200% auto;
126
+ transition: all 0.3s var(--transition-timing);
127
+ position: relative;
128
+ padding-bottom: 2px;
129
+ }
130
+
131
+ .hover-underline-animation::after {
132
+ content: '';
133
+ position: absolute;
134
+ width: 100%;
135
+ height: 2px;
136
+ bottom: 0;
137
+ left: 0;
138
+ background: linear-gradient(to right, #FF69B4, #FFC67D);
139
+ transform: scaleX(0);
140
+ transform-origin: right;
141
+ transition: transform 0.3s var(--transition-timing);
142
+ }
143
+
144
+ .hover-underline-animation:hover::after {
145
+ transform: scaleX(1);
146
+ transform-origin: left;
147
+ }
148
+
149
+ @keyframes gradient {
150
+ 0% { background-position: 0% 50%; }
151
+ 50% { background-position: 100% 50%; }
152
+ 100% { background-position: 0% 50%; }
153
+ }
154
+
155
+ .title-animation {
156
+ animation: fadeInDown var(--animation-duration) var(--transition-timing);
157
+ opacity: 0;
158
+ animation-fill-mode: forwards;
159
+ }
160
+
161
+ @keyframes fadeInDown {
162
+ from {
163
+ opacity: 0;
164
+ transform: translateY(-30px);
165
+ }
166
+ to {
167
+ opacity: 1;
168
+ transform: translateY(0);
169
+ }
170
+ }
171
+
172
+ @keyframes fadeIn {
173
+ from { opacity: 0; }
174
+ to { opacity: 1; }
175
+ }
176
+
177
+ .lang-content {
178
+ display: none;
179
+ opacity: 0;
180
+ transform: translateY(20px);
181
+ transition: all 0.3s ease;
182
+ position: relative;
183
+ width: 100%;
184
+ visibility: hidden;
185
+ }
186
+
187
+ .lang-content.active {
188
+ display: block !important;
189
+ opacity: 1 !important;
190
+ transform: translateY(0) !important;
191
+ visibility: visible !important;
192
+ position: relative !important;
193
+ }
194
+
195
+ .content-container {
196
+ position: relative;
197
+ min-height: 500px;
198
+ overflow: hidden;
199
+ perspective: 1000px;
200
+ }
201
+
202
+ .content-wrapper {
203
+ transition: transform var(--animation-duration) var(--transition-timing);
204
+ transform-style: preserve-3d;
205
+ }
206
+
207
+ .content-wrapper h3 {
208
+ opacity: 0;
209
+ transform: translateY(-20px);
210
+ animation: fadeInDown var(--animation-duration) var(--transition-timing) forwards;
211
+ }
212
+
213
+ .mb-4 p {
214
+ opacity: 0;
215
+ transform: translateY(20px);
216
+ transition: all var(--animation-duration) var(--transition-timing);
217
+ }
218
+
219
+ .mb-4 p.fade-in {
220
+ opacity: 1;
221
+ transform: translateY(0);
222
+ }
223
+
224
+ .language-nav {
225
+ position: relative;
226
+ z-index: 3;
227
+ display: flex;
228
+ flex-wrap: wrap;
229
+ justify-content: center;
230
+ gap: 1rem;
231
+ margin-bottom: 2rem;
232
+ }
233
+
234
+ .language-nav button {
235
+ background: transparent;
236
+ border: none;
237
+ padding: 0.5rem 1rem;
238
+ cursor: pointer;
239
+ transition: all 0.3s ease;
240
+ position: relative;
241
+ color: var(--text-color);
242
+ font-size: 1.25rem;
243
+ }
244
+
245
+ .language-nav button:hover {
246
+ transform: translateY(-2px);
247
+ color: var(--primary-color);
248
+ }
249
+
250
+ .language-nav button.active {
251
+ font-weight: bold;
252
+ }
253
+
254
+ .language-nav button.active::after {
255
+ content: '';
256
+ position: absolute;
257
+ bottom: -2px;
258
+ left: 0;
259
+ width: 100%;
260
+ height: 2px;
261
+ background: linear-gradient(to right, #FF69B4, #FFC67D);
262
+ transform: scaleX(1);
263
+ transition: transform 0.3s ease;
264
+ }
265
+
266
+ @media (max-width: 768px) {
267
+ body {
268
+ padding-bottom: 100px;
269
+ }
270
+
271
+ .language-nav {
272
+ gap: 0.5rem;
273
+ }
274
+
275
+ .language-nav button {
276
+ padding: 0.3rem 0.7rem;
277
+ font-size: 1rem;
278
+ }
279
+
280
+ h1 {
281
+ font-size: 2.5rem !important;
282
+ }
283
+
284
+ .hover-underline-animation {
285
+ font-size: 1rem;
286
+ }
287
+ }
288
+
289
+ @media (max-width: 480px) {
290
+ .language-nav {
291
+ flex-direction: column;
292
+ align-items: center;
293
+ gap: 0.3rem;
294
+ }
295
+
296
+ h1 {
297
+ font-size: 2rem !important;
298
+ }
299
+
300
+ .language-nav button {
301
+ width: 100%;
302
+ text-align: center;
303
+ }
304
+
305
+ .hover-underline-animation {
306
+ font-size: 0.9rem;
307
+ }
308
+ }
309
+
310
+ .neon {
311
+ animation: neon 2s ease-in-out infinite;
312
+ }
313
+
314
+ @keyframes neon {
315
+ 0%, 100% { color: #FFFF00; }
316
+ 50% { color: #00FFFF; }
317
+ }
318
+
319
+ .rotate {
320
+ animation: rotate 10s linear infinite;
321
+ }
322
+
323
+ @keyframes rotate {
324
+ from { transform: rotate(0deg); }
325
+ to { transform: rotate(360deg); }
326
+ }
327
+
328
+ /* Style pour le footer fixe */
329
+ .site-footer-original {
330
+ position: fixed;
331
+ bottom: 1rem; /* 4 de tailwind */
332
+ right: 1rem; /* 4 de tailwind */
333
+ display: flex;
334
+ align-items: center;
335
+ z-index: 50;
336
+ background-color: rgba(20, 20, 20, 0.8); /* Optionnel: fond semi-transparent */
337
+ padding: 0.5rem;
338
+ border-radius: 8px;
339
+ }
340
+ </style>
341
+ </head>
342
+ <body>
343
+
344
+ <div class="main-content-area container mx-auto px-6 pt-8">
345
+ <h1 class="text-8xl font-bold text-center mb-4 title-animation">David KRK</h1>
346
+
347
+ <nav id="language-navigation" class="language-nav text-center mb-12" aria-label="Sélecteur de langue principal">
348
+ <!-- Lien "Back" -->
349
+ <a href="index.html" class="text-xl mx-4 hover-underline-animation">Back</a>
350
+ <!-- Boutons de langue -->
351
+ <button type="button" data-lang="francais" class="text-xl mx-4 hover-underline-animation active">Français</button>
352
+ <button type="button" data-lang="castellano" class="text-xl mx-4 hover-underline-animation">Castellano</button>
353
+ <button type="button" data-lang="euskara" class="text-xl mx-4 hover-underline-animation">Euskara</button>
354
+ <button type="button" data-lang="english" class="text-xl mx-4 hover-underline-animation">English</button>
355
+ <button type="button" data-lang="romana" class="text-xl mx-4 hover-underline-animation">Română</button>
356
+ <button type="button" data-lang="zhongwen" class="text-xl mx-4 hover-underline-animation">中文</button>
357
+ <button type="button" data-lang="nihongo" class="text-xl mx-4 hover-underline-animation">日本語</button>
358
+ <button type="button" data-lang="ukrainian" class="text-xl mx-4 hover-underline-animation">Українська</button>
359
+ </nav>
360
+
361
+ <div class="main-content-area container mx-auto px-6 pt-8">
362
+ <h1 class="text-8xl font-bold text-center mb-4 title-animation">David KRK</h1>
363
+ </div>
364
+ <nav id="language-navigation-2" class="language-nav text-center mb-12" aria-label="Sélecteur de langue secondaire">
365
+ <a href="index.html" class="text-xl mx-4 hover-underline-animation">Back</a>
366
+ <button type="button" data-lang="francais" class="text-xl mx-4 hover-underline-animation active">Français</button>
367
+ <button type="button" data-lang="castellano" class="text-xl mx-4 hover-underline-animation">Castellano</button>
368
+ <button type="button" data-lang="euskara" class="text-xl mx-4 hover-underline-animation">Euskara</button>
369
+ <button type="button" data-lang="english" class="text-xl mx-4 hover-underline-animation">English</button>
370
+ <button type="button" data-lang="romana" class="text-xl mx-4 hover-underline-animation">Română</button>
371
+ <button type="button" data-lang="zhongwen" class="text-xl mx-4 hover-underline-animation">中文</button>
372
+ <button type="button" data-lang="nihongo" class="text-xl mx-4 hover-underline-animation">日本語</button>
373
+ <button type="button" data-lang="ukrainian" class="text-xl mx-4 hover-underline-animation">Українська</button>
374
+ </nav>
375
+
376
+
377
+ <!-- Contenu des langues -->
378
+ <div class="content-container">
379
+ <!-- Français -->
380
+ <div id="francais" class="lang-content" data-lang="francais">
381
+ <div class="content-wrapper">
382
+ <h3 class="text-2xl font-bold mt-4 mb-2 title-animation">Français</h3>
383
+ <div class="mb-4">
384
+ <p>David KRK, né en août 1982, est un DJ qui se produit en Espagne, France et Côte Basque depuis 2000.</p>
385
+ <p>Son style de base : Trance - Tech Trance, se diversifie aujourd'hui en complément de sons plus Techno.</p>
386
+ <p>Il est apprécié autant dans les clubs Espagnols que dans les complexes Français.</p>
387
+ <p>Il a partagé des scènes avec des artistes tels que PG-2 (Ex résident Txitxarro - Actuellement Nexo),</p>
388
+ <p>Diego ATB (Ex résident Txitxarro), The Fluid (Ex résident Inox - Actuellement Zul), Montxo (Ex Résident Nyx - Actuellement Zul)</p>
389
+ <p>mais aussi avec le collectif Espagnol connu sous le nom de North Trance Collective (Dj Sergi - Dj Gordon et Unai ATH).</p>
390
+ <p>Il a mixé dans quelques radios et Webradios telles que le programme Line Up sur Espiral Fm à Pampelune sur 99.7 et aussi sur Hesat Radio.</p>
391
+ <p>Très vite, David ressent le besoin d'exprimer ses sentiments à travers ses propres mixes.</p>
392
+ <p>Ses sets lui viennent du fond du cœur et le style qu'il joue touche le public grâce à cette sensibilité, ses émotions, qui se ressentent à travers son mix.</p>
393
+ <p>Son toucher particulier fait de ce DJ un musicien hors pair, dix minutes lui suffisent pour vous transporter dans son univers.</p>
394
+ <p>Il choisit ses disques méticuleusement pour que cela lui corresponde au moment présent et pour partager cet enthousiasme à son public.</p>
395
+ <p>Son prochain projet sera de produire un son Techno, qui sera sa référence, et c'est avec impatience que nous l'attendons!</p>
396
+ </div>
397
+ </div>
398
+ </div>
399
+
400
+ <!-- Castellano -->
401
+ <div id="castellano" class="lang-content" data-lang="castellano">
402
+ <div class="content-wrapper">
403
+ <h3 class="text-2xl font-bold mt-4 mb-2 title-animation">Castellano</h3>
404
+ <div class="mb-4">
405
+ <p>David KRK, nacido en agosto de 1982, es un DJ que se presenta en España, Francia y la Costa Vasca desde 2000.</p>
406
+ <p>Su estilo base, Trance - Tech Trance, se ha diversificado hoy en día con la incorporación de sonidos más Techno.</p>
407
+ <p>Es apreciado tanto en los clubes españoles como en los complejos franceses.</p>
408
+ <p>Ha compartido escenarios con artistas como PG-2 (ex residente de Txitxarro - actualmente en Nexo),</p>
409
+ <p>Diego ATB (ex residente de Txitxarro), The Fluid (ex residente de Inox - actualmente en Zul), Montxo (ex residente de Nyx - actualmente en Zul)</p>
410
+ <p>así como con el colectivo español conocido como North Trance Collective (DJ Sergi, DJ Gordon y Unai ATH).</p>
411
+ <p>Ha mezclado en varias radios y webradios, como el programa Line Up en Espiral FM en Pamplona en el 99.7, y también en Hesat Radio.</p>
412
+ <p>Muy pronto, David siente la necesidad de expresar sus sentimientos a través de sus propias mezclas.</p>
413
+ <p>Sus sets, que vienen del fondo del corazón, tocan al público gracias a esta sensibilidad y a las emociones que se sienten a través de su mezcla.</p>
414
+ <p>Su toque particular hace de este DJ un músico excepcional; diez minutos son suficientes para transportarte a su universo.</p>
415
+ <p>Elige sus discos meticulosamente para que correspondan al momento presente y para compartir ese entusiasmo con su público.</p>
416
+ <p>Su próximo proyecto será producir un sonido Techno, que será su referencia, ¡y lo esperamos con impaciencia!</p>
417
+ </div>
418
+ </div>
419
+ </div>
420
+
421
+ <!-- Euskara -->
422
+ <div id="euskara" class="lang-content" data-lang="euskara">
423
+ <div class="content-wrapper">
424
+ <h3 class="text-2xl font-bold mt-4 mb-2 title-animation">Euskara</h3>
425
+ <div class="mb-4">
426
+ <p>David KRK-ren biografia: 1982-ko abuztuan jaioa, David KRK 2000-garren urtetik aurrera Espainian, Frantzian eta Euskadin hezitako "deejay" gazte bat da.</p>
427
+ <p>Bere estilo nagusia: Trance eta Techno - Trance dira. Gaur egun elektro-trance izeneko doinu elektronikoa ere jorratzen du.</p>
428
+ <p>Espainian eta Frantzian egindako hainbat jaialdi garrantzitsutan egon da DJ hauekin kabina konpartituz:</p>
429
+ <p>PG-2 (Txitxarro-ko residente ohia, orain Santander-go Line Up-en dagoena), Diego ATB (Txitxarro-ko residente ohia), The Fluid (Inox-eko residente ohia, orain Zul-en dagoena), Montxo (Nyx-eko residente ohia, orain Zul alter-ean dagoena).</p>
430
+ <p>North Trance Collective izeneko kolektibo espainiarraren (DJ Sergi, DJ Gordon eta Unai ATH), Shred'R (Itzela Multiplex) eta Mr Hounck (Sonotone Evénement) laguntzarekin ere parte hartu du.</p>
431
+ <p>Zenbait irrati eta web irratietan parte hartu du, adibidez Line Up saioan (Iruñeko 99.7 Espiral FM-en) edota Hesat irratian (http://hesat.libcast.com/).</p>
432
+ <p>Bapatean, David-ek bere sentimenduak musika sesioen bidez adierazteko beharra sentitzen du.</p>
433
+ <p>Eta sesio hauek bere bihotzeko sakonenetik ateratzen dira. Bera musikaren bitartez publiko sentikor bat erakarri nahi du.</p>
434
+ <p>Bere egiteko moduak deejay eta musikari paregabea egiten dute; 10 minututan lor dezake publikoa eta clubber-ak unibertsora eramatea.</p>
435
+ <p>Diskoak xehetasunaz aukeratzen ditu une zehatz bakoitzean transmititu nahi duena adierazteko eta bere irrika publikoarekin partaide izateko.</p>
436
+ <p>David-en hurrengo proiektua Trance soinu propioa sortzea izango da.</p>
437
+ <p>Berehala entzu ahal izango ditugu bere produkzio guztiak.</p>
438
+ </div>
439
+ </div>
440
+ </div>
441
+
442
+ <!-- English -->
443
+ <div id="english" class="lang-content" data-lang="english">
444
+ <div class="content-wrapper">
445
+ <h3 class="text-2xl font-bold mt-4 mb-2 title-animation">English</h3>
446
+ <div class="mb-4">
447
+ <p>David KRK, born in August 1982, is a DJ who has been performing in Spain, France, and the Basque Coast since 2000.</p>
448
+ <p>His primary style: Trance - Tech Trance, is now diversifying to include more Techno sounds.</p>
449
+ <p>He is appreciated in both Spanish clubs and French venues.</p>
450
+ <p>He has shared stages with artists such as PG-2 (Former resident at Txitxarro - Currently at Nexo),</p>
451
+ <p>Diego ATB (Former resident at Txitxarro), The Fluid (Former resident at Inox - Currently at Zul), Montxo (Former resident at Nyx - Currently at Zul)</p>
452
+ <p>as well as with the Spanish collective known as North Trance Collective (DJ Sergi - DJ Gordon and Unai ATH).</p>
453
+ <p>He has mixed on several radio stations and web radios such as the Line Up program on Espiral FM in Pamplona on 99.7 and also on Hesat Radio.</p>
454
+ <p>Very quickly, David felt the need to express his feelings through his own mixes.</p>
455
+ <p>His sets come from the bottom of his heart, and the style he plays resonates with the audience due to this sensitivity and emotions that are felt through his mix.</p>
456
+ <p>His unique touch makes this DJ an exceptional musician; ten minutes are enough to transport you into his universe.</p>
457
+ <p>He meticulously chooses his records to match his current feelings and to share this enthusiasm with his audience.</p>
458
+ <p>His next project will be to produce a Techno sound, which will be his reference, and we eagerly await it!</p>
459
+ </div>
460
+ </div>
461
+ </div>
462
+
463
+ <!-- Українська -->
464
+ <div id="ukrainian" class="lang-content" data-lang="ukrainian">
465
+ <div class="content-wrapper">
466
+ <h3 class="text-2xl font-bold mt-4 mb-2 title-animation">Українська</h3>
467
+ <div class="mb-4">
468
+ <p>Девід КРК, народився в серпні 1982 року, є DJ, який виступає в Іспанії, Франції та Країні Басків з 2000 року.</p>
469
+ <p>Його основний стиль: Trance - Tech Trance, зараз розширюється, доповнюючись більш Techno звучанням.</p>
470
+ <p>Він цінується як в іспанських клубах, так і у французьких комплексах.</p>
471
+ <p>Він ділив сцену з такими артистами, як PG-2 (колишній резидент Txitxarro - зараз Nexo),</p>
472
+ <p>Дієго ATB (колишній резидент Txitxarro), The Fluid (колишній резидент Inox - зараз Zul), Montxo (колишній резидент Nyx - зараз Zul)</p>
473
+ <p>а також з іспанським колективом, відомим як North Trance Collective (Dj Sergi - Dj Gordon та Unai ATH).</p>
474
+ <p>Він міксував на кількох радіостанціях та Webradio, таких як програма Line Up на Espiral Fm в Памплоні на 99.7, а також на Hesat Radio.</p>
475
+ <p>Дуже швидко Девід відчуває потребу виражати свої почуття через власні мікси.</p>
476
+ <p>Його сети йдуть від самого серця, і стиль, який він грає, торкається публіки завдяки цій чутливості, його емоціям, які відчуваються через його мікс.</p>
477
+ <p>Його особливий підхід робить цього DJ неперевершеним музикантом, десяти хвилин йому достатньо, щоб перенести вас у свій всесвіт.</p>
478
+ <p>Він ретельно обирає свої диски, щоб вони відповідали його поточному настрою та щоб поділитися цим ентузіазмом зі своєю публікою.</p>
479
+ <p>Його наступним проектом буде продюсування Techno звучання, яке стане його орієнтиром, і ми з нетерпінням чекаємо на це!</p>
480
+ </div>
481
+ </div>
482
+ </div>
483
+
484
+ <!-- Română -->
485
+ <div id="romana" class="lang-content" data-lang="romana">
486
+ <div class="content-wrapper">
487
+ <h3 class="text-2xl font-bold mt-4 mb-2 title-animation">Română</h3>
488
+ <div class="mb-4">
489
+ <p>David KRK, născut în august 1982, este un DJ care activează în Spania, Franța și Țara Bascilor din anul 2000.</p>
490
+ <p>Stilul său de bază: Trance - Tech Trance, se diversifică astăzi prin completarea cu sunete mai Techno.</p>
491
+ <p>Este apreciat atât în cluburile spaniole, cât și în complexele franceze.</p>
492
+ <p>A împărțit scene cu artiști precum PG-2 (fost rezident Txitxarro - în prezent Nexo),</p>
493
+ <p>Diego ATB (fost rezident Txitxarro), The Fluid (fost rezident Inox - în prezent Zul), Montxo (fost rezident Nyx - în prezent Zul)</p>
494
+ <p>dar și cu colectivul spaniol cunoscut sub numele de North Trance Collective (Dj Sergi - Dj Gordon și Unai ATH).</p>
495
+ <p>A mixat la câteva posturi de radio și Webradio, precum programul Line Up la Espiral Fm în Pamplona pe 99.7 și, de asemenea, la Hesat Radio.</p>
496
+ <p>Foarte repede, David simte nevoia de a-și exprima sentimentele prin propriile mixuri.</p>
497
+ <p>Seturile sale vin din adâncul inimii, iar stilul pe care îl abordează atinge publicul datorită acestei sensibilități, emoțiilor sale, care se resimt prin mixul său.</p>
498
+ <p>Atingerea sa particulară face din acest DJ un muzician excepțional, zece minute fiind suficiente pentru a te transporta în universul său.</p>
499
+ <p>Își alege discurile meticulos pentru a se potrivi momentului prezent și pentru a împărtăși acest entuziasm cu publicul său.</p>
500
+ <p>Următorul său proiect va fi producerea unui sunet Techno, care va fi referința sa, și îl așteptăm cu nerăbdare!</p>
501
+ </div>
502
+ </div>
503
+ </div>
504
+
505
+ <!-- 中文 -->
506
+ <div id="zhongwen" class="lang-content" data-lang="zhongwen">
507
+ <div class="content-wrapper">
508
+ <h3 class="text-2xl font-bold mt-4 mb-2 title-animation">中文</h3>
509
+ <div class="mb-4">
510
+ <p>David KRK,1982年8月出生,自2000年以来一直在西班牙、法国和巴斯克地区演出的DJ。</p>
511
+ <p>他的基础风格是Trance - Tech Trance,如今也融入了更多的Techno元素。</p>
512
+ <p>他在西班牙俱乐部和法国场馆都备受赞赏。</p>
513
+ <p>他曾与PG-2(前Txitxarro驻场DJ - 现在Nexo)、</p>
514
+ <p>Diego ATB(前Txitxarro驻场DJ)、The Fluid(前Inox驻场DJ - 现在Zul)、Montxo(前Nyx驻场DJ - 现在Zul)等艺术家同台演出,</p>
515
+ <p>也曾与名为North Trance Collective的西班牙团体(包括DJ Sergi - DJ Gordon和Unai ATH)合作。</p>
516
+ <p>他曾在多个广播电台和网络电台进行混音,例如潘普洛纳99.7 Espiral Fm的Line Up节目以及Hesat Radio。</p>
517
+ <p>很快,David就感受到需要通过自己的混音来表达情感。</p>
518
+ <p>他的音乐集发自内心,他所播放的风格凭借其敏感性和情感触动听众,这些都通过他的混音得以体现。</p>
519
+ <p>他独特的触感使这位DJ成为一位杰出的音乐家,十分钟足以将你带入他的宇宙。</p>
520
+ <p>他精心挑选唱片,以使其符合当下时刻,并与听众分享这份热情。</p>
521
+ <p>他的下一个项目将是制作一种Techno声音,这将成为他的代表作,我们对此充满期待!</p>
522
+ </div>
523
+ </div>
524
+ </div>
525
+
526
+ <!-- 日本語 -->
527
+ <div id="nihongo" class="lang-content" data-lang="nihongo">
528
+ <div class="content-wrapper">
529
+ <h3 class="text-2xl font-bold mt-4 mb-2 title-animation">日本語</h3>
530
+ <div class="mb-4">
531
+ <p>1982年8月生まれのDavid KRKは、2000年からスペイン、フランス、バスク地方で活動しているDJです。</p>
532
+ <p>彼の基本的なスタイルはトランス - テックトランスですが、今日ではよりテクノサウンドを取り入れて多様化しています。</p>
533
+ <p>彼はスペインのクラブとフランスの会場の両方で高く評価されています。</p>
534
+ <p>彼はPG-2(元Txitxarroレジデント - 現在Nexo)、</p>
535
+ <p>Diego ATB(元Txitxarroレジデント)、The Fluid(元Inoxレジデント - 現在Zul)、Montxo(元Nyxレジデント - 現在Zul)などのアーティストとステージを共にしました。</p>
536
+ <p>また、North Trance Collectiveとして知られるスペインのコレクティブ(Dj Sergi - Dj Gordon、Unai ATH)とも共演しています。</p>
537
+ <p>彼はパンプローナの99.7 Espiral FmのLine UpプログラムやHesat Radioなど、いくつかのラジオ局やウェブラジオでミックスを行いました。</p>
538
+ <p>すぐに、Davidは自身のミックスを通じて感情を表現する必要性を感じました。</p>
539
+ <p>彼のセットは心の底から生まれ、彼がプレイするスタイルは、その感受性、彼のミックスを通じて感じられる感情によって聴衆に響きます。</p>
540
+ <p>彼の独特なタッチはこのDJを卓越したミュージシャンにしており、10分もあれば彼の宇宙へとあなたを誘います。</p>
541
+ <p>彼は現在の瞬間に合うようにレコードを細心の注意を払って選び、その熱意を聴衆と共有します。</p>
542
+ <p>彼の次のプロジェクトは、彼の代表となるテクノサウンドを制作することであり、私たちはそれを心待ちにしています!</p>
543
+ </div>
544
+ </div>
545
+ </div>
546
+ </div>
547
+ <!-- Fin du contenu des langues -->
548
+
549
+ </div>
550
+ <div class="fixed-footer">
551
+ <footer class="flex items-center gap-4">
552
+ <div>
553
+ <p class="text-gray-400 mb-2">&copy; 2025 All rights reserved <span class="rotate inline-block">David KRK</span></p>
554
+ <p class="neon font-bold text-lg">"May The Techno Be With You"</p>
555
+ </div>
556
+ <div class="footer-links flex gap-3 items-center">
557
+ <a href="https://facebook.com/DavidKRKofficial" target="_blank" rel="noopener noreferrer" class="text-gray-300 hover:text-white" aria-label="Facebook de David KRK">
558
+ <i class="fab fa-facebook text-xl"></i>
559
+ </a>
560
+ <a href="mailto:davidkrkofficial@gmail.com" class="text-gray-300 hover:text-white text-sm">
561
+ Contact
562
+ </a>
563
+ </div>
564
+ <div class="footer-logo">
565
+ <!-- VÉRIFIEZ QUE CE CHEMIN EST CORRECT ! -->
566
+ <!-- L'image doit être dans le même dossier que ce fichier HTML, ou ajustez le chemin -->
567
+ <img src="images/logo 30-01-25.png" alt="Logo David KRK" class="w-20 h-20 rounded-full border-4 border-white">
568
+ </div>
569
+ </footer>
570
+ </div>
571
+ <script>
572
+ document.addEventListener('DOMContentLoaded', function() {
573
+ // Cache tous les contenus au démarrage
574
+
575
+
576
+ <div class="fixed-footer">
577
+ <footer class="flex items-center gap-4">
578
+ <div>
579
+ <p class="text-gray-400 mb-2">&copy; 2025 All rights reserved <span class="rotate inline-block">David KRK</span></p>
580
+ <p class="neon font-bold text-lg">"May The Techno Be With You"</p>
581
+ </div>
582
+ <div class="footer-links flex gap-3 items-center">
583
+ <a href="https://facebook.com/DavidKRKofficial" target="_blank" rel="noopener noreferrer" class="text-gray-300 hover:text-white" aria-label="Facebook de David KRK">
584
+ <i class="fab fa-facebook text-xl"></i>
585
+ </a>
586
+ <a href="mailto:davidkrkofficial@gmail.com" class="text-gray-300 hover:text-white text-sm">Contact</a>
587
+ </div>
588
+ <div class="footer-logo">
589
+ <img src="images/logo 30-01-25.png" alt="Logo David KRK" class="w-20 h-20 rounded-full border-4 border-white">
590
+ </div>
591
+ </footer>
592
+ </div>
593
+ <script>
594
+ document.addEventListener('DOMContentLoaded', function() {
595
+ // Cache tous les contenus au démarrage
596
+ document.querySelectorAll('.lang-content').forEach(content => {
597
+ content.style.display = 'none';
598
+ content.classList.remove('active');
599
+ content.style.opacity = '0';
600
+ content.style.visibility = 'hidden';
601
+ });
602
+
603
+ // Gestionnaire de langue
604
+ const translations = {
605
+ 'francais': { 'pageTitle': "David KRK - DJ Techno &amp; Producteur", 'mainTitle': "SITE EN CONSTRUCTION", 'contact': "Contactez David KRK", 'rights': "© 2025 DAVID KRK - TOUS DROITS RÉSERVÉS" },
606
+ 'castellano': { 'pageTitle': "David KRK - DJ Techno & Productor", 'mainTitle': "SITIO EN CONSTRUCCIÓN", 'contact': "Contactar a David KRK", 'rights': "© 2025 DAVID KRK - TODOS LOS DERECHOS RESERVADOS" },
607
+ 'euskara': { 'pageTitle': "David KRK - Techno DJ & Ekoizlea", 'mainTitle': "GUNEA ERAIKITZEN", 'contact': "Harremanetan jarri David KRK", 'rights': "© 2025 DAVID KRK - ESKUBIDE GUZTIAK ERRESERBATUTA" },
608
+ 'english': { 'pageTitle': "David KRK - Techno DJ & Producer", 'mainTitle': "UNDER CONSTRUCTION", 'contact': "Contact David KRK", 'rights': "© 2025 DAVID KRK - ALL RIGHTS RESERVED" },
609
+ 'romana': { 'pageTitle': "David KRK - DJ Techno & Producător", 'mainTitle': "SITE ÎN CONSTRUCȚIE", 'contact': "Contactați David KRK", 'rights': "© 2025 DAVID KRK - TOATE DREPTURILE REZERVATE" },
610
+ 'zhongwen': { 'pageTitle': "David KRK - Techno DJ & 制作人", 'mainTitle': "网站建设中", 'contact': "联系 David KRK", 'rights': "© 2025 DAVID KRK - 版权所有" },
611
+ 'nihongo': { 'pageTitle': "David KRK - テクノDJ & プロデューサー", 'mainTitle': "ウェブサイト建設中", 'contact': "David KRKへのお問い合わせ", 'rights': "© 2025 DAVID KRK - 無断複写・転載を禁じます" },
612
+ 'ukrainian': { 'pageTitle': "David KRK - Techno DJ & Продюсер", 'mainTitle': "САЙТ В РОЗРОБЦІ", 'contact': "Зв'язатися з David KRK", 'rights': "© 2025 DAVID KRK - ВСІ ПРАВА ЗАХИЩЕНО" }
613
+ };
614
+
615
+ window.setLanguage = function(language) {
616
+ const langData = translations[language];
617
+ if (!langData) return;
618
+
619
+ document.documentElement.lang = language;
620
+ document.title = langData['pageTitle'];
621
+
622
+ // Gérer l'affichage des contenus de langue
623
+
624
+ document.querySelectorAll('.lang-content').forEach(content => {
625
+ content.style.display = 'none';
626
+ content.classList.remove('active');
627
+ content.style.opacity = '0';
628
+ content.style.visibility = 'hidden';
629
+ });
630
+
631
+ // Gestionnaire de langue
632
+ const translations = {
633
+ 'francais': { 'pageTitle': "David KRK - DJ Techno &amp; Producteur", 'mainTitle': "SITE EN CONSTRUCTION", 'contact': "Contactez David KRK", 'rights': " 2025 DAVID KRK - TOUS DROITS RÉSERVÉS" },
634
+ 'castellano': { 'pageTitle': "David KRK - DJ Techno &amp; Productor", 'mainTitle': "SITIO EN CONSTRUCCIÓN", 'contact': "Contactar a David KRK", 'rights': " 2025 DAVID KRK - TODOS LOS DERECHOS RESERVADOS" },
635
+ 'euskara': { 'pageTitle': "David KRK - Techno DJ &amp; Ekoizlea", 'mainTitle': "GUNEA ERAIKITZEN", 'contact': "Harremanetan jarri David KRK", 'rights': " 2025 DAVID KRK - ESKUBIDE GUZTIAK ERRESERBATUTA" },
636
+ 'english': { 'pageTitle': "David KRK - Techno DJ &amp; Producer", 'mainTitle': "UNDER CONSTRUCTION", 'contact': "Contact David KRK", 'rights': " 2025 DAVID KRK - ALL RIGHTS RESERVED" },
637
+ 'romana': { 'pageTitle': "David KRK - DJ Techno &amp; Producător", 'mainTitle': "SITE ÎN CONSTRUCȚIE", 'contact': "Contactați David KRK", 'rights': " 2025 DAVID KRK - TOATE DREPTURILE REZERVATE" },
638
+ 'zhongwen': { 'pageTitle': "David KRK - Techno DJ &amp; ", 'mainTitle': "", 'contact': "David KRK", 'rights': " 2025 DAVID KRK - " },
639
+ 'nihongo': { 'pageTitle': "David KRK - テクノDJ &amp; プロデューサー", 'mainTitle': "ウェブサイト建設中", 'contact': "David KRKへのお問い合わせ", 'rights': " 2025 DAVID KRK - " },
640
+ 'ukrainian': { 'pageTitle': "David KRK - Techno DJ &amp; Продюсер", 'mainTitle': "САЙТ В РОЗРОБЦІ", 'contact': "Зв'язатися з David KRK", 'rights': " 2025 DAVID KRK - ВСІ ПРАВА ЗАХИЩЕНО" }
641
+ };
642
+
643
+ window.setLanguage = function(language) {
644
+ const langData = translations[language];
645
+ if (!langData) return;
646
+
647
+ document.documentElement.lang = language;
648
+ document.title = langData['pageTitle'];
649
+
650
+ // Gérer l'affichage des contenus de langue
651
+ document.querySelectorAll('.lang-content').forEach(content => {
652
+ content.style.display = 'none';
653
+ content.classList.remove('active');
654
+ content.style.opacity = '0';
655
+ content.style.visibility = 'hidden';
656
+ });
657
+
658
+ const activeContent = document.querySelector(`.lang-content[data-lang="${language}"]`);
659
+ if (activeContent) {
660
+ activeContent.style.display = 'block';
661
+ activeContent.classList.add('active');
662
+ activeContent.style.opacity = '1';
663
+ activeContent.style.visibility = 'visible';
664
+ }
665
+
666
+ // Mettre à jour les boutons de langue
667
+ document.querySelectorAll('.language-nav button').forEach(button => {
668
+ button.classList.remove('active');
669
+ if (button.getAttribute('data-lang') === language) {
670
+ button.classList.add('active');
671
+ }
672
+ });
673
+ };
674
+
675
+ // Ajouter les gestionnaires d'événements aux boutons de langue
676
+ document.querySelectorAll('.language-nav button').forEach(button => {
677
+ button.addEventListener('click', function() {
678
+ const lang = this.getAttribute('data-lang');
679
+ setLanguage(lang);
680
+ });
681
+ });
682
+ button.addEventListener('click', function() {
683
+ const lang = this.getAttribute('data-lang');
684
+ setLanguage(lang);
685
+ });
686
+ });
687
+
688
+ // Initialiser avec le français
689
+ setLanguage('francais');
690
+ });
691
+ </script>
692
+ </body>
693
+ </html>
cleanDuplicates.js ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Removes duplicate entries from a JSON file by parsing, deduplicating, and rewriting the file.
3
+ *
4
+ * @param {string} filePath - Path to the JSON file to be deduplicated
5
+ * @throws {Error} If the JSON file is invalid or does not contain an array
6
+ * @description Reads a JSON file, removes duplicate entries using JSON stringification,
7
+ * and writes the unique entries back to the same file with proper indentation.
8
+ */
9
+ /**
10
+ * Removes duplicate entries from a JSON file by parsing, deduplicating, and rewriting the file.
11
+ *
12
+ * @param {string} filePath - Path to the JSON file to be deduplicated
13
+ * @throws {Error} If the JSON file is invalid or does not contain an array
14
+ * @description Reads a JSON file, removes duplicate entries using JSON stringification,
15
+ * and writes the unique entries back to the same file with proper indentation.
16
+ */
17
+ const fs = require('fs');
18
+
19
+ /**
20
+ * Removes duplicate entries from a JSON file by parsing, deduplicating, and rewriting the file.
21
+ *
22
+ * @throws {Error} If the JSON file is invalid or does not contain an array
23
+ * @description Reads a JSON file, removes duplicate entries using JSON stringification,
24
+ * and writes the unique entries back to the same file with proper indentation.
25
+ */
26
+ /**
27
+ * Removes duplicate entries from a specified JSON file.
28
+ *
29
+ * @param {string} filePath - Path to the JSON file to be deduplicated
30
+ * @throws {Error} If the JSON file contains invalid syntax or is not an array
31
+ * @description Reads a JSON file, removes duplicate entries using JSON stringification,
32
+ * and writes the unique entries back to the same file with proper indentation.
33
+ */
34
+ /**
35
+ * Removes duplicate entries from a JSON file by parsing, deduplicating, and rewriting the file.
36
+ *
37
+ * @param {string} filePath - Path to the JSON file to be deduplicated
38
+ * @throws {Error} If the JSON file is invalid or does not contain an array
39
+ * @description Reads a JSON file, removes duplicate entries using JSON stringification,
40
+ * and writes the unique entries back to the same file with proper indentation.
41
+ */
42
+ /**
43
+ * Removes duplicate entries from a JSON file by parsing, deduplicating, and rewriting the file.
44
+ *
45
+ * @param {string} filePath - Path to the JSON file to be deduplicated
46
+ * @throws {Error} If the JSON file is invalid or does not contain an array
47
+ * @description Reads a JSON file, removes duplicate entries using JSON stringification,
48
+ * and writes the unique entries back to the same file with proper indentation.
49
+ */
50
+ try {
51
+ // Lire le fichier JSON
52
+ const filePath = 'c:\\Users\\LENOVO\\DavidKRK.github.io\\playwright-report\\report.json';
53
+ const fileContent = fs.readFileSync(filePath, 'utf8');
54
+
55
+ // Vérifier si le contenu est un JSON valide
56
+ let jsonData;
57
+ try {
58
+ jsonData = JSON.parse(fileContent);
59
+ } catch (error) {
60
+ throw new Error('Le fichier JSON contient une syntaxe invalide. Veuillez corriger le fichier.');
61
+ }
62
+
63
+ // Vérifier si le contenu est un tableau
64
+ if (!Array.isArray(jsonData)) {
65
+ throw new Error('Le contenu du fichier JSON n\'est pas un tableau. Veuillez vérifier le fichier.');
66
+ }
67
+
68
+ // Supprimer les doublons
69
+ const uniqueData = Array.from(new Set(jsonData.map(JSON.stringify))).map(JSON.parse);
70
+
71
+ // Écrire le contenu nettoyé dans le fichier
72
+ fs.writeFileSync(filePath, JSON.stringify(uniqueData, null, 2), 'utf8');
73
+ console.log('Les doublons dans le fichier JSON ont été nettoyés.');
74
+ } catch (error) {
75
+ console.error('Erreur :', error.message);
76
+ }
file_list.txt ADDED
Binary file (2.61 kB). View file
 
git-error-1743827686154 ADDED
@@ -0,0 +1 @@
 
 
1
+ git status
images/david_krk_logo.png ADDED
images/dj_blue_lights.jpg ADDED

Git LFS Details

  • SHA256: 3bd446d291fe628d06c35396ed012ad0948a1cd9358f8d56c1669495362e17f3
  • Pointer size: 132 Bytes
  • Size of remote file: 1.51 MB
images/dj_crew.jpg ADDED
images/dj_crowd.jpg ADDED

Git LFS Details

  • SHA256: 2e20ff11c516f40045099e84e09871bc8f0c6d57ccac3a418755d0fc7397badc
  • Pointer size: 132 Bytes
  • Size of remote file: 6.03 MB
images/dj_crowd_view.jpg ADDED

Git LFS Details

  • SHA256: 38be0359f9d978d384994bc83ffe37320f1624d8825b06c7a1088ef1dcc56820
  • Pointer size: 132 Bytes
  • Size of remote file: 1.49 MB
images/dj_red_lights.jpg ADDED

Git LFS Details

  • SHA256: 06e92cbaaedd908fa3cfa97b2dc87b6e4af27287d2c271486ed97851af798171
  • Pointer size: 131 Bytes
  • Size of remote file: 592 kB
images/logo 30-01-25.png ADDED
images/optimized/david_krk_logo.webp ADDED
images/optimized/dj_blue_lights.webp ADDED
images/optimized/dj_crew.webp ADDED
images/optimized/dj_crowd.webp ADDED

Git LFS Details

  • SHA256: b73f3a8a17c93ba7b07c0f5614b0e8f5b7b457d8b99bd5b94cca4996203745eb
  • Pointer size: 131 Bytes
  • Size of remote file: 111 kB
images/optimized/dj_crowd_view.webp ADDED

Git LFS Details

  • SHA256: 5a3aff2a26edfddea55132cc4f96f504148b5e36f250738952c60f67024a2401
  • Pointer size: 131 Bytes
  • Size of remote file: 118 kB
images/optimized/dj_red_lights.webp ADDED

Git LFS Details

  • SHA256: 5dde602d7454e02ddd79b554d1b93c77ffebd296adc51f3e38b213d3f38e12d2
  • Pointer size: 131 Bytes
  • Size of remote file: 105 kB
images/optimized/logo.webp ADDED
images/optimized/received_921630123191476.webp ADDED
images/optimized/vinyl_crate.webp ADDED
images/received_921630123191476.jpeg ADDED
images/vinyl_crate.jpg ADDED
index.html ADDED
@@ -0,0 +1,461 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <title>David KRK · DJ Techno & Producteur</title>
8
+ <meta name="description" content="David KRK, DJ Techno international se produisant en France, Espagne et Pays Basque depuis 2000. Trance, Tech Trance et Techno.">
9
+ <meta name="keywords" content="David KRK, DJ techno, producteur, France, Espagne, Pays Basque, Trance, Tech Trance">
10
+ <meta name="author" content="David KRK">
11
+
12
+ <!-- Open Graph / Facebook -->
13
+ <meta property="og:type" content="website">
14
+ <meta property="og:url" content="https://davidkrk.com/">
15
+ <meta property="og:title" content="David KRK · DJ Techno & Producteur">
16
+ <meta property="og:description" content="DJ Techno international - France, Espagne, Pays Basque">
17
+ <meta property="og:image" content="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
18
+
19
+ <!-- Twitter -->
20
+ <meta property="twitter:card" content="summary_large_image">
21
+ <meta property="twitter:url" content="https://davidkrk.com/">
22
+ <meta property="twitter:title" content="David KRK · DJ Techno & Producteur">
23
+ <meta property="twitter:description" content="DJ Techno international - France, Espagne, Pays Basque">
24
+ <meta property="twitter:image" content="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
25
+
26
+ <!-- Favicon -->
27
+ <link rel="icon" type="image/png" href="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
28
+
29
+ <!-- Fonts & Icons -->
30
+ <link rel="preconnect" href="https://fonts.googleapis.com">
31
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
32
+ <link href="https://fonts.googleapis.com/css2?family=Russo+One&display=swap" rel="stylesheet">
33
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
34
+
35
+ <!-- Tailwind CSS -->
36
+ <script src="https://cdn.tailwindcss.com"></script>
37
+
38
+ <style>
39
+ :root {
40
+ --primary-color: #FF69B4;
41
+ --secondary-color: #03A9F4;
42
+ --accent-color: #8BC34A;
43
+ --dark-bg: #0F0F0F;
44
+ --darker-bg: #080808;
45
+ --transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.1);
46
+ }
47
+
48
+ body {
49
+ background: linear-gradient(135deg, var(--dark-bg), var(--darker-bg));
50
+ font-family: 'Russo One', sans-serif;
51
+ color: white;
52
+ margin: 0;
53
+ padding: 0;
54
+ min-height: 100vh;
55
+ overflow-x: hidden;
56
+ }
57
+
58
+ .logo-container {
59
+ position: relative;
60
+ margin-bottom: 2rem;
61
+ animation: float 6s ease-in-out infinite;
62
+ }
63
+
64
+ .logo-border {
65
+ position: absolute;
66
+ top: -5px;
67
+ left: -5px;
68
+ right: -5px;
69
+ bottom: -5px;
70
+ border-radius: 50%;
71
+ background: linear-gradient(45deg, var(--primary-color), var(--secondary-color), var(--accent-color));
72
+ background-size: 300% 300%;
73
+ animation: gradient 8s ease infinite;
74
+ z-index: -1;
75
+ filter: blur(8px);
76
+ opacity: 0.7;
77
+ }
78
+
79
+ .main-title {
80
+ background: linear-gradient(to right, var(--primary-color), var(--secondary-color), var(--accent-color));
81
+ background-clip: text;
82
+ -webkit-background-clip: text;
83
+ color: transparent;
84
+ background-size: 200% auto;
85
+ animation: gradient 8s ease infinite, fadeInDown 1s ease-out forwards;
86
+ }
87
+
88
+ .nav-link {
89
+ position: relative;
90
+ overflow: hidden;
91
+ }
92
+
93
+ .nav-link::after {
94
+ content: '';
95
+ position: absolute;
96
+ bottom: 0;
97
+ left: 0;
98
+ width: 100%;
99
+ height: 2px;
100
+ background: linear-gradient(to right, var(--primary-color), var(--secondary-color));
101
+ transform: translateX(-100%);
102
+ transition: var(--transition);
103
+ }
104
+
105
+ .nav-link:hover::after {
106
+ transform: translateX(0);
107
+ }
108
+
109
+ .social-icon {
110
+ transition: var(--transition);
111
+ transform: scale(1);
112
+ }
113
+
114
+ .social-icon:hover {
115
+ transform: scale(1.2);
116
+ color: var(--primary-color);
117
+ }
118
+
119
+ .pulse {
120
+ animation: pulse 2s infinite;
121
+ }
122
+
123
+ .welcome-text {
124
+ position: relative;
125
+ padding: 1.5rem;
126
+ border-radius: 0.5rem;
127
+ background: rgba(15, 15, 15, 0.7);
128
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
129
+ backdrop-filter: blur(10px);
130
+ border: 1px solid rgba(255, 255, 255, 0.1);
131
+ transform: perspective(500px) rotateX(0deg);
132
+ transition: all 0.5s ease;
133
+ min-height: 180px;
134
+ display: flex;
135
+ align-items: center;
136
+ justify-content: center;
137
+ }
138
+
139
+ .welcome-text:hover {
140
+ transform: perspective(500px) rotateX(5deg);
141
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
142
+ }
143
+
144
+ .welcome-text::before {
145
+ content: '';
146
+ position: absolute;
147
+ top: 0;
148
+ left: 0;
149
+ right: 0;
150
+ height: 3px;
151
+ background: linear-gradient(90deg, var(--primary-color), var(--secondary-color), var(--accent-color));
152
+ border-radius: 0.5rem 0.5rem 0 0;
153
+ }
154
+
155
+ .language-selector {
156
+ display: flex;
157
+ justify-content: center;
158
+ gap: 1rem;
159
+ margin-bottom: 1rem;
160
+ }
161
+
162
+ .language-btn {
163
+ background: rgba(255, 255, 255, 0.1);
164
+ border: none;
165
+ color: white;
166
+ padding: 0.5rem 1rem;
167
+ border-radius: 2rem;
168
+ cursor: pointer;
169
+ transition: var(--transition);
170
+ font-size: 0.9rem;
171
+ }
172
+
173
+ .language-btn:hover, .language-btn.active {
174
+ background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
175
+ transform: scale(1.05);
176
+ }
177
+
178
+ .welcome-message {
179
+ display: none;
180
+ text-align: center;
181
+ font-size: 1.25rem;
182
+ line-height: 1.6;
183
+ }
184
+
185
+ .welcome-message.active {
186
+ display: block;
187
+ animation: fadeIn 0.8s ease-out;
188
+ }
189
+
190
+ /* Mixcloud player styling */
191
+ .mixcloud-player {
192
+ width: 100%;
193
+ height: 120px;
194
+ border-radius: 0.5rem;
195
+ overflow: hidden;
196
+ margin: 2rem 0;
197
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
198
+ transition: var(--transition);
199
+ }
200
+
201
+ .mixcloud-player:hover {
202
+ transform: scale(1.02);
203
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
204
+ }
205
+
206
+ /* Animations */
207
+ @keyframes float {
208
+ 0%, 100% { transform: translateY(0); }
209
+ 50% { transform: translateY(-15px); }
210
+ }
211
+
212
+ @keyframes gradient {
213
+ 0% { background-position: 0% 50%; }
214
+ 50% { background-position: 100% 50%; }
215
+ 100% { background-position: 0% 50%; }
216
+ }
217
+
218
+ @keyframes fadeInDown {
219
+ from {
220
+ opacity: 0;
221
+ transform: translateY(-30px);
222
+ }
223
+ to {
224
+ opacity: 1;
225
+ transform: translateY(0);
226
+ }
227
+ }
228
+
229
+ @keyframes pulse {
230
+ 0% { transform: scale(1); }
231
+ 50% { transform: scale(1.1); }
232
+ 100% { transform: scale(1); }
233
+ }
234
+
235
+ @keyframes fadeIn {
236
+ from { opacity: 0; transform: translateY(10px); }
237
+ to { opacity: 1; transform: translateY(0); }
238
+ }
239
+
240
+ /* Responsive */
241
+ @media (max-width: 768px) {
242
+ .main-title {
243
+ font-size: 3.5rem;
244
+ }
245
+
246
+ .nav-container {
247
+ flex-direction: column;
248
+ gap: 1rem;
249
+ }
250
+
251
+ .welcome-text {
252
+ padding: 1rem;
253
+ }
254
+
255
+ .welcome-message {
256
+ font-size: 1.1rem;
257
+ }
258
+
259
+ .mixcloud-player {
260
+ height: 100px;
261
+ }
262
+ }
263
+ </style>
264
+ </head>
265
+ <body class="flex flex-col items-center justify-center min-h-screen p-4">
266
+ <main class="text-center max-w-4xl mx-auto px-4 py-8">
267
+ <!-- Logo with animated border -->
268
+ <div class="logo-container">
269
+ <div class="logo-border"></div>
270
+ <img src="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png"
271
+ alt="Logo David KRK"
272
+ class="w-32 h-32 rounded-full border-4 border-white object-cover shadow-xl">
273
+ </div>
274
+
275
+ <!-- Main Title -->
276
+ <h1 class="main-title text-6xl md:text-8xl font-bold mb-8 opacity-0">
277
+ David KRK
278
+ </h1>
279
+
280
+ <!-- Navigation -->
281
+ <nav class="nav-container flex justify-center gap-8 mb-12">
282
+ <a href="bio.html" class="nav-link text-2xl text-white hover:text-primary transition-colors">
283
+ Bio
284
+ </a>
285
+ <a href="music.html" class="nav-link text-2xl text-white hover:text-primary transition-colors">
286
+ Music
287
+ </a>
288
+ <a href="events.html" class="nav-link text-2xl text-white hover:text-primary transition-colors">
289
+ Events
290
+ </a>
291
+ <a href="contact.html" class="nav-link text-2xl text-white hover:text-primary transition-colors">
292
+ Contact
293
+ </a>
294
+ </nav>
295
+
296
+ <!-- Language Selector -->
297
+ <div class="language-selector">
298
+ <button class="language-btn active" data-lang="fr">Français</button>
299
+ <button class="language-btn" data-lang="es">Español</button>
300
+ <button class="language-btn" data-lang="en">English</button>
301
+ <button class="language-btn" data-lang="eu">Euskara</button>
302
+ </div>
303
+
304
+ <!-- Main Text with language options -->
305
+ <div class="welcome-text mb-12">
306
+ <!-- French -->
307
+ <div class="welcome-message active" data-lang="fr">
308
+ <p>Bienvenue sur le site officiel de David KRK, DJ Techno international se produisant en France, Espagne et Pays Basque depuis 2000. Spécialisé en Trance, Tech Trance et Techno.</p>
309
+ </div>
310
+
311
+ <!-- Spanish -->
312
+ <div class="welcome-message" data-lang="es">
313
+ <p>Bienvenido al sitio oficial de David KRK, DJ de Techno internacional actuando en Francia, España y el País Vasco desde 2000. Especializado en Trance, Tech Trance y Techno.</p>
314
+ </div>
315
+
316
+ <!-- English -->
317
+ <div class="welcome-message" data-lang="en">
318
+ <p>Welcome to the official website of David KRK, international Techno DJ performing in France, Spain and the Basque Country since 2000. Specializing in Trance, Tech Trance and Techno.</p>
319
+ </div>
320
+
321
+ <!-- Basque -->
322
+ <div class="welcome-message" data-lang="eu">
323
+ <p>Ongi etorri David KRK-ren webgune ofizialera, 2000. urtetik Frantziako, Espainiako eta Euskal Herriko Techno DJ internazionala. Trance, Tech Trance eta Techno espezialista.</p>
324
+ </div>
325
+ </div>
326
+
327
+ <!-- Mixcloud Player -->
328
+ <div class="mixcloud-player">
329
+ <iframe
330
+ width="100%"
331
+ height="120"
332
+ src="https://www.mixcloud.com/widget/iframe/?hide_cover=1&light=1&feed=%2FDavidKRK%2F"
333
+ frameborder="0">
334
+ </iframe>
335
+ </div>
336
+
337
+ <!-- Social Icons -->
338
+ <div class="flex justify-center gap-6 mb-8">
339
+ <a href="https://www.facebook.com/DavidKRKofficial" target="_blank" aria-label="Facebook" class="social-icon text-3xl text-white">
340
+ <i class="fab fa-facebook"></i>
341
+ </a>
342
+ <a href="https://www.instagram.com/davidkrk/" target="_blank" aria-label="Instagram" class="social-icon text-3xl text-white">
343
+ <i class="fab fa-instagram"></i>
344
+ </a>
345
+ <a href="https://www.mixcloud.com/DavidKRK/" target="_blank" aria-label="Mixcloud" class="social-icon text-3xl text-white">
346
+ <i class="fab fa-mixcloud"></i>
347
+ </a>
348
+ <a href="https://www.youtube.com/@DavidKRKofficial" target="_blank" aria-label="YouTube" class="social-icon text-3xl text-white">
349
+ <i class="fab fa-youtube"></i>
350
+ </a>
351
+ <a href="https://soundcloud.com/david-krkofficial" target="_blank" aria-label="SoundCloud" class="social-icon text-3xl text-white">
352
+ <i class="fab fa-soundcloud"></i>
353
+ </a>
354
+ <a href="https://www.tiktok.com/@davidkrk" target="_blank" aria-label="TikTok" class="social-icon text-3xl text-white">
355
+ <i class="fab fa-tiktok"></i>
356
+ </a>
357
+ </div>
358
+
359
+ <!-- Latest Track (Placeholder) -->
360
+ <div class="mt-12 p-6 bg-black bg-opacity-30 rounded-xl max-w-lg mx-auto transform transition-all hover:scale-105">
361
+ <h3 class="text-xl font-bold mb-4">Dernière sortie</h3>
362
+ <div class="p-4 bg-black bg-opacity-50 rounded-lg">
363
+ <p class="text-primary font-bold">KRK - Neon Dreams</p>
364
+ <p class="text-sm opacity-80 mb-3">Tech Trance • 2023</p>
365
+ <button class="bg-gradient-to-r from-primary to-secondary hover:opacity-90 text-black font-bold py-2 px-6 rounded-full transition-all transform hover:scale-105">
366
+ Écouter <i class="ml-2 fas fa-play"></i>
367
+ </button>
368
+ </div>
369
+ </div>
370
+ </main>
371
+
372
+ <!-- Footer -->
373
+ <footer class="mt-auto py-6 text-center text-sm opacity-70">
374
+ <p>© 2023 David KRK. Tous droits réservés.</p>
375
+ </footer>
376
+
377
+ <script>
378
+ // Simple script to ensure animations trigger after page load
379
+ document.addEventListener('DOMContentLoaded', () => {
380
+ // Add a small delay to ensure CSS animations trigger
381
+ setTimeout(() => {
382
+ document.querySelector('.main-title').style.opacity = '1';
383
+ }, 100);
384
+
385
+ // Add pulse animation to social icons on hover
386
+ const socialIcons = document.querySelectorAll('.social-icon');
387
+ socialIcons.forEach(icon => {
388
+ icon.addEventListener('mouseenter', () => {
389
+ icon.classList.add('pulse');
390
+ });
391
+ icon.addEventListener('mouseleave', () => {
392
+ icon.classList.remove('pulse');
393
+ });
394
+ });
395
+
396
+ // Add subtle parallax effect to welcome text
397
+ const welcomeText = document.querySelector('.welcome-text');
398
+ window.addEventListener('mousemove', (e) => {
399
+ const xAxis = (window.innerWidth / 2 - e.pageX) / 25;
400
+ const yAxis = (window.innerHeight / 2 - e.pageY) / 25;
401
+ welcomeText.style.transform = `perspective(500px) rotateY(${xAxis}deg) rotateX(${yAxis}deg)`;
402
+ });
403
+
404
+ // Language selector functionality
405
+ const languageBtns = document.querySelectorAll('.language-btn');
406
+ const welcomeMessages = document.querySelectorAll('.welcome-message');
407
+
408
+ languageBtns.forEach(btn => {
409
+ btn.addEventListener('click', () => {
410
+ // Remove active class from all buttons and messages
411
+ languageBtns.forEach(b => b.classList.remove('active'));
412
+ welcomeMessages.forEach(msg => msg.classList.remove('active'));
413
+
414
+ // Add active class to clicked button
415
+ btn.classList.add('active');
416
+
417
+ // Show corresponding message
418
+ const lang = btn.dataset.lang;
419
+ document.querySelector(`.welcome-message[data-lang="${lang}"]`).classList.add('active');
420
+
421
+ // Reset the auto-rotation timer
422
+ resetAutoRotation();
423
+ });
424
+ });
425
+
426
+ // Auto-rotation of languages every 5 seconds
427
+ let rotationInterval;
428
+ const languages = ['fr', 'es', 'en', 'eu'];
429
+ let currentIndex = 0;
430
+
431
+ function rotateLanguage() {
432
+ currentIndex = (currentIndex + 1) % languages.length;
433
+ const nextLang = languages[currentIndex];
434
+
435
+ // Remove active class from all buttons and messages
436
+ languageBtns.forEach(b => b.classList.remove('active'));
437
+ welcomeMessages.forEach(msg => msg.classList.remove('active'));
438
+
439
+ // Add active class to next language
440
+ document.querySelector(`.language-btn[data-lang="${nextLang}"]`).classList.add('active');
441
+ document.querySelector(`.welcome-message[data-lang="${nextLang}"]`).classList.add('active');
442
+ }
443
+
444
+ function resetAutoRotation() {
445
+ clearInterval(rotationInterval);
446
+ rotationInterval = setInterval(rotateLanguage, 5000);
447
+ }
448
+
449
+ // Start auto-rotation
450
+ resetAutoRotation();
451
+
452
+ // Pause auto-rotation when hovering over welcome text
453
+ welcomeText.addEventListener('mouseenter', () => {
454
+ clearInterval(rotationInterval);
455
+ });
456
+
457
+ welcomeText.addEventListener('mouseleave', resetAutoRotation);
458
+ });
459
+ </script>
460
+ </body>
461
+ </html>
music.html ADDED
@@ -0,0 +1,426 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <!-- Favicon -->
8
+ <link rel="icon" type="image/png" href="images/logo%2030-01-25.png">
9
+ <title>David KRK · Music - DJ Sets &amp; Productions</title>
10
+ <!-- Meta tags for SEO -->
11
+ <meta name="description" content="Écoutez les derniers sets et productions de David KRK. Techno, Trance et Tech Trance. Disponible sur Mixcloud et Soundcloud.">
12
+ <meta name="keywords" content="David KRK, DJ sets, techno music, trance, tech trance, mixcloud, soundcloud, electronic music">
13
+ <meta name="author" content="David KRK">
14
+ <!-- Open Graph / Social Media -->
15
+ <meta property="og:title" content="David KRK · Music - DJ Sets &amp; Productions">
16
+ <meta property="og:description" content="Écoutez les derniers sets et productions de David KRK. Techno, Trance et Tech Trance.">
17
+ <meta property="og:image" content="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
18
+ <meta property="og:url" content="https://davidkrk.com/music.html">
19
+ <!-- Twitter Card -->
20
+ <meta name="twitter:card" content="summary_large_image">
21
+ <meta name="twitter:title" content="David KRK · Music">
22
+ <meta name="twitter:description" content="DJ Sets &amp; Productions - Techno, Trance, Tech Trance">
23
+ <meta name="twitter:image" content="https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png">
24
+ <!-- Preload critical resources -->
25
+ <link rel="preconnect" href="https://fonts.googleapis.com">
26
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
27
+ <link rel="preload" href="https://fonts.googleapis.com/css2?family=Russo+One&display=swap" as="style">
28
+ <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" as="style">
29
+ <!-- Stylesheets -->
30
+ <link rel="preload" href="https://fonts.googleapis.com/css2?family=Russo+One&display=swap" as="style">
31
+ <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css" as="style">
32
+ <link rel="preload" href="dist/output.css" as="style">
33
+ <link href="https://fonts.googleapis.com/css2?family=Russo+One&display=swap" rel="stylesheet">
34
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
35
+ <link rel="stylesheet" href="dist/output.css">
36
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
37
+ <link rel="stylesheet" href="dist/output.css">
38
+
39
+ <!-- Schema.org markup for Google -->
40
+ <script type="application/ld+json">
41
+ {
42
+ "@context": "https://schema.org",
43
+ "@type": "MusicGroup",
44
+ "name": "David KRK",
45
+ "url": "https://davidkrk.com/music.html",
46
+ "image": "https://raw.githubusercontent.com/DavidKRK/DavidKRK.github.io/main/logo%2030-01-25.png",
47
+ "description": "DJ Techno et Producteur de musique électronique",
48
+ "genre": ["Techno", "Trance", "Tech Trance"],
49
+ "sameAs": [
50
+ "https://www.mixcloud.com/DavidKRK/",
51
+ "https://soundcloud.com/davidkrk/"
52
+ ]
53
+ }
54
+ </script>
55
+ <style>
56
+ :root {
57
+ --primary-color: #FF0000;
58
+ --secondary-color: #141414;
59
+ --accent-color-1: #FF69B4;
60
+ --accent-color-2: #FFC67D;
61
+ --text-color: #FFFFFF;
62
+ --mixcloud-color: #45a0e6;
63
+ --soundcloud-color: #ff8800;
64
+ --animation-duration: 1s;
65
+ --transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
66
+ }
67
+
68
+ body {
69
+ background: linear-gradient(135deg, var(--secondary-color), #000000);
70
+ color: var(--text-color);
71
+ font-family: 'Russo One', sans-serif;
72
+ min-height: 100vh;
73
+ display: flex;
74
+ flex-direction: column;
75
+ overflow-x: hidden;
76
+ }
77
+
78
+ .title-animation {
79
+ opacity: 0;
80
+ animation: fadeInDown var(--animation-duration) var(--transition-timing) forwards;
81
+ }
82
+
83
+ @keyframes fadeInDown {
84
+ from {
85
+ opacity: 0;
86
+ transform: translateY(-30px);
87
+ }
88
+ to {
89
+ opacity: 1;
90
+ transform: translateY(0);
91
+ }
92
+ }
93
+
94
+ .hover-underline-animation {
95
+ display: inline-block;
96
+ position: relative;
97
+ background: linear-gradient(to right, var(--accent-color-1), var(--accent-color-2));
98
+ background-clip: text;
99
+ -webkit-background-clip: text;
100
+ color: transparent;
101
+ animation: gradient 10s ease infinite;
102
+ transition: transform 0.3s var(--transition-timing);
103
+ }
104
+
105
+ .hover-underline-animation:after {
106
+ content: '';
107
+ position: absolute;
108
+ width: 100%;
109
+ height: 2px;
110
+ bottom: -2px;
111
+ left: 0;
112
+ background: linear-gradient(to right, var(--accent-color-1), var(--accent-color-2));
113
+ transform: scaleX(0);
114
+ transform-origin: right;
115
+ transition: transform 0.3s var(--transition-timing);
116
+ }
117
+
118
+ .hover-underline-animation:hover {
119
+ transform: translateY(-2px);
120
+ }
121
+
122
+ .hover-underline-animation:hover:after {
123
+ transform: scaleX(1);
124
+ transform-origin: left;
125
+ }
126
+
127
+ @keyframes gradient {
128
+ 0% { background-position: 0% 50%; }
129
+ 50% { background-position: 100% 50%; }
130
+ 100% { background-position: 0% 50%; }
131
+ }
132
+
133
+ .rotate {
134
+ animation: rotate 10s linear infinite;
135
+ filter: drop-shadow(0 0 10px rgba(255, 0, 0, 0.5));
136
+ }
137
+
138
+ @keyframes rotate {
139
+ from { transform: rotate(0deg); }
140
+ to { transform: rotate(360deg); }
141
+ }
142
+
143
+ .neon {
144
+ animation: neon 2s ease-in-out infinite;
145
+ text-shadow: 0 0 10px rgba(255, 255, 0, 0.5);
146
+ }
147
+
148
+ @keyframes neon {
149
+ 0%, 100% { color: #FFFF00; text-shadow: 0 0 10px rgba(255, 255, 0, 0.5); }
150
+ 50% { color: #00FFFF; text-shadow: 0 0 20px rgba(0, 255, 255, 0.7); }
151
+ }
152
+
153
+ nav {
154
+ display: flex;
155
+ flex-wrap: wrap;
156
+ justify-content: center;
157
+ gap: 2rem;
158
+ padding: 2rem;
159
+ margin-bottom: 2rem;
160
+ }
161
+
162
+ nav a {
163
+ position: relative;
164
+ transition: all 0.3s var(--transition-timing);
165
+ }
166
+
167
+ nav a:hover {
168
+ transform: translateY(-2px);
169
+ }
170
+
171
+ .fab {
172
+ font-size: 1.5rem;
173
+ margin-right: 0.5rem;
174
+ vertical-align: middle;
175
+ }
176
+
177
+ .fa-mixcloud {
178
+ color: var(--mixcloud-color);
179
+ filter: drop-shadow(0 0 5px rgba(69, 160, 230, 0.5));
180
+ }
181
+
182
+ .fa-soundcloud {
183
+ color: var(--soundcloud-color);
184
+ filter: drop-shadow(0 0 5px rgba(255, 136, 0, 0.5));
185
+ }
186
+
187
+ .player-container {
188
+ width: 100%;
189
+ max-width: 800px;
190
+ margin: 0 auto;
191
+ opacity: 0;
192
+ transform: translateY(20px);
193
+ animation: fadeInUp 1s var(--transition-timing) forwards;
194
+ animation-delay: 0.5s;
195
+ }
196
+
197
+ @keyframes fadeInUp {
198
+ from {
199
+ opacity: 0;
200
+ transform: translateY(20px);
201
+ }
202
+ to {
203
+ opacity: 1;
204
+ transform: translateY(0);
205
+ }
206
+ }
207
+
208
+ .fixed-footer {
209
+ position: fixed;
210
+ bottom: 0;
211
+ right: 0;
212
+ padding: 1rem;
213
+ background: rgba(0, 0, 0, 0.8);
214
+ backdrop-filter: blur(10px);
215
+ border-radius: 10px 0 0 0;
216
+ box-shadow: 0 -5px 15px rgba(0, 0, 0, 0.3);
217
+ z-index: 1000;
218
+ }
219
+
220
+ @media (max-width: 768px) {
221
+ nav {
222
+ flex-direction: column;
223
+ gap: 1rem;
224
+ }
225
+
226
+ .fab {
227
+ font-size: 1.2rem;
228
+ }
229
+
230
+ h1 {
231
+ font-size: 3rem !important;
232
+ }
233
+
234
+ h2 {
235
+ font-size: 2rem !important;
236
+ }
237
+
238
+ .fixed-footer {
239
+ padding: 0.5rem;
240
+ }
241
+
242
+ .fixed-footer img {
243
+ width: 3rem;
244
+ height: 3rem;
245
+ }
246
+ }
247
+
248
+ @media (max-width: 480px) {
249
+ nav a {
250
+ font-size: 1.2rem !important;
251
+ }
252
+
253
+ h1 {
254
+ font-size: 2rem !important;
255
+ }
256
+
257
+ h2 {
258
+ font-size: 1.5rem !important;
259
+ }
260
+ }
261
+
262
+ .load-player-btn {
263
+ width: 100%;
264
+ padding: 2rem;
265
+ margin: 1rem 0;
266
+ font-size: 1.2rem;
267
+ transition: all 0.3s ease;
268
+ border: 2px solid transparent;
269
+ }
270
+
271
+ .mixcloud-container .load-player-btn {
272
+ background: linear-gradient(135deg, #45a0e6, #3178b3);
273
+ border-color: #45a0e6;
274
+ }
275
+
276
+ .soundcloud-container .load-player-btn {
277
+ background: linear-gradient(135deg, #ff8800, #ff5500);
278
+ border-color: #ff8800;
279
+ }
280
+
281
+ .load-player-btn:hover {
282
+ transform: translateY(-2px);
283
+ box-shadow: 0 4px 12px rgba(0,0,0,0.2);
284
+ }
285
+ </style>
286
+ <script>
287
+ function showContent(lang) {
288
+ const contents = document.querySelectorAll('.lang-content');
289
+ contents.forEach(content => content.style.display = 'none');
290
+ document.getElementById(lang).style.display = 'block';
291
+ }
292
+ </script>
293
+ </head>
294
+ <body>
295
+ <div id="music" class="py-20">
296
+ <div class="container mx-auto px-6">
297
+ <h1 class="text-8xl font-bold text-center mb-4 title-animation">David KRK</h1>
298
+ <h2 class="text-6xl font-bold text-center mb-12 text-red-500 title-animation">Sets &amp; Productions</h2>
299
+ <nav class="text-center mb-12">
300
+ <a href="index.html" class="text-3xl hover-underline-animation flex items-center justify-center">
301
+ <i class="fas fa-arrow-left mr-2"></i> Back
302
+ </a>
303
+ <a href="https://www.mixcloud.com/DavidKRK/" target="_blank" rel="noopener noreferrer" class="hover:scale-110 transition-transform" aria-label="Mixcloud">
304
+ <i class="fab fa-mixcloud text-4xl"></i>
305
+ </a>
306
+ <a href="https://soundcloud.com/davidkrk/" target="_blank" rel="noopener noreferrer" class="hover:scale-110 transition-transform" aria-label="SoundCloud">
307
+ <i class="fab fa-soundcloud text-4xl"></i>
308
+ </a>
309
+ </nav>
310
+
311
+ <div class="mixcloud-container" data-url="https://www.mixcloud.com/widget/iframe/?hide_cover=1&amp;light=0&amp;mini=1&amp;hide_artwork=1&amp;autoplay=0&amp;hide_followers=1&amp;hide_followbutton=1&amp;feed=%2FDavidKRK%2Fplaylists%2Fdavid-krk-life-good-techno%2F">
312
+ <button type="button" class="load-player-btn bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" onclick="loadPlayer(this, 'mixcloud')">
313
+ <i class="fab fa-mixcloud mr-2"></i>Charger le lecteur Mixcloud
314
+ </button>
315
+ <button type="button" class="load-player-btn bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" onclick="loadPlayer(this, 'mixcloud')">
316
+ <i class="fab fa-mixcloud mr-2"></i>Charger le lecteur Mixcloud
317
+ </button>
318
+ <button type="button" class="load-player-btn bg-orange-600 hover:bg-orange-700 text-white font-bold py-2 px-4 rounded" onclick="loadPlayer(this, 'soundcloud')">
319
+ <i class="fab fa-soundcloud mr-2"></i>Charger le lecteur SoundCloud
320
+ </button>
321
+ </div>
322
+ </div>
323
+
324
+ <div class="text-center mb-12">
325
+ <p class="text-xl mb-4">Follow David KRK on social media for the latest updates:</p>
326
+ <div class="flex justify-center gap-6">
327
+ <a href="https://www.facebook.com/DavidKRKofficial" target="_blank" rel="noopener noreferrer" class="hover:scale-110 transition-transform" aria-label="Facebook">
328
+ <i class="fab fa-facebook text-4xl"></i>
329
+ </a>
330
+ <a href="https://www.instagram.com/davidkrk/" target="_blank" rel="noopener noreferrer" class="hover:scale-110 transition-transform" aria-label="Instagram">
331
+ <i class="fab fa-instagram text-4xl"></i>
332
+ </a>
333
+ <a href="https://www.youtube.com/user/DavidKRKofficial" target="_blank" rel="noopener noreferrer" class="hover:scale-110 transition-transform" aria-label="YouTube">
334
+ <i class="fab fa-youtube text-4xl"></i>
335
+ </a>
336
+ </div>
337
+ </div>
338
+ </div>
339
+
340
+ <div class="fixed-footer">
341
+ <footer class="flex items-center gap-4">
342
+ <div>
343
+ <p class="text-gray-400 mb-2">&copy; 2025 All rights reserved <span class="rotate inline-block">David KRK</span></p>
344
+ <p class="neon font-bold text-lg">&quot;May The Techno Be With You&quot;</p>
345
+ </div>
346
+ <img src="images/logo 30-01-25.png" alt="Logo David KRK" class="w-16 h-16 border-2 border-white rounded-full">
347
+ </footer>
348
+ </div>
349
+
350
+ <!-- SoundCloud Widget API -->
351
+ <script src="https://w.soundcloud.com/player/api.js"></script>
352
+ <script src="https://widget.mixcloud.com/media/js/widgetApi.js"></script>
353
+
354
+ <script>
355
+ // Fonction pour charger les scripts des widgets de manière asynchrone
356
+ function loadScript(src) {
357
+ return new Promise((resolve, reject) => {
358
+ if (document.querySelector(`script[src="${src}"]`)) {
359
+ resolve();
360
+ return;
361
+ }
362
+ const script = document.createElement('script');
363
+ script.src = src;
364
+ script.async = true;
365
+ script.onload = resolve;
366
+ script.onerror = reject;
367
+ document.body.appendChild(script);
368
+ });
369
+ }
370
+
371
+ // Fonction pour charger un lecteur
372
+ async function loadPlayer(button, type) {
373
+ const container = button.parentElement;
374
+ const url = container.dataset.url;
375
+
376
+ // Créer l'iframe
377
+ const iframe = document.createElement('iframe');
378
+ iframe.width = '100%';
379
+ iframe.height = type === 'mixcloud' ? '180' : '450';
380
+ iframe.frameBorder = '0';
381
+ iframe.allow = 'autoplay';
382
+ iframe.loading = 'lazy';
383
+ iframe.src = url;
384
+
385
+ // Remplacer le bouton par l'iframe
386
+ container.innerHTML = '';
387
+ container.appendChild(iframe);
388
+
389
+ try {
390
+ // Charger le script approprié
391
+ if (type === 'mixcloud') {
392
+ await loadScript('https://widget.mixcloud.com/media/js/widgetApi.js');
393
+ const widget = Mixcloud.PlayerWidget(iframe);
394
+ await widget.ready;
395
+ widget.events.play.on(() => console.log('Mixcloud playing'));
396
+ } else if (type === 'soundcloud') {
397
+ await loadScript('https://w.soundcloud.com/player/api.js');
398
+ const widget = SC.Widget(iframe);
399
+ widget.bind(SC.Widget.Events.READY, () => console.log('SoundCloud ready'));
400
+ }
401
+ } catch (error) {
402
+ console.log(`Error loading ${type} widget:`, error);
403
+ container.innerHTML = `<div class="text-red-500 p-4">Erreur de chargement du lecteur. Veuillez réessayer.</div>`;
404
+ }
405
+ }
406
+
407
+ // Animation des éléments au scroll
408
+ document.addEventListener('DOMContentLoaded', function() {
409
+ const observer = new IntersectionObserver((entries) => {
410
+ entries.forEach(entry => {
411
+ if (entry.isIntersecting) {
412
+ entry.target.style.opacity = '1';
413
+ entry.target.style.transform = 'translateY(0)';
414
+ }
415
+ });
416
+ }, {
417
+ threshold: 0.1
418
+ });
419
+
420
+ document.querySelectorAll('.player-container').forEach(container => {
421
+ observer.observe(container);
422
+ });
423
+ });
424
+ </script>
425
+ </body>
426
+ </html>
node ADDED
File without changes
optimize-images.js ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const sharp = require('sharp');
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+
5
+ const inputDir = 'images';
6
+ const outputDir = 'images/optimized';
7
+
8
+ // Créer le dossier de sortie s'il n'existe pas
9
+ if (!fs.existsSync(outputDir)) {
10
+ fs.mkdirSync(outputDir, { recursive: true });
11
+ }
12
+
13
+ // Fonction pour optimiser une image
14
+ async function optimizeImage(inputPath, outputPath) {
15
+ try {
16
+ await sharp(inputPath)
17
+ .resize(1920, 1080, {
18
+ fit: 'inside',
19
+ withoutEnlargement: true
20
+ })
21
+ .webp({ quality: 80 })
22
+ .toFile(outputPath);
23
+
24
+ console.log(`Optimized: ${inputPath} -> ${outputPath}`);
25
+ } catch (error) {
26
+ console.error(`Error optimizing ${inputPath}:`, error);
27
+ }
28
+ }
29
+
30
+ // Parcourir le dossier d'images
31
+ fs.readdir(inputDir, async (err, files) => {
32
+ if (err) {
33
+ console.error('Error reading directory:', err);
34
+ return;
35
+ }
36
+
37
+ for (const file of files) {
38
+ if (file.endsWith('.jpg') || file.endsWith('.jpeg') || file.endsWith('.png')) {
39
+ const inputPath = path.join(inputDir, file);
40
+ const outputPath = path.join(outputDir, path.basename(file, path.extname(file)) + '.webp');
41
+ await optimizeImage(inputPath, outputPath);
42
+ }
43
+ }
44
+ });
package.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "davidkrk-website",
3
+ "version": "1.0.0",
4
+ "description": "Website for David KRK - Techno DJ & Producer",
5
+ "main": "index.html",
6
+ "scripts": {
7
+ "build": "npm run optimize-images && tailwindcss -i ./src/input.css -o ./dist/output.css --minify",
8
+ "optimize-images": "node optimize-images.js",
9
+ "clean": "if exist rm -rf dist",
10
+ "prebuild": "npm run clean && npm run optimize-images && mkdir dist",
11
+ "postbuild": "xcopy /E /I /Y images dist\\images && copy *.html dist\\ && copy CNAME dist\\ && copy robots.txt dist\\ && copy sitemap.xml dist\\",
12
+ "start": "npm run build && npx serve dist",
13
+ "dev": "npm run build && npm run watch & npx serve dist",
14
+ "validate": "npm run validate:html && npm run validate:css",
15
+ "validate:html": "html-validate index.html bio.html music.html",
16
+ "validate:css": "stylelint \"**/*.css\""
17
+ },
18
+ "dependencies": {
19
+ "sharp": "^0.33.2"
20
+ },
21
+ "devDependencies": {
22
+ "tailwindcss": "^3.4.1",
23
+ "autoprefixer": "^10.4.17",
24
+ "postcss": "^8.4.35",
25
+ "cssnano": "^6.0.3",
26
+ "html-validate": "^8.18.0",
27
+ "stylelint": "^16.2.1",
28
+ "stylelint-config-standard": "^36.0.0",
29
+ "serve": "^14.2.1"
30
+ }
31
+ }
playwright-report/data/3d6a3d1a8bb6714f575631aa577f179974dc2f76.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Test info
2
+
3
+ - Name: hello world test
4
+ - Location: C:\Users\LENOVO\DavidKRK.github.io\tests\example.spec.ts:3:5
5
+
6
+ # Error details
7
+
8
+ ```
9
+ Error: page.goto: net::ERR_CONNECTION_REFUSED at http://localhost:3000/
10
+ Call log:
11
+ - navigating to "http://localhost:3000/", waiting until "load"
12
+
13
+ at C:\Users\LENOVO\DavidKRK.github.io\tests\example.spec.ts:4:16
14
+ ```
15
+
16
+ # Test source
17
+
18
+ ```ts
19
+ 1 | import { test, expect } from '@playwright/test';
20
+ 2 |
21
+ 3 | test('hello world test', async ({ page }) => {
22
+ > 4 | await page.goto('http://localhost:3000');
23
+ | ^ Error: page.goto: net::ERR_CONNECTION_REFUSED at http://localhost:3000/
24
+ 5 | const title = await page.title();
25
+ 6 | expect(title).toBe('Titre de votre application');
26
+ 7 | });
27
+ ```
playwright-report/data/ca4adf35189c26b25c9d073ecdd17f6ca35d558c.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Test info
2
+
3
+ - Name: vérifie le chargement de la page
4
+ - Location: C:\Users\LENOVO\DavidKRK.github.io\tests\hello-world.spec.ts:3:5
5
+
6
+ # Error details
7
+
8
+ ```
9
+ Error: page.goto: net::ERR_CONNECTION_REFUSED at http://localhost:3000/
10
+ Call log:
11
+ - navigating to "http://localhost:3000/", waiting until "load"
12
+
13
+ at C:\Users\LENOVO\DavidKRK.github.io\tests\hello-world.spec.ts:4:16
14
+ ```
15
+
16
+ # Test source
17
+
18
+ ```ts
19
+ 1 | import { test, expect } from '@playwright/test';
20
+ 2 |
21
+ 3 | test('vérifie le chargement de la page', async ({ page }) => {
22
+ > 4 | await page.goto('http://localhost:3000');
23
+ | ^ Error: page.goto: net::ERR_CONNECTION_REFUSED at http://localhost:3000/
24
+ 5 | const title = await page.title();
25
+ 6 | expect(title).toBe('Titre de votre application');
26
+ 7 | });
27
+ ```
playwright-report/index.html ADDED
The diff for this file is too large to render. See raw diff
 
playwright-report/report.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const fs = require('fs');
2
+
3
+ // Lire le fichier JSON
4
+ const filePath = 'c:\\Users\\LENOVO\\DavidKRK.github.io\\playwright-report\\report.json';
5
+ let jsonData = [
6
+ {"id": 1, "name": "Alice"},
7
+ {"id": 2, "name": "Bob"},
8
+ {"id": 1, "name": "Alice"}
9
+ ];
10
+
11
+ // Vérifier si le contenu est un tableau
12
+ if (Array.isArray(jsonData)) {
13
+ // Supprimer les doublons
14
+ const uniqueData = Array.from(new Set(jsonData.map(JSON.stringify))).map(JSON.parse);
15
+
16
+ // Écrire le contenu nettoyé dans le fichier
17
+ fs.writeFileSync(filePath, JSON.stringify(uniqueData, null, 2), 'utf8');
18
+ console.log('Les doublons dans le fichier JSON ont été nettoyés.');
19
+ } else {
20
+ console.error('Le contenu du fichier JSON n\'est pas un tableau.');
21
+ }
playwright.config.ts ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // playwright.config.ts
2
+ import { defineConfig } from '@playwright/test';
3
+
4
+ export default defineConfig({
5
+ webServer: {
6
+ command: 'npm run start', // Commande pour démarrer le serveur
7
+ port: 3000, // Port sur lequel le serveur écoute
8
+ timeout: 120 * 1000, // Timeout pour le démarrage
9
+ reuseExistingServer: !process.env.CI, // Réutiliser le serveur si déjà démarré
10
+ },
11
+ });
robots.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ User-agent: *
2
+ Allow: /
3
+
4
+ Sitemap: https://davidkrk.github.io/sitemap.xml
sitemap.xml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://davidkrk.github.io/</loc>
5
+ <lastmod>2024-04-03</lastmod>
6
+ <changefreq>weekly</changefreq>
7
+ <priority>1.0</priority>
8
+ </url>
9
+ <url>
10
+ <loc>https://davidkrk.github.io/bio.html</loc>
11
+ <lastmod>2024-04-03</lastmod>
12
+ <changefreq>monthly</changefreq>
13
+ <priority>0.8</priority>
14
+ </url>
15
+ <url>
16
+ <loc>https://davidkrk.github.io/music.html</loc>
17
+ <lastmod>2024-04-03</lastmod>
18
+ <changefreq>weekly</changefreq>
19
+ <priority>0.9</priority>
20
+ </url>
21
+ </urlset>
src/input.css ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ body {
7
+ @apply bg-gradient-to-br from-secondary to-black font-russo text-text min-h-screen pb-36 overflow-x-hidden;
8
+ }
9
+ }
10
+
11
+ @layer components {
12
+ .main-logo {
13
+ max-width: 200px;
14
+ display: block;
15
+ margin: 2rem auto 1rem auto;
16
+ }
17
+ .main-content-area {
18
+ @apply flex-grow opacity-0 animate-fade-in;
19
+ }
20
+
21
+ .hover-underline-animation {
22
+ @apply bg-gradient-to-r from-pink-500 via-yellow-300 to-green-400 bg-clip-text text-transparent bg-[length:200%_auto] relative pb-1;
23
+
24
+ animation: gradient 10s ease infinite;
25
+ }
26
+
27
+ .hover-underline-animation::after {
28
+ @apply content-[''] absolute w-full h-0.5 bottom-0 left-0 bg-gradient-to-r from-pink-500 to-yellow-300 scale-x-0 origin-right transition-transform duration-300;
29
+ }
30
+
31
+ .hover-underline-animation:hover::after {
32
+ @apply scale-x-100 origin-left;
33
+ }
34
+
35
+ .title-animation {
36
+ @apply animate-fade-in-down opacity-0;
37
+ }
38
+
39
+ .lang-content {
40
+ @apply hidden opacity-0 translate-y-5 transition-all duration-500 ease-in-out absolute w-full invisible z-10;
41
+ }
42
+
43
+ .lang-content.active {
44
+ @apply block opacity-100 translate-y-0 relative visible z-20;
45
+ }
46
+
47
+ .content-container {
48
+ @apply relative min-h-[500px] overflow-hidden;
49
+ }
50
+
51
+ .content-wrapper {
52
+ @apply transition-transform duration-500 ease-in-out;
53
+ }
54
+
55
+ .content-wrapper h3 {
56
+ @apply opacity-0 -translate-y-5 animate-fade-in-down;
57
+ }
58
+
59
+ .mb-4 p {
60
+ @apply opacity-0 translate-y-5 transition-all duration-500 ease-in-out;
61
+ }
62
+
63
+ .mb-4 p.fade-in {
64
+ @apply opacity-100 translate-y-0;
65
+ }
66
+
67
+ .language-nav {
68
+ @apply relative z-30 flex flex-wrap justify-center gap-4 mb-8;
69
+ }
70
+
71
+ .language-nav button {
72
+ @apply bg-transparent border-none px-4 py-2 cursor-pointer transition-all duration-300 relative text-text text-xl;
73
+ }
74
+
75
+ .language-nav button:hover {
76
+ @apply -translate-y-0.5 text-primary;
77
+ }
78
+
79
+ .language-nav button.active {
80
+ @apply font-bold;
81
+ }
82
+
83
+ .language-nav button.active::after {
84
+ @apply content-[''] absolute -bottom-0.5 left-0 w-full h-0.5 bg-gradient-to-r from-pink-500 to-yellow-300 scale-x-100 transition-transform duration-300;
85
+ }
86
+
87
+ .site-footer-original {
88
+ @apply fixed bottom-4 right-4 flex items-center z-50 bg-secondary/80 p-2 rounded-lg;
89
+ }
90
+ }
91
+
92
+ @keyframes gradient {
93
+ 0% { background-position: 0% 50%; }
94
+ 50% { background-position: 100% 50%; }
95
+ 100% { background-position: 0% 50%; }
96
+ }
97
+
98
+ @keyframes neon {
99
+ 0%, 100% { color: #FF0; }
100
+ 50% { color: #0FF; }
101
+ }
102
+
103
+ @keyframes rotate {
104
+ from { transform: rotate(0deg); }
105
+ to { transform: rotate(360deg); }
106
+ }
107
+
108
+ @media (width <= 768px) {
109
+ body {
110
+ @apply pb-24;
111
+ }
112
+
113
+ .language-nav {
114
+ @apply gap-2;
115
+ }
116
+
117
+ .language-nav button {
118
+ @apply px-3 py-1 text-base;
119
+ }
120
+
121
+ h1 {
122
+ @apply text-5xl !important;
123
+ }
124
+
125
+ .hover-underline-animation {
126
+ @apply text-base;
127
+ }
128
+ }
129
+
130
+ @media (width <= 480px) {
131
+ .language-nav {
132
+ @apply flex-col items-center gap-1;
133
+ }
134
+
135
+ h1 {
136
+ @apply text-4xl !important;
137
+ }
138
+
139
+ .language-nav button {
140
+ @apply w-full text-center;
141
+ }
142
+
143
+ .hover-underline-animation {
144
+ @apply text-sm;
145
+ }
146
+ }