4 Commits

Author SHA1 Message Date
e9ce2d1f9f feat/final commit
All checks were successful
Build Docker Image Front / run (push) Successful in 1m56s
Build Docker Image Back / run (push) Successful in 25s
2024-06-09 20:05:28 +02:00
3cb5a30270 feat: use drink api in front and more (#16)
All checks were successful
Build Docker Image Front / run (push) Successful in 28s
Build Docker Image Back / run (push) Successful in 27s
Reviewed-on: #16
Co-authored-by: Clement <c.boesmier@aptatio.com>
Co-committed-by: Clement <c.boesmier@aptatio.com>
2024-06-07 19:09:57 +02:00
2cb2166093 fix: correction prod docker (#15)
All checks were successful
Build Docker Image Front / run (push) Successful in 26s
Build Docker Image Back / run (push) Successful in 24s
Reviewed-on: #15
Co-authored-by: Clement <c.boesmier@aptatio.com>
Co-committed-by: Clement <c.boesmier@aptatio.com>
2024-05-21 10:40:13 +02:00
1593fa3493 feat: astro template for front and fix login(#13)
All checks were successful
Build Docker Image Front / run (push) Successful in 25s
Build Docker Image Back / run (push) Successful in 25s
Reviewed-on: #13
Co-authored-by: Clement <c.boesmier@aptatio.com>
Co-committed-by: Clement <c.boesmier@aptatio.com>
2024-05-21 10:07:56 +02:00
112 changed files with 2187 additions and 1427 deletions

View File

@ -47,7 +47,8 @@ WORKDIR /home/node
EXPOSE 3000
# Add Healthcheck
HEALTHCHECK --interval=10s --timeout=10s --start-period=5s --retries=3 CMD wget --no-verbose --tries=1 --spider http://localhost:3000 || exit 1
# FIXME: faire en sorte que le healthcheck fonctionne
# HEALTHCHECK --interval=10s --timeout=10s --start-period=5s --retries=3 CMD wget --no-verbose --tries=1 --spider http://localhost:3000 || exit 1
# copy from build image
COPY --chown=node:node --from=BUILD_IMAGE /home/node/node_modules ./node_modules

View File

@ -1,5 +1,8 @@
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
testPathIgnorePatterns: [
"<rootDir>/dist/"
],
testTimeout: 10000,
preset: 'ts-jest',
testEnvironment: 'node',

View File

@ -8,6 +8,7 @@
"@types/express": "^4.17.21",
"@types/node": "^20.12.7",
"axios": "^1.6.8",
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"rimraf": "^5.0.5",
@ -15,6 +16,7 @@
"swagger-ui-express": "^5.0.0"
},
"devDependencies": {
"@types/cors": "^2.8.17",
"@types/jest": "^29.5.12",
"@types/rewire": "^2.5.30",
"@types/supertest": "^6.0.2",
@ -1968,6 +1970,15 @@
"integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==",
"dev": true
},
"node_modules/@types/cors": {
"version": "2.8.17",
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
"integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/express": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
@ -4745,6 +4756,18 @@
"dev": true,
"optional": true
},
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/create-jest": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
@ -9248,7 +9271,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}

View File

@ -14,6 +14,7 @@
"@types/express": "^4.17.21",
"@types/node": "^20.12.7",
"axios": "^1.6.8",
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"rimraf": "^5.0.5",
@ -21,6 +22,7 @@
"swagger-ui-express": "^5.0.0"
},
"devDependencies": {
"@types/cors": "^2.8.17",
"@types/jest": "^29.5.12",
"@types/rewire": "^2.5.30",
"@types/supertest": "^6.0.2",

View File

@ -1,11 +1,13 @@
import { getCity, getRadius, getPoiId, getBox } from "./openTripMaps"
import express from "express"
import cors from "cors"
/**
* Initialize Express application instance.
* @returns An initialized Express application object.
*/
const app = express()
app.use(cors())
/**

View File

@ -13,7 +13,7 @@ const key = process.env.OPEN_TRIP_MAPS_KEY
* @param {string} lat2 Latitude of the 2nd point of the box
* @returns {FeatureCollection} a list of POIs with their type, id, etc. (cf: [opentripmap](https://dev.opentripmap.org/docs#))
*/
async function callBox(lon1:string, lat1:string, lon2: string, lat2: string) {
async function callBox(lon1:string, lat1:string, lon2: string, lat2: string, rate: string) {
const lonMin = Math.min(parseFloat(lon1), parseFloat(lon2))
const lonMax = Math.max(parseFloat(lon1), parseFloat(lon2))
const latMin = Math.min(parseFloat(lat1), parseFloat(lat2))
@ -27,6 +27,7 @@ async function callBox(lon1:string, lat1:string, lon2: string, lat2: string) {
lon_max: lonMax,
lat_min: latMin,
lat_max: latMax,
rate: rate,
apikey: key,
kinds: 'bars,cafes,pubs,biergartens'
},
@ -182,12 +183,16 @@ export async function getBox(req:express.Request, res: express.Response) {
const lat1 = req.query["lat1"] as string
const lon2 = req.query["lon2"] as string
const lat2 = req.query["lat2"] as string
let rate = req.query["rate"] as string
if(!lon1 || !lat1 || !lon2 || !lat2){
res.status(400).send("Missing Argument")
return
}
res.send( await callBox(lon1, lat1, lon2, lat2))
if(!rate){
rate = "1";
}
res.send( await callBox(lon1, lat1, lon2, lat2, rate))
}
//TODO: fair une route ou l'on donne 2 coordonée

View File

@ -21,7 +21,7 @@ const options = {
}
],
},
apis: ['./src/*.ts'],
apis: ['./src/*.ts','./dist/src/*.js'],
explorer: true
}

View File

