diff --git a/bun.lock b/bun.lock index ac5c70f..2711ded 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,5 @@ { "lockfileVersion": 1, - "configVersion": 1, "workspaces": { "": { "name": "acad-ia-2", @@ -12,6 +11,7 @@ "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-separator": "^1.1.8", "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.2.8", "@tailwindcss/vite": "^4.0.6", "@tanstack/react-devtools": "^0.7.0", @@ -253,6 +253,8 @@ "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.11", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q=="], + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], "@radix-ui/react-context": ["@radix-ui/react-context@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="], @@ -281,12 +283,16 @@ "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.10", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="], "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g=="], "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="], "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], @@ -1301,6 +1307,12 @@ "@radix-ui/react-arrow/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-collection/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-collection/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@radix-ui/react-dialog/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], "@radix-ui/react-dialog/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], @@ -1323,10 +1335,18 @@ "@radix-ui/react-portal/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-roving-focus/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-roving-focus/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-scroll-area/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], "@radix-ui/react-scroll-area/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-tabs/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-tabs/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@radix-ui/react-tooltip/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], "@radix-ui/react-tooltip/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], @@ -1405,8 +1425,12 @@ "@radix-ui/react-portal/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@radix-ui/react-roving-focus/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@radix-ui/react-scroll-area/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@radix-ui/react-tabs/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], "@tanstack/devtools/@tanstack/devtools-client/@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.3.5", "", {}, "sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw=="], diff --git a/package.json b/package.json index 1e561cb..038149d 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-separator": "^1.1.8", "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.2.8", "@tailwindcss/vite": "^4.0.6", "@tanstack/react-devtools": "^0.7.0", diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx new file mode 100644 index 0000000..275381c --- /dev/null +++ b/src/components/ui/separator.tsx @@ -0,0 +1,28 @@ +"use client" + +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +function Separator({ + className, + orientation = "horizontal", + decorative = true, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Separator } diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx new file mode 100644 index 0000000..3d6f3ac --- /dev/null +++ b/src/components/ui/tabs.tsx @@ -0,0 +1,64 @@ +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +function Tabs({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsList({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsTrigger({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index d7e2d24..cb0430d 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -14,6 +14,7 @@ import { Route as LoginRouteImport } from './routes/login' import { Route as DashboardRouteImport } from './routes/dashboard' import { Route as IndexRouteImport } from './routes/index' import { Route as Planes2IndexRouteImport } from './routes/planes2/index' +import { Route as MateriasIndexRouteImport } from './routes/materias/index' import { Route as DemoTanstackQueryRouteImport } from './routes/demo/tanstack-query' import { Route as Planes2PlanIdRouteRouteImport } from './routes/planes2/$planId/route' import { Route as Planes2PlanIdIndexRouteImport } from './routes/planes2/$planId/index' @@ -23,6 +24,7 @@ import { Route as Planes2PlanIdIaplanRouteImport } from './routes/planes2/$planI import { Route as Planes2PlanIdHistorialRouteImport } from './routes/planes2/$planId/historial' import { Route as Planes2PlanIdFlujoRouteImport } from './routes/planes2/$planId/flujo' import { Route as Planes2PlanIdDocumentoRouteImport } from './routes/planes2/$planId/documento' +import { Route as MateriasMateriaIdMateriaIdRouteImport } from './routes/materias/$materiaId/$materiaId' const PlanesRoute = PlanesRouteImport.update({ id: '/planes', @@ -49,6 +51,11 @@ const Planes2IndexRoute = Planes2IndexRouteImport.update({ path: '/planes2/', getParentRoute: () => rootRouteImport, } as any) +const MateriasIndexRoute = MateriasIndexRouteImport.update({ + id: '/materias/', + path: '/materias/', + getParentRoute: () => rootRouteImport, +} as any) const DemoTanstackQueryRoute = DemoTanstackQueryRouteImport.update({ id: '/demo/tanstack-query', path: '/demo/tanstack-query', @@ -94,6 +101,12 @@ const Planes2PlanIdDocumentoRoute = Planes2PlanIdDocumentoRouteImport.update({ path: '/documento', getParentRoute: () => Planes2PlanIdRouteRoute, } as any) +const MateriasMateriaIdMateriaIdRoute = + MateriasMateriaIdMateriaIdRouteImport.update({ + id: '/materias/$materiaId/$materiaId', + path: '/materias/$materiaId/$materiaId', + getParentRoute: () => rootRouteImport, + } as any) export interface FileRoutesByFullPath { '/': typeof IndexRoute @@ -102,7 +115,9 @@ export interface FileRoutesByFullPath { '/planes': typeof PlanesRoute '/planes2/$planId': typeof Planes2PlanIdRouteRouteWithChildren '/demo/tanstack-query': typeof DemoTanstackQueryRoute + '/materias': typeof MateriasIndexRoute '/planes2': typeof Planes2IndexRoute + '/materias/$materiaId/$materiaId': typeof MateriasMateriaIdMateriaIdRoute '/planes2/$planId/documento': typeof Planes2PlanIdDocumentoRoute '/planes2/$planId/flujo': typeof Planes2PlanIdFlujoRoute '/planes2/$planId/historial': typeof Planes2PlanIdHistorialRoute @@ -117,7 +132,9 @@ export interface FileRoutesByTo { '/login': typeof LoginRoute '/planes': typeof PlanesRoute '/demo/tanstack-query': typeof DemoTanstackQueryRoute + '/materias': typeof MateriasIndexRoute '/planes2': typeof Planes2IndexRoute + '/materias/$materiaId/$materiaId': typeof MateriasMateriaIdMateriaIdRoute '/planes2/$planId/documento': typeof Planes2PlanIdDocumentoRoute '/planes2/$planId/flujo': typeof Planes2PlanIdFlujoRoute '/planes2/$planId/historial': typeof Planes2PlanIdHistorialRoute @@ -134,7 +151,9 @@ export interface FileRoutesById { '/planes': typeof PlanesRoute '/planes2/$planId': typeof Planes2PlanIdRouteRouteWithChildren '/demo/tanstack-query': typeof DemoTanstackQueryRoute + '/materias/': typeof MateriasIndexRoute '/planes2/': typeof Planes2IndexRoute + '/materias/$materiaId/$materiaId': typeof MateriasMateriaIdMateriaIdRoute '/planes2/$planId/documento': typeof Planes2PlanIdDocumentoRoute '/planes2/$planId/flujo': typeof Planes2PlanIdFlujoRoute '/planes2/$planId/historial': typeof Planes2PlanIdHistorialRoute @@ -152,7 +171,9 @@ export interface FileRouteTypes { | '/planes' | '/planes2/$planId' | '/demo/tanstack-query' + | '/materias' | '/planes2' + | '/materias/$materiaId/$materiaId' | '/planes2/$planId/documento' | '/planes2/$planId/flujo' | '/planes2/$planId/historial' @@ -167,7 +188,9 @@ export interface FileRouteTypes { | '/login' | '/planes' | '/demo/tanstack-query' + | '/materias' | '/planes2' + | '/materias/$materiaId/$materiaId' | '/planes2/$planId/documento' | '/planes2/$planId/flujo' | '/planes2/$planId/historial' @@ -183,7 +206,9 @@ export interface FileRouteTypes { | '/planes' | '/planes2/$planId' | '/demo/tanstack-query' + | '/materias/' | '/planes2/' + | '/materias/$materiaId/$materiaId' | '/planes2/$planId/documento' | '/planes2/$planId/flujo' | '/planes2/$planId/historial' @@ -200,7 +225,9 @@ export interface RootRouteChildren { PlanesRoute: typeof PlanesRoute Planes2PlanIdRouteRoute: typeof Planes2PlanIdRouteRouteWithChildren DemoTanstackQueryRoute: typeof DemoTanstackQueryRoute + MateriasIndexRoute: typeof MateriasIndexRoute Planes2IndexRoute: typeof Planes2IndexRoute + MateriasMateriaIdMateriaIdRoute: typeof MateriasMateriaIdMateriaIdRoute } declare module '@tanstack/react-router' { @@ -240,6 +267,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof Planes2IndexRouteImport parentRoute: typeof rootRouteImport } + '/materias/': { + id: '/materias/' + path: '/materias' + fullPath: '/materias' + preLoaderRoute: typeof MateriasIndexRouteImport + parentRoute: typeof rootRouteImport + } '/demo/tanstack-query': { id: '/demo/tanstack-query' path: '/demo/tanstack-query' @@ -303,6 +337,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof Planes2PlanIdDocumentoRouteImport parentRoute: typeof Planes2PlanIdRouteRoute } + '/materias/$materiaId/$materiaId': { + id: '/materias/$materiaId/$materiaId' + path: '/materias/$materiaId/$materiaId' + fullPath: '/materias/$materiaId/$materiaId' + preLoaderRoute: typeof MateriasMateriaIdMateriaIdRouteImport + parentRoute: typeof rootRouteImport + } } } @@ -336,7 +377,9 @@ const rootRouteChildren: RootRouteChildren = { PlanesRoute: PlanesRoute, Planes2PlanIdRouteRoute: Planes2PlanIdRouteRouteWithChildren, DemoTanstackQueryRoute: DemoTanstackQueryRoute, + MateriasIndexRoute: MateriasIndexRoute, Planes2IndexRoute: Planes2IndexRoute, + MateriasMateriaIdMateriaIdRoute: MateriasMateriaIdMateriaIdRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) diff --git a/src/routes/materias/$materiaId/$materiaId.tsx b/src/routes/materias/$materiaId/$materiaId.tsx new file mode 100644 index 0000000..dfb4bf5 --- /dev/null +++ b/src/routes/materias/$materiaId/$materiaId.tsx @@ -0,0 +1,227 @@ +import { createFileRoute, Link } from '@tanstack/react-router' +import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs' +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { Separator } from '@/components/ui/separator' +import { + ArrowLeft, + GraduationCap, + BookOpen, + Sparkles, + FileText, + History, +} from 'lucide-react' + +export const Route = createFileRoute('/materias/$materiaId/$materiaId')({ + component: MateriaDetailPage, +}) + +function MateriaDetailPage() { + const { materiaId } = Route.useParams() + + return ( +
+ {/* ================= HEADER ================= */} +
+
+ + + Volver al plan + + +
+
+ + IA-401 + + +

+ Inteligencia Artificial Aplicada +

+ +
+ + + Ingeniería en Sistemas Computacionales + + + Facultad de Ingeniería +
+ +

+ Pertenece al plan:{' '} + + Licenciatura en Ingeniería en Sistemas Computacionales 2024 + +

+
+ +
+ 8 créditos + 7° semestre + Sistemas Inteligentes +
+
+
+
+ + {/* ================= TABS ================= */} +
+
+ + + Datos generales + Contenido temático + Bibliografía + IA de la materia + Documento SEP + Historial + + + + + {/* ================= TAB: DATOS GENERALES ================= */} + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ ) +} + +/* ================= TAB CONTENT ================= */ + +function DatosGenerales() { + return ( +
+ + + + + +
  • Diseñar algoritmos de machine learning
  • +
  • Implementar redes neuronales profundas
  • +
  • Evaluar modelos de IA considerando métricas
  • +
  • Aplicar principios éticos en sistemas inteligentes
  • + + } + /> + + + + + + +
  • Aprendizaje basado en proyectos
  • +
  • Talleres prácticos con datasets reales
  • +
  • Estudios de caso
  • + + } + /> + + +
  • Exámenes parciales: 30%
  • +
  • Proyecto integrador: 35%
  • +
  • Prácticas de laboratorio: 20%
  • +
  • Participación: 15%
  • + + } + /> + + +
    + ) +} + +function HeaderTab() { + return ( +
    +
    +

    Datos Generales

    +

    + Información basada en la plantilla SEP Licenciatura +

    +
    + + +
    + ) +} + +function InfoCard({ + title, + content, +}: { + title: string + content: React.ReactNode +}) { + return ( + + + + {title} + Obligatorio + + + + + {content} + + + ) +} + +function EmptyTab({ title }: { title: string }) { + return ( +
    + {title} (pendiente) +
    + ) +} diff --git a/src/routes/materias/index.tsx b/src/routes/materias/index.tsx new file mode 100644 index 0000000..de00ea6 --- /dev/null +++ b/src/routes/materias/index.tsx @@ -0,0 +1,144 @@ +import { createFileRoute } from '@tanstack/react-router' +import { Button } from '@/components/ui/button' +import { Card, CardContent } from '@/components/ui/card' +import { + BookOpen, + Sparkles, + FileText, + Library, + LayoutTemplate, + History, + ArrowRight, + GraduationCap, +} from 'lucide-react' + +export const Route = createFileRoute('/materias/')({ + component: MateriasLandingPage, +}) + +function MateriasLandingPage() { + return ( +
    + {/* ================= HERO ================= */} +
    +
    +
    + + SISTEMA DE GESTIÓN CURRICULAR +
    + +

    + Universidad La Salle +

    + +

    + Diseña, documenta y mejora programas de estudio con herramientas + de inteligencia artificial integradas y cumplimiento normativo SEP. +

    + + +
    +
    + + {/* ================= FEATURES ================= */} +
    +
    +

    + Características principales +

    + +
    + } + title="Gestión de Materias" + description="Edita datos generales, contenido temático y bibliografía con una interfaz intuitiva." + /> + + } + title="IA Integrada" + description="Usa inteligencia artificial para mejorar objetivos, competencias y alinear con perfiles de egreso." + /> + + } + title="Documentos SEP" + description="Genera automáticamente documentos oficiales para la Secretaría de Educación Pública." + /> + + } + title="Biblioteca Digital" + description="Busca y vincula recursos del repositorio de Biblioteca La Salle directamente." + /> + + } + title="Plantillas Flexibles" + description="Adapta la estructura de materias según plantillas SEP o institucionales." + /> + + } + title="Historial Completo" + description="Rastrea todos los cambios con historial detallado por usuario y fecha." + /> +
    +
    +
    + + {/* ================= CTA ================= */} +
    +
    +

    + Explora la vista de detalle de materia +

    + +

    + Navega por las diferentes pestañas para ver cómo funciona el sistema + de gestión curricular. +

    + + +
    +
    +
    + ) +} + +/* ================= FEATURE CARD ================= */ + +function FeatureCard({ + icon, + title, + description, +}: { + icon: React.ReactNode + title: string + description: string +}) { + return ( + + +
    + {icon} +
    + +

    {title}

    + +

    + {description} +

    +
    +
    + ) +}