diff --git a/package.json b/package.json index 00f3447..ef0574b 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@radix-ui/react-tabs": "^1.1.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "cmdk": "1.0.0", "iconv-lite": "^0.6.3", "jschardet": "^3.1.4", "jsdom": "^25.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75322f2..27c6d13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + cmdk: + specifier: 1.0.0 + version: 1.0.0(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) iconv-lite: specifier: ^0.6.3 version: 0.6.3 @@ -100,6 +103,10 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@babel/runtime@7.25.7': + resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} + engines: {node: '>=6.9.0'} + '@extractus/article-extractor@8.0.10': resolution: {integrity: sha512-wEUHThxLAss1RqA5dnCB4DiW1rR6yMA5Q7oTrDkbuS7fvyWHtTbDSs8454OANaFp0BBsmjb6KYXz/S8jiHCOTg==} engines: {node: '>= 18'} @@ -221,6 +228,9 @@ packages: '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + '@radix-ui/primitive@1.0.1': + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + '@radix-ui/primitive@1.1.0': resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} @@ -276,6 +286,15 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-compose-refs@1.0.1': + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-compose-refs@1.1.0': resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} peerDependencies: @@ -285,6 +304,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.0.1': + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.1.0': resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} peerDependencies: @@ -303,6 +331,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-dialog@1.0.5': + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-dialog@1.1.2': resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} peerDependencies: @@ -325,6 +366,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-dismissable-layer@1.0.5': + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-dismissable-layer@1.1.1': resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} peerDependencies: @@ -351,6 +405,15 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-focus-guards@1.0.1': + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-guards@1.1.1': resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} peerDependencies: @@ -360,6 +423,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-scope@1.0.4': + resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-scope@1.1.0': resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} peerDependencies: @@ -391,6 +467,15 @@ packages: peerDependencies: react: ^16.x || ^17.x || ^18.x + '@radix-ui/react-id@1.0.1': + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-id@1.1.0': resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} peerDependencies: @@ -452,6 +537,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-portal@1.0.4': + resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.1.2': resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} peerDependencies: @@ -465,6 +563,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.0.1': + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-presence@1.1.1': resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} peerDependencies: @@ -478,6 +589,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@1.0.3': + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.0.0': resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} peerDependencies: @@ -517,6 +641,15 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-slot@1.0.2': + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-slot@1.1.0': resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} peerDependencies: @@ -539,6 +672,15 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-use-callback-ref@1.0.1': + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-callback-ref@1.1.0': resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: @@ -548,6 +690,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.0.1': + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.1.0': resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} peerDependencies: @@ -557,6 +708,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-escape-keydown@1.0.3': + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.1.0': resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} peerDependencies: @@ -566,6 +726,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.0.1': + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.1.0': resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} peerDependencies: @@ -717,6 +886,12 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cmdk@1.0.0: + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1176,6 +1351,16 @@ packages: '@types/react': optional: true + react-remove-scroll@2.5.5: + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-remove-scroll@2.6.0: resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} engines: {node: '>=10'} @@ -1207,6 +1392,9 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -1450,6 +1638,10 @@ snapshots: '@alloc/quick-lru@5.2.0': {} + '@babel/runtime@7.25.7': + dependencies: + regenerator-runtime: 0.14.1 + '@extractus/article-extractor@8.0.10': dependencies: '@mozilla/readability': 0.5.0 @@ -1551,6 +1743,10 @@ snapshots: '@radix-ui/number@1.1.0': {} + '@radix-ui/primitive@1.0.1': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/primitive@1.1.0': {} '@radix-ui/react-alert-dialog@1.1.2(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -1600,12 +1796,26 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-context@1.0.1(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-context@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 @@ -1618,6 +1828,28 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-dialog@1.0.5(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.10)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.10)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-dialog@1.1.2(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -1645,6 +1877,19 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-dismissable-layer@1.0.5(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-dismissable-layer@1.1.1(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -1671,12 +1916,30 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-focus-scope@1.0.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-focus-scope@1.1.0(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) @@ -1707,6 +1970,14 @@ snapshots: dependencies: react: 18.3.1 + '@radix-ui/react-id@1.0.1(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-id@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) @@ -1786,6 +2057,15 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-portal@1.0.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-portal@1.1.2(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.0.0(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1795,6 +2075,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-presence@1.0.1(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-presence@1.1.1(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) @@ -1804,6 +2094,15 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-primitive@1.0.3(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-primitive@2.0.0(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) @@ -1856,6 +2155,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-slot@1.0.2(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-slot@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) @@ -1878,12 +2185,27 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) @@ -1891,6 +2213,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) @@ -1898,6 +2228,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.7 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 @@ -2025,6 +2362,16 @@ snapshots: clsx@2.1.1: {} + cmdk@1.0.0(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.0.5(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2468,6 +2815,17 @@ snapshots: optionalDependencies: '@types/react': 18.3.10 + react-remove-scroll@2.5.5(@types/react@18.3.10)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.10)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.10)(react@18.3.1) + tslib: 2.7.0 + use-callback-ref: 1.3.2(@types/react@18.3.10)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.10)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + react-remove-scroll@2.6.0(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 @@ -2500,6 +2858,8 @@ snapshots: dependencies: picomatch: 2.3.1 + regenerator-runtime@0.14.1: {} + resolve@1.22.8: dependencies: is-core-module: 2.15.1 diff --git a/src/app/page.jsx b/src/app/page.jsx index aeb352d..dfca757 100644 --- a/src/app/page.jsx +++ b/src/app/page.jsx @@ -1,5 +1,5 @@ "use client"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useRef } from "react"; import { Dialog, DialogContent, @@ -22,6 +22,80 @@ import { } from "lucide-react"; import { History } from "lucide-react"; import { Sidebar } from "lucide-react"; +import { + Command, + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, + CommandShortcut, +} from "@/components/ui/command"; +import { Settings } from "lucide-react"; +import { MagnifyingGlassIcon } from "@radix-ui/react-icons"; +import { PlusIcon } from "lucide-react"; + +function CommandPalette({ onAddFeed }) { + const [open, setOpen] = useState(false); + + useEffect(() => { + const down = (e) => { + if ((e.ctrlKey || e.metaKey) && e.key === "k") { + e.preventDefault(); + setOpen((open) => !open); + } + }; + + document.addEventListener("keydown", down); + return () => document.removeEventListener("keydown", down); + }, []); + + const handleCommand = (action) => { + setOpen(false); + switch (action) { + case "settings": + window.location.href = "/settings"; + break; + case "discover": + window.location.href = "/discover"; + break; + case "add-feed": + onAddFeed(); + break; + default: + console.log("Unknown action"); + } + }; + + return ( + <> + + + + No results found. + + handleCommand("settings")}> + + Settings + + + + handleCommand("add-feed")}> + + Add feed + + handleCommand("discover")}> + + Discover + + + + + + ); +} export default function Home() { const [feedsJSON, setFeedsJSON] = useState([]); @@ -38,6 +112,10 @@ export default function Home() { const [feeds, setFeeds] = useState([]); const [readHistory, setReadHistory] = useState(null); + const openDialog = () => { + setDialogOpen(true); + }; + async function parseRSSFeed(xmlString, url) { let feed = {}; let feedItems = []; @@ -300,10 +378,30 @@ export default function Home() { localStorage.setItem("filters", JSON.stringify([])); setRules([]); } + const toggleSidebar = (e) => { + if ((e.ctrlKey || e.metaKey) && e.key === "s") { + e.preventDefault(); + setSidebarOpen((prev) => !prev); + } + }; + + document.addEventListener("keydown", toggleSidebar); + document.addEventListener("keydown", (e) => { + if (e.key === "j") { + e.preventDefault(); + document.querySelector(".main-content").scrollBy(0, 100); + } + if (e.key === "k") { + e.preventDefault(); + document.querySelector(".main-content").scrollBy(0, -100); + } + }); window.addEventListener("beforeinstallprompt", handleBeforeInstallPrompt); return () => { setFeedsJSON([]); setFeeds([]); + document.removeEventListener("keydown", toggleSidebar); + setFeedsURLs([]); window.removeEventListener( "beforeinstallprompt", @@ -383,6 +481,7 @@ export default function Home() {
+ + + + + Add New RSS Feed + + Enter the URL of the RSS feed you want to add. + + +
+
+ + setNewFeedURL(e.target.value)} + className="col-span-3" + placeholder="https://example.com/rss" + /> +
+
+
Discover more feeds + + + + + + +
+ + Articles +
    { - setSelector("all_posts"); + setSelector("history"); setCurrentIndex(0); }} > - - Home + + History - {feeds.map((feed, index) => { - if (feed.type == "feeds") { - console.log(feed); - return ( - { - e.preventDefault(); - let confirmation = confirm( - "Are you sure you want to delete this feed?" - ); - if (confirmation) { - setFeedsURLs((prev) => { - const updatedFeeds = prev.filter( - (feedURL) => feedURL !== feed.feedURL - ); - localStorage.setItem( - "savedFeeds", - JSON.stringify(updatedFeeds) - ); - return updatedFeeds; - }); - window.location.reload(); - } - }} - onClick={() => { - setSelector(feed.feedURL); - setCurrentIndex(index); - }} - > - - - {feed.title.split(" - ")[0]} - - - ); - } - })} - - - - - - - Add New RSS Feed - - Enter the URL of the RSS feed you want to add. - - -
    -
    - - setNewFeedURL(e.target.value)} - className="col-span-3" - placeholder="https://example.com/rss" - /> -
    -
    - Discover more feeds - - - -
    -
-
- - Articles - -
    - { - setSelector("history"); - setCurrentIndex(0); - }} - > - - History - -
-
- - ) : null} +
+
{allItems.length > 0 ? ( diff --git a/src/components/ui/command.jsx b/src/components/ui/command.jsx new file mode 100644 index 0000000..26c10d4 --- /dev/null +++ b/src/components/ui/command.jsx @@ -0,0 +1,117 @@ +"use client"; +import * as React from "react" +import { MagnifyingGlassIcon } from "@radix-ui/react-icons" +import { Command as CommandPrimitive } from "cmdk" + +import { cn } from "@/lib/utils" +import { Dialog, DialogContent } from "@/components/ui/dialog" + +const Command = React.forwardRef(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +const CommandDialog = ({ + children, + ...props +}) => { + return ( + ( + + + {children} + + + ) + ); +} + +const CommandInput = React.forwardRef(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}) => { + return ( + () + ); +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +}