Layouts & Components

This commit is contained in:
Matthieu Morin 2024-01-21 04:34:04 +01:00
parent 22c452ad59
commit 2a840f4511
20 changed files with 322 additions and 93 deletions

View File

@ -16,33 +16,34 @@
},
"devDependencies": {
"@playwright/test": "^1.28.1",
"@skeletonlabs/skeleton": "2.3.0",
"@skeletonlabs/tw-plugin": "0.2.2",
"@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/kit": "^1.20.4",
"@tailwindcss/forms": "0.5.6",
"@tailwindcss/typography": "0.5.10",
"@types/node": "20.8.8",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"autoprefixer": "10.4.16",
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-svelte": "^2.30.0",
"postcss": "8.4.31",
"prettier": "^2.8.0",
"prettier-plugin-svelte": "^2.10.1",
"svelte": "^4.0.5",
"svelte-check": "^3.4.3",
"tailwindcss": "3.3.3",
"tslib": "^2.4.1",
"typescript": "^5.0.0",
"vite": "^4.4.2",
"vitest": "^0.32.2",
"postcss": "8.4.31",
"autoprefixer": "10.4.16",
"tailwindcss": "3.3.3",
"@skeletonlabs/skeleton": "2.3.0",
"@skeletonlabs/tw-plugin": "0.2.2",
"vite-plugin-tailwind-purgecss": "0.1.3",
"@tailwindcss/typography": "0.5.10",
"@tailwindcss/forms": "0.5.6",
"@types/node": "20.8.8"
"vitest": "^0.32.2"
},
"type": "module",
"dependencies": {
"@floating-ui/dom": "1.5.3"
"@floating-ui/dom": "1.5.3",
"svelte-preprocess": "^5.1.3"
}
}

View File

