Compare commits
5 Commits
feature/ma
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bb00c7623 | ||
|
|
94074d6d77 | ||
|
|
a700fe4325 | ||
|
|
1409e44d4b | ||
|
|
01ceb46835 |
53
index.html
@@ -6,7 +6,58 @@
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link href="/src/assets/css/main.css" rel="stylesheet">
|
||||
<title>Vite App</title>
|
||||
|
||||
<title>Vélo Park — AlexisNP</title>
|
||||
<meta property="og:title" content="Vélo Park — AlexisNP" />
|
||||
|
||||
<meta name="description" content="Cartes des emplacements de parcs à vélos de l'agglomération rennaise." />
|
||||
<meta property="og:description" content="Cartes des emplacements de parcs à vélos de l'agglomération rennaise." />
|
||||
<meta name="twitter:description" content="Cartes des emplacements de parcs à vélos de l'agglomération rennaise." />
|
||||
|
||||
<meta property="author" content="Alexis Pelé" />
|
||||
<meta property="og:author" content="Alexis Pelé" />
|
||||
<meta property="og:author:username" content="AlexisNP" />
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/favicon/light/apple-icon-57x57.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/favicon/light/apple-icon-60x60.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/favicon/light/apple-icon-72x72.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/favicon/light/apple-icon-76x76.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/favicon/light/apple-icon-114x114.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/favicon/light/apple-icon-120x120.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/favicon/light/apple-icon-144x144.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/favicon/light/apple-icon-152x152.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/light/apple-icon-180x180.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/favicon/light/android-icon-192x192.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon/light/favicon-32x32.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/favicon/light/favicon-96x96.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/light/favicon-16x16.png" media="(prefers-color-scheme: light)">
|
||||
<link rel="manifest" href="/favicon/light/manifest.json" media="(prefers-color-scheme: light)">
|
||||
<meta name="msapplication-TileImage" content="/favicon/light/ms-icon-144x144.png" media="(prefers-color-scheme: light)">
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/favicon/dark/apple-icon-57x57.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/favicon/dark/apple-icon-60x60.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/favicon/dark/apple-icon-72x72.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/favicon/dark/apple-icon-76x76.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/favicon/dark/apple-icon-114x114.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/favicon/dark/apple-icon-120x120.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/favicon/dark/apple-icon-144x144.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/favicon/dark/apple-icon-152x152.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/dark/apple-icon-180x180.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/favicon/dark/android-icon-192x192.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon/dark/favicon-32x32.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/favicon/dark/favicon-96x96.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/dark/favicon-16x16.png" media="(prefers-color-scheme: dark)">
|
||||
<link rel="manifest" href="/favicon/dark/manifest.json" media="(prefers-color-scheme: dark)">
|
||||
<meta name="msapplication-TileImage" content="/favicon/dark/ms-icon-144x144.png" media="(prefers-color-scheme: dark)">
|
||||
|
||||
<meta name="msapplication-TileColor" content="#06df72">
|
||||
<meta name="theme-color" content="#06df72">
|
||||
<meta name="color-scheme" content="light" />
|
||||
|
||||
<meta property="og:site_name" content="bikes.alexcreates.fr" />
|
||||
<meta name="twitter:domain" content="bikes.alexcreates.fr" />
|
||||
|
||||
<meta property="og:type" content="website" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
48
package.json
@@ -16,40 +16,40 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@phosphor-icons/vue": "^2.2.1",
|
||||
"@pinia/colada": "^1.0.0",
|
||||
"@tailwindcss/vite": "^4.2.2",
|
||||
"@pinia/colada": "^1.3.1",
|
||||
"@tailwindcss/vite": "^4.3.0",
|
||||
"@vue-leaflet/vue-leaflet": "^0.10.1",
|
||||
"@vueuse/core": "^14.2.1",
|
||||
"@vueuse/core": "^14.3.0",
|
||||
"leaflet": "^1.9.4",
|
||||
"pinia": "^3.0.4",
|
||||
"reka-ui": "^2.9.2",
|
||||
"tailwindcss": "^4.2.2",
|
||||
"vue": "^3.5.30",
|
||||
"reka-ui": "^2.9.9",
|
||||
"tailwindcss": "^4.3.0",
|
||||
"vue": "^3.5.35",
|
||||
"vue-leaflet-markercluster": "^0.6.1",
|
||||
"vue-router": "^5.0.3"
|
||||
"vue-router": "^5.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tsconfig/node24": "^24.0.4",
|
||||
"@types/leaflet": "^1.9.21",
|
||||
"@types/node": "^24.12.0",
|
||||
"@vitejs/plugin-vue": "^6.0.4",
|
||||
"@vue/eslint-config-typescript": "^14.7.0",
|
||||
"@vue/tsconfig": "^0.9.0",
|
||||
"@types/node": "^25.9.1",
|
||||
"@vitejs/plugin-vue": "^6.0.7",
|
||||
"@vue/eslint-config-typescript": "^14.8.0",
|
||||
"@vue/tsconfig": "^0.9.1",
|
||||
"clsx": "^2.1.1",
|
||||
"eslint": "^10.0.3",
|
||||
"eslint": "^10.4.1",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-oxlint": "~1.51.0",
|
||||
"eslint-plugin-vue": "~10.8.0",
|
||||
"jiti": "^2.6.1",
|
||||
"npm-run-all2": "^8.0.4",
|
||||
"oxfmt": "^0.37.0",
|
||||
"oxlint": "~1.51.0",
|
||||
"sass-embedded": "^1.98.0",
|
||||
"tailwind-merge": "^3.5.0",
|
||||
"typescript": "~5.9.3",
|
||||
"vite": "^7.3.1",
|
||||
"vite-plugin-vue-devtools": "^8.0.7",
|
||||
"vue-tsc": "^3.2.5"
|
||||
"eslint-plugin-oxlint": "~1.68.0",
|
||||
"eslint-plugin-vue": "~10.9.2",
|
||||
"jiti": "^2.7.0",
|
||||
"npm-run-all2": "^9.0.1",
|
||||
"oxfmt": "^0.53.0",
|
||||
"oxlint": "~1.68.0",
|
||||
"sass-embedded": "^1.100.0",
|
||||
"tailwind-merge": "^3.6.0",
|
||||
"typescript": "~6.0.3",
|
||||
"vite": "^8.0.16",
|
||||
"vite-plugin-vue-devtools": "^8.1.2",
|
||||
"vue-tsc": "^3.3.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
|
||||
2622
pnpm-lock.yaml
generated
@@ -1,3 +1,4 @@
|
||||
onlyBuiltDependencies:
|
||||
- '@parcel/watcher'
|
||||
- esbuild
|
||||
- vue-demi
|
||||
|
||||
|
Before Width: | Height: | Size: 4.2 KiB |
BIN
public/favicon/dark/android-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
public/favicon/dark/android-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
public/favicon/dark/android-icon-36x36.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/favicon/dark/android-icon-48x48.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/favicon/dark/android-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/favicon/dark/android-icon-96x96.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/favicon/dark/apple-icon-114x114.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
public/favicon/dark/apple-icon-120x120.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
public/favicon/dark/apple-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
public/favicon/dark/apple-icon-152x152.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
public/favicon/dark/apple-icon-180x180.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
public/favicon/dark/apple-icon-57x57.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/favicon/dark/apple-icon-60x60.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/favicon/dark/apple-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/favicon/dark/apple-icon-76x76.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/favicon/dark/apple-icon-precomposed.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
public/favicon/dark/apple-icon.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
2
public/favicon/dark/browserconfig.xml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#065f46</TileColor></tile></msapplication></browserconfig>
|
||||
BIN
public/favicon/dark/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 833 B |
BIN
public/favicon/dark/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/favicon/dark/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/favicon/dark/favicon.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
46
public/favicon/dark/manifest.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"name": "alexcreates.fr",
|
||||
"theme_color": "#065f46",
|
||||
"background_color": "#065f46",
|
||||
"display": "browser",
|
||||
"scope": "/",
|
||||
"start_url": "https://alexcreates.fr",
|
||||
"icons": [
|
||||
{
|
||||
"src": "\/android-icon-36x36.png",
|
||||
"sizes": "36x36",
|
||||
"type": "image\/png",
|
||||
"density": "0.75"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-48x48.png",
|
||||
"sizes": "48x48",
|
||||
"type": "image\/png",
|
||||
"density": "1.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-72x72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image\/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-96x96.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image\/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-144x144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image\/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image\/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
public/favicon/dark/ms-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
public/favicon/dark/ms-icon-150x150.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
public/favicon/dark/ms-icon-310x310.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
BIN
public/favicon/dark/ms-icon-70x70.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
public/favicon/light/android-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
public/favicon/light/android-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
public/favicon/light/android-icon-36x36.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/favicon/light/android-icon-48x48.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/favicon/light/android-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
public/favicon/light/android-icon-96x96.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/favicon/light/apple-icon-114x114.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/favicon/light/apple-icon-120x120.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/favicon/light/apple-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
public/favicon/light/apple-icon-152x152.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
public/favicon/light/apple-icon-180x180.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
public/favicon/light/apple-icon-57x57.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/favicon/light/apple-icon-60x60.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/favicon/light/apple-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
public/favicon/light/apple-icon-76x76.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/favicon/light/apple-icon-precomposed.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
public/favicon/light/apple-icon.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
2
public/favicon/light/browserconfig.xml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#065f46</TileColor></tile></msapplication></browserconfig>
|
||||
BIN
public/favicon/light/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 822 B |
BIN
public/favicon/light/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/favicon/light/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/favicon/light/favicon.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
46
public/favicon/light/manifest.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"name": "alexcreates.fr",
|
||||
"theme_color": "#065f46",
|
||||
"background_color": "#065f46",
|
||||
"display": "browser",
|
||||
"scope": "/",
|
||||
"start_url": "https://alexcreates.fr",
|
||||
"icons": [
|
||||
{
|
||||
"src": "\/android-icon-36x36.png",
|
||||
"sizes": "36x36",
|
||||
"type": "image\/png",
|
||||
"density": "0.75"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-48x48.png",
|
||||
"sizes": "48x48",
|
||||
"type": "image\/png",
|
||||
"density": "1.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-72x72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image\/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-96x96.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image\/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-144x144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image\/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image\/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
public/favicon/light/ms-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
public/favicon/light/ms-icon-150x150.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
public/favicon/light/ms-icon-310x310.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
public/favicon/light/ms-icon-70x70.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
49
public/robots.txt
Normal file
@@ -0,0 +1,49 @@
|
||||
User-agent: GPTBot
|
||||
Disallow: /
|
||||
User-agent: ChatGPT-User
|
||||
Disallow: /
|
||||
User-agent: Google-Extended
|
||||
Disallow: /
|
||||
User-agent: PerplexityBot
|
||||
Disallow: /
|
||||
User-agent: Amazonbot
|
||||
Disallow: /
|
||||
User-agent: ClaudeBot
|
||||
Disallow: /
|
||||
User-agent: Omgilibot
|
||||
Disallow: /
|
||||
User-Agent: FacebookBot
|
||||
Disallow: /
|
||||
User-Agent: Applebot
|
||||
Disallow: /
|
||||
User-agent: anthropic-ai
|
||||
Disallow: /
|
||||
User-agent: Bytespider
|
||||
Disallow: /
|
||||
User-agent: Claude-Web
|
||||
Disallow: /
|
||||
User-agent: Diffbot
|
||||
Disallow: /
|
||||
User-agent: ImagesiftBot
|
||||
Disallow: /
|
||||
User-agent: Omgilibot
|
||||
Disallow: /
|
||||
User-agent: Omgili
|
||||
Disallow: /
|
||||
User-agent: YouBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: AhrefsBot
|
||||
Disallow: /
|
||||
User-agent: AhrefsSiteAudit
|
||||
Disallow: /
|
||||
User-agent: SemrushBot
|
||||
Disallow: /
|
||||
User-agent: YandexMarket
|
||||
Disallow: /
|
||||
User-agent: YandexBot
|
||||
Disallow: /
|
||||
User-agent: DataForSeoBot
|
||||
Disallow: /
|
||||
|
||||
Sitemap: https://alexcreates.fr/sitemap-index.xml
|
||||
@@ -21,19 +21,19 @@ defineProps<{
|
||||
<style lang="scss">
|
||||
.marker-cluster div {
|
||||
font-family: var(--default-font-family);
|
||||
font-size: .9em;
|
||||
font-size: .95em;
|
||||
}
|
||||
|
||||
.marker-cluster span {
|
||||
font-weight: var(--font-weight-bold);
|
||||
opacity: .85;
|
||||
opacity: .5;
|
||||
}
|
||||
|
||||
.marker-cluster-small {
|
||||
background-color: color-mix(in srgb, var(--color-green-400) 10%, transparent);
|
||||
background-color: color-mix(in srgb, var(--color-green-400) 7.5%, transparent);
|
||||
|
||||
div {
|
||||
background-color: color-mix(in srgb, var(--color-green-400) 15%, transparent);
|
||||
background-color: color-mix(in srgb, var(--color-green-400) 10%, transparent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ defineProps<{
|
||||
background-color: color-mix(in srgb, var(--color-amber-500) 12.5%, transparent);
|
||||
|
||||
div {
|
||||
background-color: color-mix(in srgb, var(--color-amber-500) 20%, transparent);
|
||||
background-color: color-mix(in srgb, var(--color-amber-500) 15%, transparent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ defineProps<{
|
||||
background-color: color-mix(in srgb, var(--color-rose-500) 15%, transparent);
|
||||
|
||||
div {
|
||||
background-color: color-mix(in srgb, var(--color-rose-500) 25%, transparent);
|
||||
background-color: color-mix(in srgb, var(--color-rose-500) 20%, transparent);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -8,17 +8,24 @@ globalThis.L = L
|
||||
import { useMap } from '@/stores/map'
|
||||
import type { ApiResponse } from '@/types/Api'
|
||||
import type { BikeParking } from '@/types/Bikes'
|
||||
import { API_BASE_URL, API_LIMIT, MAP_TILELAYER_URL, SpotAccess, SpotType } from '@/utils/const'
|
||||
import { API_BASE_URL, API_LIMIT, MAP_TILELAYER_URL_DARK, MAP_TILELAYER_URL_LIGHT, SpotAccess, SpotType } from '@/utils/const'
|
||||
import { useQuery } from '@pinia/colada'
|
||||
import { LControlZoom, LIcon, LMap, LMarker, LTileLayer } from '@vue-leaflet/vue-leaflet'
|
||||
import { LControlZoom, LMap, LTileLayer } from '@vue-leaflet/vue-leaflet'
|
||||
import BikeFilters from './BikeFilters.vue'
|
||||
import { computed, ref, useTemplateRef } from 'vue'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import BikeClusterLayer from './BikeClusterLayer.vue'
|
||||
import { PhCircleNotch, PhMapPin } from '@phosphor-icons/vue'
|
||||
import { PhCircleNotch } from '@phosphor-icons/vue'
|
||||
import { useDark } from '@vueuse/core'
|
||||
import BikeUserMarker from './BikeUserMarker.vue'
|
||||
|
||||
// Map setup
|
||||
const mapRef = useTemplateRef<{ leafletObject: Map }>('map')
|
||||
const isDark = useDark({ storageKey: "theme" })
|
||||
|
||||
const mapTilelayer = computed(() => {
|
||||
return isDark.value ? MAP_TILELAYER_URL_DARK : MAP_TILELAYER_URL_LIGHT
|
||||
})
|
||||
|
||||
// Data fetching
|
||||
const fetchedPages = ref(0)
|
||||
@@ -114,13 +121,9 @@ function handleClickGeoloc() {
|
||||
<LMap ref="map" :min-zoom v-model:zoom="zoom" :center="center" :max-bounds :max-bounds-viscosity
|
||||
:options="extraOptions" :useGlobalLeaflet="true">
|
||||
<LControlZoom position="bottomright" />
|
||||
<LTileLayer v-once :url="MAP_TILELAYER_URL" layer-type="base" />
|
||||
<LTileLayer v-once :url="mapTilelayer" layer-type="base" />
|
||||
|
||||
<LMarker v-if="userCoords" :lat-lng="[userCoords.latitude, userCoords.longitude]">
|
||||
<LIcon>
|
||||
<PhMapPin size="24" weight="fill" class="text-amber-400" />
|
||||
</LIcon>
|
||||
</LMarker>
|
||||
<BikeUserMarker v-if="userCoords" />
|
||||
|
||||
<BikeClusterLayer :parkings="coveredParkings" group="covered" :visible="filterCovered" :max-cluster-radius
|
||||
:disable-clustering-at-zoom />
|
||||
|
||||
@@ -84,7 +84,7 @@ const isMarkerVisible = computed(() => isMarkerVisibleLayers.value && isMarkerVi
|
||||
{ 'korrigo': park.condition_acces === KORRIGO_KEY },
|
||||
{ 'highlight': park.type === BOXED_KEY || park.type === COVERED_KEY },
|
||||
)">
|
||||
<PhBicycle v-if="park.type === UNCOVERED_KEY" size="18" />
|
||||
<PhBicycle v-if="park.type === UNCOVERED_KEY" size="18" weight="fill" />
|
||||
<PhWarehouse v-else-if="park.type === COVERED_KEY" size="18" weight="light" />
|
||||
<PhSquareHalf v-else-if="park.type === BOXED_KEY" size="18" weight="light" />
|
||||
<PhLockKey v-else-if="park.condition_acces === KORRIGO_KEY" size="18" weight="fill" />
|
||||
@@ -95,8 +95,10 @@ const isMarkerVisible = computed(() => isMarkerVisibleLayers.value && isMarkerVi
|
||||
<style lang="scss">
|
||||
.leaflet-marker-icon:not(.marker-cluster) {
|
||||
border-radius: 50%;
|
||||
color: var(--color-muted-foreground);
|
||||
background-color: var(--color-background);
|
||||
color: color-mix(in srgb, var(--color-foreground) 80%, var(--color-background));
|
||||
background-color: color-mix(in srgb, var(--color-background) 85%, var(--color-foreground));
|
||||
border: 1px solid color-mix(in srgb, var(--color-muted-foreground) 50%, var(--color-background));
|
||||
box-shadow: var(--shadow);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
|
||||
|
||||
24
src/components/BikeUserMarker.vue
Normal file
@@ -0,0 +1,24 @@
|
||||
<script setup lang="ts">
|
||||
import { useMap } from '@/stores/map';
|
||||
import { PhMapPin } from '@phosphor-icons/vue';
|
||||
import { LIcon, LMarker } from '@vue-leaflet/vue-leaflet';
|
||||
import type { PointTuple } from 'leaflet';
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { computed, ref } from 'vue';
|
||||
|
||||
const normalIconSize: PointTuple = [30, 30]
|
||||
|
||||
const iconSize = ref<PointTuple>(normalIconSize)
|
||||
const iconAnchor = computed<PointTuple>(() => [iconSize.value[0] / 2, iconSize.value[1]])
|
||||
|
||||
// Geolocation
|
||||
const { userCoords } = storeToRefs(useMap())
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<LMarker v-if="userCoords" :lat-lng="[userCoords.latitude, userCoords.longitude]" :icon-size :icon-anchor>
|
||||
<LIcon>
|
||||
<PhMapPin size="20" weight="fill" class="text-amber-400" />
|
||||
</LIcon>
|
||||
</LMarker>
|
||||
</template>
|
||||
@@ -20,7 +20,7 @@ export const useMap = defineStore('map', () => {
|
||||
}
|
||||
|
||||
// Cluster layers options
|
||||
const maxClusterRadius = 40
|
||||
const maxClusterRadius = 60
|
||||
const disableClusteringAtZoom = 17
|
||||
|
||||
// Geolocation
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export const MAP_TILELAYER_URL =
|
||||
'https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png'
|
||||
export const MAP_TILELAYER_URL_LIGHT = 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png'
|
||||
export const MAP_TILELAYER_URL_DARK = 'http://{s}.tile.osm.org/{z}/{x}/{y}.png'
|
||||
|
||||
export const API_BASE_URL =
|
||||
'https://data.rennesmetropole.fr/api/explore/v2.1/catalog/datasets/parkings_velos_sur_rennes_metropole/records'
|
||||
|
||||