Rafael Lopez

fix nav teclado

......@@ -10,6 +10,7 @@
"dependencies": {
"@observablehq/plot": "^0.6.17",
"@supabase/supabase-js": "^2.98.0",
"@sveltejs/adapter-node": "^5.5.4",
"d3": "^7.9.0",
"fuse.js": "^7.1.0",
"hyparquet": "^1.25.1",
......@@ -32,7 +33,6 @@
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -49,7 +49,6 @@
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -66,7 +65,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -83,7 +81,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -100,7 +97,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -117,7 +113,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -134,7 +129,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -151,7 +145,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -168,7 +161,6 @@
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -185,7 +177,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -202,7 +193,6 @@
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -219,7 +209,6 @@
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -236,7 +225,6 @@
"cpu": [
"mips64el"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -253,7 +241,6 @@
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -270,7 +257,6 @@
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -287,7 +273,6 @@
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -304,7 +289,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -321,7 +305,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -338,7 +321,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -355,7 +337,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -372,7 +353,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -389,7 +369,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -406,7 +385,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -423,7 +401,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -440,7 +417,6 @@
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -457,7 +433,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -471,7 +446,6 @@
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
......@@ -482,7 +456,6 @@
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
......@@ -493,7 +466,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
......@@ -503,14 +475,12 @@
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
......@@ -535,9 +505,109 @@
"version": "1.0.0-next.29",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
"integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
"dev": true,
"license": "MIT"
},
"node_modules/@rollup/plugin-commonjs": {
"version": "29.0.2",
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.2.tgz",
"integrity": "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==",
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
"commondir": "^1.0.1",
"estree-walker": "^2.0.2",
"fdir": "^6.2.0",
"is-reference": "1.2.1",
"magic-string": "^0.30.3",
"picomatch": "^4.0.2"
},
"engines": {
"node": ">=16.0.0 || 14 >= 14.17"
},
"peerDependencies": {
"rollup": "^2.68.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/plugin-commonjs/node_modules/is-reference": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
"integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
"license": "MIT",
"dependencies": {
"@types/estree": "*"
}
},
"node_modules/@rollup/plugin-json": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
"integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^5.1.0"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/plugin-node-resolve": {
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz",
"integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==",
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
"@types/resolve": "1.20.2",
"deepmerge": "^4.2.2",
"is-module": "^1.0.0",
"resolve": "^1.22.1"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"rollup": "^2.78.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/pluginutils": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
"integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==",
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"estree-walker": "^2.0.2",
"picomatch": "^4.0.2"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
......@@ -545,7 +615,6 @@
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -559,7 +628,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -573,7 +641,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -587,7 +654,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -601,7 +667,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -615,7 +680,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -629,7 +693,6 @@
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -643,7 +706,6 @@
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -657,7 +719,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -671,7 +732,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -685,7 +745,6 @@
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -699,7 +758,6 @@
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -713,7 +771,6 @@
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -727,7 +784,6 @@
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -741,7 +797,6 @@
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -755,7 +810,6 @@
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -769,7 +823,6 @@
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -783,7 +836,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -797,7 +849,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -811,7 +862,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -825,7 +875,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -839,7 +888,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -853,7 +901,6 @@
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -867,7 +914,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -881,7 +927,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
......@@ -892,7 +937,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
"dev": true,
"license": "MIT"
},
"node_modules/@supabase/auth-js": {
......@@ -979,7 +1023,6 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz",
"integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"acorn": "^8.9.0"
......@@ -995,11 +1038,25 @@
"@sveltejs/kit": "^2.0.0"
}
},
"node_modules/@sveltejs/adapter-node": {
"version": "5.5.4",
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.5.4.tgz",
"integrity": "sha512-45X92CXW+2J8ZUzPv3eLlKWEzINKiiGeFWTjyER4ZN4sGgNoaoeSkCY/QYNxHpPXy71QPsctwccBo9jJs0ySPQ==",
"license": "MIT",
"dependencies": {
"@rollup/plugin-commonjs": "^29.0.0",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.0",
"rollup": "^4.59.0"
},
"peerDependencies": {
"@sveltejs/kit": "^2.4.0"
}
},
"node_modules/@sveltejs/kit": {
"version": "2.53.3",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.53.3.tgz",
"integrity": "sha512-tshOeBUid2v5LAblUpatIdFm5Cyykbw2EiKWOunAAX0A/oJaR7DOdC9wLR5Qqh9zUf3QUISA2m9A3suBdQSYQg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
......@@ -1041,7 +1098,6 @@
"version": "6.2.4",
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.4.tgz",
"integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@sveltejs/vite-plugin-svelte-inspector": "^5.0.0",
......@@ -1062,7 +1118,6 @@
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz",
"integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==",
"dev": true,
"license": "MIT",
"dependencies": {
"obug": "^2.1.0"
......@@ -1352,14 +1407,12 @@
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
"dev": true,
"license": "MIT"
},
"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/@types/node": {
......@@ -1377,11 +1430,16 @@
"integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==",
"license": "MIT"
},
"node_modules/@types/resolve": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
"license": "MIT"
},
"node_modules/@types/trusted-types": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/ws": {
......@@ -1397,7 +1455,6 @@
"version": "8.16.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
......@@ -1410,7 +1467,6 @@
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz",
"integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">= 0.4"
......@@ -1420,7 +1476,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">= 0.4"
......@@ -1436,7 +1491,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
......@@ -1451,11 +1505,16 @@
"node": ">= 10"
}
},
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"license": "MIT"
},
"node_modules/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
......@@ -1866,7 +1925,6 @@
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
......@@ -1885,7 +1943,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"dev": true,
"devOptional": true,
"license": "Apache-2.0",
"engines": {
"node": ">=8"
......@@ -1895,7 +1953,6 @@
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz",
"integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==",
"dev": true,
"license": "MIT"
},
"node_modules/enhanced-resolve": {
......@@ -1912,11 +1969,19 @@
"node": ">=10.13.0"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/esbuild": {
"version": "0.27.3",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
"integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
......@@ -1958,24 +2023,27 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
"dev": true,
"license": "MIT"
},
"node_modules/esrap": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz",
"integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15"
}
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
"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"
......@@ -1993,7 +2061,6 @@
"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,
......@@ -2004,6 +2071,15 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/fuse.js": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz",
......@@ -2020,6 +2096,18 @@
"dev": true,
"license": "ISC"
},
"node_modules/hasown": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
"integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/hyparquet": {
"version": "1.25.1",
"resolved": "https://registry.npmjs.org/hyparquet/-/hyparquet-1.25.1.tgz",
......@@ -2065,11 +2153,31 @@
"binary-search-bounds": "^2.0.0"
}
},
"node_modules/is-core-module": {
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"license": "MIT",
"dependencies": {
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-module": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
"integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
"license": "MIT"
},
"node_modules/is-reference": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.6"
......@@ -2085,7 +2193,7 @@
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
"dev": true,
"devOptional": true,
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
......@@ -2095,7 +2203,6 @@
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
......@@ -2105,7 +2212,7 @@
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz",
"integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==",
"dev": true,
"devOptional": true,
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
......@@ -2138,7 +2245,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2159,7 +2265,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2180,7 +2285,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2201,7 +2305,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2222,7 +2325,6 @@
"cpu": [
"arm"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2243,7 +2345,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2264,7 +2365,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2285,7 +2385,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2306,7 +2405,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2327,7 +2425,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2348,7 +2445,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
......@@ -2366,14 +2462,12 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
"integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
"dev": true,
"license": "MIT"
},
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
......@@ -2395,7 +2489,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
"integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
......@@ -2405,7 +2498,6 @@
"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",
......@@ -2424,25 +2516,28 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
"integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
"dev": true,
"funding": [
"https://github.com/sponsors/sxzz",
"https://opencollective.com/debug"
],
"license": "MIT"
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"license": "MIT"
},
"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"
......@@ -2455,7 +2550,6 @@
"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",
......@@ -2480,6 +2574,27 @@
"node": "^10 || ^12 || >=14"
}
},
"node_modules/resolve": {
"version": "1.22.12",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
"integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"is-core-module": "^2.16.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/robust-predicates": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
......@@ -2490,7 +2605,6 @@
"version": "4.59.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
"integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.8"
......@@ -2547,14 +2661,12 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.0.1.tgz",
"integrity": "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==",
"dev": true,
"license": "MIT"
},
"node_modules/sirv": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
"integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@polka/url": "^1.0.0-next.24",
......@@ -2569,17 +2681,27 @@
"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/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/svelte": {
"version": "5.53.5",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.5.tgz",
"integrity": "sha512-YkqERnF05g8KLdDZwZrF8/i1eSbj6Eoat8Jjr2IfruZz9StLuBqo8sfCSzjosNKd+ZrQ8DkKZDjpO5y3ht1Pow==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
......@@ -2628,7 +2750,6 @@
"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",
......@@ -2645,7 +2766,6 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
"integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
......@@ -2667,7 +2787,6 @@
"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",
......@@ -2742,7 +2861,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz",
"integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==",
"dev": true,
"license": "MIT",
"workspaces": [
"tests/deps/*",
......@@ -2783,7 +2901,6 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
"integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
"dev": true,
"license": "MIT"
}
}
......
......@@ -21,6 +21,7 @@
"dependencies": {
"@observablehq/plot": "^0.6.17",
"@supabase/supabase-js": "^2.98.0",
"@sveltejs/adapter-node": "^5.5.4",
"d3": "^7.9.0",
"fuse.js": "^7.1.0",
"hyparquet": "^1.25.1",
......
No preview for this file type
......@@ -133,22 +133,31 @@
<a
href="/"
onclick={closeDrawer}
class="w-full flex items-center gap-3 px-3 py-3 rounded-lg transition-colors text-left mb-4"
class="w-full flex items-center px-3 py-2.5 rounded-lg transition-colors text-left"
style="background-color: {$page.url.pathname === '/' ? 'var(--theme-fill)' : 'transparent'};"
onmouseenter={(e) => e.currentTarget.style.backgroundColor = 'var(--theme-fill)'}
onmouseleave={(e) => e.currentTarget.style.backgroundColor = $page.url.pathname === '/' ? 'var(--theme-fill)' : 'transparent'}
>
<svg class="w-4 h-4 flex-shrink-0" style="color: var(--theme-texto);" fill="currentColor" viewBox="0 0 20 20">
<rect x="2" y="2" width="7" height="7" rx="1.5"/>
<rect x="11" y="2" width="7" height="7" rx="1.5"/>
<rect x="2" y="11" width="7" height="7" rx="1.5"/>
<rect x="11" y="11" width="7" height="7" rx="1.5"/>
</svg>
<span class="font-medium text-sm" style="color: var(--theme-titulo);">Inicio / Buscador</span>
<span class="text-sm" style="color: var(--theme-titulo);">Inicio / Buscador</span>
</a>
<!-- Descargas -->
<a
href="/descargas"
onclick={closeDrawer}
class="w-full flex items-center px-3 py-2.5 rounded-lg transition-colors text-left mb-4"
style="background-color: {$page.url.pathname === '/descargas' ? 'var(--theme-fill)' : 'transparent'};"
onmouseenter={(e) => e.currentTarget.style.backgroundColor = 'var(--theme-fill)'}
onmouseleave={(e) => e.currentTarget.style.backgroundColor = $page.url.pathname === '/descargas' ? 'var(--theme-fill)' : 'transparent'}
>
<span class="text-sm" style="color: var(--theme-titulo);">Descargas</span>
</a>
<!-- Separador -->
<div class="border-t mb-4" style="border-color: var(--theme-borde);"></div>
<!-- Clasificadores -->
<div class="mb-6">
<div class="mb-4">
<h3 class="text-xs font-semibold uppercase tracking-wider mb-3 px-2" style="color: var(--theme-texto);">
Navegar por clasificadores
</h3>
......@@ -157,13 +166,13 @@
<a
href={c.href}
onclick={closeDrawer}
class="w-full flex items-center justify-between px-3 py-2.5 rounded-lg transition-colors text-left group"
class="w-full flex items-center justify-between px-3 py-2 rounded-lg transition-colors text-left group"
style="background-color: {isActive(c.href) ? 'var(--theme-fill)' : 'transparent'};"
onmouseenter={(e) => e.currentTarget.style.backgroundColor = 'var(--theme-fill)'}
onmouseleave={(e) => e.currentTarget.style.backgroundColor = isActive(c.href) ? 'var(--theme-fill)' : 'transparent'}
>
<div class="flex-1 min-w-0">
<span class="text-sm font-medium block" style="color: var(--theme-titulo);">{c.nombre}</span>
<span class="text-sm block" style="color: var(--theme-titulo);">{c.nombre}</span>
<span class="text-xs" style="color: var(--theme-texto);">{c.desc}</span>
</div>
<svg
......@@ -178,86 +187,52 @@
</svg>
</a>
{/each}
</div>
</div>
<!-- Ver todos los clasificadores -->
<a
href="/clasificadores"
onclick={closeDrawer}
class="w-full flex items-center gap-3 px-3 py-3 rounded-lg transition-colors text-left mb-6"
class="w-full flex items-center px-3 py-2 rounded-lg transition-colors text-left mt-1"
style="background-color: {$page.url.pathname === '/clasificadores' ? 'var(--theme-fill)' : 'transparent'};"
onmouseenter={(e) => e.currentTarget.style.backgroundColor = 'var(--theme-fill)'}
onmouseleave={(e) => e.currentTarget.style.backgroundColor = $page.url.pathname === '/clasificadores' ? 'var(--theme-fill)' : 'transparent'}
>
<svg class="w-4 h-4 flex-shrink-0" style="color: var(--theme-accent);" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z"/>
</svg>
<span class="text-sm" style="color: var(--theme-accent);">Ver todos los clasificadores</span>
<span class="text-xs" style="color: var(--theme-texto);">Ver todos los clasificadores</span>
</a>
</div>
</div>
<!-- Separador -->
<div class="border-t my-4" style="border-color: var(--theme-borde);"></div>
<div class="border-t mb-4" style="border-color: var(--theme-borde);"></div>
<!-- Enlaces -->
<div class="space-y-1">
<a
href="/documentacion"
onclick={closeDrawer}
class="w-full flex items-center gap-3 px-3 py-2.5 rounded-lg transition-colors text-left"
class="w-full flex items-center px-3 py-2 rounded-lg transition-colors text-left"
onmouseenter={(e) => e.currentTarget.style.backgroundColor = 'var(--theme-fill)'}
onmouseleave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}
>
<svg class="w-4 h-4 flex-shrink-0" style="color: var(--theme-texto);" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18a8.967 8.967 0 00-6 2.292m0-14.25v14.25"/>
</svg>
<span class="text-sm" style="color: var(--theme-titulo);">Documentación</span>
</a>
<a
href="/sobre"
onclick={closeDrawer}
class="w-full flex items-center gap-3 px-3 py-2.5 rounded-lg transition-colors text-left"
class="w-full flex items-center px-3 py-2 rounded-lg transition-colors text-left"
onmouseenter={(e) => e.currentTarget.style.backgroundColor = 'var(--theme-fill)'}
onmouseleave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}
>
<svg class="w-4 h-4 flex-shrink-0" style="color: var(--theme-texto);" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"/>
</svg>
<span class="text-sm" style="color: var(--theme-titulo);">Sobre el proyecto</span>
</a>
</div>
<!-- Separador -->
<div class="border-t my-4" style="border-color: var(--theme-borde);"></div>
<!-- Descargas -->
<a
href="/descargas"
onclick={closeDrawer}
class="w-full flex items-center gap-3 px-3 py-3 rounded-lg transition-colors text-left"
style="background-color: {$page.url.pathname === '/descargas' ? 'var(--theme-fill)' : 'transparent'};"
onmouseenter={(e) => e.currentTarget.style.backgroundColor = 'var(--theme-fill)'}
onmouseleave={(e) => e.currentTarget.style.backgroundColor = $page.url.pathname === '/descargas' ? 'var(--theme-fill)' : 'transparent'}
>
<svg class="w-4 h-4 flex-shrink-0" style="color: var(--theme-accent);" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"/>
</svg>
<span class="text-sm font-medium" style="color: var(--theme-accent);">Descargas</span>
</a>
<!-- Créditos -->
<a
href="/creditos"
onclick={closeDrawer}
class="w-full flex items-center gap-3 px-3 py-2.5 rounded-lg transition-colors text-left mt-2"
class="w-full flex items-center px-3 py-2 rounded-lg transition-colors text-left"
onmouseenter={(e) => e.currentTarget.style.backgroundColor = 'var(--theme-fill)'}
onmouseleave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}
>
<svg class="w-4 h-4 flex-shrink-0" style="color: var(--theme-texto);" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z"/>
</svg>
<span class="text-sm" style="color: var(--theme-texto);">Créditos institucionales</span>
</a>
</div>
</nav>
<!-- Footer -->
......
......@@ -220,7 +220,7 @@
const url = `${base}${item.codigo}`;
console.log('[SEARCH] goToResult:', item.tipo, item.codigo, '→', url);
open = false;
window.location.href = url;
goto(url);
}
}
......
<script>
import '../app.css';
import { page, navigating } from '$app/stores';
import favicon from '$lib/assets/favicon.svg';
import favicon from '$lib/assets/favicon.ico';
import Navbar from '$lib/components/ui/Navbar.svelte';
import NavigationDrawer from '$lib/components/layout/NavigationDrawer.svelte';
import SearchModal from '$lib/components/ui/SearchModal.svelte';
......
<script>
import { onMount } from 'svelte';
import { goto } from '$app/navigation';
import { landingSearchMode, landingSelectedClassifiers, landingSearchQuery } from '$lib/stores/landingSearchState';
import { openDrawer } from '$lib/stores/drawer.js';
......@@ -811,7 +812,7 @@
url = `/programa/${generateCodigo(hit)}`;
}
window.location.href = url;
goto(url);
}
function clearSearch() {
......@@ -1123,7 +1124,7 @@
{#each EXAMPLES_PROGRAMAS as ex}
<span
class="mode-pill"
onclick={() => searchFromPill(ex.label)}
onclick={(e) => { e.stopPropagation(); searchFromPill(ex.label); }}
onkeydown={(e) => e.key === 'Enter' && searchFromPill(ex.label)}
role="button"
tabindex="0"
......@@ -1165,7 +1166,7 @@
class="clf-chip"
class:clf-chip-active={selectedClassifiers.includes(clf.id)}
class:clf-chip-disabled={clf.disabled}
onclick={() => { if (!clf.disabled) toggleClassifier(clf.id); }}
onclick={(e) => { e.stopPropagation(); if (!clf.disabled) toggleClassifier(clf.id); }}
disabled={clf.disabled}
>
<span class="clf-dot"></span>
......@@ -1176,11 +1177,11 @@
<div class="mode-card-pills">
{#each EXAMPLES_CLASIFICADORES as ex}
{#if ex.href}
<a href={ex.href} class="mode-pill">{ex.label}</a>
<a href={ex.href} class="mode-pill" onclick={(e) => e.stopPropagation()}>{ex.label}</a>
{:else}
<span
class="mode-pill"
onclick={() => searchFromPill(ex.label, ex.classifier)}
onclick={(e) => { e.stopPropagation(); searchFromPill(ex.label, ex.classifier); }}
onkeydown={(e) => e.key === 'Enter' && searchFromPill(ex.label, ex.classifier)}
role="button"
tabindex="0"
......@@ -2240,8 +2241,8 @@
.pills-hint{font-family:var(--sans);font-size:10px;color:#7B7870;font-weight:500}
.hint-desktop{display:inline}
.hint-mobile{display:none}
.mode-pill{font-family:var(--sans);font-size:11px;font-weight:500;padding:5px 10px;border-radius:8px;cursor:pointer;transition:all 0.2s;border:1px solid rgba(255,255,255,0.15);background:rgba(255,255,255,0.06);color:#F5F0E8}
.mode-pill:hover{background:rgba(255,255,255,0.12);border-color:rgba(255,255,255,0.25);color:#F5F0E8}
.mode-pill{font-family:var(--sans);font-size:11px;font-weight:500;padding:5px 10px;border-radius:8px;cursor:pointer;transition:all 0.2s;border:1px solid rgba(255,255,255,0.15);background:rgba(255,255,255,0.06);color:#F5F0E8 !important;text-decoration:none}
.mode-pill:hover{background:rgba(255,255,255,0.12);border-color:rgba(255,255,255,0.25);color:#FFFFFF !important}
.mode-card-radio{position:absolute;top:16px;right:16px}
.radio-dot{width:18px;height:18px;border-radius:50%;border:2px solid rgba(255,255,255,0.2);display:block;transition:all 0.2s;position:relative}
......@@ -2635,8 +2636,8 @@
:global(html:not(.dark)) .radio-dot-active{border-color:#D4A017}
/* Mode pills */
:global(html:not(.dark)) .mode-pill{border-color:rgba(0,0,0,0.12);background:rgba(0,0,0,0.04);color:#555}
:global(html:not(.dark)) .mode-pill:hover{background:rgba(0,0,0,0.08);border-color:rgba(0,0,0,0.2);color:#1d1d1f}
:global(html:not(.dark)) .mode-pill{border-color:rgba(0,0,0,0.12);background:rgba(0,0,0,0.04);color:#555 !important}
:global(html:not(.dark)) .mode-pill:hover{background:rgba(0,0,0,0.08);border-color:rgba(0,0,0,0.2);color:#1d1d1f !important}
:global(html:not(.dark)) .pills-hint{color:#999}
/* Gear / settings */
......
export const ssr = false;
import { error } from '@sveltejs/kit';
import { API_HOST } from '$lib/api.js';
......
......@@ -1217,18 +1217,19 @@
.slice(0, 20);
}
function parseDescripciones(descripcionesStr) {
if (!descripcionesStr) return [];
try {
const parsed = JSON.parse(descripcionesStr);
return parsed.sort((a, b) => {
const maxYearA = getMaxYear(a.rangos);
const maxYearB = getMaxYear(b.rangos);
function parseDescripciones(descs) {
if (!descs) return [];
let arr;
if (typeof descs === 'string') {
try { arr = JSON.parse(descs); } catch { return []; }
} else {
arr = Array.isArray(descs) ? descs : [];
}
return [...arr].sort((a, b) => {
const maxYearA = getMaxYear(a.gestion || a.rangos);
const maxYearB = getMaxYear(b.gestion || b.rangos);
return maxYearB - maxYearA;
});
} catch {
return [];
}
}
function getMaxYear(rangos) {
......
......@@ -1364,19 +1364,19 @@
.slice(0, 20);
}
function parseDescripciones(descripcionesStr) {
if (!descripcionesStr) return [];
try {
const parsed = JSON.parse(descripcionesStr);
// Ordenar por año más reciente (extraer el máximo año de cada rango)
return parsed.sort((a, b) => {
const maxYearA = getMaxYear(a.rangos);
const maxYearB = getMaxYear(b.rangos);
return maxYearB - maxYearA; // Descendente, más reciente primero
});
} catch {
return [];
function parseDescripciones(descs) {
if (!descs) return [];
let arr;
if (typeof descs === 'string') {
try { arr = JSON.parse(descs); } catch { return []; }
} else {
arr = Array.isArray(descs) ? descs : [];
}
return [...arr].sort((a, b) => {
const maxYearA = getMaxYear(a.gestion || a.rangos);
const maxYearB = getMaxYear(b.gestion || b.rangos);
return maxYearB - maxYearA;
});
}
function getMaxYear(rangos) {
......
......@@ -881,18 +881,19 @@
.slice(0, 20);
}
function parseDescripciones(descripcionesStr) {
if (!descripcionesStr) return [];
try {
const parsed = typeof descripcionesStr === 'string' ? JSON.parse(descripcionesStr) : descripcionesStr;
return parsed.sort((a, b) => {
const maxYearA = getMaxYear(a.rangos);
const maxYearB = getMaxYear(b.rangos);
function parseDescripciones(descs) {
if (!descs) return [];
let arr;
if (typeof descs === 'string') {
try { arr = JSON.parse(descs); } catch { return []; }
} else {
arr = Array.isArray(descs) ? descs : [];
}
return [...arr].sort((a, b) => {
const maxYearA = getMaxYear(a.gestion || a.rangos);
const maxYearB = getMaxYear(b.gestion || b.rangos);
return maxYearB - maxYearA;
});
} catch {
return [];
}
}
function getMaxYear(rangos) {
......
......@@ -722,6 +722,7 @@
});
onMount(async () => {
console.log('[SECTORES] onMount started');
isMobile = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
requestAnimationFrame(() => {
......@@ -735,10 +736,10 @@
const data = await res.json();
if (Array.isArray(data)) {
allItems = data;
allItems = data.filter(item => String(item.acteco) !== '0' && !String(item.acteco).startsWith('0.') && !/desconocido/i.test(item.desc_acteco || ''));
// Sectores = items de profundidad 1
sectores = data
sectores = allItems
.filter(item => getDepth(item.acteco) === 1)
.sort((a, b) => String(a.acteco).localeCompare(String(b.acteco), undefined, { numeric: true }));
......@@ -766,6 +767,7 @@
selectedYear = 2025;
}
console.log('[SECTORES] loading done, sectores:', sectores.length, 'allItems:', allItems.length, 'selectedYear:', selectedYear, 'layoutMounted:', layoutMounted, 'viewMode:', viewMode);
loading = false;
});
......@@ -1223,18 +1225,19 @@
.slice(0, 20);
}
function parseDescripciones(descripcionesStr) {
if (!descripcionesStr) return [];
try {
const parsed = JSON.parse(descripcionesStr);
return parsed.sort((a, b) => {
const maxYearA = getMaxYear(a.rangos);
const maxYearB = getMaxYear(b.rangos);
function parseDescripciones(descs) {
if (!descs) return [];
let arr;
if (typeof descs === 'string') {
try { arr = JSON.parse(descs); } catch { return []; }
} else {
arr = Array.isArray(descs) ? descs : [];
}
return [...arr].sort((a, b) => {
const maxYearA = getMaxYear(a.gestion || a.rangos);
const maxYearB = getMaxYear(b.gestion || b.rangos);
return maxYearB - maxYearA;
});
} catch {
return [];
}
}
function getMaxYear(rangos) {
......
......@@ -4,7 +4,7 @@
const YEARS = Array.from({ length: 10 }, (_, i) => 2016 + i);
let mounted = $state(false);
let dataset = $state('gastos');
let dataset = $state('gasto');
let entities = $state([]);
let entitySearch = $state('');
let entityFocused = $state(false);
......@@ -18,6 +18,13 @@
}
function buildUrl(partition, value) {
if (partition === 'completo') {
return `${DOWNLOAD_BASE}${dataset}/ultimo/${dataset}.zip`;
} else if (partition === 'gestion') {
return `${DOWNLOAD_BASE}${dataset}/gestiones/gestion_${value}.zip`;
} else if (partition === 'entidad') {
return `${DOWNLOAD_BASE}${dataset}/entidades/entidad_${value}.zip`;
}
return `${DOWNLOAD_BASE}${dataset}/${partition}/${value}`;
}
......@@ -80,8 +87,8 @@
<div class="section">
<span class="section-label">Base</span>
<div class="toggle-group">
<button class="toggle-btn" class:active={dataset === 'gastos'} onclick={() => { dataset = 'gastos'; selectedEntity = null; }}>Gastos</button>
<button class="toggle-btn" class:active={dataset === 'ingresos'} onclick={() => { dataset = 'ingresos'; selectedEntity = null; }}>Ingresos</button>
<button class="toggle-btn" class:active={dataset === 'gasto'} onclick={() => { dataset = 'gasto'; selectedEntity = null; }}>Gastos</button>
<button class="toggle-btn" class:active={dataset === 'ingreso'} onclick={() => { dataset = 'ingreso'; selectedEntity = null; }}>Ingresos</button>
</div>
</div>
......@@ -90,7 +97,7 @@
<h2 class="section-title">Completo</h2>
<a href={buildUrl('completo', 'ultimo')} class="download-link">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
Descargar todo ({dataset})
Descargar todo ({dataset === 'gasto' ? 'gastos' : 'ingresos'})
</a>
</div>
......@@ -159,20 +166,23 @@
<style>
.page {
min-height: 100vh;
height: 100dvh;
background: var(--theme-body);
color: var(--theme-titulo);
font-family: var(--font-sans), -apple-system, sans-serif;
font-family: 'Qanelas', var(--font-sans), -apple-system, sans-serif;
opacity: 0;
transition: opacity 0.4s;
padding-top: 60px;
box-sizing: border-box;
overflow-y: auto;
}
.page.mounted { opacity: 1; }
:global(html:not(.dark)) .page { background: #f5f5f7; }
:global(html:not(.dark)) .page { background: #f2f2f4; }
.layout {
max-width: 700px;
margin: 0 auto;
padding: 100px 2rem 3rem;
padding: 1.5rem 2rem 2rem;
}
.title {
......@@ -180,96 +190,137 @@
font-size: 2rem;
font-weight: 400;
margin: 0 0 0.25rem;
letter-spacing: -0.02em;
}
.subtitle {
font-family: 'Qanelas', var(--font-sans);
font-size: 0.875rem;
color: var(--theme-texto);
opacity: 0.6;
margin: 0 0 2rem;
opacity: 0.7;
margin: 0 0 1.5rem;
line-height: 1.5;
}
.section { margin-bottom: 2rem; }
.section {
margin-bottom: 1.25rem;
padding-bottom: 1.25rem;
border-bottom: 1px solid var(--theme-borde);
}
.section:last-child { border-bottom: none; }
.section-label {
font-family: 'DM Mono', monospace;
font-family: 'JetBrains Mono', 'DM Mono', monospace;
font-size: 0.6875rem;
letter-spacing: 0.1em;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--theme-texto);
opacity: 0.5;
display: block;
margin-bottom: 0.5rem;
margin-bottom: 0.75rem;
}
.section-title {
font-family: 'Qanelas', var(--font-sans);
font-size: 1rem;
font-weight: 700;
margin: 0 0 0.75rem;
font-weight: 800;
margin: 0 0 0.625rem;
letter-spacing: -0.01em;
}
/* Toggle */
.toggle-group {
display: flex;
gap: 0.25rem;
background: var(--theme-surface);
border-radius: 8px;
gap: 0;
background: #2A2A27;
border: 1px solid rgba(255,255,255,0.08);
border-radius: 10px;
padding: 3px;
width: fit-content;
}
.toggle-btn {
font-size: 0.8125rem;
font-weight: 500;
padding: 0.375rem 1rem;
font-family: 'Qanelas', var(--font-sans);
font-size: 0.875rem;
font-weight: 600;
padding: 0.5rem 1.5rem;
border: none;
border-radius: 6px;
border-radius: 8px;
background: transparent;
color: var(--theme-texto);
cursor: pointer;
transition: all 0.15s;
transition: all 0.2s;
}
.toggle-btn:hover { color: var(--theme-titulo); }
.toggle-btn.active {
background: var(--theme-accent);
color: white;
font-weight: 600;
background: rgba(255,255,255,0.12);
color: var(--theme-titulo);
font-weight: 700;
}
:global(html:not(.dark)) .toggle-btn.active {
background: rgba(0,0,0,0.06);
color: var(--theme-titulo);
}
/* Download link */
.download-link {
display: inline-flex;
align-items: center;
gap: 0.375rem;
font-size: 0.8125rem;
gap: 0.5rem;
font-family: 'Qanelas', var(--font-sans);
font-size: 0.9375rem;
font-weight: 600;
color: var(--theme-accent);
text-decoration: none;
border-bottom: 1px dotted rgba(201, 167, 81, 0.4);
padding-bottom: 1px;
transition: opacity 0.15s;
padding: 0.625rem 1.25rem;
border: 1px solid var(--theme-accent);
border-radius: 10px;
transition: all 0.2s;
}
.download-link:hover {
background: var(--theme-accent);
color: #1C1C1A;
}
:global(html:not(.dark)) .download-link {
border-color: rgba(0,0,0,0.12);
color: var(--theme-titulo);
}
:global(html:not(.dark)) .download-link:hover {
background: rgba(0,0,0,0.03);
color: var(--theme-titulo);
}
.download-link:hover { opacity: 0.7; }
/* Years */
.year-grid {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
gap: 0.625rem;
}
.year-link {
font-family: 'DM Mono', monospace;
font-size: 0.75rem;
padding: 0.375rem 0.75rem;
border: 1px solid var(--theme-borde);
border-radius: 6px;
font-family: 'Qanelas', var(--font-sans);
font-size: 0.8125rem;
font-weight: 500;
padding: 0.625rem;
background: #2A2A27;
border: 1px solid rgba(255,255,255,0.08);
border-radius: 10px;
color: var(--theme-titulo);
text-decoration: none;
transition: all 0.15s;
text-align: center;
transition: all 0.2s;
}
.year-link:hover {
border-color: var(--theme-accent);
color: var(--theme-accent);
background: rgba(201, 167, 81, 0.06);
transform: translateY(-1px);
}
:global(html:not(.dark)) .year-link:hover {
border-color: rgba(0,0,0,0.15);
color: var(--theme-titulo);
background: rgba(0,0,0,0.03);
transform: none;
}
/* Entity search */
......@@ -279,39 +330,43 @@
.search-input {
width: 100%;
max-width: 400px;
padding: 0.625rem 1rem;
max-width: 480px;
padding: 0.75rem 1.25rem;
border: 1px solid var(--theme-borde);
border-radius: 8px;
background: var(--theme-surface);
border-radius: 10px;
background: #2A2A27;
color: var(--theme-titulo);
font-size: 0.8125rem;
font-family: 'Qanelas', var(--font-sans);
font-size: 0.9375rem;
outline: none;
transition: border-color 0.15s;
transition: border-color 0.2s, box-shadow 0.2s;
}
.search-input:focus { border-color: var(--theme-accent); }
.search-input::placeholder { color: var(--theme-texto); opacity: 0.5; }
.search-input:focus {
border-color: var(--theme-accent);
box-shadow: 0 0 0 3px rgba(201, 167, 81, 0.12);
}
.search-input::placeholder { color: var(--theme-texto); opacity: 0.4; }
.search-status {
display: block;
font-size: 0.75rem;
color: var(--theme-texto);
opacity: 0.6;
margin-top: 0.375rem;
margin-top: 0.5rem;
}
.search-status.error { color: #b42318; opacity: 1; }
.search-dropdown {
position: absolute;
top: calc(100% + 4px);
top: calc(100% + 6px);
left: 0;
max-width: 400px;
max-width: 480px;
width: 100%;
background: var(--theme-surface);
border: 1px solid var(--theme-borde);
border-radius: 8px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
max-height: 240px;
border-radius: 12px;
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.15);
max-height: 280px;
overflow-y: auto;
z-index: 10;
}
......@@ -320,7 +375,7 @@
display: flex;
flex-direction: column;
width: 100%;
padding: 0.625rem 1rem;
padding: 0.75rem 1.25rem;
border: none;
border-top: 1px solid var(--theme-borde);
background: transparent;
......@@ -329,32 +384,53 @@
transition: background 0.15s;
}
.search-item:first-child { border-top: none; }
.search-item:hover, .search-item.active { background: var(--theme-surface-hover, rgba(128,128,128,0.08)); }
.search-item:hover, .search-item.active { background: var(--theme-surface-hover, rgba(128,128,128,0.06)); }
.item-name { font-size: 0.8125rem; color: var(--theme-titulo); }
.item-code { font-family: 'DM Mono', monospace; font-size: 0.6875rem; color: var(--theme-texto); opacity: 0.5; }
.item-name {
font-family: 'Qanelas', var(--font-sans);
font-size: 0.875rem;
font-weight: 500;
color: var(--theme-titulo);
}
.item-code {
font-family: 'JetBrains Mono', 'DM Mono', monospace;
font-size: 0.6875rem;
color: var(--theme-texto);
opacity: 0.4;
margin-top: 2px;
}
.entity-result {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-top: 1rem;
padding: 0.75rem 1rem;
background: var(--theme-surface);
border-radius: 8px;
max-width: 400px;
margin-top: 1.25rem;
padding: 1rem 1.25rem;
background: #2A2A27;
border: 1px solid rgba(255,255,255,0.08);
border-radius: 12px;
max-width: 480px;
}
.entity-name {
font-size: 0.8125rem;
font-weight: 500;
font-family: 'Qanelas', var(--font-sans);
font-size: 0.9375rem;
font-weight: 600;
color: var(--theme-titulo);
}
:global(html:not(.dark)) .toggle-group { background: #ffffff; border-color: rgba(0,0,0,0.08); }
:global(html:not(.dark)) .year-link { background: #ffffff; border-color: rgba(0,0,0,0.08); }
:global(html:not(.dark)) .search-input { background: #ffffff; border-color: rgba(0,0,0,0.08); }
:global(html:not(.dark)) .entity-result { background: #ffffff; border-color: rgba(0,0,0,0.08); }
:global(html:not(.dark)) .search-dropdown { background: #ffffff; }
@media (max-width: 640px) {
.layout { padding: 80px 1rem 2rem; }
.title { font-size: 1.5rem; }
.layout { padding: 1rem 1rem 2rem; }
.title { font-size: 2rem; }
.year-grid { grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); }
.search-input, .search-dropdown, .entity-result { max-width: 100%; }
.toggle-btn { padding: 0.5rem 1rem; font-size: 0.8125rem; }
}
</style>
......
<script>
import { onMount, tick } from 'svelte';
import { goto } from '$app/navigation';
import { page } from '$app/stores';
import * as d3 from 'd3';
......@@ -142,7 +143,7 @@
}
function navigateToEntity(item) {
window.location.href = `/entidad/${item.codigo}`;
goto(`/entidad/${item.codigo}`);
}
function onSearchKeydown(e) {
......
export const ssr = false;
import { error } from '@sveltejs/kit';
import { API_HOST } from '$lib/api.js';
......
export const ssr = false;
import { error } from '@sveltejs/kit';
import { API_HOST } from '$lib/api.js';
......@@ -17,7 +19,7 @@ export async function load({ params }) {
const clasRes = await fetch(`${API_BASE}/clasificador`);
if (clasRes.ok) {
const clasificador = await clasRes.json();
const current = clasificador.find(c => c.organismo === parseInt(codigo));
const current = clasificador.find(c => String(c.organismo) === codigo);
if (current) {
// Padres: grupo y subgrupo (como objetos virtuales para navegación)
padres = [
......
export const ssr = false;
import { error } from '@sveltejs/kit';
import { API_HOST } from '$lib/api.js';
......
......@@ -19,10 +19,9 @@
</p>
<p class="p3">
La plataforma reúne más de veinte años de información sobre ingresos y gastos
La plataforma reúne 10 años de información sobre ingresos y gastos
públicos, organizada mediante los clasificadores presupuestarios oficiales y a
través de los programas y proyectos de inversión pública. Los datos se actualizan
semanalmente y abarcan a todas las entidades del sector público.
través de los programas y proyectos de inversión pública.
</p>
<p class="p3">
......
<script>
import { onMount, tick } from 'svelte';
import { goto } from '$app/navigation';
import { page } from '$app/stores';
import { get } from 'svelte/store';
import * as d3 from 'd3';
......@@ -224,7 +225,7 @@
}
function navigateToEntity(item) {
window.location.href = `/ubicacion/${item.codigo}`;
goto(`/ubicacion/${item.codigo}`);
}
function onSearchKeydown(e) {
......
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Descargas presupuestarias</title>
<style>
:root {
--text: #1f1f1f;
--muted: #666;
--link: #0b57d0;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: sans-serif;
color: var(--text);
line-height: 1.5;
}
main {
max-width: 800px;
margin: 0 auto;
padding: 24px 16px 40px;
}
h1,
h2,
p {
margin-top: 0;
}
h1 {
margin-bottom: 16px;
}
h2 {
margin-bottom: 8px;
font-size: 1rem;
}
section {
margin-bottom: 20px;
}
label,
input,
button {
font: inherit;
}
input {
width: 100%;
padding: 8px 10px;
border: 1px solid #ccc;
background: #fff;
}
.field {
display: grid;
gap: 6px;
}
.radio-group {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.radio-option {
display: inline-flex;
align-items: center;
gap: 8px;
}
.radio-option input {
width: auto;
padding: 0;
border: 0;
}
.links,
.results {
padding: 0;
margin: 0;
list-style: none;
}
.links {
display: flex;
flex-wrap: wrap;
gap: 8px 12px;
}
.search-area {
position: relative;
}
.results {
position: absolute;
top: calc(100% + 4px);
left: 0;
right: 0;
z-index: 10;
max-height: 240px;
overflow-y: auto;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
background: #fff;
}
.results[hidden],
.entity-downloads[hidden] {
display: none;
}
.results li + li {
border-top: 1px solid #ddd;
}
.result-button {
display: block;
width: 100%;
padding: 10px 0;
border: 0;
background: transparent;
text-align: left;
cursor: pointer;
}
.result-button:hover,
.result-button.active,
.result-button:focus {
background: #f3f3f3;
}
.meta,
.status {
color: var(--muted);
}
.status {
min-height: 1.25rem;
margin: 6px 0 0;
font-size: 0.9rem;
}
.status.error {
color: #b42318;
}
.entity-downloads p {
margin-bottom: 8px;
}
a {
color: var(--link);
}
</style>
</head>
<body>
<main>
<h1>Descargas</h1>
<section>
<div class="field">
<span>Base</span>
<div class="radio-group">
<label class="radio-option">
<input type="radio" name="dataset" value="gastos" checked>
<span>Gastos</span>
</label>
<label class="radio-option">
<input type="radio" name="dataset" value="ingresos">
<span>Ingresos</span>
</label>
</div>
</div>
</section>
<section>
<h2>Completo</h2>
<ul class="links" id="full-download"></ul>
</section>
<section>
<h2>Por gestión</h2>
<ul class="links" id="year-downloads"></ul>
</section>
<section>
<h2>Por entidad</h2>
<div class="field search-area">
<label for="entity-search">Entidad</label>
<input
id="entity-search"
name="entity-search"
type="search"
placeholder="Busca entidades"
autocomplete="off"
>
<ul class="results" id="entity-results" hidden></ul>
</div>
<p class="status" id="entity-status">Cargando entidades...</p>
<div class="entity-downloads" id="entity-downloads" hidden>
<p id="entity-name"></p>
<ul class="links" id="entity-links"></ul>
</div>
</section>
</main>
<script>
const API_BASE = "http://136.112.29.74/api/";
const DOWNLOAD_BASE = "https://abierto.economiayfinanzas.gob.bo/presupuesto/descargas/";
const ENTITY_API = `${API_BASE}entidad/clasificador`;
const YEARS = Array.from({ length: 10 }, (_, index) => 2016 + index);
const MAX_ENTITY_RESULTS = 12;
let entities = [];
let activeResultIndex = -1;
function setStatus(message, type = "info") {
const status = document.getElementById("entity-status");
status.textContent = message;
status.classList.toggle("error", type === "error");
}
function currentDataset() {
return document.querySelector('input[name="dataset"]:checked').value;
}
function buildUrl(partition, value) {
return `${DOWNLOAD_BASE}${currentDataset()}/${partition}/${value}`;
}
function normalizeText(value) {
return value
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.toLowerCase()
.trim();
}
function createLinkItem(label, href) {
const item = document.createElement("li");
const link = document.createElement("a");
link.href = href;
link.textContent = label;
item.appendChild(link);
return item;
}
function renderFullDownload() {
const container = document.getElementById("full-download");
container.innerHTML = "";
container.appendChild(createLinkItem("Descargar", buildUrl("completo", "ultimo")));
}
function renderYearDownloads() {
const container = document.getElementById("year-downloads");
container.innerHTML = "";
YEARS.forEach((year) => {
container.appendChild(createLinkItem(String(year), buildUrl("gestion", year)));
});
}
function renderEntityDownloads(entity) {
const wrapper = document.getElementById("entity-downloads");
const name = document.getElementById("entity-name");
const links = document.getElementById("entity-links");
name.textContent = entity.desc_entidad;
links.innerHTML = "";
links.appendChild(createLinkItem("Descargar", buildUrl("entidad", entity.entidad)));
wrapper.hidden = false;
}
function selectEntity(entity) {
document.getElementById("entity-search").value = entity.desc_entidad;
document.getElementById("entity-results").hidden = true;
activeResultIndex = -1;
renderEntityDownloads(entity);
}
function resultButtons() {
return Array.from(document.querySelectorAll("#entity-results .result-button"));
}
function setActiveResult(index) {
const buttons = resultButtons();
buttons.forEach((button, buttonIndex) => {
button.classList.toggle("active", buttonIndex === index);
});
activeResultIndex = index;
if (index >= 0 && buttons[index]) {
buttons[index].scrollIntoView({ block: "nearest" });
}
}
function renderEntityResults(matches) {
const results = document.getElementById("entity-results");
results.innerHTML = "";
activeResultIndex = -1;
if (!matches.length) {
results.hidden = true;
return;
}
matches.forEach((entity) => {
const item = document.createElement("li");
const button = document.createElement("button");
const meta = document.createElement("span");
button.type = "button";
button.className = "result-button";
button.textContent = entity.desc_entidad;
button.addEventListener("click", () => selectEntity(entity));
meta.className = "meta";
meta.textContent = `Código ${entity.entidad}`;
button.appendChild(document.createElement("br"));
button.appendChild(meta);
item.appendChild(button);
results.appendChild(item);
});
results.hidden = false;
}
function moveActiveResult(direction) {
const buttons = resultButtons();
if (!buttons.length) {
return;
}
if (activeResultIndex === -1) {
setActiveResult(direction > 0 ? 0 : buttons.length - 1);
return;
}
const nextIndex = (activeResultIndex + direction + buttons.length) % buttons.length;
setActiveResult(nextIndex);
}
function updateEntitySearch() {
const query = normalizeText(document.getElementById("entity-search").value);
document.getElementById("entity-downloads").hidden = true;
if (!entities.length) {
return;
}
if (!query) {
setStatus("");
document.getElementById("entity-results").hidden = true;
activeResultIndex = -1;
return;
}
const matches = entities
.filter((entity) => entity.normalizedName.includes(query))
.slice(0, MAX_ENTITY_RESULTS);
if (!matches.length) {
setStatus("Sin resultados.", "error");
document.getElementById("entity-results").hidden = true;
activeResultIndex = -1;
return;
}
setStatus(`${matches.length} resultado(s).`);
renderEntityResults(matches);
}
async function loadEntities() {
try {
const response = await fetch(ENTITY_API);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
entities = data
.filter((entity) => entity && entity.entidad && entity.desc_entidad)
.map((entity) => ({
entidad: entity.entidad,
desc_entidad: entity.desc_entidad,
normalizedName: normalizeText(entity.desc_entidad)
}));
setStatus("");
} catch (error) {
setStatus("No se pudieron cargar las entidades.", "error");
}
}
function rerenderDownloads() {
renderFullDownload();
renderYearDownloads();
const selectedName = document.getElementById("entity-search").value;
const selectedEntity = entities.find(
(entity) => entity.desc_entidad === selectedName
);
if (selectedEntity) {
renderEntityDownloads(selectedEntity);
}
}
document.querySelectorAll('input[name="dataset"]').forEach((input) => {
input.addEventListener("change", rerenderDownloads);
});
document.getElementById("entity-search").addEventListener("input", updateEntitySearch);
document.getElementById("entity-search").addEventListener("keydown", (event) => {
const results = document.getElementById("entity-results");
if (event.key === "ArrowDown") {
event.preventDefault();
if (!results.hidden) {
moveActiveResult(1);
}
}
if (event.key === "ArrowUp") {
event.preventDefault();
if (!results.hidden) {
moveActiveResult(-1);
}
}
if (event.key === "Enter") {
const buttons = resultButtons();
if (!results.hidden && activeResultIndex >= 0 && buttons[activeResultIndex]) {
event.preventDefault();
buttons[activeResultIndex].click();
}
}
if (event.key === "Escape") {
results.hidden = true;
activeResultIndex = -1;
}
});
renderFullDownload();
renderYearDownloads();
loadEntities();
</script>
</body>
</html>
No preview for this file type
No preview for this file type
No preview for this file type
import adapter from '@sveltejs/adapter-auto';
import adapter from '@sveltejs/adapter-node';
/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.
// See https://svelte.dev/docs/kit/adapters for more information about adapters.
adapter: adapter()
}
};
......
......@@ -377,7 +377,7 @@ Sector → Subsector → Área → Subárea → Entidad
---
## Tablas de Vista de Entidad
## Tablas de Vista de Entidad"
### 13. `entidad_resumen` - Resumen histórico por entidad/DA
......