@ -8,6 +8,9 @@ dependencies:
'@floating-ui/dom':
specifier: 1.5.3
version: 1.5.3
svelte-preprocess:
specifier: ^5.1.3
version: 5.1.3(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2)
devDependencies:
'@playwright/test':
@ -104,7 +107,6 @@ packages:
dependencies:
'@jridgewell/gen-mapping': 0.3.3
'@jridgewell/trace-mapping': 0.3.20
dev: true
/@esbuild/android-arm64@0.18.20:
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
@ -397,28 +399,23 @@ packages:
'@jridgewell/set-array': 1.1.2
'@jridgewell/sourcemap-codec': 1.4.15
'@jridgewell/trace-mapping': 0.3.20
dev: true
/@jridgewell/resolve-uri@3.1.1:
resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
engines: {node: '>=6.0.0'}
dev: true
/@jridgewell/set-array@1.1.2:
resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
engines: {node: '>=6.0.0'}
dev: true
/@jridgewell/sourcemap-codec@1.4.15:
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
dev: true
/@jridgewell/trace-mapping@0.3.20:
resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
dependencies:
'@jridgewell/resolve-uri': 3.1.1
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@ -584,7 +581,6 @@ packages:
/@types/estree@1.0.3:
resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==}
dev: true
/@types/json-schema@7.0.14:
resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==}
@ -598,7 +594,6 @@ packages:
/@types/pug@2.0.8:
resolution: {integrity: sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==}
dev: true
/@types/semver@7.5.4:
resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==}
@ -794,7 +789,6 @@ packages:
resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: true
/ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@ -846,7 +840,6 @@ packages:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
dependencies:
dequal: 2.0.3
dev: true
/array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
@ -877,11 +870,9 @@ packages:
resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
dependencies:
dequal: 2.0.3
dev: true
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
/binary-extensions@2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
@ -893,7 +884,6 @@ packages:
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
dev: true
/brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
@ -921,7 +911,6 @@ packages:
/buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
dev: true
/cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
@ -992,7 +981,6 @@ packages:
acorn: 8.10.0
estree-walker: 3.0.3
periscopic: 3.1.0
dev: true
/color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
@ -1017,7 +1005,6 @@ packages:
/concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
/cookie@0.5.0:
resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
@ -1039,7 +1026,6 @@ packages:
dependencies:
mdn-data: 2.0.30
source-map-js: 1.0.2
dev: true
/cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
@ -1078,12 +1064,10 @@ packages:
/dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
dev: true
/detect-indent@6.1.0:
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
engines: {node: '>=8'}
dev: true
/devalue@4.3.2:
resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==}
@ -1122,7 +1106,6 @@ packages:
/es6-promise@3.3.1:
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
dev: true
/esbuild@0.18.20:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
@ -1297,7 +1280,6 @@ packages:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
dependencies:
'@types/estree': 1.0.3
dev: true
/esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
@ -1374,7 +1356,6 @@ packages:
/fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
dev: true
/fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
@ -1434,7 +1415,6 @@ packages:
minimatch: 3.1.2
once: 1.4.0
path-is-absolute: 1.0.1
dev: true
/glob@8.1.0:
resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
@ -1476,7 +1456,6 @@ packages:
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
dev: true
/graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
@ -1521,11 +1500,9 @@ packages:
dependencies:
once: 1.4.0
wrappy: 1.0.2
dev: true
/inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
dev: true
/is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
@ -1566,7 +1543,6 @@ packages:
resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
dependencies:
'@types/estree': 1.0.3
dev: true
/isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@ -1639,7 +1615,6 @@ packages:
/locate-character@3.0.0:
resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
dev: true
/locate-path@6.0.0:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
@ -1673,23 +1648,14 @@ packages:
yallist: 4.0.0
dev: true
/magic-string@0.27.0:
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/magic-string@0.30.5:
resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
dev: true
/merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
@ -1707,7 +1673,6 @@ packages:
/min-indent@1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
dev: true
/mini-svg-data-uri@1.4.4:
resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
@ -1718,7 +1683,6 @@ packages:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies:
brace-expansion: 1.1.11
dev: true
/minimatch@5.1.6:
resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
@ -1729,14 +1693,12 @@ packages:
/minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
dev: true
/mkdirp@0.5.6:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
dependencies:
minimist: 1.2.8
dev: true
/mlly@1.4.2:
resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==}
@ -1773,7 +1735,6 @@ packages:
resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
dev: true
/natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
@ -1807,7 +1768,6 @@ packages:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies:
wrappy: 1.0.2
dev: true
/optionator@0.9.3:
resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
@ -1857,7 +1817,6 @@ packages:
/path-is-absolute@1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
dev: true
/path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
@ -1887,11 +1846,9 @@ packages:
'@types/estree': 1.0.3
estree-walker: 3.0.3
is-reference: 3.0.2
dev: true
/picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
dev: true
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@ -2043,7 +2000,6 @@ packages:
nanoid: 3.3.6
picocolors: 1.0.0
source-map-js: 1.0.2
dev: true
/prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
@ -2135,7 +2091,6 @@ packages:
hasBin: true
dependencies:
glob: 7.2.3
dev: true
/rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
@ -2172,7 +2127,6 @@ packages:
graceful-fs: 4.2.11
mkdirp: 0.5.6
rimraf: 2.7.1
dev: true
/semver@7.5.4:
resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
@ -2224,12 +2178,10 @@ packages:
buffer-crc32: 0.2.13
minimist: 1.2.8
sander: 0.5.1
dev: true
/source-map-js@1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'}
dev: true
/stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
@ -2251,7 +2203,6 @@ packages:
engines: {node: '>=8'}
dependencies:
min-indent: 1.0.1
dev: true
/strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
@ -2303,7 +2254,7 @@ packages:
picocolors: 1.0.0
sade: 1.8.1
svelte: 4.2.2
svelte-preprocess: 5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2)
svelte-preprocess: 5.1.3(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2)
typescript: 5.2.2
transitivePeerDependencies:
- '@babel/core'
@ -2343,21 +2294,21 @@ packages:
svelte: 4.2.2
dev: true
/svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2):
resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==}
engines: {node: '>= 14.10.0'}
/svelte-preprocess@5.1.3(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2):
resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==}
engines: {node: '>= 16.0.0', pnpm: ^8.0.0}
requiresBuild: true
peerDependencies:
'@babel/core': ^7.10.2
coffeescript: ^2.5.1
less: ^3.11.3 || ^4.0.0
postcss: ^7 || ^8
postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
pug: ^3.0.0
sass: ^1.26.8
stylus: ^0.55.0
sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0
svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0
svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0'
peerDependenciesMeta:
'@babel/core':
@ -2383,13 +2334,12 @@ packages:
dependencies:
'@types/pug': 2.0.8
detect-indent: 6.1.0
magic-string: 0.27.0
magic-string: 0.30.5
postcss: 8.4.31
sorcery: 0.11.0
strip-indent: 3.0.0
svelte: 4.2.2
typescript: 5.2.2
dev: true
/svelte@4.2.2:
resolution: {integrity: sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==}
@ -2408,7 +2358,6 @@ packages:
locate-character: 3.0.0
magic-string: 0.30.5
periscopic: 3.1.0
dev: true
/tailwindcss@3.3.3:
resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==}
@ -2529,7 +2478,6 @@ packages:
resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==}
engines: {node: '>=14.17'}
hasBin: true
dev: true
/ufo@1.3.1:
resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==}
@ -2730,7 +2678,6 @@ packages:
/wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
dev: true
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}

