commit 4528583b7129cfa7ef2657f6cb3ce02b0d588cb1 Author: Jose Jimenez Date: Sun Feb 1 13:45:21 2026 +0100 Initial commit. Basic spirit selector plus recipes data crossing. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.pretierrc b/.pretierrc new file mode 100644 index 0000000..d65b421 --- /dev/null +++ b/.pretierrc @@ -0,0 +1,10 @@ +{ + "semi": true, + "trailingComma": "es5", + "singleQuote": true, + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..136284c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Jose Jimenez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/index.html b/index.html new file mode 100644 index 0000000..c65f83f --- /dev/null +++ b/index.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + Licores son Amores + + +
+
+

Licores son Amores

+

Descubre qué cócteles puedes preparar

+
+ +
+

Tus Licores

+
+
+ +
+ +
+

Recetas Disponibles

+
+

Selecciona tus licores y presiona "¡A Mezclar!" para descubrir qué cócteles puedes preparar.

+
+
+
+

Advertencia ⚠️

+
+

El consumo de alcohol está prohibido a menores de 18 años 🔞

+

No te recomiendo el consumo de alcohol en general 🚱

+

Si vas a consumir alcohol siempre con moderación 🍷✋

+
+
+
+ + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..876aefa --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1121 @@ +{ + "name": "licores-son-amores", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "licores-son-amores", + "version": "0.0.0", + "devDependencies": { + "prettier": "^3.8.1", + "vite": "^7.2.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a6231f9 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "licores-son-amores", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "format": "prettier --write \"src/**/*.{js,json,css,md}\"", + "format:check": "prettier --check \"src/**/*.{js,json,css,md}\"" + }, + "devDependencies": { + "prettier": "^3.8.1", + "vite": "^7.2.4" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/data.json b/src/data.json new file mode 100644 index 0000000..1be858c --- /dev/null +++ b/src/data.json @@ -0,0 +1,534 @@ +{ + "spirits": [ + { + "name": "Tanqueray", + "brand": "Tanqueray", + "type": "ginebra" + }, + { + "name": "Beefeater", + "brand": "Beefeater", + "type": "ginebra" + }, + { + "name": "Hendrick's", + "brand": "Hendrick's", + "type": "ginebra" + }, + { + "name": "Bacardí Blanco", + "brand": "Bacardí", + "type": "ron" + }, + { + "name": "Havana Club", + "brand": "Havana Club", + "type": "ron" + }, + { + "name": "Absolut", + "brand": "Absolut", + "type": "vodka" + }, + { + "name": "Smirnoff", + "brand": "Smirnoff", + "type": "vodka" + }, + { + "name": "Jack Daniel's", + "brand": "Jack Daniel's", + "type": "whisky" + }, + { + "name": "Johnnie Walker", + "brand": "Johnnie Walker", + "type": "whisky" + }, + { + "name": "José Cuervo", + "brand": "José Cuervo", + "type": "tequila" + }, + { + "name": "Patrón", + "brand": "Patrón", + "type": "tequila" + }, + { + "name": "Martini Rosso", + "brand": "Martini", + "type": "vermut" + }, + { + "name": "Martini Bianco", + "brand": "Martini", + "type": "vermut" + }, + { + "name": "Baileys", + "brand": "Baileys", + "type": "licor-crema" + }, + { + "name": "Cointreau", + "brand": "Cointreau", + "type": "licor-naranja" + }, + { + "name": "Campari", + "brand": "Campari", + "type": "aperitivo" + }, + { + "name": "Jägermeister", + "brand": "Jägermeister", + "type": "licor-hierbas" + }, + { + "name": "Licor 43", + "brand": "Licor 43", + "type": "licor-hierbas" + }, + { + "name": "Kahlúa", + "brand": "Kahlúa", + "type": "licor-cafe" + } + ], + "recipes": [ + { + "name": "Gin Tonic", + "ingredients": [ + { + "type": "ginebra", + "name": "Ginebra", + "amount": "50 ml", + "isAlcohol": true + }, + { + "type": "tonica", + "name": "Tónica", + "amount": "150 ml", + "isAlcohol": false + } + ], + "instructions": "Servir la ginebra en un vaso largo con hielo, añadir la tónica y decorar con rodaja de limón o pepino." + }, + { + "name": "Mojito", + "ingredients": [ + { + "type": "ron", + "name": "Ron blanco", + "amount": "50 ml", + "isAlcohol": true + }, + { + "type": "menta", + "name": "Hojas de menta", + "isAlcohol": false + }, + { + "type": "azucar", + "name": "Azúcar", + "amount": "2 cditas", + "isAlcohol": false + }, + { + "type": "lima", + "name": "Lima", + "amount": "1/2 unidad", + "isAlcohol": false + }, + { + "type": "soda", + "name": "Soda", + "amount": "Top", + "isAlcohol": false + } + ], + "instructions": "Machacar menta con azúcar y lima, añadir el ron, hielo y soda. Remover suavemente." + }, + { + "name": "Moscow Mule", + "ingredients": [ + { + "type": "vodka", + "name": "Vodka", + "amount": "50 ml", + "isAlcohol": true + }, + { + "type": "lima", + "name": "Zumo de lima", + "amount": "15 ml", + "isAlcohol": false + }, + { + "type": "ginger-beer", + "name": "Ginger beer", + "amount": "120 ml", + "isAlcohol": false + } + ], + "instructions": "Mezclar vodka con zumo de lima y ginger beer en vaso de cobre con hielo. Decorar con lima." + }, + { + "name": "Whisky Sour", + "ingredients": [ + { + "type": "whisky", + "name": "Whisky", + "amount": "60 ml", + "isAlcohol": true + }, + { + "type": "limon", + "name": "Zumo de limón", + "amount": "30 ml", + "isAlcohol": false + }, + { + "type": "jarabe", + "name": "Jarabe simple", + "amount": "15 ml", + "isAlcohol": false + }, + { + "type": "clara-huevo", + "name": "Clara de huevo", + "amount": "Opcional", + "isAlcohol": false + } + ], + "instructions": "Mezclar whisky con zumo de limón y jarabe simple. Agitar con hielo y servir. Opcional: clara de huevo." + }, + { + "name": "Margarita", + "ingredients": [ + { + "type": "tequila", + "name": "Tequila", + "amount": "50 ml", + "isAlcohol": true + }, + { + "type": "licor-naranja", + "name": "Cointreau", + "amount": "25 ml", + "isAlcohol": true + }, + { + "type": "lima", + "name": "Zumo de lima", + "amount": "25 ml", + "isAlcohol": false + }, + { + "type": "sal", + "name": "Sal", + "amount": "Para escarchar", + "isAlcohol": false + } + ], + "instructions": "Mezclar tequila, Cointreau y zumo de lima. Servir en copa con borde escarchado de sal." + }, + { + "name": "Negroni", + "ingredients": [ + { + "type": "ginebra", + "name": "Ginebra", + "amount": "30 ml", + "isAlcohol": true + }, + { + "type": "vermut", + "name": "Vermut rosso", + "amount": "30 ml", + "isAlcohol": true + }, + { + "type": "aperitivo", + "name": "Campari", + "amount": "30 ml", + "isAlcohol": true + }, + { + "type": "naranja", + "name": "Rodaja de naranja", + "isAlcohol": false + } + ], + "instructions": "Mezclar partes iguales en vaso con hielo. Decorar con naranja." + }, + { + "name": "Americano", + "ingredients": [ + { + "type": "vermut", + "name": "Vermut rosso", + "amount": "45 ml", + "isAlcohol": true + }, + { + "type": "aperitivo", + "name": "Campari", + "amount": "45 ml", + "isAlcohol": true + }, + { + "type": "soda", + "name": "Soda", + "amount": "Top", + "isAlcohol": false + }, + { + "type": "naranja", + "name": "Rodaja de naranja", + "isAlcohol": false + } + ], + "instructions": "Mezclar vermut y Campari en vaso con hielo, completar con soda. Decorar con naranja." + }, + { + "name": "White Russian", + "ingredients": [ + { + "type": "vodka", + "name": "Vodka", + "amount": "40 ml", + "isAlcohol": true + }, + { + "type": "licor-cafe", + "name": "Kahlúa", + "amount": "20 ml", + "isAlcohol": true + }, + { + "type": "nata", + "name": "Nata fresca", + "amount": "30 ml", + "isAlcohol": false + } + ], + "instructions": "Mezclar vodka y Kahlúa con hielo, añadir nata fresca flotando encima." + }, + { + "name": "Espresso Martini", + "ingredients": [ + { + "type": "vodka", + "name": "Vodka", + "amount": "50 ml", + "isAlcohol": true + }, + { + "type": "licor-cafe", + "name": "Kahlúa", + "amount": "25 ml", + "isAlcohol": true + }, + { + "type": "cafe", + "name": "Café expreso", + "amount": "30 ml", + "isAlcohol": false + } + ], + "instructions": "Agitar vodka, Kahlúa y café expreso recién hecho con hielo. Servir en copa de martini." + }, + { + "name": "Carajillo", + "ingredients": [ + { + "type": "licor-hierbas", + "name": "Licor 43", + "amount": "40 ml", + "isAlcohol": true + }, + { + "type": "cafe", + "name": "Café expreso", + "amount": "30 ml", + "isAlcohol": false + } + ], + "instructions": "Servir Licor 43 con café expreso caliente. Se puede flamear opcionalmente." + }, + { + "name": "Baileys con Café", + "ingredients": [ + { + "type": "licor-crema", + "name": "Baileys", + "amount": "50 ml", + "isAlcohol": true + }, + { + "type": "cafe", + "name": "Café caliente", + "amount": "120 ml", + "isAlcohol": false + } + ], + "instructions": "Añadir Baileys a café caliente. Perfecto como postre líquido." + }, + { + "name": "Old Fashioned", + "ingredients": [ + { + "type": "whisky", + "name": "Whisky", + "amount": "60 ml", + "isAlcohol": true + }, + { + "type": "azucar", + "name": "Azúcar", + "amount": "1 terrón", + "isAlcohol": false + }, + { + "type": "angostura", + "name": "Angostura", + "amount": "2 gotas", + "isAlcohol": false + }, + { + "type": "naranja", + "name": "Rodaja de naranja", + "isAlcohol": false + } + ], + "instructions": "Mezclar whisky con azúcar, angostura y una rodaja de naranja. Servir con hielo grande." + }, + { + "name": "Tequila Sunrise", + "ingredients": [ + { + "type": "tequila", + "name": "Tequila", + "amount": "50 ml", + "isAlcohol": true + }, + { + "type": "naranja", + "name": "Zumo de naranja", + "amount": "120 ml", + "isAlcohol": false + }, + { + "type": "granadina", + "name": "Granadina", + "amount": "15 ml", + "isAlcohol": false + } + ], + "instructions": "Mezclar tequila con zumo de naranja, añadir granadina lentamente para crear efecto amanecer." + }, + { + "name": "Daiquiri", + "ingredients": [ + { + "type": "ron", + "name": "Ron blanco", + "amount": "60 ml", + "isAlcohol": true + }, + { + "type": "lima", + "name": "Zumo de lima", + "amount": "30 ml", + "isAlcohol": false + }, + { + "type": "jarabe", + "name": "Jarabe simple", + "amount": "15 ml", + "isAlcohol": false + } + ], + "instructions": "Agitar ron con zumo de lima y jarabe simple. Servir en copa fría." + }, + { + "name": "Martini", + "ingredients": [ + { + "type": "ginebra", + "name": "Ginebra", + "amount": "60 ml", + "isAlcohol": true + }, + { + "type": "vermut", + "name": "Vermut seco", + "amount": "10 ml", + "isAlcohol": true + }, + { + "type": "aceituna", + "name": "Aceituna o twist de limón", + "isAlcohol": false + } + ], + "instructions": "Mezclar ginebra y vermut con hielo, colar en copa fría. Decorar con aceituna o twist de limón." + }, + { + "name": "Cosmopolitan", + "ingredients": [ + { + "type": "vodka", + "name": "Vodka", + "amount": "40 ml", + "isAlcohol": true + }, + { + "type": "licor-naranja", + "name": "Cointreau", + "amount": "15 ml", + "isAlcohol": true + }, + { + "type": "lima", + "name": "Zumo de lima", + "amount": "15 ml", + "isAlcohol": false + }, + { + "type": "arandanos", + "name": "Zumo de arándanos", + "amount": "30 ml", + "isAlcohol": false + } + ], + "instructions": "Agitar vodka, Cointreau, zumo de lima y arándanos. Servir en copa de martini." + }, + { + "name": "Cuba Libre", + "ingredients": [ + { + "type": "ron", + "name": "Ron", + "amount": "50 ml", + "isAlcohol": true + }, + { + "type": "coca-cola", + "name": "Coca-cola", + "amount": "120 ml", + "isAlcohol": false + }, + { + "type": "lima", + "name": "Zumo de lima", + "amount": "10 ml", + "isAlcohol": false + } + ], + "instructions": "Mezclar ron con coca-cola y zumo de lima. Servir con hielo y rodaja de lima." + } + ] +} diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..e73587f --- /dev/null +++ b/src/main.js @@ -0,0 +1,172 @@ +import "./styles.css"; +import data from "./data.json"; +let spiritsData = []; +let recipesData = []; + +// Cargar datos desde JSON +async function loadData() { + console.log("data"); + console.log(data); + try { + spiritsData = data.spirits; + recipesData = data.recipes; + renderSpirits(); + } catch (error) { + console.error("Error cargando datos:", error); + document.getElementById("spiritsGrid").innerHTML = + '

Error al cargar los datos. Asegúrate de que data.json está disponible.

'; + } +} + +function renderSpirits() { + const grid = document.getElementById("spiritsGrid"); + grid.innerHTML = spiritsData + .map( + (spirit, index) => ` +
+ +
${spirit.name}
+
${spirit.brand}
+
${spirit.type}
+
+ `, + ) + .join(""); + // Add toggle logic to cards + spiritsData.map((spirit, index) => { + grid.querySelector(`#spirit-${index}`).addEventListener("click", (e) => { + toggleSpirit(index); + }); + }); + // Add recipes crossing to mix button + const section = document.getElementsByClassName("section"); + if (section && section.length > 0) { + section[0].querySelector(".mix-button").addEventListener("click", (e) => { + findRecipes(); + }); + } +} + +function toggleSpirit(index) { + const card = document.getElementById(`spirit-${index}`); + const checkbox = document.getElementById(`check-${index}`); + checkbox.checked = !checkbox.checked; + card.classList.toggle("selected"); + + // Check enable/disable mix button on card toggle + updateMixButtonStatus(); +} + +function updateMixButtonStatus() { + const section = document.getElementsByClassName("section"); + const selected = getSelectedSpirits(); + if (section && section.length > 0) { + section[0].querySelector(".mix-button").disabled = selected.length === 0; + } +} + +function getSelectedSpirits() { + const selectedSpirits = []; + spiritsData.forEach((spirit, index) => { + const checkbox = document.getElementById(`check-${index}`); + if (checkbox.checked) { + selectedSpirits.push(spirit.type); + } + }); + return selectedSpirits; +} + +function findRecipes() { + const selectedSpirits = getSelectedSpirits(); + if (selectedSpirits.length === 0) { + document.getElementById("recipesContainer").innerHTML = + '

Por favor, selecciona al menos un licor para encontrar recetas.

'; + return; + } + + const availableRecipes = recipesData.filter((recipe) => { + const alcoholIngredients = recipe.ingredients.filter( + (ing) => ing.isAlcohol, + ); + return alcoholIngredients.every((ingredient) => + selectedSpirits.includes(ingredient.type), + ); + }); + + renderRecipes(availableRecipes); + + document.getElementById("recipesContainer").scrollIntoView({ + behavior: "smooth", + block: "start", + }); +} + +function renderRecipes(recipes) { + const container = document.getElementById("recipesContainer"); + + if (recipes.length === 0) { + container.innerHTML = + '

No se encontraron recetas con los licores seleccionados. ¡Intenta agregar más licores!

'; + return; + } + + container.innerHTML = recipes + .map((recipe) => { + const alcoholIngredients = recipe.ingredients.filter( + (ing) => ing.isAlcohol, + ); + const nonAlcoholIngredients = recipe.ingredients.filter( + (ing) => !ing.isAlcohol, + ); + + return ` +
+
${recipe.name}
+
+ ${alcoholIngredients + .map( + (ing) => ` +
+ ${ing.amount} + ${ing.name} +
+ `, + ) + .join("")} + ${ + nonAlcoholIngredients.length > 0 + ? ` +
+
Otros ingredientes:
+ ${nonAlcoholIngredients + .map( + (ing) => ` +
+ ${ing.amount ? `${ing.amount}` : ""} + ${ing.name} +
+ `, + ) + .join("")} +
+ ` + : "" + } +
+ ${ + recipe.instructions + ? ` +
+ Preparación: ${recipe.instructions} +
+ ` + : "" + } +
+ `; + }) + .join(""); +} + +// Inicializar al cargar la página +document.addEventListener("DOMContentLoaded", loadData); diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..0285e57 --- /dev/null +++ b/src/styles.css @@ -0,0 +1,389 @@ +:root { + --cognac: #8b4513; + --amber: #d4a574; + --cream: #f5e6d3; + --olive: #556b2f; + --deep-red: #8b1538; + --shadow: rgba(107, 70, 40, 0.3); +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: "Nunito", sans-serif; + background: linear-gradient( + 135deg, + var(--cream) 0%, + #fff8e7 50%, + var(--amber) 100% + ); + background-attachment: fixed; + color: #2c1810; + line-height: 1.6; + min-height: 100vh; + position: relative; + overflow-x: hidden; +} + +body::before { + content: ""; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient( + circle at 20% 30%, + rgba(139, 69, 19, 0.03) 0%, + transparent 50% + ), + radial-gradient( + circle at 80% 70%, + rgba(213, 165, 116, 0.05) 0%, + transparent 50% + ); + pointer-events: none; + z-index: 0; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 3rem 2rem; + position: relative; + z-index: 1; +} + +header { + text-align: center; + margin-bottom: 4rem; + position: relative; +} + +h1 { + font-family: "Fredoka", sans-serif; + font-size: 4.5rem; + font-weight: 700; + color: var(--cognac); + margin-bottom: 0.5rem; + letter-spacing: -0.02em; + text-shadow: + 2px 2px 0 var(--amber), + 4px 4px 0 var(--cream); + animation: fadeInDown 0.8s ease-out; +} + +.subtitle { + font-size: 1.4rem; + color: var(--olive); + font-style: italic; + animation: fadeIn 1s ease-out 0.3s backwards; +} + +@keyframes fadeInDown { + from { + opacity: 0; + transform: translateY(-30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.section { + background: rgba(255, 255, 255, 0.85); + backdrop-filter: blur(10px); + border-radius: 20px; + padding: 2.5rem; + margin-bottom: 2rem; + box-shadow: 0 10px 40px var(--shadow); + border: 2px solid rgba(139, 69, 19, 0.1); + animation: slideUp 0.6s ease-out backwards; +} + +.section:nth-child(2) { + animation-delay: 0.2s; +} +.section:nth-child(3) { + animation-delay: 0.4s; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +h2 { + font-family: "Fredoka", sans-serif; + font-size: 2.5rem; + font-weight: 600; + color: var(--deep-red); + margin-bottom: 1.5rem; + border-bottom: 3px solid var(--amber); + padding-bottom: 0.5rem; +} + +.spirits-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 1rem; + margin-bottom: 2rem; +} + +.spirit-card { + background: linear-gradient(135deg, #fff 0%, var(--cream) 100%); + border: 2px solid var(--amber); + border-radius: 12px; + padding: 1rem; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + position: relative; + overflow: hidden; +} + +.spirit-card::before { + content: ""; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: radial-gradient( + circle, + rgba(255, 255, 255, 0.8) 0%, + transparent 70% + ); + opacity: 0; + transition: opacity 0.3s; +} + +.spirit-card:hover::before { + opacity: 1; +} + +.spirit-card:hover { + transform: translateY(-5px) scale(1.02); + box-shadow: 0 8px 25px var(--shadow); + border-color: var(--cognac); +} + +.spirit-card.selected { + background: linear-gradient(135deg, var(--cognac) 0%, var(--deep-red) 100%); + color: white; + border-color: var(--cognac); + transform: scale(1.05); +} + +.spirit-card input[type="checkbox"] { + display: none; +} + +.spirit-name { + font-family: "Fredoka", sans-serif; + font-size: 1.3rem; + font-weight: 600; + margin-bottom: 0.3rem; +} + +.spirit-brand { + font-size: 0.95rem; + opacity: 0.8; +} + +.spirit-type { + font-size: 0.85rem; + font-style: italic; + margin-top: 0.3rem; + opacity: 0.7; +} + +.mix-button { + display: block; + width: 100%; + max-width: 400px; + margin: 2rem auto; + padding: 1.2rem 3rem; + font-family: "Fredoka", sans-serif; + font-size: 1.8rem; + font-weight: 600; + background: linear-gradient(135deg, var(--deep-red) 0%, var(--cognac) 100%); + color: white; + border: none; + border-radius: 50px; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 8px 20px rgba(139, 21, 56, 0.4); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.mix-button:hover { + transform: translateY(-3px); + box-shadow: 0 12px 30px rgba(139, 21, 56, 0.5); +} + +.mix-button:active { + transform: translateY(-1px); +} + +.mix-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.recipes-container { + min-height: 200px; +} + +.recipe-card { + background: linear-gradient(135deg, #fff 0%, #fff8f0 100%); + border-left: 5px solid var(--deep-red); + border-radius: 10px; + padding: 1.5rem; + margin-bottom: 1.5rem; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); + animation: recipeAppear 0.5s ease-out backwards; +} + +.recipe-card:nth-child(1) { + animation-delay: 0.1s; +} +.recipe-card:nth-child(2) { + animation-delay: 0.2s; +} +.recipe-card:nth-child(3) { + animation-delay: 0.3s; +} +.recipe-card:nth-child(4) { + animation-delay: 0.4s; +} +.recipe-card:nth-child(5) { + animation-delay: 0.5s; +} + +@keyframes recipeAppear { + from { + opacity: 0; + transform: translateX(-20px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.recipe-name { + font-family: "Fredoka", sans-serif; + font-size: 2rem; + font-weight: 600; + color: var(--deep-red); + margin-bottom: 0.8rem; +} + +.recipe-ingredients { + margin-bottom: 1rem; +} + +.ingredient { + padding: 0.4rem 0; + font-size: 1.1rem; + border-bottom: 1px dashed rgba(139, 69, 19, 0.2); +} + +.ingredient:last-child { + border-bottom: none; +} + +.alcohol-ingredient { + font-weight: 600; +} + +.non-alcohol-section { + margin-top: 1rem; + padding-top: 1rem; + border-top: 2px solid rgba(139, 69, 19, 0.15); +} + +.non-alcohol-title { + font-family: "Fredoka", sans-serif; + font-size: 1.1rem; + color: var(--olive); + margin-bottom: 0.5rem; + font-weight: 600; +} + +.non-alcohol-ingredient { + font-weight: 400; + opacity: 0.85; + font-size: 1rem; +} + +.ingredient-amount { + color: var(--cognac); + font-weight: 600; + margin-right: 0.5rem; +} + +.recipe-instructions { + background: rgba(212, 165, 116, 0.15); + padding: 1rem; + border-radius: 8px; + font-style: italic; + margin-top: 1rem; +} + +.no-recipes { + text-align: center; + padding: 3rem; + color: var(--olive); + font-size: 1.3rem; + font-style: italic; +} + +.loading { + text-align: center; + padding: 2rem; + font-size: 1.2rem; + color: var(--cognac); +} + +@media (max-width: 768px) { + h1 { + font-size: 3rem; + } + + .spirits-grid { + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + } + + .section { + padding: 1.5rem; + } +} + +.warning-msg { + font-family: "Fredoka", sans-serif; + font-size: 1.1rem; + color: var(--olive); +}