@ -219,6 +219,14 @@ describe("Test the otm city path", () => {
}
]
}
function sleep(milliseconds: number) {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
sleep(2000);
request(app)
.get("/otm/box")
.query({'lon1':'-1.435199','lon2':'-1.43519', 'lat1':'46.668460', 'lat2':'46.668461'})

View File

@ -0,0 +1,18 @@
{
"folders": [
{
"name": "Ratrapage_WEB",
"path": "."
},
{
"name": "barAndCafe",
"path": "Express/barAndCafe"
},
{
"path": "front"
}
],
"settings": {
"typescript.tsdk": "node_modules/typescript/lib"
}
}

View File

@ -1,5 +1,6 @@
vars {
TRIPMAP_URL: https://api.opentripmap.com/0.1
EXPRESS_API: http://localhost:3001
}
vars:secret [
app_key,

View File

@ -0,0 +1,8 @@
vars {
EXPRESS_API: https://drink-tweb.cb85.fr
PB_URL: https://pb-tweb.cb85.fr
TRIPMAP_URL: https://api.opentripmap.com/0.1/
}
vars:secret [
OTM_KEY
]

View File

@ -5,7 +5,7 @@ meta {
}
get {
url: http://localhost:3001/otm/city?name=La roche sur yon&radius=300
url: {{EXPRESS_API}}/otm/city?name=La roche sur yon&radius=300
body: none
auth: none
}

View File

@ -0,0 +1,16 @@
meta {
name: otm_city
type: http
seq: 5
}
get {
url: {{TRIPMAP_URL}}/en/places/geoname?name=paris&apikey={{OTM_KEY}}
body: none
auth: none
}
query {
name: paris
apikey: {{OTM_KEY}}
}

View File

@ -0,0 +1,18 @@
meta {
name: connexion
type: http
seq: 1
}
post {
url: {{PB_URL}}/api/collections/users/auth-with-password
body: json
auth: none
}
body:json {
{
"identity": "michel.biche@aptatio.com",
"password": "123456789"
}
}

View File

@ -0,0 +1,27 @@
meta {
name: get all poi
type: http
seq: 5
}
get {
url: {{PB_URL}}/api/collections/user_poi/records?filter=owner='vvy93m1hoaeshwy'&&poi_list='cabkkovmjsfoapa'
body: json
auth: bearer
}
query {
filter: owner
poi_list: 'cabkkovmjsfoapa'
}
auth:bearer {
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MTg4Mjg0NzEsImlkIjoidnZ5OTNtMWhvYWVzaHd5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.pC7u-QaZ_BYqWA5wG8wu1lRbbd4mKuKeAveWe_IBnfU
}
body:json {
{
"owner": "vvy93m1hoaeshwy",
"poi_list": "sh430u0im37cxm5"
}
}

View File

@ -0,0 +1,22 @@
meta {
name: link user to poi
type: http
seq: 3
}
post {
url: {{PB_URL}}/api/collections/user_poi/records
body: json
auth: bearer
}
auth:bearer {
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MTg4Mjg0NzEsImlkIjoidnZ5OTNtMWhvYWVzaHd5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.pC7u-QaZ_BYqWA5wG8wu1lRbbd4mKuKeAveWe_IBnfU
}
body:json {
{
"owner": "vvy93m1hoaeshwy",
"poi_list": "sh430u0im37cxm5"
}
}

View File

@ -0,0 +1,40 @@
meta {
name: send a poi
type: http
seq: 2
}
post {
url: {{PB_URL}}/api/collections/POI/records
body: json
auth: bearer
}
auth:bearer {
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MTg4Mjg0NzEsImlkIjoidnZ5OTNtMWhvYWVzaHd5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.pC7u-QaZ_BYqWA5wG8wu1lRbbd4mKuKeAveWe_IBnfU
}
body:json {
{
"Poi_id": "11472887",
"Poi": {
"type": "Feature",
"id": "11472887",
"geometry": {
"type": "Point",
"coordinates": [
-0.0626024,
51.4924088
]
},
"properties": {
"xid": "W544344833",
"name": "The Blue Anchor",
"rate": 2,
"osm": "way/544344833",
"wikidata": "Q7718716",
"kinds": "pubs,foods,shops,marketplaces,tourist_facilities"
}
}
}
}

View File

@ -0,0 +1,37 @@
meta {
name: send fav to astro
type: http
seq: 4
}
post {
url: http://localhost:3000/maps/save_poi
body: json
auth: bearer
}
auth:bearer {
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MTg4ODY2OTIsImlkIjoidnZ5OTNtMWhvYWVzaHd5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.R9PBGlHn6aBHt89g6G0NykMh_Vye24OpKEUYtz6R6Og
}
body:json {
{
"type": "Feature",
"id": "11472888",
"geometry": {
"type": "Point",
"coordinates": [
-0.0626024,
51.4924088
]
},
"properties": {
"xid": "W544344833",
"name": "The Blue Anchor",
"rate": 2,
"osm": "way/544344833",
"wikidata": "Q7718716",
"kinds": "pubs,foods,shops,marketplaces,tourist_facilities"
}
}
}

View File

@ -18,7 +18,9 @@ services:
- public
front:
image: git.lab-ouest.org/epitech/ratrapage_t-web_front:pr-1-head
image: git.lab-ouest.org/epitech/ratrapage_t-web_front:pr-16-head
environment:
- POCKETBASE_URL=https://${POCKET_BASE_URL}
depends_on:
- pocketbase
labels:
@ -30,9 +32,10 @@ services:
- public
back_drink:
image: git.lab-ouest.org/epitech/ratrapage_t-web_back:pr-6-head
image: git.lab-ouest.org/epitech/ratrapage_t-web_back:master
environment:
- port=${BACK_BASE_PORT}
- OPEN_TRIP_MAPS_KEY=${OPEN_TRIP_MAPS_KEY}
labels:
- traefik.enable=true
- traefik.http.routers.expressDrinkTweb.rule=Host(`${DRINK_URL}`)
@ -92,4 +95,4 @@ x-dockge:
- https://${FRONT_URL}/
- https://${DOCS_DRINK_URL}/
- https://${DRINK_URL}/
- https://${DATA_TOURISME_URL}/
- https://${DATA_TOURISME_URL}/

View File

@ -26,7 +26,8 @@ const whenExternalScripts = (items = []) =>
hasExternalScripts ? (Array.isArray(items) ? items.map((item) => item()) : [items()]) : [];
export default defineConfig({
output: 'server',
compressHTML: true,
build: {
assets: 'assets',
@ -37,7 +38,6 @@ export default defineConfig({
port: 3000
},
trailingSlash: 'never',
output: 'server',
adapter: node({
mode: 'standalone'
}),

View File

@ -20,12 +20,16 @@
"astro-embed": "^0.7.2",
"astro-icon": "^1.1.0",
"leaflet": "^1.9.4",
"leaflet-control-geocoder": "^2.4.0",
"leaflet-geosearch": "^4.0.0",
"leaflet-routing-machine": "^3.2.12",
"limax": "4.1.0",
"lodash.merge": "^4.6.2",
"lucide-astro": "^0.372.0",
"pocketbase": "^0.21.1",
"react-leaflet": "^4.2.1",
"simple-icons-astro": "^11.12.0",
"tailwind-merge": "^2.3.0",
"tailwindcss": "^3.4.3",
"unpic": "^3.18.0"
},
@ -42,6 +46,7 @@
"@types/eslint__js": "^8.42.3",
"@types/js-yaml": "^4.0.9",
"@types/leaflet": "^1.9.12",
"@types/leaflet-routing-machine": "^3.2.8",
"@types/lodash.merge": "^4.6.9",
"@types/node": "^20",
"@typescript-eslint/eslint-plugin": "^6.21.0",
@ -59,7 +64,6 @@
"reading-time": "^1.5.0",
"rehype-plugin-image-native-lazy-loading": "^1.2.0",
"sharp": "0.33.3",
"tailwind-merge": "^2.3.0",
"tailwindcss": "^3.4.3",
"typescript": "^5",
"typescript-eslint": "^7.9.0",
@ -1129,7 +1133,6 @@
"version": "7.24.5",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
"integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@ -1746,6 +1749,15 @@
"resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.0.18.tgz",
"integrity": "sha512-rJzSrtJ3b7djiGFvRuTe6stDfbYJGhdQSfn2SI2WfXviee7Er0yKAHE5u7FU7OWVQQQ1x3+cxdmx9NdiAkcrcA=="
},
"node_modules/@googlemaps/js-api-loader": {
"version": "1.16.6",
"resolved": "https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.6.tgz",
"integrity": "sha512-V8p5W9DbPQx74jWUmyYJOerhiB4C+MHekaO0ZRmc6lrOYrvY7+syLhzOWpp55kqSPeNb+qbC2h8i69aLIX6krQ==",
"optional": true,
"dependencies": {
"fast-deep-equal": "^3.1.3"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
@ -2459,6 +2471,22 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@mapbox/corslite": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/@mapbox/corslite/-/corslite-0.0.7.tgz",
"integrity": "sha512-w/uS474VFjmqQ7fFWIMZINQM1BAQxDLuoJaZZIPES1BmeYpCtlh9MtbFxKGGDAsfvut8/HircIsVvEYRjQ+iMg=="
},
"node_modules/@mapbox/polyline": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@mapbox/polyline/-/polyline-0.2.0.tgz",
"integrity": "sha512-GCddO0iw6AzOQqZgBmjEQI9Pgo40/yRgkTkikGctE01kNBN0ThWYuAnTD+hRWrAWMV6QJ0rNm4m8DAsaAXE7Pg==",
"bin": {
"polyline": "bin/polyline.bin.js"
},
"engines": {
"node": "*"
}
},
"node_modules/@mdx-js/mdx": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz",
@ -3061,6 +3089,15 @@
"@types/geojson": "*"
}
},
"node_modules/@types/leaflet-routing-machine": {
"version": "3.2.8",
"resolved": "https://registry.npmjs.org/@types/leaflet-routing-machine/-/leaflet-routing-machine-3.2.8.tgz",
"integrity": "sha512-v2pJDv/nqbB769SsytHemhLkqwjVor9UdWvZ1l6Y2SEaXNt1yDwVrktc4sCT8/4n7npuEb8VP+UAk8xrPePqSQ==",
"dev": true,
"dependencies": {
"@types/leaflet": "*"
}
},
"node_modules/@types/lodash": {
"version": "4.17.4",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz",
@ -6318,7 +6355,7 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
"devOptional": true
},
"node_modules/fast-glob": {
"version": "3.3.2",
@ -8117,6 +8154,36 @@
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
"integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
},
"node_modules/leaflet-control-geocoder": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/leaflet-control-geocoder/-/leaflet-control-geocoder-2.4.0.tgz",
"integrity": "sha512-b2QlxuFd40uIDbnoUI3U9fzfnB4yKUYlmsXjquJ2d2YjoJqnyVYcIJeErAVv3kPvX3nI0gzvBq1XHMgSVFrGkQ==",
"optionalDependencies": {
"open-location-code": "^1.0.0"
},
"peerDependencies": {
"leaflet": "^1.6.0"
}
},
"node_modules/leaflet-geosearch": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/leaflet-geosearch/-/leaflet-geosearch-4.0.0.tgz",
"integrity": "sha512-a92VNY9gxyv3oyEDqIWoCNoBllajWRYejztzOSNmpLRtzpA6JtGgy/wwl9tsB8+6Eek1fe+L6+W0MDEOaidbXA==",
"optionalDependencies": {
"@googlemaps/js-api-loader": "^1.16.6",
"leaflet": "^1.6.0"
}
},
"node_modules/leaflet-routing-machine": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/leaflet-routing-machine/-/leaflet-routing-machine-3.2.12.tgz",
"integrity": "sha512-HLde58G1YtD9xSIzZavJ6BPABZaV1hHeGst8ouhzuxmSC3s32NVtADT+njbIUMW1maHRCrsgTk/E4hz5QH7FrA==",
"dependencies": {
"@mapbox/corslite": "0.0.7",
"@mapbox/polyline": "^0.2.0",
"osrm-text-instructions": "^0.13.2"
}
},
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@ -8164,7 +8231,6 @@
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
@ -8184,7 +8250,6 @@
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
@ -8204,7 +8269,6 @@
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
@ -8224,7 +8288,6 @@
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"linux"
@ -8244,7 +8307,6 @@
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
@ -8264,7 +8326,6 @@
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
@ -8284,7 +8345,6 @@
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
@ -8304,7 +8364,6 @@
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
@ -8324,7 +8383,6 @@
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"win32"
@ -10006,6 +10064,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/open-location-code": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/open-location-code/-/open-location-code-1.0.3.tgz",
"integrity": "sha512-DBm14BSn40Ee241n80zIFXIT6+y8Tb0I+jTdosLJ8Sidvr2qONvymwqymVbHV2nS+1gkDZ5eTNpnOIVV0Kn2fw==",
"optional": true
},
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@ -10056,6 +10120,11 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/osrm-text-instructions": {
"version": "0.13.4",
"resolved": "https://registry.npmjs.org/osrm-text-instructions/-/osrm-text-instructions-0.13.4.tgz",
"integrity": "sha512-ge4ZTIetMQKAHKq2MwWf83ntzdJN20ndRKRaVNoZ3SkDkBNO99Qddz7r6+hrVx38I+ih6Rk5T1yslczAB6Q9Pg=="
},
"node_modules/p-limit": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
@ -10899,8 +10968,7 @@
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"dev": true
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"node_modules/regexp.prototype.flags": {
"version": "1.5.2",
@ -12272,7 +12340,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz",
"integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.24.1"
},

View File

@ -16,37 +16,32 @@
},
"dependencies": {
"@astrojs/node": "^8.2.5",
"@astrojs/rss": "^4.0.5",
"@astrojs/sitemap": "^3.1.4",
"@astrojs/tailwind": "^5.1.0",
"@astrolib/analytics": "^0.5.0",
"@astrolib/seo": "^1.0.0-beta.5",
"@fontsource-variable/inter": "^5.0.18",
"@tailwindcss/typography": "^0.5.12",
"astro": "^4.8.3",
"astro-embed": "^0.7.2",
"astro-icon": "^1.1.0",
"leaflet": "^1.9.4",
"leaflet-control-geocoder": "^2.4.0",
"leaflet-geosearch": "^4.0.0",
"leaflet-routing-machine": "^3.2.12",
"limax": "4.1.0",
"lodash.merge": "^4.6.2",
"lucide-astro": "^0.372.0",
"pocketbase": "^0.21.1",
"react-leaflet": "^4.2.1",
"simple-icons-astro": "^11.12.0",
"tailwind-merge": "^2.3.0",
"tailwindcss": "^3.4.3",
"@astrojs/rss": "^4.0.5",
"@astrojs/sitemap": "^3.1.4",
"@astrolib/analytics": "^0.5.0",
"@astrolib/seo": "^1.0.0-beta.5",
"@fontsource-variable/inter": "^5.0.18",
"astro": "^4.8.3",
"astro-embed": "^0.7.2",
"astro-icon": "^1.1.0",
"limax": "4.1.0",
"lodash.merge": "^4.6.2",
"unpic": "^3.18.0"
},
"devDependencies": {
"@astrojs/check": "^0",
"@types/leaflet": "^1.9.12",
"@types/node": "^20",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"@vitest/coverage-v8": "^1",
"eslint": "^8.57.0",
"eslint-plugin-astro": "^0.31.4",
"typescript": "^5",
"vitest": "^1",
"@astrojs/mdx": "^3.0.0",
"@astrojs/partytown": "^2.1.0",
"@astrojs/tailwind": "5.1.0",
@ -57,8 +52,16 @@
"@tailwindcss/typography": "^0.5.13",
"@types/eslint__js": "^8.42.3",
"@types/js-yaml": "^4.0.9",
"@types/leaflet": "^1.9.12",
"@types/leaflet-routing-machine": "^3.2.8",
"@types/lodash.merge": "^4.6.9",
"@types/node": "^20",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"@vitest/coverage-v8": "^1",
"astro-eslint-parser": "^1.0.2",
"eslint": "^8.57.0",
"eslint-plugin-astro": "^0.31.4",
"eslint-plugin-jsx-a11y": "^6.8.0",
"globals": "^15.2.0",
"js-yaml": "^4.1.0",
@ -68,8 +71,9 @@
"reading-time": "^1.5.0",
"rehype-plugin-image-native-lazy-loading": "^1.2.0",
"sharp": "0.33.3",
"tailwind-merge": "^2.3.0",
"tailwindcss": "^3.4.3",
"typescript-eslint": "^7.9.0"
"typescript": "^5",
"typescript-eslint": "^7.9.0",
"vitest": "^1"
}
}