View File

@ -2,7 +2,7 @@
<html lang="en" class="light">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width" />
%sveltekit.head%
<link
@ -12,6 +12,18 @@
type="font/ttf"
crossorigin
/>
<link rel="apple-touch-icon" sizes="180x180" href="%sveltekit.assets%/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="%sveltekit.assets%/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="%sveltekit.assets%/favicon-16x16.png">
<link rel="manifest" href="%sveltekit.assets%/site.webmanifest">
<link rel="mask-icon" href="%sveltekit.assets%/safari-pinned-tab.svg" color="#ec4899">
<meta name="apple-mobile-web-app-title" content="KKosmeticky Salon">
<meta name="application-name" content="KKosmeticky Salon">
<meta name="msapplication-TileColor" content="#ec4899">
<meta name="theme-color" content="#ec4899">
</head>
<body data-sveltekit-preload-data="hover" data-theme="modern">
<div style="display: contents" class="h-full overflow-hidden">%sveltekit.body%</div>

View File

@ -0,0 +1,3 @@
<script lang="ts">
</script>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,15 @@
<footer
class="page-footer bg-surface-50 dark:bg-surface-900 border-t border-surface-500/10 text-xs mt-4 md:text-base"
>
<div
class="w-full max-w-7xl mx-auto p-4 py-8 md:py-12 space-y-10 flex items-center justify-center"
>
<!-- <div class="container px-5 py-8 mx-auto flex items-center sm:flex-row flex-col"> -->
<a class="flex items-center md:justify-start justify-center" href="/">
<img class="w-4 h-4 md:w-8 md:h-8" src="/images/Logo.png" alt="logo" />
<p class="sm:pl-4 text-base sm:py-2 sm:mt-0 mt-4">© 2023 Klára Morinová</p>
<a href="https://github.com/matthieu42morin" class="sm:pl-4 text-base sm:py-2 sm:mt-0 mt-4">Web vyvíjel Matthieu Morin</a>
</a>
</div>
<hr class="opacity-20" />
</footer>

View File

@ -0,0 +1,43 @@
<script lang="ts">
import { AppBar, LightSwitch } from '@skeletonlabs/skeleton';
import * as config from '$lib/config';
import Logo from '$lib/components/Logo.svelte';
</script>
<AppBar>
<!-- Left-side Header -->
<svelte:fragment slot="lead">
<a class="lg:!ml-0 w-8 lg:w-auto overflow-hidden" href="/" title="Logo {config.title}">
<Logo clazz="w-[325px] h-8 md:h-16"/>
</a>
</svelte:fragment>
<!-- Right-side Header -->
<svelte:fragment slot="trail">
<!-- Links -->
<a href="/blog">Blog</a>
<a href="/projects">Projects</a>
<a href="/about">About</a>
<!-- Social -->
<section class="hidden sm:inline-flex space-x-1">
<a
class="btn-icon hover:variant-soft-primary"
href="{config.instagram}"
target="_blank"
rel="noreferrer"
>
<i class="fa-brands fa-instagram text-lg" />
</a>
<a
class="btn-icon hover:variant-soft-primary"
href="{config.facebook}"
target="_blank"
rel="noreferrer"
>
<i class="fa-brands fa-facebook text-lg" />
</a>
</section>
</svelte:fragment>
</AppBar>

View File

@ -9,11 +9,7 @@ const benefits: string[] = [
<section class="container mx-auto flex flex-col items-center px-8 py-36 sm:flex-row-reverse sm:px-12">
<div class="mb-8 w-full sm:mb-0 sm:w-1/2 sm:pl-4 md:pl-16">
<img
alt="Hanging out with friends"
class="rounded-lg sm:rounded-br-[80px] sm:rounded-tl-[120px]"
src="/images/hero.webp"
/>
</div>
<div class="mr-4 w-full text-center sm:w-1/2 sm:text-left">
<h1 class="mb-6 text-3xl font-bold leading-tight dark:text-slate-50 md:text-4xl">

View File

@ -0,0 +1,12 @@
<script lang="ts">
import type Product
</script>
<container class="container">
<section>
<header>
<img class="w-max h-max" src=`${product.image}` alt=`${product.name}`>
</header>
</section>
</container>

View File

@ -0,0 +1,38 @@
<script lang="ts">
import type { Service } from '$lib/types/service';
export let services: Service[] = [];
</script>
<div class="grid md:grid-cols-3 gap-4 p-4">
{#each services as service}
<div class="overflow-hidden rounded-lg shadow-lg hover:shadow-xl transition-shadow">
<div class="p-6">
<h1 class="text-center font-semibold text-xl mb-4">{service.category}</h1>
{#each service.items as item}
<div class="flex border-b border-gray-200 last:border-b-0 p-4 hover:bg-gray-100">
<div class="flex-none w-24 h-24 bg-cover bg-center rounded-lg" style="background-image: url('/images/services/{item.id}');"></div>
<div class="flex-grow p-3">
<h4 class="font-semibold">{item.name}</h4>
<p class="text-gray-600">{item.description}</p>
</div>
<div class="flex-none text-right">
<p class="text-lg font-semibold">
{typeof item.price === 'number' ? `${item.price},-` : item.price}
</p>
<a href="https://app.cal.com/kkosmetickysalon/{item.id}" class="text-indigo-600 hover:text-indigo-800">Objednejte se</a>
</div>
</div>
{/each}
</div>
</div>
{/each}
</div>
<style lang="postcss">
service-card {
@apply grid gap-4 p-4};
@media (max-width: 768px) {
@apply grid-cols-1;
}
</style>

View File

@ -0,0 +1,33 @@
<section class="text-gray-600 body-font">
<div class="container px-5 py-24 mx-auto">
<div class="flex flex-wrap -m-4">
<div class="lg:w-1/3 lg:mb-0 mb-6 p-4">
<div class="h-full text-center">
<img alt="testimonial" class="w-20 h-20 mb-8 object-cover object-center rounded-full inline-block border-2 border-gray-200 bg-gray-100" src="https://dummyimage.com/302x302">
<p class="leading-relaxed">Edison bulb retro cloud bread echo park, helvetica stumptown taiyaki taxidermy 90's cronut +1 kinfolk. Single-origin coffee ennui shaman taiyaki vape DIY tote bag drinking vinegar cronut adaptogen squid fanny pack vaporware.</p>
<span class="inline-block h-1 w-10 rounded bg-indigo-500 mt-6 mb-4"></span>
<h2 class="text-gray-900 font-medium title-font tracking-wider text-sm">HOLDEN CAULFIELD</h2>
<p class="text-gray-500">Senior Product Designer</p>
</div>
</div>
<div class="lg:w-1/3 lg:mb-0 mb-6 p-4">
<div class="h-full text-center">
<img alt="testimonial" class="w-20 h-20 mb-8 object-cover object-center rounded-full inline-block border-2 border-gray-200 bg-gray-100" src="https://dummyimage.com/300x300">
<p class="leading-relaxed">Edison bulb retro cloud bread echo park, helvetica stumptown taiyaki taxidermy 90's cronut +1 kinfolk. Single-origin coffee ennui shaman taiyaki vape DIY tote bag drinking vinegar cronut adaptogen squid fanny pack vaporware.</p>
<span class="inline-block h-1 w-10 rounded bg-indigo-500 mt-6 mb-4"></span>
<h2 class="text-gray-900 font-medium title-font tracking-wider text-sm">ALPER KAMU</h2>
<p class="text-gray-500">UI Develeoper</p>
</div>
</div>
<div class="lg:w-1/3 lg:mb-0 p-4">
<div class="h-full text-center">
<img alt="testimonial" class="w-20 h-20 mb-8 object-cover object-center rounded-full inline-block border-2 border-gray-200 bg-gray-100" src="https://dummyimage.com/305x305">
<p class="leading-relaxed">Edison bulb retro cloud bread echo park, helvetica stumptown taiyaki taxidermy 90's cronut +1 kinfolk. Single-origin coffee ennui shaman taiyaki vape DIY tote bag drinking vinegar cronut adaptogen squid fanny pack vaporware.</p>
<span class="inline-block h-1 w-10 rounded bg-indigo-500 mt-6 mb-4"></span>
<h2 class="text-gray-900 font-medium title-font tracking-wider text-sm">HENRY LETHAM</h2>
<p class="text-gray-500">CTO</p>
</div>
</div>
</div>
</div>
</section>

10
src/lib/config.ts Normal file
View File

@ -0,0 +1,10 @@
import { dev } from '$app/environment';
export const title = "KkosmetickySalon";
export const description = 'Salon kosmetiky, krásy, půvabu, kde se můžete nechat hýčkat a zkrášlovat.';
export const url = dev ? 'http://localhost:5174' : 'https://kkosmetickysalon.cz';
export const author = 'Klára Morinová';
export const email = 'klara@kkosmetickysalon.cz';
export const facebook = 'https://www.facebook.com/jack.morin.712';
export const instagram = 'https://www.instagram.com/kkosmetickysalon/';

8
src/lib/types/product.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
export type Product = {
id: string;
name: string;
price: number;
description: string;
image: string;
url: string;
}

10
src/lib/types/service.ts Normal file
View File

@ -0,0 +1,10 @@
export type Service = {
category: string;
items: {
name: string;
description: string;
id: string;
price: number | string;
duration: number | string;
}[];
};

View File

@ -1,6 +1,6 @@
<script lang="ts">
import '../app.postcss';
import { AppShell, AppBar, LightSwitch } from '@skeletonlabs/skeleton';
import { AppShell } from '@skeletonlabs/skeleton';
import { page } from '$app/stores';
// Floating UI for Popups
@ -9,8 +9,9 @@
storePopup.set({ computePosition, autoUpdate, flip, shift, offset, arrow });
// Components
import Logo from '$lib/components/Logo.svelte';
import Cookies from '$lib/components/Cookies.svelte';
import MainHeader from '$lib/components/MainHeader.svelte';
import MainFooter from '$lib/components/MainFooter.svelte';
// SEO Meta tags
const metaDefaults = {
@ -38,7 +39,7 @@
const elemTarget: HTMLElement | null = document.querySelector(window.location.hash);
if (elemTarget) elemTarget.scrollIntoView({ behavior: 'smooth' });
};
</script>
</script>
<!-- SEO Meta tags -->
<svelte:head>
<title>{meta.title}</title>
@ -67,21 +68,19 @@
<meta name="twitter:image" content={meta.twitter.image} />
</svelte:head>
<!-- <Analytics />
-->
<!-- App Shell -->
<AppShell>
<svelte:fragment slot="header">
<!-- App Bar -->
<AppBar>
<svelte:fragment slot="lead">
<Logo/>
<strong class="text-xl uppercase">BeautySalon</strong>
</svelte:fragment>
<svelte:fragment slot="trail">
<LightSwitch/>
</svelte:fragment>
</AppBar>
<MainHeader />
</svelte:fragment>
<!-- Page Route Content -->
<slot />
<svelte:fragment slot="pageFooter">
<MainFooter />
</svelte:fragment>
</AppShell>
<!-- <CookieConsent />
<Segment /> -->

View File

View File

View File

@ -0,0 +1,68 @@
<script lang="ts">
import ServiceCard from '$lib/components/products/ServicesLayout.svelte';
import type { Service } from '$lib/types/service';
// Sample data, replace this with your actual data fetching logic
let services: Service[] = [
{
category: 'Permanentní make-up',
items: [
{ name: 'Obočí Pudrové, Ombré', id: 'oboci',price: 3000, duration: 2.5 },
{ name: 'Horní linky - meziřasové přirozené', id: 'linky', price: 2000, duration: 2 },
{ name: 'Klasické linky - s ocáskem', id: 'classic-linky', price: 3000, duration: 2.5 },
{ name: 'Klasické linky - s ocáskem + spodní linky', id: 'classic-linky+spodni', price: 3500, duration: 2.5 },
{ name: 'Rty - kontura', id: 'rty', price: 2500, duration: 2 },
{ name: '3D Rty (kontura a stínování), Full Lips (plné rty)', id: '3d-rty', price: 3500, duration: 2.5 },
{ name: 'Aquarelle Lips (přirodní stínování, bez kontury)', id: 'aquarelle', price: 3000, duration: 2 },
{ name: 'První korekce po aplikaci pmu max. do 3měsíců', id: 'korekce', price: 1000, duration: 1.5 },
{ name: 'Oprava práce obočí jiného salonu', id: 'oprava-oboci', price: 'na domluve', duration: 'na domluve' }
],
},
{
category: 'Kosmetické ošetření',
items: [
{ name: 'ZÁKLADNÍ CALM', id: 'zakladni-calm', price: 500, duration: 1 },
{ name: 'ZÁKLADNÍ + CALM PLUS', id: 'zakladni-calm-plus', price: 600, duration: 1 },
{ name: 'RELAXAČNÍ', id: 'relaxacni', price: 690, duration: 1.5 },
{ name: 'LIFTINGOVÉ -ANTI AGE', id: 'liftingove-anti-age', price: 690, duration: 1.5 },
{ name: 'CLEAR + ANTI AKNÉ', id: 'clear-anti-akne', price: 690, duration: 1.5 },
{ name: 'Odlíčení+sérum+alginátová maska (PROJASNĚNÍ)', id: 'odliceni-serum-alginatova-maska', price: 300, duration: 1 },
]
},
{
category: 'DALŠÍ VELMI OBLÍBENÉ SLUŽBY',
items: [
{ name: 'Lifting řas booster (botox)', id: 'lifting-ras-booster', price: 500, duration: 1 },
{ name: 'Laminace obočí + výživa', id: 'laminace-oboci-vyziva', price: 500, duration: 1 },
{ name: 'Úprava obočí (tvar+barva)', id: 'uprava-oboci-tvar-barva', price: 250, duration: 1 },
{ name: 'Úprava obočí + řasy (tvar + barvení)', id: 'uprava-oboci-rasy-tvar-barveni', price: 300, duration: 1 },
]
},
{
category: 'Depilace',
items: [
{ name: 'Depilace Horní ret', id: 'depilace-horni-ret', price: 80, duration: 0.5 },
{ name: 'Depilace Brada', id: 'depilace-brada', price: 80, duration: 0.5 },
{ name: 'Depilace Obočí', id: 'depilace-oboci', price: 150, duration: 0.5 },
{ name: 'Depilace Tváře', id: 'depilace-tvare', price: 150, duration: 0.5 },
{ name: 'Depilace Podpaží', id: 'depilace-podpazi', price: 150, duration: 0.5 },
{ name: 'Depilace Předloktí', id: 'depilace-predlokti', price: 200, duration: 0.5 },
{ name: 'Depilace Celé ruce', id: 'depilace-cele-ruce', price: 350, duration: 1 },
{ name: 'Depilace Lýtka', id: 'depilace-lytka', price: 350, duration: 1 },
{ name: 'Depilace Celé nohy', id: 'depilace-cele-nohy', price: 500, duration: 1 }
]
},
{
category: 'Vakuslim 48 - zeštíhlující procedura',
items: [
{ name: 'Vakuslim 48 zeštíhlující procedura 1 ošetření horních končetin', id: 'vakuslim-48-zestihlujici-procedura-horni-koncetiny', price: 600, duration: 2 },
{ name: 'Vakuslim 48 zeštíhlující procedura 1ošetření spodní části těla (břicho, boky, dolní končetiny)', id: 'vakuslim-48-zestihlujici-procedura-spodni-cast-tela', price: 800, duration: 2 },
{ name: 'Vakuslim 48 zeštíhlující procedura 1 ošetření komplet horní-dolní části', id: 'vakuslim-48-zestihlujici-procedura-komplet-horni-dolni-cast', price: 1200, duration: 2 },
{ name: 'Vakuslim 48 zeštíhlující procedura 6 ošetření předplatné kompet', id: 'vakuslim-48-zestihlujici-procedura-6-o-setreni-predplatne-kompet', price: 6600, duration: 2 },
{ name: 'Vakuslim 48 zeštíhlující procedura 12 ošetření předplatné komplet', id: 'vakuslim-48-zestihlujici-procedura-12-o-setreni-predplatne-komplet', price: 11000, duration: 2 }
]
}
];
</script>
<ServiceCard {services} />

View File

@ -1,5 +1,6 @@
import adapter from '@sveltejs/adapter-auto';
import { vitePreprocess } from '@sveltejs/kit/vite';
import preprocess from 'svelte-preprocess';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
@ -10,6 +11,9 @@ const config = {
// Consult https://github.com/sveltejs/svelte-preprocess
// for more information about preprocessors
preprocess: [
preprocess({
postcss: true
}),
vitePreprocess({
style: {
css: {