View File

@ -0,0 +1,30 @@
---
import type { Input as Props } from 'types';
const {value, checked ,name, label, autocomplete, placeholder, divClass, inputClass} = Astro.props;
---
<>
{
name && (
<div class={"flex flex-row items-center " + divClass}>
<input
type="checkbox"
name={name}
id={name}
checked={checked}
value={value}
autocomplete={autocomplete}
placeholder={placeholder}
class={"mr-2 size-5 " + inputClass}
/>
{label && (
<label for={name} class="block text-lg font-medium">
{label}
</label>
)}
</div>
)
}
</>

View File

@ -1,7 +1,7 @@
---
import favIcon from '~/assets/favicons/favicon.ico';
import favIconSvg from '~/assets/favicons/favicon.svg';
import appleTouchIcon from '~/assets/favicons/apple-touch-icon.png';
import favIcon from 'assets/favicons/favicon.ico';
import favIconSvg from 'assets/favicons/favicon.svg';
import appleTouchIcon from 'assets/favicons/apple-touch-icon.png';
---
<link rel="shortcut icon" href={favIcon} />

View File

@ -0,0 +1,28 @@
---
import type { Input as Props } from 'types';
const { type, name, label, autocomplete, placeholder, divClass, inputClass} = Astro.props;
---
<>
{
name && (
<div class={divClass}>
{label && (
<label for={name} class="block text-sm font-medium">
{label}
</label>
)}
<input
type={type}
name={name}
id={name}
autocomplete={autocomplete}
placeholder={placeholder}
class={"py-3 px-4 block w-full text-md rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-slate-900" + inputClass}
/>
</div>
)
}
</>

View File

@ -0,0 +1,53 @@
---
import ContactUs from 'components/widgets/Contact.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
const pb = Astro.locals.pb
const oauths = (await pb.collection('users').listAuthMethods()).authProviders;
const discordProvider = oauths.find(item => item.name === 'discord');
const googleProvider = oauths.find(item => item.name === 'google');
---
<>
<CallToAction
actions={[
{
variant: 'primary',
text: 'Discord',
href: discordProvider!.authUrl + Astro.url.protocol + "//" + Astro.url.host + '/account/oauth',
icon: 'tabler:brand-discord',
class: "oauth-btn",
"data-cookie": encodeURIComponent(JSON.stringify(discordProvider))
},
{
variant: 'primary',
text: 'Google',
href: googleProvider!.authUrl + Astro.url.protocol + "//" + Astro.url.host + '/account/oauth',
icon: 'tabler:brand-google',
class: "oauth-btn",
"data-cookie": encodeURIComponent(JSON.stringify(googleProvider))
}
]}
>
<Fragment slot="title">
Oauth
</Fragment>
<Fragment slot="subtitle">
Connecter Vous aussi avec
</Fragment>
</CallToAction>
</>
<script>
// import { date } from "astro/zod";
document.cookie = "provider" + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
// console.log(date.toString)
const btn = document.querySelectorAll('.oauth-btn')
btn.forEach((item: Element) =>(item.addEventListener('click', (ev) =>{
document.cookie = "provider" + "=" + item.getAttribute('data-cookie') + "; path=/;"// expires=" + ;
})))
</script>

View File

@ -0,0 +1,19 @@
---
export interface Props {
values: Array<{label:String, name:string, checked?:boolean | undefined}>
}
const fields = Astro.props.values
---
<>
<div class="flex, flex-col">
{fields.map(value => (
<input type="radio" id={value.name} name="note-min" value={value.name} checked={value.checked}>
<label for={value.name} class="ml-1">{value.label}</label><br>
))}
</div>
</>

View File

@ -1,6 +1,6 @@
---
import Item from '~/components/blog/GridItem.astro';
import type { Post } from '~/types';
import Item from 'components/blog/GridItem.astro';
import type { Post } from 'types';
export interface Props {
posts: Array<Post>;

View File

@ -1,11 +1,11 @@
---
import { APP_BLOG } from 'astrowind:config';
import type { Post } from '~/types';
import type { Post } from 'types';
import Image from '~/components/common/Image.astro';
import Image from 'components/common/Image.astro';
import { findImage } from '~/utils/images';
import { getPermalink } from '~/utils/permalinks';
import { findImage } from 'utils/images';
import { getPermalink } from 'utils/permalinks';
export interface Props {
post: Post;

View File

@ -1,6 +1,6 @@
---
import Item from '~/components/blog/ListItem.astro';
import type { Post } from '~/types';
import Item from 'components/blog/ListItem.astro';
import type { Post } from 'types';
export interface Props {
posts: Array<Post>;

View File

@ -1,15 +1,15 @@
---
import type { ImageMetadata } from 'astro';
import { Icon } from 'astro-icon/components';
import Image from '~/components/common/Image.astro';
import PostTags from '~/components/blog/Tags.astro';
import Image from 'components/common/Image.astro';
import PostTags from 'components/blog/Tags.astro';
import { APP_BLOG } from 'astrowind:config';
import type { Post } from '~/types';
import type { Post } from 'types';
import { getPermalink } from '~/utils/permalinks';
import { findImage } from '~/utils/images';
import { getFormattedDate } from '~/utils/utils';
import { getPermalink } from 'utils/permalinks';
import { findImage } from 'utils/images';
import { getFormattedDate } from 'utils/utils';
export interface Props {
post: Post;

View File

@ -1,7 +1,7 @@
---
import { Icon } from 'astro-icon/components';
import { getPermalink } from '~/utils/permalinks';
import Button from '~/components/ui/Button.astro';
import { getPermalink } from 'utils/permalinks';
import Button from 'components/ui/Button.astro';
export interface Props {
prevUrl?: string;

View File

@ -1,10 +1,10 @@
---
import { APP_BLOG } from 'astrowind:config';
import { getRelatedPosts } from '~/utils/blog';
import { getRelatedPosts } from 'utils/blog';
import BlogHighlightedPosts from '../widgets/BlogHighlightedPosts.astro';
import type { Post } from '~/types';
import { getBlogPermalink } from '~/utils/permalinks';
import type { Post } from 'types';
import { getBlogPermalink } from 'utils/permalinks';
export interface Props {
post: Post;

View File

@ -1,14 +1,14 @@
---
import { Icon } from 'astro-icon/components';
import Image from '~/components/common/Image.astro';
import PostTags from '~/components/blog/Tags.astro';
import SocialShare from '~/components/common/SocialShare.astro';
import Image from 'components/common/Image.astro';
import PostTags from 'components/blog/Tags.astro';
import SocialShare from 'components/common/SocialShare.astro';
import { getPermalink } from '~/utils/permalinks';
import { getFormattedDate } from '~/utils/utils';
import { getPermalink } from 'utils/permalinks';
import { getFormattedDate } from 'utils/utils';
import type { Post } from '~/types';
import type { Post } from 'types';
export interface Props {
post: Post;

View File

@ -1,8 +1,8 @@
---
import { getPermalink } from '~/utils/permalinks';
import { getPermalink } from 'utils/permalinks';
import { APP_BLOG } from 'astrowind:config';
import type { Post } from '~/types';
import type { Post } from 'types';
export interface Props {
tags: Post['tags'];

View File

@ -1,8 +1,8 @@
---
import { Icon } from 'astro-icon/components';
import { getBlogPermalink } from '~/utils/permalinks';
import { getBlogPermalink } from 'utils/permalinks';
import { I18N } from 'astrowind:config';
import Button from '~/components/ui/Button.astro';
import Button from 'components/ui/Button.astro';
const { textDirection } = I18N;
---

View File

@ -1,5 +1,5 @@
---
import { getAsset } from '~/utils/permalinks';
import { getAsset } from 'utils/permalinks';
---
<meta charset="UTF-8" />

View File

@ -1,5 +1,5 @@
---
import { findImage } from '~/utils/images';
import { findImage } from 'utils/images';
import {
getImagesOptimized,
astroAsseetsOptimizer,
@ -7,7 +7,7 @@ import {
isUnpicCompatible,
type ImageProps,
type AttributesProps,
} from '~/utils/images-optimization';
} from 'utils/images-optimization';
type Props = ImageProps;
type ImageType = {

View File

@ -5,10 +5,10 @@ import { AstroSeo } from '@astrolib/seo';
import type { Props as AstroSeoProps } from '@astrolib/seo';
import { SITE, METADATA, I18N } from 'astrowind:config';
import type { MetaData } from '~/types';
import { getCanonical } from '~/utils/permalinks';
import type { MetaData } from 'types';
import { getCanonical } from 'utils/permalinks';
import { adaptOpenGraphImages } from '~/utils/images';
import { adaptOpenGraphImages } from 'utils/images';
export interface Props extends MetaData {
dontUseTitleTemplate?: boolean;

View File

@ -1,7 +1,7 @@
---
import { Icon } from 'astro-icon/components';
import { twMerge } from 'tailwind-merge';
import type { CallToAction as Props } from '~/types';
import type { CallToAction as Props } from 'types';
const {
variant = 'secondary',

View File

@ -1,11 +1,11 @@
---
import type { Form as Props } from '~/types';
import Button from '~/components/ui/Button.astro';
import type { Form as Props } from 'types';
import Button from 'components/ui/Button.astro';
const { inputs, textarea, disclaimer, button = 'Contact us', description = '' } = Astro.props;
const { inputs, textarea, disclaimer, button = 'Contact us', description = '', id, method, enctype } = Astro.props;
---
<form>
<form id={id} method={method} enctype={enctype}>
{
inputs &&
inputs.map(

View File

@ -1,5 +1,5 @@
---
import type { Headline as Props } from '~/types';
import type { Headline as Props } from 'types';
import { twMerge } from 'tailwind-merge';
const {

View File

@ -1,5 +1,5 @@
---
import type { ItemGrid as Props } from '~/types';
import type { ItemGrid as Props } from 'types';
import { twMerge } from 'tailwind-merge';
import Button from './Button.astro';
import { Icon } from 'astro-icon/components';

View File

@ -1,5 +1,5 @@
---
import type { ItemGrid as Props } from '~/types';
import type { ItemGrid as Props } from 'types';
import { Icon } from 'astro-icon/components';
import { twMerge } from 'tailwind-merge';
import Button from './Button.astro';

View File

@ -1,7 +1,7 @@
---
import { Icon } from 'astro-icon/components';
import { twMerge } from 'tailwind-merge';
import type { Item } from '~/types';
import type { Item } from 'types';
export interface Props {
items?: Array<Item>;

View File

@ -1,6 +1,6 @@
---
import type { HTMLTag } from 'astro/types';
import type { Widget } from '~/types';
import type { Widget } from 'types';
import { twMerge } from 'tailwind-merge';
import Background from './Background.astro';

View File

@ -1,12 +1,12 @@
---
import { APP_BLOG } from 'astrowind:config';
import Grid from '~/components/blog/Grid.astro';
import Grid from 'components/blog/Grid.astro';
import { getBlogPermalink } from '~/utils/permalinks';
import { findPostsByIds } from '~/utils/blog';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import type { Widget } from '~/types';
import { getBlogPermalink } from 'utils/permalinks';
import { findPostsByIds } from 'utils/blog';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import type { Widget } from 'types';
export interface Props extends Widget {
title?: string;

View File

@ -1,12 +1,12 @@
---
import { APP_BLOG } from 'astrowind:config';
import Grid from '~/components/blog/Grid.astro';
import Grid from 'components/blog/Grid.astro';
import { getBlogPermalink } from '~/utils/permalinks';
import { findLatestPosts } from '~/utils/blog';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import type { Widget } from '~/types';
import { getBlogPermalink } from 'utils/permalinks';
import { findLatestPosts } from 'utils/blog';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import type { Widget } from 'types';
import Button from '../ui/Button.astro';
export interface Props extends Widget {

View File

@ -1,10 +1,10 @@
---
import { Icon } from 'astro-icon/components';
import type { Brands as Props } from '~/types';
import type { Brands as Props } from 'types';
import Image from '~/components/common/Image.astro';
import Headline from '~/components/ui/Headline.astro';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import Image from 'components/common/Image.astro';
import Headline from 'components/ui/Headline.astro';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
const {
title = '',
subtitle = '',

View File

@ -1,8 +1,8 @@
---
import WidgetWrapper from '../ui/WidgetWrapper.astro';
import type { CallToAction, Widget } from '~/types';
import Headline from '~/components/ui/Headline.astro';
import Button from '~/components/ui/Button.astro';
import type { CallToAction, Widget } from 'types';
import Headline from 'components/ui/Headline.astro';
import Button from 'components/ui/Button.astro';
interface Props extends Widget {
title?: string;
@ -45,7 +45,7 @@ const {
{Array.isArray(actions) ? (
actions.map((action) => (
<div class="flex w-full sm:w-auto">
<Button {...(action || {})} class="w-full sm:mb-0" />
<Button {...(action || {})} class:list={["w-full", "sm:mb-0", action.class]} />
</div>
))
) : (

View File

@ -1,8 +1,8 @@
---
import FormContainer from '~/components/ui/Form.astro';
import Headline from '~/components/ui/Headline.astro';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import type { Contact as Props } from '~/types';
import FormContainer from 'components/ui/Form.astro';
import Headline from 'components/ui/Headline.astro';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import type { Contact as Props } from 'types';
const {
title = await Astro.slots.render('title'),
@ -13,6 +13,9 @@ const {
disclaimer,
button,
description,
formid,
method,
enctype,
id,
isDark = false,
@ -33,6 +36,9 @@ const {
disclaimer={disclaimer}
button={button}
description={description}
id={formid}
method={method}
enctype={enctype}
/>
</div>
)

View File

@ -1,9 +1,9 @@
---
import type { Content as Props } from '~/types';
import type { Content as Props } from 'types';
import Headline from '../ui/Headline.astro';
import WidgetWrapper from '../ui/WidgetWrapper.astro';
import Image from '~/components/common/Image.astro';
import Button from '~/components/ui/Button.astro';
import Image from 'components/common/Image.astro';
import Button from 'components/ui/Button.astro';
import ItemGrid from '../ui/ItemGrid.astro';
const {

View File

@ -1,8 +1,8 @@
---
import Headline from '~/components/ui/Headline.astro';
import ItemGrid from '~/components/ui/ItemGrid.astro';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import type { Faqs as Props } from '~/types';
import Headline from 'components/ui/Headline.astro';
import ItemGrid from 'components/ui/ItemGrid.astro';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import type { Faqs as Props } from 'types';
const {
title = '',

View File

@ -1,8 +1,8 @@
---
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import ItemGrid from '~/components/ui/ItemGrid.astro';
import Headline from '~/components/ui/Headline.astro';
import type { Features as Props } from '~/types';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import ItemGrid from 'components/ui/ItemGrid.astro';
import Headline from 'components/ui/Headline.astro';
import type { Features as Props } from 'types';
const {
title = await Astro.slots.render('title'),

View File

@ -1,8 +1,8 @@
---
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import Headline from '~/components/ui/Headline.astro';
import ItemGrid2 from '~/components/ui/ItemGrid2.astro';
import type { Features as Props } from '~/types';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import Headline from 'components/ui/Headline.astro';
import ItemGrid2 from 'components/ui/ItemGrid2.astro';
import type { Features as Props } from 'types';
const {
title = await Astro.slots.render('title'),

View File

@ -1,9 +1,9 @@
---
import Headline from '~/components/ui/Headline.astro';
import ItemGrid from '~/components/ui/ItemGrid.astro';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import Image from '~/components/common/Image.astro';
import type { Features as Props } from '~/types';
import Headline from 'components/ui/Headline.astro';
import ItemGrid from 'components/ui/ItemGrid.astro';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import Image from 'components/common/Image.astro';
import type { Features as Props } from 'types';
const {
title = await Astro.slots.render('title'),

View File

@ -1,7 +1,7 @@
---
import { Icon } from 'astro-icon/components';
import { SITE } from 'astrowind:config';
import { getHomePermalink } from '~/utils/permalinks';
import { getHomePermalink } from 'utils/permalinks';
interface Link {
text?: string;
@ -26,7 +26,7 @@ export interface Props {
const { socialLinks = [], secondaryLinks = [], links = [], footNote = '', theme = 'light' } = Astro.props;
---
<footer class:list={[{ dark: theme === 'dark' }, 'relative border-t border-gray-200 dark:border-slate-800 not-prose']}>
<footer class:list={[{ dark: theme === 'dark' }, 'relative border-t border-gray-200 dark:border-slate-800 not-prose, mt-auto, h-{11rem}']}>
<div class="dark:bg-dark absolute inset-0 pointer-events-none" aria-hidden="true"></div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 dark:text-slate-300">
<div class="grid grid-cols-12 gap-4 gap-y-8 sm:gap-8 py-8 md:py-12">

View File

@ -1,166 +1,173 @@
---
import { Icon } from 'astro-icon/components';
import Logo from '~/components/Logo.astro';
import ToggleTheme from '~/components/common/ToggleTheme.astro';
import ToggleMenu from '~/components/common/ToggleMenu.astro';
import Button from '~/components/ui/Button.astro';
import { Icon } from 'astro-icon/components'
import Logo from 'components/Logo.astro'
import ToggleTheme from 'components/common/ToggleTheme.astro'
import ToggleMenu from 'components/common/ToggleMenu.astro'
import Button from 'components/ui/Button.astro'
import { getHomePermalink } from '~/utils/permalinks';
import { trimSlash, getAsset } from '~/utils/permalinks';
import type { CallToAction } from '~/types';
import { getHomePermalink } from 'utils/permalinks'
import { trimSlash, getAsset } from 'utils/permalinks'
import type { CallToAction } from 'types'
const pb = Astro.locals.pb
const connected = pb.authStore.isValid
interface Link {
text?: string;
href?: string;
ariaLabel?: string;
icon?: string;
text?: string
href?: string
ariaLabel?: string
icon?: string
}
interface ActionLink extends CallToAction {}
interface MenuLink extends Link {
links?: Array<MenuLink>;
links?: Array<MenuLink>
}
export interface Props {
id?: string;
links?: Array<MenuLink>;
actions?: Array<ActionLink>;
isSticky?: boolean;
isDark?: boolean;
isFullWidth?: boolean;
showToggleTheme?: boolean;
showRssFeed?: boolean;
position?: string;
id?: string
links?: Array<MenuLink>
actions?: Array<ActionLink>
isSticky?: boolean
isDark?: boolean
isFullWidth?: boolean
showToggleTheme?: boolean
showRssFeed?: boolean
position?: string
}
const {
id = 'header',
links = [],
actions = [],
isSticky = false,
isDark = false,
isFullWidth = false,
showToggleTheme = false,
showRssFeed = false,
position = 'center',
} = Astro.props;
id = 'header',
links = [],
actions = [],
isSticky = false,
isDark = false,
isFullWidth = false,
showToggleTheme = false,
showRssFeed = false,
position = 'center',
} = Astro.props
const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`;
const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
---
<header
class:list={[
{ sticky: isSticky, relative: !isSticky, dark: isDark },
'top-0 z-40 flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out',
]}
{...isSticky ? { 'data-aw-sticky-header': true } : {}}
{...id ? { id } : {}}
class:list={[
{ sticky: isSticky, relative: !isSticky, dark: isDark },
'top-0 z-[1001] h-[5rem] bg-page flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out',
]}
{...isSticky ? { 'data-aw-sticky-header': true } : {}}
{...id ? { id } : {}}
>
<div class="absolute inset-0"></div>
<div
class:list={[
'relative text-default py-3 px-3 md:px-6 mx-auto w-full',
{
'md:flex md:justify-between': position !== 'center',
},
{
'md:grid md:grid-cols-3 md:items-center': position === 'center',
},
{
'max-w-7xl': !isFullWidth,
},
]}
>
<div class:list={[{ 'mr-auto rtl:mr-0 rtl:ml-auto': position === 'right' }, 'flex justify-between']}>
<a class="flex items-center" href={getHomePermalink()}>
<Logo />
</a>
<div class="flex items-center md:hidden">
<ToggleMenu />
</div>
</div>
<nav
class="items-center w-full md:w-auto hidden md:flex md:mx-5 text-default overflow-y-auto overflow-x-hidden md:overflow-y-visible md:overflow-x-auto md:justify-self-center"
aria-label="Main navigation"
>
<ul
class="flex flex-col md:flex-row md:self-center w-full md:w-auto text-xl md:text-[0.9375rem] tracking-[0.01rem] font-medium md:justify-center"
>
{
links.map(({ text, href, links }) => (
<li class={links?.length ? 'dropdown' : ''}>
{links?.length ? (
<>
<button type="button" class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center">
{text}{' '}
<Icon name="tabler:chevron-down" class="w-3.5 h-3.5 ml-0.5 rtl:ml-0 rtl:mr-0.5 hidden md:inline" />
</button>
<ul class="dropdown-menu md:backdrop-blur-md dark:md:bg-dark rounded md:absolute pl-4 md:pl-0 md:hidden font-medium md:bg-white/90 md:min-w-[200px] drop-shadow-xl">
{links.map(({ text: text2, href: href2 }) => (
<li>
<a
class:list={[
'first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap',
{ 'aw-link-active': href2 === currentPath },
]}
href={href2}
>
{text2}
</a>
</li>
))}
</ul>
</>
) : (
<a
class:list={[
'hover:text-link dark:hover:text-white px-4 py-3 flex items-center',
{ 'aw-link-active': href === currentPath },
]}
href={href}
>
{text}
</a>
)}
</li>
))
}
</ul>
</nav>
<div
class:list={[
{ 'ml-auto rtl:ml-0 rtl:mr-auto': position === 'left' },
'hidden md:self-center md:flex items-center md:mb-0 fixed w-full md:w-auto md:static justify-end left-0 rtl:left-auto rtl:right-0 bottom-0 p-3 md:p-0 md:justify-self-end',
]}
>
<div class="items-center flex justify-between w-full md:w-auto">
<div class="flex">
{showToggleTheme && <ToggleTheme iconClass="w-6 h-6 md:w-5 md:h-5 md:inline-block" />}
{
showRssFeed && (
<a
class="text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline-flex items-center"
aria-label="RSS Feed"
href={getAsset('/rss.xml')}
>
<Icon name="tabler:rss" class="w-5 h-5" />
</a>
)
}
</div>
{
actions?.length ? (
<span class="ml-4 rtl:ml-0 rtl:mr-4">
{actions.map((btnProps) => (
<Button {...btnProps} class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto" />
))}
</span>
) : (
''
)
}
</div>
</div>
</div>
<div class="absolute inset-0"></div>
<div
class:list={[
'relative text-default py-3 px-3 md:px-6 mx-auto w-full',
{
'md:flex md:justify-between': position !== 'center',
},
{
'md:grid md:grid-cols-3 md:items-center': position === 'center',
},
{
'max-w-7xl': !isFullWidth,
},
]}
>
<div class:list={[{ 'mr-auto rtl:mr-0 rtl:ml-auto': position === 'right' }, 'flex justify-between']}>
<a class="flex items-center" href={getHomePermalink()}>
<Logo />
</a>
<div class="flex items-center md:hidden">
<ToggleMenu />
</div>
</div>
<nav
class="items-center w-full md:w-auto hidden md:flex md:mx-5 text-default overflow-y-auto overflow-x-hidden md:overflow-y-visible md:overflow-x-auto md:justify-self-center"
aria-label="Main navigation"
>
<ul
class="flex flex-col bg-page md:flex-row md:self-center w-full md:w-auto text-xl md:text-[0.9375rem] tracking-[0.01rem] font-medium md:justify-center"
>
{
links.map(({ text, href, links }) => (
<li class={links?.length ? 'dropdown' : ''}>
{links?.length ? (
<>
<button type="button" class="hover:text-link dark:hover:text-white px-4 py-3 flex items-center">
{text}{' '}
<Icon name="tabler:chevron-down" class="w-3.5 h-3.5 ml-0.5 rtl:ml-0 rtl:mr-0.5 hidden md:inline" />
</button>
<ul class="dropdown-menu md:backdrop-blur-md dark:md:bg-dark rounded md:absolute pl-4 md:pl-0 md:hidden font-medium md:bg-white/90 md:min-w-[200px] drop-shadow-xl">
{links.map(({ text: text2, href: href2 }) => (
<li>
<a
class:list={[
'first:rounded-t last:rounded-b md:hover:bg-gray-100 hover:text-link dark:hover:text-white dark:hover:bg-gray-700 py-2 px-5 block whitespace-no-wrap',
{ 'aw-link-active': href2 === currentPath },
]}
href={href2}
>
{text2}
</a>
</li>
))}
</ul>
</>
) : (
<a
class:list={[
'hover:text-link dark:hover:text-white px-4 py-3 flex items-center',
{ 'aw-link-active': href === currentPath },
]}
href={href}
>
{text}
</a>
)}
</li>
))
}
</ul>
</nav>
<div
class:list={[
{ 'ml-auto rtl:ml-0 rtl:mr-auto': position === 'left' },
'hidden md:self-center md:flex items-center md:mb-0 fixed w-full md:w-auto md:static justify-end left-0 rtl:left-auto rtl:right-0 bottom-0 p-3 md:p-0 md:justify-self-end',
]}
>
<div class="items-center flex justify-between w-full md:w-auto">
<div class="flex">
{showToggleTheme && <ToggleTheme iconClass="w-6 h-6 md:w-5 md:h-5 md:inline-block" />}
{
showRssFeed && (
<a
class="text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5 inline-flex items-center"
aria-label="RSS Feed"
href={getAsset('/rss.xml')}
>
<Icon name="tabler:rss" class="w-5 h-5" />
</a>
)
}
</div>
{ !connected && (
<span class="ml-4 rtl:ml-0 rtl:mr-4">
<Button href='/account/login' variant='primary' class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto">
Connexion
</Button>
<Button href='/account/register' variant='secondary' class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto">
Inscription
</Button>
</span>
)}
{ connected && (
<Button href='/account/logout' variant='primary' class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto">
Déconnexion
</Button>
)}
</div>
</div>
</div>
</header>

View File

@ -1,7 +1,7 @@
---
import Image from '~/components/common/Image.astro';
import Button from '~/components/ui/Button.astro';
import type { CallToAction } from '~/types';
import Image from 'components/common/Image.astro';
import Button from 'components/ui/Button.astro';
import type { CallToAction } from 'types';
export interface Props {
id?: string;

View File

@ -1,7 +1,7 @@
---
import Image from '~/components/common/Image.astro';
import type { CallToAction } from '~/types';
import Button from '~/components/ui/Button.astro';
import Image from 'components/common/Image.astro';
import type { CallToAction } from 'types';
import Button from 'components/ui/Button.astro';
export interface Props {
title?: string;

View File

@ -1,6 +1,6 @@
---
import type { CallToAction } from '~/types';
import Button from '~/components/ui/Button.astro';
import type { CallToAction } from 'types';
import Button from 'components/ui/Button.astro';
export interface Props {
title?: string;

View File

@ -1,9 +1,9 @@
---
import { Icon } from 'astro-icon/components';
import Button from '~/components/ui/Button.astro';
import Headline from '~/components/ui/Headline.astro';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import type { Pricing as Props } from '~/types';
import Button from 'components/ui/Button.astro';
import Headline from 'components/ui/Headline.astro';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import type { Pricing as Props } from 'types';
const {
title = '',

View File

@ -1,5 +1,5 @@
---
import type { Stats as Props } from '~/types';
import type { Stats as Props } from 'types';
import WidgetWrapper from '../ui/WidgetWrapper.astro';
import Headline from '../ui/Headline.astro';
import { Icon } from 'astro-icon/components';

View File

@ -1,9 +1,9 @@
---
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import Timeline from '~/components/ui/Timeline.astro';
import Headline from '~/components/ui/Headline.astro';
import Image from '~/components/common/Image.astro';
import type { Steps as Props } from '~/types';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import Timeline from 'components/ui/Timeline.astro';
import Headline from 'components/ui/Headline.astro';
import Image from 'components/common/Image.astro';
import type { Steps as Props } from 'types';
const {
title = await Astro.slots.render('title'),

View File

@ -1,9 +1,9 @@
---
import { Icon } from 'astro-icon/components';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import Headline from '~/components/ui/Headline.astro';
import Button from '~/components/ui/Button.astro';
import type { Steps as Props } from '~/types';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import Headline from 'components/ui/Headline.astro';
import Button from 'components/ui/Button.astro';
import type { Steps as Props } from 'types';
const {
title = await Astro.slots.render('title'),

View File

@ -1,9 +1,9 @@
---
import Headline from '~/components/ui/Headline.astro';
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
import Button from '~/components/ui/Button.astro';
import Image from '~/components/common/Image.astro';
import type { Testimonials as Props } from '~/types';
import Headline from 'components/ui/Headline.astro';
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
import Button from 'components/ui/Button.astro';
import Image from 'components/common/Image.astro';
import type { Testimonials as Props } from 'types';
const {
title = '',

View File

@ -1,6 +1,6 @@
site:
name: AstroWind
site: 'https://astrowind.vercel.app'
name: EpicRoadTrip
site: 'https://front-tweb.cb85.fr'
base: '/'
trailingSlash: false

View File

@ -12,8 +12,8 @@ metadata:
canonical: https://astrowind.vercel.app/astrowind-template-in-depth
---
import DListItem from '~/components/ui/DListItem.astro';
import ToggleTheme from '~/components/common/ToggleTheme.astro';
import DListItem from 'components/ui/DListItem.astro';
import ToggleTheme from 'components/common/ToggleTheme.astro';
## Overview

View File

@ -8,7 +8,7 @@ tags:
- Astro
---
import Logo from '~/components/Logo.astro';
import Logo from 'components/Logo.astro';
import { YouTube, Tweet, Vimeo } from 'astro-embed';
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

6
front/src/env.d.ts vendored
View File

@ -6,10 +6,10 @@
import PocketBase from 'pocketbase'
export interface ImportMetaEnv {
NODE_ENV: string
APP_URL: string
NODE_ENV: string
APP_URL: string
POCKETBASE_URL: string
POCKETBASE_URL: string
GOOGLE_API_KEY: string
}

View File

@ -1,9 +1,9 @@
---
import PageLayout from '~/layouts/PageLayout.astro';
import Header from '~/components/widgets/Header.astro';
import PageLayout from 'layouts/PageLayout.astro';
import Header from 'components/widgets/Header.astro';
import { headerData } from '~/navigation';
import type { MetaData } from '~/types';
import { headerData } from 'navigation';
import type { MetaData } from 'types';
export interface Props {
metadata?: MetaData;

View File

@ -3,19 +3,19 @@ import '~/assets/styles/tailwind.css';
import { I18N } from 'astrowind:config';
import CommonMeta from '~/components/common/CommonMeta.astro';
import Favicons from '~/components/Favicons.astro';
import CustomStyles from '~/components/CustomStyles.astro';
import ApplyColorMode from '~/components/common/ApplyColorMode.astro';
import Metadata from '~/components/common/Metadata.astro';
import SiteVerification from '~/components/common/SiteVerification.astro';
import Analytics from '~/components/common/Analytics.astro';
import BasicScripts from '~/components/common/BasicScripts.astro';
import CommonMeta from 'components/common/CommonMeta.astro';
import Favicons from 'components/Favicons.astro';
import CustomStyles from 'components/CustomStyles.astro';
import ApplyColorMode from 'components/common/ApplyColorMode.astro';
import Metadata from 'components/common/Metadata.astro';
import SiteVerification from 'components/common/SiteVerification.astro';
import Analytics from 'components/common/Analytics.astro';
import BasicScripts from 'components/common/BasicScripts.astro';
// Comment the line below to disable View Transitions
import { ViewTransitions } from 'astro:transitions';
import type { MetaData as MetaDataType } from '~/types';
import type { MetaData as MetaDataType } from 'types';
export interface Props {
metadata?: MetaDataType;

View File

@ -1,7 +1,7 @@
---
import Layout from '~/layouts/PageLayout.astro';
import Layout from 'layouts/PageLayout.astro';
import type { MetaData } from '~/types';
import type { MetaData } from 'types';
export interface Props {
frontmatter: {

View File

@ -1,12 +1,12 @@
---
import Layout from '~/layouts/Layout.astro';
import Header from '~/components/widgets/Header.astro';
import Footer from '~/components/widgets/Footer.astro';
import Announcement from '~/components/widgets/Announcement.astro';
import Layout from 'layouts/Layout.astro';
import Header from 'components/widgets/Header.astro';
import Footer from 'components/widgets/Footer.astro';
import Announcement from 'components/widgets/Announcement.astro';
import { headerData, footerData } from '~/navigation';
import { headerData, footerData } from 'navigation';
import type { MetaData } from '~/types';
import type { MetaData } from 'types';
export interface Props {
metadata?: MetaData;
@ -16,16 +16,18 @@ const { metadata } = Astro.props;
---
<Layout metadata={metadata}>
<slot name="announcement">
<Announcement />
</slot>
<slot name="header">
<Header {...headerData} isSticky showRssFeed showToggleTheme />
</slot>
<main>
<slot />
</main>
<slot name="footer">
<Footer {...footerData} />
</slot>
<div id="posts" class="flex flex-col min-h-screen">
<!-- <slot name="announcement">
<Announcement />
</slot> -->
<slot name="header">
<Header {...headerData} isSticky showToggleTheme />
</slot>
<main>
<slot />
</main>
<slot name="footer">
<Footer {...footerData} />
</slot>
</div>
</Layout>

View File

@ -1,183 +1,63 @@
import { getPermalink, getBlogPermalink, getAsset } from './utils/permalinks';
import { getPermalink, getBlogPermalink } from './utils/permalinks'
export const headerData = {
links: [
links: [
{
text: 'Explorer POI',
href: '/maps',
},
{
text: 'Homes',
links: [
{
text: 'SaaS',
href: getPermalink('/homes/saas'),
},
{
text: 'Startup',
href: getPermalink('/homes/startup'),
},
{
text: 'Mobile App',
href: getPermalink('/homes/mobile-app'),
},
{
text: 'Personal',
href: getPermalink('/homes/personal'),
},
],
},
text: 'itinéraire',
href: '/maps/find_route',
},
{
text: 'Pages',
links: [
{
text: 'Features (Anchor Link)',
href: getPermalink('/#features'),
},
{
text: 'Services',
href: getPermalink('/services'),
},
{
text: 'Pricing',
href: getPermalink('/pricing'),
},
{
text: 'About us',
href: getPermalink('/about'),
},
{
text: 'Contact',
href: getPermalink('/contact'),
},
{
text: 'Terms',
href: getPermalink('/terms'),
},
{
text: 'Privacy policy',
href: getPermalink('/privacy'),
},
],
},
{
text: 'Landing',
links: [
{
text: 'Lead Generation',
href: getPermalink('/landing/lead-generation'),
},
{
text: 'Long-form Sales',
href: getPermalink('/landing/sales'),
},
{
text: 'Click-Through',
href: getPermalink('/landing/click-through'),
},
{
text: 'Product Details (or Services)',
href: getPermalink('/landing/product'),
},
{
text: 'Coming Soon or Pre-Launch',
href: getPermalink('/landing/pre-launch'),
},
{
text: 'Subscription',
href: getPermalink('/landing/subscription'),
},
],
},
{
text: 'Blog',
links: [
{
text: 'Blog List',
href: getBlogPermalink(),
},
{
text: 'Article',
href: getPermalink('get-started-website-with-astro-tailwind-css', 'post'),
},
{
text: 'Article (with MDX)',
href: getPermalink('markdown-elements-demo-post', 'post'),
},
{
text: 'Category Page',
href: getPermalink('tutorials', 'category'),
},
{
text: 'Tag Page',
href: getPermalink('astro', 'tag'),
},
],
},
{
text: 'Widgets',
href: '#',
},
],
actions: [{ text: 'Download', href: 'https://github.com/onwidget/astrowind', target: '_blank' }],
};
text: 'Compte',
href: '/account',
},
],
// actions: [
// {
// text: 'Connexion',
// href: '',
// target: '_blank',
// },
// ],
}
export const footerData = {
links: [
{
title: 'Product',
links: [
{ text: 'Features', href: '#' },
{ text: 'Security', href: '#' },
{ text: 'Team', href: '#' },
{ text: 'Enterprise', href: '#' },
{ text: 'Customer stories', href: '#' },
{ text: 'Pricing', href: '#' },
{ text: 'Resources', href: '#' },
],
},
{
title: 'Platform',
links: [
{ text: 'Developer API', href: '#' },
{ text: 'Partners', href: '#' },
{ text: 'Atom', href: '#' },
{ text: 'Electron', href: '#' },
{ text: 'AstroWind Desktop', href: '#' },
],
},
{
title: 'Support',
links: [
{ text: 'Docs', href: '#' },
{ text: 'Community Forum', href: '#' },
{ text: 'Professional Services', href: '#' },
{ text: 'Skills', href: '#' },
{ text: 'Status', href: '#' },
],
},
{
title: 'Company',
links: [
{ text: 'About', href: '#' },
{ text: 'Blog', href: '#' },
{ text: 'Careers', href: '#' },
{ text: 'Press', href: '#' },
{ text: 'Inclusion', href: '#' },
{ text: 'Social Impact', href: '#' },
{ text: 'Shop', href: '#' },
],
},
],
secondaryLinks: [
{ text: 'Terms', href: getPermalink('/terms') },
{ text: 'Privacy Policy', href: getPermalink('/privacy') },
],
socialLinks: [
{ ariaLabel: 'X', icon: 'tabler:brand-x', href: '#' },
{ ariaLabel: 'Instagram', icon: 'tabler:brand-instagram', href: '#' },
{ ariaLabel: 'Facebook', icon: 'tabler:brand-facebook', href: '#' },
{ ariaLabel: 'RSS', icon: 'tabler:rss', href: getAsset('/rss.xml') },
{ ariaLabel: 'Github', icon: 'tabler:brand-github', href: 'https://github.com/onwidget/astrowind' },
],
footNote: `
<img class="w-5 h-5 md:w-6 md:h-6 md:-mt-0.5 bg-cover mr-1.5 rtl:mr-0 rtl:ml-1.5 float-left rtl:float-right rounded-sm" src="https://onwidget.com/favicon/favicon-32x32.png" alt="onWidget logo" loading="lazy"></img>
Made by <a class="text-blue-600 underline dark:text-muted" href="https://onwidget.com/"> onWidget</a> · All rights reserved.
`,
};
links: [
{
title: 'Product',
links: [
{ text: 'Features', href: '#' },
{ text: 'Security', href: '#' },
],
},
{
title: 'Platform',
links: [
{ text: 'Developer API', href: '#' },
{ text: 'Partners', href: '#' },
],
},
{
title: 'Support',
links: [
{ text: 'Docs', href: '#' },
{ text: 'Community Forum', href: '#' },
],
},
{
title: 'Company',
links: [
{ text: 'About', href: '#' },
{ text: 'Blog', href: '#' },
],
},
],
secondaryLinks: [
{ text: 'Terms', href: getPermalink('/terms') },
{ text: 'Privacy Policy', href: getPermalink('/privacy') },
],
socialLinks:[]
}

View File

@ -1,6 +1,6 @@
---
import Layout from '~/layouts/Layout.astro';
import { getHomePermalink } from '~/utils/permalinks';
import Layout from 'layouts/Layout.astro';
import { getHomePermalink } from 'utils/permalinks';
const title = `Error 404`;
---

View File

@ -1,13 +1,13 @@
---
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
import Layout from '~/layouts/PageLayout.astro';
import BlogList from '~/components/blog/List.astro';
import Headline from '~/components/blog/Headline.astro';
import Pagination from '~/components/blog/Pagination.astro';
import Layout from 'layouts/PageLayout.astro';
import BlogList from 'components/blog/List.astro';
import Headline from 'components/blog/Headline.astro';
import Pagination from 'components/blog/Pagination.astro';
// import PostTags from "~/components/blog/Tags.astro";
import { blogListRobots, getStaticPathsBlogList } from '~/utils/blog';
import { blogListRobots, getStaticPathsBlogList } from 'utils/blog';
export const prerender = true;

View File

@ -1,11 +1,11 @@
---
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
import { blogCategoryRobots, getStaticPathsBlogCategory } from '~/utils/blog';
import { blogCategoryRobots, getStaticPathsBlogCategory } from 'utils/blog';
import Layout from '~/layouts/PageLayout.astro';
import BlogList from '~/components/blog/List.astro';
import Headline from '~/components/blog/Headline.astro';
import Pagination from '~/components/blog/Pagination.astro';
import Layout from 'layouts/PageLayout.astro';
import BlogList from 'components/blog/List.astro';
import Headline from 'components/blog/Headline.astro';
import Pagination from 'components/blog/Pagination.astro';
export const prerender = true;

View File

@ -1,11 +1,11 @@
---
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
import { blogTagRobots, getStaticPathsBlogTag } from '~/utils/blog';
import { blogTagRobots, getStaticPathsBlogTag } from 'utils/blog';
import Layout from '~/layouts/PageLayout.astro';
import BlogList from '~/components/blog/List.astro';
import Headline from '~/components/blog/Headline.astro';
import Pagination from '~/components/blog/Pagination.astro';
import Layout from 'layouts/PageLayout.astro';
import BlogList from 'components/blog/List.astro';
import Headline from 'components/blog/Headline.astro';
import Pagination from 'components/blog/Pagination.astro';
export const prerender = true;

View File

@ -3,15 +3,15 @@ import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
import merge from 'lodash.merge';
import type { ImageMetadata } from 'astro';
import Layout from '~/layouts/PageLayout.astro';
import SinglePost from '~/components/blog/SinglePost.astro';
import ToBlogLink from '~/components/blog/ToBlogLink.astro';
import Layout from 'layouts/PageLayout.astro';
import SinglePost from 'components/blog/SinglePost.astro';
import ToBlogLink from 'components/blog/ToBlogLink.astro';
import { getCanonical, getPermalink } from '~/utils/permalinks';
import { getStaticPathsBlogPost, blogPostRobots } from '~/utils/blog';
import { findImage } from '~/utils/images';
import type { MetaData } from '~/types';
import RelatedPosts from '~/components/blog/RelatedPosts.astro';
import { getCanonical, getPermalink } from 'utils/permalinks';
import { getStaticPathsBlogPost, blogPostRobots } from 'utils/blog';
import { findImage } from 'utils/images';
import type { MetaData } from 'types';
import RelatedPosts from 'components/blog/RelatedPosts.astro';
export const prerender = true;

View File

@ -1,10 +1,10 @@
---
import Features2 from '~/components/widgets/Features2.astro';
import Features3 from '~/components/widgets/Features3.astro';
import Hero from '~/components/widgets/Hero.astro';
import Stats from '~/components/widgets/Stats.astro';
import Steps2 from '~/components/widgets/Steps2.astro';
import Layout from '~/layouts/PageLayout.astro';
import Features2 from 'components/widgets/Features2.astro';
import Features3 from 'components/widgets/Features3.astro';
import Hero from 'components/widgets/Hero.astro';
import Stats from 'components/widgets/Stats.astro';
import Steps2 from 'components/widgets/Steps2.astro';
import Layout from 'layouts/PageLayout.astro';
const metadata = {
title: 'About us',

View File

@ -1,5 +1,6 @@
---
import Layout from 'layouts/Layout.astro'
import Layout from 'layouts/PageLayout.astro';
//import Layout from 'layouts/Layout.astro';
import PocketBase from 'pocketbase'
@ -11,11 +12,12 @@ if(!auth.isValid){
return Astro.redirect("/account/login");
}
const metadata = {
title: 'Account',
ignoreTitleTemplate: true,
};
---
<Layout title="Account setting">
<h1>Bonjour {user!.name}</h1>
<div>
<a href="/account/logout">deconnexion</a>
</div>
<Layout metadata={metadata}>
<h1>Bonjour {user!.username}</h1>
</Layout>

View File

@ -1,8 +1,11 @@
---
import Layout from "layouts/Layout.astro";
import Layout from 'layouts/PageLayout.astro';
//import Layout from 'layouts/Layout.astro';
import AstroUtils from "libs/AstroUtils";
import PocketBase from 'pocketbase'
import ContactUs from 'components/widgets/Contact.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
import Oauth from 'components/Oauth.astro';
const pb = Astro.locals.pb
@ -10,7 +13,8 @@ if(pb.authStore.isValid){
return Astro.redirect("/account")
}
const res = await AstroUtils.wrap(async () => {
await AstroUtils.wrap(async () => {
if (Astro.request.method !== 'POST') {
return
}
@ -29,12 +33,33 @@ const res = await AstroUtils.wrap(async () => {
return Astro.redirect("/account/login");// route('/account/login', {message: 'Compte invalide, valider les identifiants'})) //XXX: comprendre comment le system de route fonctionne
}
})
const metadata = {
title: 'Login',
ignoreTitleTemplate: true,
};
---
<Layout title="login">
<form id="account-creation" method="post" enctype="multipart/form-data">
<input required name="username" placeholder="Pseudo ou email"/>
<input required name="password" type="password" placeholder="Mot de passe" />
<button>Connection</button>
</form>
</Layout>
<Layout metadata={metadata}>
<ContactUs
formid="login"
title="Connexion"
subtitle="Connectez vous pour sauvegardez vos recherche"
button='Connexion'
method='post'
enctype="multipart/form-data"
inputs={[
{
type: 'text',
name: 'username',
label: 'Nom d\'utilisateur ou e-mail',
placeholder: "michel@example.com"
},
{
type: "password",
name: "password"
}
]}
/>
<Oauth/>
</Layout>

View File

@ -8,6 +8,6 @@ if(pb.authStore.isValid){
pb.authStore.clear()
}
return Astro.redirect('/account/login')
return Astro.redirect('/')
---
---

View File

@ -4,9 +4,6 @@ const redirectUrl = Astro.url.protocol + "//" + Astro.url.host + '/account/oauth
const params = Astro.url.searchParams
const code = params.get('code')
console.log(redirectUrl)
console.log(Astro.request.headers.get('cookie'))
//TODO socké dans les cookies
// load the previously stored provider's data
const providerstr = Astro.cookies.get('provider')
@ -24,9 +21,13 @@ if (!code) {
// compare the redirect's state param and the stored provider's one
if (provider.state !== params.get('state')) {
console.log(provider.state)
console.log(params.get('state'))
throw "State parameters don't match.";
}
let authenticated = false
await pb.collection('users').authWithOAuth2Code(
provider.name,
code,
@ -38,15 +39,15 @@ await pb.collection('users').authWithOAuth2Code(
).then((authData) => {
//REDIRECT
console.log("oauth OK !!");
console.log(JSON.stringify(authData, null, 2));
console.log(pb.authStore.isValid);
console.log(pb.authStore.isValid);
return Astro.redirect("/account")
}).catch((err) => {
authenticated = true
}).catch((err) => {
console.log("oauth fail !!");
console.log(err);
});
});
if (authenticated) {
return Astro.redirect("/account")
}
---

View File

@ -1,77 +1,83 @@
---
import Layout from 'layouts/Layout.astro';
import Layout from 'layouts/PageLayout.astro';
//import Layout from 'layouts/Layout.astro';
import AstroUtils from 'libs/AstroUtils';
import { getEnv } from 'libs/Env';
import ContactUs from 'components/widgets/Contact.astro';
import Oauth from 'components/Oauth.astro';
const pb = Astro.locals.pb
const oauths = await pb.collection('users').listAuthMethods();
console.log(JSON.stringify(oauths.authProviders[0]));
let secure = true
if (getEnv('NODE_ENV', 'production') !== 'production') {
secure = false
}
Astro.cookies.set('provider', oauths.authProviders[0],{
httpOnly: true,
path: '/',
secure: secure,
sameSite: 'lax',
maxAge: 365000
})
if(pb.authStore.isValid){
return Astro.redirect("/account")
}
let loged = false
await AstroUtils.wrap(async () => {
if (Astro.request.method !== 'POST'){
return
}
const form = await Astro.request.formData()
if(form.get("type") == "userPassword"){
const request = {
username: form.get("username") as string,
name: form.get("name") as string,
email: form.get("email") as string,
password: form.get("password") as string,
passwordConfirm: form.get("passwordConfirm") as string,
}
try{
await pb.collection('users').create(request)
return Astro.redirect('/account/login')
}catch(e){
console.log(e);
}
}else if (form.get("type") == "discord2FA") {
// console.log("pouet")
// await pb.collection('user').authWithOAuth2({provider: 'discord'})
// console.log("pouetF");
}else{
Astro.redirect("/404")
const request = {
username: form.get("username") as string,
name: form.get("name") as string,
email: form.get("email") as string,
password: form.get("password") as string,
passwordConfirm: form.get("passwordConfirm") as string,
}
})
try{
await pb.collection('users').create(request)
loged = true
}catch(e){
console.log(e);
}
})
if (loged) {
return Astro.redirect('/account/login')
}
const metadata = {
title: 'Register',
ignoreTitleTemplate: true,
};
---
<Layout title="register">
<form id="account-creation" method="post" enctype="multipart/form-data">
<input type="hidden" name="type" value="userPassword">
<input required name="name" placeholder="Prénom Nom"/>
<input required name="username" placeholder="Pseudo"/>
<input required name="email" type="email" placeholder="Renseignez votre email" />
<input required name="password" type="password" placeholder="Créez un mot de passe" />
<input required name="passwordConfirm" type="password" placeholder="Confirmer votre mot de passe" />
<button>Créer un compte</button>
</form>
<Layout metadata={metadata}>
<button id="OauthDiscord">connexion avec discord</button>
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="type" value="discord2FA">
</form>
<a href={oauths.authProviders[0].authUrl + Astro.url.protocol + "//" + Astro.url.host + '/account/oauth'}>discord?</a>
<ContactUs
formid='account-creation'
title='Inscription'
subtitle="inscrivez vous pour sauvegardez vos recherche"
button='Créer un compte'
method='post'
enctype="multipart/form-data"
inputs={[
{
type: 'text',
name: 'name',
label: 'Prénom Nom',
placeholder: "Michel Biche"
},{
type: 'text',
name: 'username',
label: 'Nom d\'utilisateur',
placeholder: "michel85"
},{
type: 'email',
name: 'email',
label: 'Adresse email',
placeholder: "michel@example.com"
},{
type: 'password',
name: 'password',
label: 'Créez un mot de passe',
},{
type: 'password',
name: 'passwordConfirm',
label: 'Confirmer votre mot de passe',
},
]}
/>
<Oauth/>
</Layout>

View File

@ -1,8 +1,8 @@
---
import Layout from '~/layouts/PageLayout.astro';
import HeroText from '~/components/widgets/HeroText.astro';
import ContactUs from '~/components/widgets/Contact.astro';
import Features2 from '~/components/widgets/Features2.astro';
import Layout from 'layouts/PageLayout.astro';
import HeroText from 'components/widgets/HeroText.astro';
import ContactUs from 'components/widgets/Contact.astro';
import Features2 from 'components/widgets/Features2.astro';
const metadata = {
title: 'Contact',

View File

@ -1,18 +1,18 @@
---
import Layout from '~/layouts/PageLayout.astro';
import Layout from 'layouts/PageLayout.astro';
import Header from '~/components/widgets/Header.astro';
import Header from 'components/widgets/Header.astro';
import Hero2 from '~/components/widgets/Hero2.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Features3 from '~/components/widgets/Features3.astro';
import Content from '~/components/widgets/Content.astro';
import Testimonials from '~/components/widgets/Testimonials.astro';
import FAQs from '~/components/widgets/FAQs.astro';
import Stats from '~/components/widgets/Stats.astro';
import Hero2 from 'components/widgets/Hero2.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
import Features3 from 'components/widgets/Features3.astro';
import Content from 'components/widgets/Content.astro';
import Testimonials from 'components/widgets/Testimonials.astro';
import FAQs from 'components/widgets/FAQs.astro';
import Stats from 'components/widgets/Stats.astro';
import Button from '~/components/ui/Button.astro';
import Image from '~/components/common/Image.astro';
import Button from 'components/ui/Button.astro';
import Image from 'components/common/Image.astro';
const appStoreImg = '~/assets/images/app-store.png';
const appStoreDownloadLink = 'https://github.com/onwidget/astrowind';

View File

@ -1,15 +1,15 @@
---
import Layout from '~/layouts/PageLayout.astro';
import Layout from 'layouts/PageLayout.astro';
import Header from '~/components/widgets/Header.astro';
import Hero from '~/components/widgets/Hero.astro';
import Content from '~/components/widgets/Content.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Features3 from '~/components/widgets/Features3.astro';
import Testimonials from '~/components/widgets/Testimonials.astro';
import Steps from '~/components/widgets/Steps.astro';
import BlogLatestPosts from '~/components/widgets/BlogLatestPosts.astro';
import { getPermalink } from '~/utils/permalinks';
import Header from 'components/widgets/Header.astro';
import Hero from 'components/widgets/Hero.astro';
import Content from 'components/widgets/Content.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
import Features3 from 'components/widgets/Features3.astro';
import Testimonials from 'components/widgets/Testimonials.astro';
import Steps from 'components/widgets/Steps.astro';
import BlogLatestPosts from 'components/widgets/BlogLatestPosts.astro';
import { getPermalink } from 'utils/permalinks';
const metadata = {
title: 'Personal Homepage Demo',

View File

@ -1,16 +1,16 @@
---
import Layout from '~/layouts/PageLayout.astro';
import Layout from 'layouts/PageLayout.astro';
import Header from '~/components/widgets/Header.astro';
import Hero2 from '~/components/widgets/Hero2.astro';
import Features from '~/components/widgets/Features.astro';
import Steps2 from '~/components/widgets/Steps2.astro';
import Content from '~/components/widgets/Content.astro';
import Pricing from '~/components/widgets/Pricing.astro';
import Header from 'components/widgets/Header.astro';
import Hero2 from 'components/widgets/Hero2.astro';
import Features from 'components/widgets/Features.astro';
import Steps2 from 'components/widgets/Steps2.astro';
import Content from 'components/widgets/Content.astro';
import Pricing from 'components/widgets/Pricing.astro';
import { headerData } from '~/navigation';
import FAQs from '~/components/widgets/FAQs.astro';
import BlogLatestPosts from '~/components/widgets/BlogLatestPosts.astro';
import { headerData } from 'navigation';
import FAQs from 'components/widgets/FAQs.astro';
import BlogLatestPosts from 'components/widgets/BlogLatestPosts.astro';
const metadata = {
title: 'SaaS Landing Page',

View File

@ -1,15 +1,15 @@
---
import Layout from '~/layouts/PageLayout.astro';
import Layout from 'layouts/PageLayout.astro';
import Hero from '~/components/widgets/Hero.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Hero from 'components/widgets/Hero.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
import Features2 from '~/components/widgets/Features2.astro';
import Features from '~/components/widgets/Features.astro';
import Stats from '~/components/widgets/Stats.astro';
import Features3 from '~/components/widgets/Features3.astro';
import FAQs from '~/components/widgets/FAQs.astro';
import Brands from '~/components/widgets/Brands.astro';
import Features2 from 'components/widgets/Features2.astro';
import Features from 'components/widgets/Features.astro';
import Stats from 'components/widgets/Stats.astro';
import Features3 from 'components/widgets/Features3.astro';
import FAQs from 'components/widgets/FAQs.astro';
import Brands from 'components/widgets/Brands.astro';
import { YouTube } from 'astro-embed';

View File

@ -1,16 +1,16 @@
---
import Layout from '~/layouts/PageLayout.astro';
import Layout from 'layouts/PageLayout.astro';
import Hero from '~/components/widgets/Hero.astro';
import Note from '~/components/widgets/Note.astro';
import Features from '~/components/widgets/Features.astro';
import Features2 from '~/components/widgets/Features2.astro';
import Steps from '~/components/widgets/Steps.astro';
import Content from '~/components/widgets/Content.astro';
import BlogLatestPosts from '~/components/widgets/BlogLatestPosts.astro';
import FAQs from '~/components/widgets/FAQs.astro';
import Stats from '~/components/widgets/Stats.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Hero from 'components/widgets/Hero.astro';
import Note from 'components/widgets/Note.astro';
import Features from 'components/widgets/Features.astro';
import Features2 from 'components/widgets/Features2.astro';
import Steps from 'components/widgets/Steps.astro';
import Content from 'components/widgets/Content.astro';
import BlogLatestPosts from 'components/widgets/BlogLatestPosts.astro';
import FAQs from 'components/widgets/FAQs.astro';
import Stats from 'components/widgets/Stats.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
const metadata = {
title: 'AstroWind — Free template for creating websites with Astro + Tailwind CSS',

View File

@ -1,8 +1,8 @@
---
import Layout from '~/layouts/LandingLayout.astro';
import Layout from 'layouts/LandingLayout.astro';
import Hero2 from '~/components/widgets/Hero2.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Hero2 from 'components/widgets/Hero2.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
const metadata = {
title: 'Click-through Landing Page Demo',

View File

@ -1,8 +1,8 @@
---
import Layout from '~/layouts/LandingLayout.astro';
import Layout from 'layouts/LandingLayout.astro';
import Hero from '~/components/widgets/Hero.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Hero from 'components/widgets/Hero.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
const metadata = {
title: 'Lead Generation Landing Page Demo',

View File

@ -1,8 +1,8 @@
---
import Layout from '~/layouts/LandingLayout.astro';
import Layout from 'layouts/LandingLayout.astro';
import Hero2 from '~/components/widgets/Hero2.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Hero2 from 'components/widgets/Hero2.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
const metadata = {
title: 'Pre-Launch Landing Page',

View File

@ -1,8 +1,8 @@
---
import Layout from '~/layouts/LandingLayout.astro';
import Layout from 'layouts/LandingLayout.astro';
import Hero from '~/components/widgets/Hero.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Hero from 'components/widgets/Hero.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
const metadata = {
title: 'Product Details Landing Page Demo',

View File

@ -1,8 +1,8 @@
---
import Layout from '~/layouts/LandingLayout.astro';
import Layout from 'layouts/LandingLayout.astro';
import Hero2 from '~/components/widgets/Hero2.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Hero2 from 'components/widgets/Hero2.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
const metadata = {
title: 'Sales Landing Page Demo',

View File

@ -1,8 +1,8 @@
---
import Layout from '~/layouts/LandingLayout.astro';
import Layout from 'layouts/LandingLayout.astro';
import Hero2 from '~/components/widgets/Hero2.astro';
import CallToAction from '~/components/widgets/CallToAction.astro';
import Hero2 from 'components/widgets/Hero2.astro';
import CallToAction from 'components/widgets/CallToAction.astro';
const metadata = {
title: 'Subscription Landing Page Demo',

View File

@ -1,26 +0,0 @@
---
import Layout from 'layouts/Layout.astro';
import 'leaflet/dist/leaflet.css'
---
<Layout title="maps test">
<div class="w-52 h-52" id="map" />
</Layout>
<script>
import L from 'leaflet'
const map = L.map('map', {
center: [50,0],
zoom: 13,
preferCanvas: true
})
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
var marker = L.marker([51.5, -0.09]).addTo(map);
</script>

View File

@ -0,0 +1,87 @@
---
import Layout from 'layouts/PageLayout.astro'
import 'leaflet/dist/leaflet.css'
import 'leaflet-routing-machine/dist/leaflet-routing-machine.css'
import FormContainer from 'components/ui/Form.astro'
import Input from 'components/Input.astro'
import Button from 'components/ui/Button.astro'
const metadata = {
title: 'Maps',
ignoreTitleTemplate: true,
}
---
<Layout metadata={metadata}>
<div class="h-[calc(100vh-5rem)] flex flex-col">
<div class="w-full h-96 grow" id="map" />
<Button id="test-btn">test</Button>
</div>
<!-- for remouve footer -->
<div slot="footer"></div>
</Layout>
<script>
import * as L from 'leaflet'
import markerShadow from "leaflet/dist/images/marker-shadow.png"
import markerIcon from "leaflet/dist/images/marker-icon.png"
import 'leaflet-routing-machine/dist/leaflet-routing-machine.js'
import 'leaflet-control-geocoder/dist/Control.Geocoder.js'
const icon = {icon: new L.Icon({iconUrl: markerIcon.src, shadowUrl: markerShadow.src, iconAnchor: [13,41]})}
// declare map
const map = L.map('map', {
center: [51.5, -0.09],
zoom: 13,
preferCanvas: true,
zoomControl: false
})
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map)
// move zoom ctl to bottom
L.control.zoom({
position: 'bottomleft'
}).addTo(map);
const routing = L.Routing.control({
// utile pour afficher des route stocké
// waypoints: [
// L.latLng(46.6705431, -1.4269698),
// L.latLng(47.218536, -1.554075)
// ],
routeWhileDragging: true,
//@ts-ignore
geocoder: L.Control.Geocoder.nominatim(),
//@ts-ignore
position: 'topleft',
showAlternatives: true,
reverseWaypoints: true,
altLineOptions: {
missingRouteTolerance: 50,
extendToWaypoints: true,
styles: [
{color: 'black', opacity: 0.15, weight: 9},
{color: 'white', opacity: 0.2, weight: 6},
{color: 'blue', opacity: 5, weight: 2}
]
}
}).addTo(map).on('routeselected', (e) => {
console.log("iténeraire choisie")
console.log(e)
}).on('routesfound', (e) =>{
console.log("route trouvé")
console.log(e)
})
document.querySelector<HTMLButtonElement>('#test-btn')?.addEventListener('click', () => {
routing.setWaypoints(
[L.latLng(46.6705431, -1.4269698),L.latLng(47.218536, -1.554075)]
)
routing.route();
})
</script>

Some files were not shown because too many files have changed in this diff Show More