Changeset 50f2fb4
- Timestamp:
- 01/30/26 01:40:27 (8 months ago)
- Branches:
- master
- Children:
- ba52069
- Parents:
- 298f9b3
- Files:
-
- 5 added
- 16 edited
-
package-lock.json (modified) (153 diffs)
-
package.json (modified) (1 diff)
-
src/app/[locale]/layout.tsx (added)
-
src/app/layout.tsx (modified) (3 diffs)
-
src/app/page.tsx (modified) (13 diffs)
-
src/app/professor/profile/page.tsx (modified) (9 diffs)
-
src/app/professor/students/page.tsx (modified) (13 diffs)
-
src/app/students/applications/page.tsx (modified) (16 diffs)
-
src/app/students/documents/page.tsx (modified) (26 diffs)
-
src/app/students/profile/page.tsx (modified) (9 diffs)
-
src/app/students/semesters/page.tsx (modified) (12 diffs)
-
src/app/students/subjects/page.tsx (modified) (17 diffs)
-
src/components/LanguageSwitcher.tsx (added)
-
src/components/exams.tsx (modified) (11 diffs)
-
src/components/header.tsx (modified) (3 diffs)
-
src/components/navbar.tsx (modified) (2 diffs)
-
src/components/professor-navbar.tsx (modified) (2 diffs)
-
src/i18n.ts (added)
-
src/locales/en/translation.json (added)
-
src/locales/mk/translation.json (added)
-
tsconfig.json (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
package-lock.json
r298f9b3 r50f2fb4 16 16 "class-variance-authority": "^0.7.1", 17 17 "clsx": "^2.1.1", 18 "i18next": "^25.8.0", 18 19 "lucide-react": "^0.544.0", 19 "next": "15.5.9", 20 "react": "19.1.0", 21 "react-dom": "19.1.0", 20 "next": "^16.1.6", 21 "next-intl": "^4.8.0", 22 "react": "^19.2.4", 23 "react-dom": "^19.2.4", 24 "react-i18next": "^16.5.4", 22 25 "tailwind-merge": "^3.3.1" 23 26 }, … … 50 53 } 51 54 }, 55 "node_modules/@babel/runtime": { 56 "version": "7.28.6", 57 "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", 58 "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", 59 "license": "MIT", 60 "engines": { 61 "node": ">=6.9.0" 62 } 63 }, 52 64 "node_modules/@emnapi/core": { 53 "version": "1. 5.0",54 "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1. 5.0.tgz",55 "integrity": "sha512- sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==",65 "version": "1.8.1", 66 "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", 67 "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", 56 68 "dev": true, 57 69 "license": "MIT", … … 63 75 }, 64 76 "node_modules/@emnapi/runtime": { 65 "version": "1. 5.0",66 "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1. 5.0.tgz",67 "integrity": "sha512- 97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",77 "version": "1.8.1", 78 "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", 79 "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", 68 80 "license": "MIT", 69 81 "optional": true, … … 84 96 }, 85 97 "node_modules/@eslint-community/eslint-utils": { 86 "version": "4.9. 0",87 "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9. 0.tgz",88 "integrity": "sha512- ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",98 "version": "4.9.1", 99 "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", 100 "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", 89 101 "dev": true, 90 102 "license": "MIT", … … 116 128 }, 117 129 "node_modules/@eslint-community/regexpp": { 118 "version": "4.12. 1",119 "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12. 1.tgz",120 "integrity": "sha512- CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",130 "version": "4.12.2", 131 "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", 132 "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", 121 133 "dev": true, 122 134 "license": "MIT", … … 126 138 }, 127 139 "node_modules/@eslint/config-array": { 128 "version": "0.21. 0",129 "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21. 0.tgz",130 "integrity": "sha512- ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",140 "version": "0.21.1", 141 "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", 142 "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", 131 143 "dev": true, 132 144 "license": "Apache-2.0", 133 145 "dependencies": { 134 "@eslint/object-schema": "^2.1. 6",146 "@eslint/object-schema": "^2.1.7", 135 147 "debug": "^4.3.1", 136 148 "minimatch": "^3.1.2" … … 141 153 }, 142 154 "node_modules/@eslint/config-helpers": { 143 "version": "0. 3.1",144 "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0. 3.1.tgz",145 "integrity": "sha512- xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",155 "version": "0.4.2", 156 "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", 157 "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", 146 158 "dev": true, 147 159 "license": "Apache-2.0", 160 "dependencies": { 161 "@eslint/core": "^0.17.0" 162 }, 148 163 "engines": { 149 164 "node": "^18.18.0 || ^20.9.0 || >=21.1.0" … … 151 166 }, 152 167 "node_modules/@eslint/core": { 153 "version": "0.1 5.2",154 "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.1 5.2.tgz",155 "integrity": "sha512- 78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",168 "version": "0.17.0", 169 "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", 170 "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", 156 171 "dev": true, 157 172 "license": "Apache-2.0", … … 164 179 }, 165 180 "node_modules/@eslint/eslintrc": { 166 "version": "3.3. 1",167 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3. 1.tgz",168 "integrity": "sha512- gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",181 "version": "3.3.3", 182 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", 183 "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", 169 184 "dev": true, 170 185 "license": "MIT", … … 176 191 "ignore": "^5.2.0", 177 192 "import-fresh": "^3.2.1", 178 "js-yaml": "^4.1. 0",193 "js-yaml": "^4.1.1", 179 194 "minimatch": "^3.1.2", 180 195 "strip-json-comments": "^3.1.1" … … 188 203 }, 189 204 "node_modules/@eslint/js": { 190 "version": "9.3 6.0",191 "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3 6.0.tgz",192 "integrity": "sha512- uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==",205 "version": "9.39.2", 206 "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", 207 "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", 193 208 "dev": true, 194 209 "license": "MIT", … … 201 216 }, 202 217 "node_modules/@eslint/object-schema": { 203 "version": "2.1. 6",204 "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1. 6.tgz",205 "integrity": "sha512- RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",218 "version": "2.1.7", 219 "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", 220 "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", 206 221 "dev": true, 207 222 "license": "Apache-2.0", … … 211 226 }, 212 227 "node_modules/@eslint/plugin-kit": { 213 "version": "0. 3.5",214 "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0. 3.5.tgz",215 "integrity": "sha512- Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",228 "version": "0.4.1", 229 "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", 230 "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", 216 231 "dev": true, 217 232 "license": "Apache-2.0", 218 233 "dependencies": { 219 "@eslint/core": "^0.1 5.2",234 "@eslint/core": "^0.17.0", 220 235 "levn": "^0.4.1" 221 236 }, … … 224 239 } 225 240 }, 241 "node_modules/@formatjs/ecma402-abstract": { 242 "version": "3.1.0", 243 "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-3.1.0.tgz", 244 "integrity": "sha512-CjP1sUzM7XiQW6YluDreN+dMvcKZysO/J4ikvuDjDyd6nSOoSqAK9gvD1s75ZFaJVXtYOsz+y3CUXPZ1sKxcxw==", 245 "license": "MIT", 246 "dependencies": { 247 "@formatjs/fast-memoize": "3.1.0", 248 "@formatjs/intl-localematcher": "0.8.0", 249 "decimal.js": "^10.6.0", 250 "tslib": "^2.8.1" 251 } 252 }, 253 "node_modules/@formatjs/ecma402-abstract/node_modules/@formatjs/intl-localematcher": { 254 "version": "0.8.0", 255 "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.8.0.tgz", 256 "integrity": "sha512-zgMYWdUlmEZpX2Io+v3LHrfq9xZ6khpQVf9UAw2xYWhGerGgI9XgH1HvL/A34jWiruUJpYlP5pk4g8nIcaDrXQ==", 257 "license": "MIT", 258 "dependencies": { 259 "@formatjs/fast-memoize": "3.1.0", 260 "tslib": "^2.8.1" 261 } 262 }, 263 "node_modules/@formatjs/fast-memoize": { 264 "version": "3.1.0", 265 "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.0.tgz", 266 "integrity": "sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==", 267 "license": "MIT", 268 "dependencies": { 269 "tslib": "^2.8.1" 270 } 271 }, 272 "node_modules/@formatjs/icu-messageformat-parser": { 273 "version": "3.5.0", 274 "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.0.tgz", 275 "integrity": "sha512-Q01XuvtbDVCJQsG/E2MSfMZ+UdUoZV8v4Aex8tTH44SqKJZCeu5LjuclaKFUS0o1YoXndfEinJen5k1T1GR1vg==", 276 "license": "MIT", 277 "dependencies": { 278 "@formatjs/ecma402-abstract": "3.1.0", 279 "@formatjs/icu-skeleton-parser": "2.1.0", 280 "tslib": "^2.8.1" 281 } 282 }, 283 "node_modules/@formatjs/icu-skeleton-parser": { 284 "version": "2.1.0", 285 "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.0.tgz", 286 "integrity": "sha512-wNer4imHDFBVAJnMb2OGoSyM4wL/uuLnuo5mrenliqkDaNjRbG4jzlJcwTTDEBhai8iCjnzUsE7xwNJC29SfWw==", 287 "license": "MIT", 288 "dependencies": { 289 "@formatjs/ecma402-abstract": "3.1.0", 290 "tslib": "^2.8.1" 291 } 292 }, 293 "node_modules/@formatjs/intl-localematcher": { 294 "version": "0.5.10", 295 "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz", 296 "integrity": "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==", 297 "license": "MIT", 298 "dependencies": { 299 "tslib": "2" 300 } 301 }, 226 302 "node_modules/@fortawesome/fontawesome-common-types": { 227 "version": "7. 0.1",228 "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7. 0.1.tgz",229 "integrity": "sha512- 0VpNtO5cNe1/HQWMkl4OdncYK/mv9hnBte0Ew0n6DMzmo3Q3WzDFABHm6LeNTipt5zAyhQ6Ugjiu8aLaEjh1gg==",303 "version": "7.1.0", 304 "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.1.0.tgz", 305 "integrity": "sha512-l/BQM7fYntsCI//du+6sEnHOP6a74UixFyOYUyz2DLMXKx+6DEhfR3F2NYGE45XH1JJuIamacb4IZs9S0ZOWLA==", 230 306 "license": "MIT", 231 307 "engines": { … … 234 310 }, 235 311 "node_modules/@fortawesome/fontawesome-svg-core": { 236 "version": "7. 0.1",237 "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7. 0.1.tgz",238 "integrity": "sha512- x0cR55ILVqFpUioSMf6ebpRCMXMcheGN743P05W2RB5uCNpJUqWIqW66Lap8PfL/lngvjTbZj0BNSUweIr/fHQ==",312 "version": "7.1.0", 313 "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.1.0.tgz", 314 "integrity": "sha512-fNxRUk1KhjSbnbuBxlWSnBLKLBNun52ZBTcs22H/xEEzM6Ap81ZFTQ4bZBxVQGQgVY0xugKGoRcCbaKjLQ3XZA==", 239 315 "license": "MIT", 240 316 "peer": true, 241 317 "dependencies": { 242 "@fortawesome/fontawesome-common-types": "7. 0.1"318 "@fortawesome/fontawesome-common-types": "7.1.0" 243 319 }, 244 320 "engines": { … … 247 323 }, 248 324 "node_modules/@fortawesome/free-brands-svg-icons": { 249 "version": "7. 0.1",250 "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7. 0.1.tgz",251 "integrity": "sha512- 6xPmn5SrND/GM0+W33E77x05+aDn6RpR02eWd8eLdN0IxY0vXa5yU/ugaAKloOVxiG9w2330TSRsbJYL6c57Ow==",325 "version": "7.1.0", 326 "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.1.0.tgz", 327 "integrity": "sha512-9byUd9bgNfthsZAjBl6GxOu1VPHgBuRUP9juI7ZoM98h8xNPTCTagfwUFyYscdZq4Hr7gD1azMfM9s5tIWKZZA==", 252 328 "license": "(CC-BY-4.0 AND MIT)", 253 329 "dependencies": { 254 "@fortawesome/fontawesome-common-types": "7. 0.1"330 "@fortawesome/fontawesome-common-types": "7.1.0" 255 331 }, 256 332 "engines": { … … 259 335 }, 260 336 "node_modules/@fortawesome/free-regular-svg-icons": { 261 "version": "7. 0.1",262 "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7. 0.1.tgz",263 "integrity": "sha512- 4V9fHbHjcx9Qu4O99AM5B4zuEDfB4zajk1I77hEzOxPN00f8g3484Aeq6WpfFcmookvjLE3Pr71Dhf/lqw7tbA==",337 "version": "7.1.0", 338 "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.1.0.tgz", 339 "integrity": "sha512-0e2fdEyB4AR+e6kU4yxwA/MonnYcw/CsMEP9lH82ORFi9svA6/RhDyhxIv5mlJaldmaHLLYVTb+3iEr+PDSZuQ==", 264 340 "license": "(CC-BY-4.0 AND MIT)", 265 341 "dependencies": { 266 "@fortawesome/fontawesome-common-types": "7. 0.1"342 "@fortawesome/fontawesome-common-types": "7.1.0" 267 343 }, 268 344 "engines": { … … 271 347 }, 272 348 "node_modules/@fortawesome/free-solid-svg-icons": { 273 "version": "7. 0.1",274 "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7. 0.1.tgz",275 "integrity": "sha512- esKuSrl1WMOTMDLNt38i16VfLe/gRZt2ZAJ3Yw7slfs7sj583MKqNFqO57zmhknk1Sya6f9Wys89aCzIJkcqlg==",349 "version": "7.1.0", 350 "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.1.0.tgz", 351 "integrity": "sha512-Udu3K7SzAo9N013qt7qmm22/wo2hADdheXtBfxFTecp+ogsc0caQNRKEb7pkvvagUGOpG9wJC1ViH6WXs8oXIA==", 276 352 "license": "(CC-BY-4.0 AND MIT)", 277 353 "dependencies": { 278 "@fortawesome/fontawesome-common-types": "7. 0.1"354 "@fortawesome/fontawesome-common-types": "7.1.0" 279 355 }, 280 356 "engines": { … … 283 359 }, 284 360 "node_modules/@fortawesome/react-fontawesome": { 285 "version": "3. 0.2",286 "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-3. 0.2.tgz",287 "integrity": "sha512- cmp/nT0pPC7HUALF8uc3+D5ECwEBWxYQbOIHwtGUWEu72sWtZc26k5onr920HWOViF0nYaC+Qzz6Ln56SQcaVg==",361 "version": "3.1.1", 362 "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-3.1.1.tgz", 363 "integrity": "sha512-EDllr9hpodc21odmUywHS1alXNiCd4E8sp5GJ5s7wYINz8vSmMiNWpALTiuYODb865YyQ/NlyiN4mbXp7HCNqg==", 288 364 "license": "MIT", 289 365 "engines": { … … 358 434 }, 359 435 "node_modules/@img/sharp-darwin-arm64": { 360 "version": "0.34. 4",361 "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34. 4.tgz",362 "integrity": "sha512- sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==",436 "version": "0.34.5", 437 "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", 438 "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", 363 439 "cpu": [ 364 440 "arm64" … … 376 452 }, 377 453 "optionalDependencies": { 378 "@img/sharp-libvips-darwin-arm64": "1.2. 3"454 "@img/sharp-libvips-darwin-arm64": "1.2.4" 379 455 } 380 456 }, 381 457 "node_modules/@img/sharp-darwin-x64": { 382 "version": "0.34. 4",383 "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34. 4.tgz",384 "integrity": "sha512- rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==",458 "version": "0.34.5", 459 "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", 460 "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", 385 461 "cpu": [ 386 462 "x64" … … 398 474 }, 399 475 "optionalDependencies": { 400 "@img/sharp-libvips-darwin-x64": "1.2. 3"476 "@img/sharp-libvips-darwin-x64": "1.2.4" 401 477 } 402 478 }, 403 479 "node_modules/@img/sharp-libvips-darwin-arm64": { 404 "version": "1.2. 3",405 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2. 3.tgz",406 "integrity": "sha512- QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==",480 "version": "1.2.4", 481 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", 482 "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", 407 483 "cpu": [ 408 484 "arm64" … … 418 494 }, 419 495 "node_modules/@img/sharp-libvips-darwin-x64": { 420 "version": "1.2. 3",421 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2. 3.tgz",422 "integrity": "sha512- Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==",496 "version": "1.2.4", 497 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", 498 "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", 423 499 "cpu": [ 424 500 "x64" … … 434 510 }, 435 511 "node_modules/@img/sharp-libvips-linux-arm": { 436 "version": "1.2. 3",437 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2. 3.tgz",438 "integrity": "sha512- x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==",512 "version": "1.2.4", 513 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", 514 "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", 439 515 "cpu": [ 440 516 "arm" … … 450 526 }, 451 527 "node_modules/@img/sharp-libvips-linux-arm64": { 452 "version": "1.2. 3",453 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2. 3.tgz",454 "integrity": "sha512- I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==",528 "version": "1.2.4", 529 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", 530 "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", 455 531 "cpu": [ 456 532 "arm64" … … 466 542 }, 467 543 "node_modules/@img/sharp-libvips-linux-ppc64": { 468 "version": "1.2. 3",469 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2. 3.tgz",470 "integrity": "sha512- Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==",544 "version": "1.2.4", 545 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", 546 "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", 471 547 "cpu": [ 472 548 "ppc64" … … 481 557 } 482 558 }, 559 "node_modules/@img/sharp-libvips-linux-riscv64": { 560 "version": "1.2.4", 561 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", 562 "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", 563 "cpu": [ 564 "riscv64" 565 ], 566 "license": "LGPL-3.0-or-later", 567 "optional": true, 568 "os": [ 569 "linux" 570 ], 571 "funding": { 572 "url": "https://opencollective.com/libvips" 573 } 574 }, 483 575 "node_modules/@img/sharp-libvips-linux-s390x": { 484 "version": "1.2. 3",485 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2. 3.tgz",486 "integrity": "sha512- RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==",576 "version": "1.2.4", 577 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", 578 "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", 487 579 "cpu": [ 488 580 "s390x" … … 498 590 }, 499 591 "node_modules/@img/sharp-libvips-linux-x64": { 500 "version": "1.2. 3",501 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2. 3.tgz",502 "integrity": "sha512- 3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==",592 "version": "1.2.4", 593 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", 594 "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", 503 595 "cpu": [ 504 596 "x64" … … 514 606 }, 515 607 "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 516 "version": "1.2. 3",517 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2. 3.tgz",518 "integrity": "sha512-F 9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==",608 "version": "1.2.4", 609 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", 610 "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", 519 611 "cpu": [ 520 612 "arm64" … … 530 622 }, 531 623 "node_modules/@img/sharp-libvips-linuxmusl-x64": { 532 "version": "1.2. 3",533 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2. 3.tgz",534 "integrity": "sha512- U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==",624 "version": "1.2.4", 625 "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", 626 "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", 535 627 "cpu": [ 536 628 "x64" … … 546 638 }, 547 639 "node_modules/@img/sharp-linux-arm": { 548 "version": "0.34. 4",549 "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34. 4.tgz",550 "integrity": "sha512- Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==",640 "version": "0.34.5", 641 "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", 642 "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", 551 643 "cpu": [ 552 644 "arm" … … 564 656 }, 565 657 "optionalDependencies": { 566 "@img/sharp-libvips-linux-arm": "1.2. 3"658 "@img/sharp-libvips-linux-arm": "1.2.4" 567 659 } 568 660 }, 569 661 "node_modules/@img/sharp-linux-arm64": { 570 "version": "0.34. 4",571 "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34. 4.tgz",572 "integrity": "sha512- YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==",662 "version": "0.34.5", 663 "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", 664 "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", 573 665 "cpu": [ 574 666 "arm64" … … 586 678 }, 587 679 "optionalDependencies": { 588 "@img/sharp-libvips-linux-arm64": "1.2. 3"680 "@img/sharp-libvips-linux-arm64": "1.2.4" 589 681 } 590 682 }, 591 683 "node_modules/@img/sharp-linux-ppc64": { 592 "version": "0.34. 4",593 "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34. 4.tgz",594 "integrity": "sha512- F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==",684 "version": "0.34.5", 685 "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", 686 "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", 595 687 "cpu": [ 596 688 "ppc64" … … 608 700 }, 609 701 "optionalDependencies": { 610 "@img/sharp-libvips-linux-ppc64": "1.2.3" 702 "@img/sharp-libvips-linux-ppc64": "1.2.4" 703 } 704 }, 705 "node_modules/@img/sharp-linux-riscv64": { 706 "version": "0.34.5", 707 "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", 708 "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", 709 "cpu": [ 710 "riscv64" 711 ], 712 "license": "Apache-2.0", 713 "optional": true, 714 "os": [ 715 "linux" 716 ], 717 "engines": { 718 "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 719 }, 720 "funding": { 721 "url": "https://opencollective.com/libvips" 722 }, 723 "optionalDependencies": { 724 "@img/sharp-libvips-linux-riscv64": "1.2.4" 611 725 } 612 726 }, 613 727 "node_modules/@img/sharp-linux-s390x": { 614 "version": "0.34. 4",615 "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34. 4.tgz",616 "integrity": "sha512- qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==",728 "version": "0.34.5", 729 "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", 730 "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", 617 731 "cpu": [ 618 732 "s390x" … … 630 744 }, 631 745 "optionalDependencies": { 632 "@img/sharp-libvips-linux-s390x": "1.2. 3"746 "@img/sharp-libvips-linux-s390x": "1.2.4" 633 747 } 634 748 }, 635 749 "node_modules/@img/sharp-linux-x64": { 636 "version": "0.34. 4",637 "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34. 4.tgz",638 "integrity": "sha512- ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==",750 "version": "0.34.5", 751 "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", 752 "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", 639 753 "cpu": [ 640 754 "x64" … … 652 766 }, 653 767 "optionalDependencies": { 654 "@img/sharp-libvips-linux-x64": "1.2. 3"768 "@img/sharp-libvips-linux-x64": "1.2.4" 655 769 } 656 770 }, 657 771 "node_modules/@img/sharp-linuxmusl-arm64": { 658 "version": "0.34. 4",659 "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34. 4.tgz",660 "integrity": "sha512- 8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==",772 "version": "0.34.5", 773 "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", 774 "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", 661 775 "cpu": [ 662 776 "arm64" … … 674 788 }, 675 789 "optionalDependencies": { 676 "@img/sharp-libvips-linuxmusl-arm64": "1.2. 3"790 "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" 677 791 } 678 792 }, 679 793 "node_modules/@img/sharp-linuxmusl-x64": { 680 "version": "0.34. 4",681 "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34. 4.tgz",682 "integrity": "sha512- lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==",794 "version": "0.34.5", 795 "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", 796 "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", 683 797 "cpu": [ 684 798 "x64" … … 696 810 }, 697 811 "optionalDependencies": { 698 "@img/sharp-libvips-linuxmusl-x64": "1.2. 3"812 "@img/sharp-libvips-linuxmusl-x64": "1.2.4" 699 813 } 700 814 }, 701 815 "node_modules/@img/sharp-wasm32": { 702 "version": "0.34. 4",703 "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34. 4.tgz",704 "integrity": "sha512- 33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==",816 "version": "0.34.5", 817 "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", 818 "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", 705 819 "cpu": [ 706 820 "wasm32" … … 709 823 "optional": true, 710 824 "dependencies": { 711 "@emnapi/runtime": "^1. 5.0"825 "@emnapi/runtime": "^1.7.0" 712 826 }, 713 827 "engines": { … … 719 833 }, 720 834 "node_modules/@img/sharp-win32-arm64": { 721 "version": "0.34. 4",722 "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34. 4.tgz",723 "integrity": "sha512- 2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==",835 "version": "0.34.5", 836 "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", 837 "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", 724 838 "cpu": [ 725 839 "arm64" … … 738 852 }, 739 853 "node_modules/@img/sharp-win32-ia32": { 740 "version": "0.34. 4",741 "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34. 4.tgz",742 "integrity": "sha512- 3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==",854 "version": "0.34.5", 855 "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", 856 "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", 743 857 "cpu": [ 744 858 "ia32" … … 757 871 }, 758 872 "node_modules/@img/sharp-win32-x64": { 759 "version": "0.34. 4",760 "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34. 4.tgz",761 "integrity": "sha512- xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==",873 "version": "0.34.5", 874 "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", 875 "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", 762 876 "cpu": [ 763 877 "x64" … … 773 887 "funding": { 774 888 "url": "https://opencollective.com/libvips" 775 }776 },777 "node_modules/@isaacs/fs-minipass": {778 "version": "4.0.1",779 "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",780 "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",781 "dev": true,782 "license": "ISC",783 "dependencies": {784 "minipass": "^7.0.4"785 },786 "engines": {787 "node": ">=18.0.0"788 889 } 789 890 }, … … 852 953 }, 853 954 "node_modules/@next/env": { 854 "version": "1 5.5.9",855 "resolved": "https://registry.npmjs.org/@next/env/-/env-1 5.5.9.tgz",856 "integrity": "sha512- 4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==",955 "version": "16.1.6", 956 "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", 957 "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", 857 958 "license": "MIT" 858 959 }, … … 868 969 }, 869 970 "node_modules/@next/swc-darwin-arm64": { 870 "version": "1 5.5.7",871 "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-1 5.5.7.tgz",872 "integrity": "sha512- IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==",971 "version": "16.1.6", 972 "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", 973 "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", 873 974 "cpu": [ 874 975 "arm64" … … 884 985 }, 885 986 "node_modules/@next/swc-darwin-x64": { 886 "version": "1 5.5.7",887 "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-1 5.5.7.tgz",888 "integrity": "sha512- UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==",987 "version": "16.1.6", 988 "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", 989 "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", 889 990 "cpu": [ 890 991 "x64" … … 900 1001 }, 901 1002 "node_modules/@next/swc-linux-arm64-gnu": { 902 "version": "1 5.5.7",903 "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-1 5.5.7.tgz",904 "integrity": "sha512- NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==",1003 "version": "16.1.6", 1004 "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", 1005 "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", 905 1006 "cpu": [ 906 1007 "arm64" … … 916 1017 }, 917 1018 "node_modules/@next/swc-linux-arm64-musl": { 918 "version": "1 5.5.7",919 "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-1 5.5.7.tgz",920 "integrity": "sha512- nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==",1019 "version": "16.1.6", 1020 "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", 1021 "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", 921 1022 "cpu": [ 922 1023 "arm64" … … 932 1033 }, 933 1034 "node_modules/@next/swc-linux-x64-gnu": { 934 "version": "1 5.5.7",935 "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-1 5.5.7.tgz",936 "integrity": "sha512- hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==",1035 "version": "16.1.6", 1036 "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", 1037 "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", 937 1038 "cpu": [ 938 1039 "x64" … … 948 1049 }, 949 1050 "node_modules/@next/swc-linux-x64-musl": { 950 "version": "1 5.5.7",951 "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-1 5.5.7.tgz",952 "integrity": "sha512- 4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==",1051 "version": "16.1.6", 1052 "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", 1053 "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", 953 1054 "cpu": [ 954 1055 "x64" … … 964 1065 }, 965 1066 "node_modules/@next/swc-win32-arm64-msvc": { 966 "version": "1 5.5.7",967 "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-1 5.5.7.tgz",968 "integrity": "sha512- CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==",1067 "version": "16.1.6", 1068 "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", 1069 "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", 969 1070 "cpu": [ 970 1071 "arm64" … … 980 1081 }, 981 1082 "node_modules/@next/swc-win32-x64-msvc": { 982 "version": "1 5.5.7",983 "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-1 5.5.7.tgz",984 "integrity": "sha512- gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==",1083 "version": "16.1.6", 1084 "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", 1085 "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", 985 1086 "cpu": [ 986 1087 "x64" … … 1043 1144 } 1044 1145 }, 1146 "node_modules/@parcel/watcher": { 1147 "version": "2.5.6", 1148 "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", 1149 "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", 1150 "hasInstallScript": true, 1151 "license": "MIT", 1152 "dependencies": { 1153 "detect-libc": "^2.0.3", 1154 "is-glob": "^4.0.3", 1155 "node-addon-api": "^7.0.0", 1156 "picomatch": "^4.0.3" 1157 }, 1158 "engines": { 1159 "node": ">= 10.0.0" 1160 }, 1161 "funding": { 1162 "type": "opencollective", 1163 "url": "https://opencollective.com/parcel" 1164 }, 1165 "optionalDependencies": { 1166 "@parcel/watcher-android-arm64": "2.5.6", 1167 "@parcel/watcher-darwin-arm64": "2.5.6", 1168 "@parcel/watcher-darwin-x64": "2.5.6", 1169 "@parcel/watcher-freebsd-x64": "2.5.6", 1170 "@parcel/watcher-linux-arm-glibc": "2.5.6", 1171 "@parcel/watcher-linux-arm-musl": "2.5.6", 1172 "@parcel/watcher-linux-arm64-glibc": "2.5.6", 1173 "@parcel/watcher-linux-arm64-musl": "2.5.6", 1174 "@parcel/watcher-linux-x64-glibc": "2.5.6", 1175 "@parcel/watcher-linux-x64-musl": "2.5.6", 1176 "@parcel/watcher-win32-arm64": "2.5.6", 1177 "@parcel/watcher-win32-ia32": "2.5.6", 1178 "@parcel/watcher-win32-x64": "2.5.6" 1179 } 1180 }, 1181 "node_modules/@parcel/watcher-android-arm64": { 1182 "version": "2.5.6", 1183 "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", 1184 "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", 1185 "cpu": [ 1186 "arm64" 1187 ], 1188 "license": "MIT", 1189 "optional": true, 1190 "os": [ 1191 "android" 1192 ], 1193 "engines": { 1194 "node": ">= 10.0.0" 1195 }, 1196 "funding": { 1197 "type": "opencollective", 1198 "url": "https://opencollective.com/parcel" 1199 } 1200 }, 1201 "node_modules/@parcel/watcher-darwin-arm64": { 1202 "version": "2.5.6", 1203 "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", 1204 "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", 1205 "cpu": [ 1206 "arm64" 1207 ], 1208 "license": "MIT", 1209 "optional": true, 1210 "os": [ 1211 "darwin" 1212 ], 1213 "engines": { 1214 "node": ">= 10.0.0" 1215 }, 1216 "funding": { 1217 "type": "opencollective", 1218 "url": "https://opencollective.com/parcel" 1219 } 1220 }, 1221 "node_modules/@parcel/watcher-darwin-x64": { 1222 "version": "2.5.6", 1223 "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", 1224 "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", 1225 "cpu": [ 1226 "x64" 1227 ], 1228 "license": "MIT", 1229 "optional": true, 1230 "os": [ 1231 "darwin" 1232 ], 1233 "engines": { 1234 "node": ">= 10.0.0" 1235 }, 1236 "funding": { 1237 "type": "opencollective", 1238 "url": "https://opencollective.com/parcel" 1239 } 1240 }, 1241 "node_modules/@parcel/watcher-freebsd-x64": { 1242 "version": "2.5.6", 1243 "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", 1244 "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", 1245 "cpu": [ 1246 "x64" 1247 ], 1248 "license": "MIT", 1249 "optional": true, 1250 "os": [ 1251 "freebsd" 1252 ], 1253 "engines": { 1254 "node": ">= 10.0.0" 1255 }, 1256 "funding": { 1257 "type": "opencollective", 1258 "url": "https://opencollective.com/parcel" 1259 } 1260 }, 1261 "node_modules/@parcel/watcher-linux-arm-glibc": { 1262 "version": "2.5.6", 1263 "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", 1264 "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", 1265 "cpu": [ 1266 "arm" 1267 ], 1268 "license": "MIT", 1269 "optional": true, 1270 "os": [ 1271 "linux" 1272 ], 1273 "engines": { 1274 "node": ">= 10.0.0" 1275 }, 1276 "funding": { 1277 "type": "opencollective", 1278 "url": "https://opencollective.com/parcel" 1279 } 1280 }, 1281 "node_modules/@parcel/watcher-linux-arm-musl": { 1282 "version": "2.5.6", 1283 "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", 1284 "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", 1285 "cpu": [ 1286 "arm" 1287 ], 1288 "license": "MIT", 1289 "optional": true, 1290 "os": [ 1291 "linux" 1292 ], 1293 "engines": { 1294 "node": ">= 10.0.0" 1295 }, 1296 "funding": { 1297 "type": "opencollective", 1298 "url": "https://opencollective.com/parcel" 1299 } 1300 }, 1301 "node_modules/@parcel/watcher-linux-arm64-glibc": { 1302 "version": "2.5.6", 1303 "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", 1304 "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", 1305 "cpu": [ 1306 "arm64" 1307 ], 1308 "license": "MIT", 1309 "optional": true, 1310 "os": [ 1311 "linux" 1312 ], 1313 "engines": { 1314 "node": ">= 10.0.0" 1315 }, 1316 "funding": { 1317 "type": "opencollective", 1318 "url": "https://opencollective.com/parcel" 1319 } 1320 }, 1321 "node_modules/@parcel/watcher-linux-arm64-musl": { 1322 "version": "2.5.6", 1323 "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", 1324 "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", 1325 "cpu": [ 1326 "arm64" 1327 ], 1328 "license": "MIT", 1329 "optional": true, 1330 "os": [ 1331 "linux" 1332 ], 1333 "engines": { 1334 "node": ">= 10.0.0" 1335 }, 1336 "funding": { 1337 "type": "opencollective", 1338 "url": "https://opencollective.com/parcel" 1339 } 1340 }, 1341 "node_modules/@parcel/watcher-linux-x64-glibc": { 1342 "version": "2.5.6", 1343 "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", 1344 "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", 1345 "cpu": [ 1346 "x64" 1347 ], 1348 "license": "MIT", 1349 "optional": true, 1350 "os": [ 1351 "linux" 1352 ], 1353 "engines": { 1354 "node": ">= 10.0.0" 1355 }, 1356 "funding": { 1357 "type": "opencollective", 1358 "url": "https://opencollective.com/parcel" 1359 } 1360 }, 1361 "node_modules/@parcel/watcher-linux-x64-musl": { 1362 "version": "2.5.6", 1363 "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", 1364 "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", 1365 "cpu": [ 1366 "x64" 1367 ], 1368 "license": "MIT", 1369 "optional": true, 1370 "os": [ 1371 "linux" 1372 ], 1373 "engines": { 1374 "node": ">= 10.0.0" 1375 }, 1376 "funding": { 1377 "type": "opencollective", 1378 "url": "https://opencollective.com/parcel" 1379 } 1380 }, 1381 "node_modules/@parcel/watcher-win32-arm64": { 1382 "version": "2.5.6", 1383 "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", 1384 "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", 1385 "cpu": [ 1386 "arm64" 1387 ], 1388 "license": "MIT", 1389 "optional": true, 1390 "os": [ 1391 "win32" 1392 ], 1393 "engines": { 1394 "node": ">= 10.0.0" 1395 }, 1396 "funding": { 1397 "type": "opencollective", 1398 "url": "https://opencollective.com/parcel" 1399 } 1400 }, 1401 "node_modules/@parcel/watcher-win32-ia32": { 1402 "version": "2.5.6", 1403 "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", 1404 "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", 1405 "cpu": [ 1406 "ia32" 1407 ], 1408 "license": "MIT", 1409 "optional": true, 1410 "os": [ 1411 "win32" 1412 ], 1413 "engines": { 1414 "node": ">= 10.0.0" 1415 }, 1416 "funding": { 1417 "type": "opencollective", 1418 "url": "https://opencollective.com/parcel" 1419 } 1420 }, 1421 "node_modules/@parcel/watcher-win32-x64": { 1422 "version": "2.5.6", 1423 "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", 1424 "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", 1425 "cpu": [ 1426 "x64" 1427 ], 1428 "license": "MIT", 1429 "optional": true, 1430 "os": [ 1431 "win32" 1432 ], 1433 "engines": { 1434 "node": ">= 10.0.0" 1435 }, 1436 "funding": { 1437 "type": "opencollective", 1438 "url": "https://opencollective.com/parcel" 1439 } 1440 }, 1441 "node_modules/@parcel/watcher/node_modules/picomatch": { 1442 "version": "4.0.3", 1443 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 1444 "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 1445 "license": "MIT", 1446 "engines": { 1447 "node": ">=12" 1448 }, 1449 "funding": { 1450 "url": "https://github.com/sponsors/jonschlinkert" 1451 } 1452 }, 1045 1453 "node_modules/@rtsao/scc": { 1046 1454 "version": "1.1.0", … … 1051 1459 }, 1052 1460 "node_modules/@rushstack/eslint-patch": { 1053 "version": "1.1 2.0",1054 "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1 2.0.tgz",1055 "integrity": "sha512- 5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==",1461 "version": "1.15.0", 1462 "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.15.0.tgz", 1463 "integrity": "sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==", 1056 1464 "dev": true, 1057 1465 "license": "MIT" 1466 }, 1467 "node_modules/@schummar/icu-type-parser": { 1468 "version": "1.21.5", 1469 "resolved": "https://registry.npmjs.org/@schummar/icu-type-parser/-/icu-type-parser-1.21.5.tgz", 1470 "integrity": "sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==", 1471 "license": "MIT" 1472 }, 1473 "node_modules/@swc/core-darwin-arm64": { 1474 "version": "1.15.11", 1475 "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.11.tgz", 1476 "integrity": "sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==", 1477 "cpu": [ 1478 "arm64" 1479 ], 1480 "license": "Apache-2.0 AND MIT", 1481 "optional": true, 1482 "os": [ 1483 "darwin" 1484 ], 1485 "engines": { 1486 "node": ">=10" 1487 } 1488 }, 1489 "node_modules/@swc/core-darwin-x64": { 1490 "version": "1.15.11", 1491 "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz", 1492 "integrity": "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==", 1493 "cpu": [ 1494 "x64" 1495 ], 1496 "license": "Apache-2.0 AND MIT", 1497 "optional": true, 1498 "os": [ 1499 "darwin" 1500 ], 1501 "engines": { 1502 "node": ">=10" 1503 } 1504 }, 1505 "node_modules/@swc/core-linux-arm-gnueabihf": { 1506 "version": "1.15.11", 1507 "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz", 1508 "integrity": "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==", 1509 "cpu": [ 1510 "arm" 1511 ], 1512 "license": "Apache-2.0", 1513 "optional": true, 1514 "os": [ 1515 "linux" 1516 ], 1517 "engines": { 1518 "node": ">=10" 1519 } 1520 }, 1521 "node_modules/@swc/core-linux-arm64-gnu": { 1522 "version": "1.15.11", 1523 "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz", 1524 "integrity": "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==", 1525 "cpu": [ 1526 "arm64" 1527 ], 1528 "license": "Apache-2.0 AND MIT", 1529 "optional": true, 1530 "os": [ 1531 "linux" 1532 ], 1533 "engines": { 1534 "node": ">=10" 1535 } 1536 }, 1537 "node_modules/@swc/core-linux-arm64-musl": { 1538 "version": "1.15.11", 1539 "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz", 1540 "integrity": "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==", 1541 "cpu": [ 1542 "arm64" 1543 ], 1544 "license": "Apache-2.0 AND MIT", 1545 "optional": true, 1546 "os": [ 1547 "linux" 1548 ], 1549 "engines": { 1550 "node": ">=10" 1551 } 1552 }, 1553 "node_modules/@swc/core-linux-x64-gnu": { 1554 "version": "1.15.11", 1555 "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz", 1556 "integrity": "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==", 1557 "cpu": [ 1558 "x64" 1559 ], 1560 "license": "Apache-2.0 AND MIT", 1561 "optional": true, 1562 "os": [ 1563 "linux" 1564 ], 1565 "engines": { 1566 "node": ">=10" 1567 } 1568 }, 1569 "node_modules/@swc/core-linux-x64-musl": { 1570 "version": "1.15.11", 1571 "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz", 1572 "integrity": "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==", 1573 "cpu": [ 1574 "x64" 1575 ], 1576 "license": "Apache-2.0 AND MIT", 1577 "optional": true, 1578 "os": [ 1579 "linux" 1580 ], 1581 "engines": { 1582 "node": ">=10" 1583 } 1584 }, 1585 "node_modules/@swc/core-win32-arm64-msvc": { 1586 "version": "1.15.11", 1587 "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz", 1588 "integrity": "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==", 1589 "cpu": [ 1590 "arm64" 1591 ], 1592 "license": "Apache-2.0 AND MIT", 1593 "optional": true, 1594 "os": [ 1595 "win32" 1596 ], 1597 "engines": { 1598 "node": ">=10" 1599 } 1600 }, 1601 "node_modules/@swc/core-win32-ia32-msvc": { 1602 "version": "1.15.11", 1603 "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz", 1604 "integrity": "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==", 1605 "cpu": [ 1606 "ia32" 1607 ], 1608 "license": "Apache-2.0 AND MIT", 1609 "optional": true, 1610 "os": [ 1611 "win32" 1612 ], 1613 "engines": { 1614 "node": ">=10" 1615 } 1616 }, 1617 "node_modules/@swc/core-win32-x64-msvc": { 1618 "version": "1.15.11", 1619 "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz", 1620 "integrity": "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==", 1621 "cpu": [ 1622 "x64" 1623 ], 1624 "license": "Apache-2.0 AND MIT", 1625 "optional": true, 1626 "os": [ 1627 "win32" 1628 ], 1629 "engines": { 1630 "node": ">=10" 1631 } 1632 }, 1633 "node_modules/@swc/counter": { 1634 "version": "0.1.3", 1635 "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", 1636 "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", 1637 "license": "Apache-2.0" 1058 1638 }, 1059 1639 "node_modules/@swc/helpers": { … … 1066 1646 } 1067 1647 }, 1648 "node_modules/@swc/types": { 1649 "version": "0.1.25", 1650 "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", 1651 "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", 1652 "license": "Apache-2.0", 1653 "dependencies": { 1654 "@swc/counter": "^0.1.3" 1655 } 1656 }, 1068 1657 "node_modules/@tailwindcss/node": { 1069 "version": "4.1.1 3",1070 "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.1 3.tgz",1071 "integrity": "sha512- eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==",1658 "version": "4.1.18", 1659 "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", 1660 "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", 1072 1661 "dev": true, 1073 1662 "license": "MIT", … … 1075 1664 "@jridgewell/remapping": "^2.3.4", 1076 1665 "enhanced-resolve": "^5.18.3", 1077 "jiti": "^2. 5.1",1078 "lightningcss": "1.30. 1",1079 "magic-string": "^0.30. 18",1666 "jiti": "^2.6.1", 1667 "lightningcss": "1.30.2", 1668 "magic-string": "^0.30.21", 1080 1669 "source-map-js": "^1.2.1", 1081 "tailwindcss": "4.1.1 3"1670 "tailwindcss": "4.1.18" 1082 1671 } 1083 1672 }, 1084 1673 "node_modules/@tailwindcss/oxide": { 1085 "version": "4.1.13", 1086 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz", 1087 "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", 1088 "dev": true, 1089 "hasInstallScript": true, 1090 "license": "MIT", 1091 "dependencies": { 1092 "detect-libc": "^2.0.4", 1093 "tar": "^7.4.3" 1094 }, 1674 "version": "4.1.18", 1675 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", 1676 "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", 1677 "dev": true, 1678 "license": "MIT", 1095 1679 "engines": { 1096 1680 "node": ">= 10" 1097 1681 }, 1098 1682 "optionalDependencies": { 1099 "@tailwindcss/oxide-android-arm64": "4.1.1 3",1100 "@tailwindcss/oxide-darwin-arm64": "4.1.1 3",1101 "@tailwindcss/oxide-darwin-x64": "4.1.1 3",1102 "@tailwindcss/oxide-freebsd-x64": "4.1.1 3",1103 "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.1 3",1104 "@tailwindcss/oxide-linux-arm64-gnu": "4.1.1 3",1105 "@tailwindcss/oxide-linux-arm64-musl": "4.1.1 3",1106 "@tailwindcss/oxide-linux-x64-gnu": "4.1.1 3",1107 "@tailwindcss/oxide-linux-x64-musl": "4.1.1 3",1108 "@tailwindcss/oxide-wasm32-wasi": "4.1.1 3",1109 "@tailwindcss/oxide-win32-arm64-msvc": "4.1.1 3",1110 "@tailwindcss/oxide-win32-x64-msvc": "4.1.1 3"1683 "@tailwindcss/oxide-android-arm64": "4.1.18", 1684 "@tailwindcss/oxide-darwin-arm64": "4.1.18", 1685 "@tailwindcss/oxide-darwin-x64": "4.1.18", 1686 "@tailwindcss/oxide-freebsd-x64": "4.1.18", 1687 "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", 1688 "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", 1689 "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", 1690 "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", 1691 "@tailwindcss/oxide-linux-x64-musl": "4.1.18", 1692 "@tailwindcss/oxide-wasm32-wasi": "4.1.18", 1693 "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", 1694 "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" 1111 1695 } 1112 1696 }, 1113 1697 "node_modules/@tailwindcss/oxide-android-arm64": { 1114 "version": "4.1.1 3",1115 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.1 3.tgz",1116 "integrity": "sha512- BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==",1698 "version": "4.1.18", 1699 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", 1700 "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", 1117 1701 "cpu": [ 1118 1702 "arm64" … … 1129 1713 }, 1130 1714 "node_modules/@tailwindcss/oxide-darwin-arm64": { 1131 "version": "4.1.1 3",1132 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.1 3.tgz",1133 "integrity": "sha512- YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==",1715 "version": "4.1.18", 1716 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", 1717 "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", 1134 1718 "cpu": [ 1135 1719 "arm64" … … 1146 1730 }, 1147 1731 "node_modules/@tailwindcss/oxide-darwin-x64": { 1148 "version": "4.1.1 3",1149 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.1 3.tgz",1150 "integrity": "sha512- aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==",1732 "version": "4.1.18", 1733 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", 1734 "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", 1151 1735 "cpu": [ 1152 1736 "x64" … … 1163 1747 }, 1164 1748 "node_modules/@tailwindcss/oxide-freebsd-x64": { 1165 "version": "4.1.1 3",1166 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.1 3.tgz",1167 "integrity": "sha512- Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==",1749 "version": "4.1.18", 1750 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", 1751 "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", 1168 1752 "cpu": [ 1169 1753 "x64" … … 1180 1764 }, 1181 1765 "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 1182 "version": "4.1.1 3",1183 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.1 3.tgz",1184 "integrity": "sha512- mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==",1766 "version": "4.1.18", 1767 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", 1768 "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", 1185 1769 "cpu": [ 1186 1770 "arm" … … 1197 1781 }, 1198 1782 "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 1199 "version": "4.1.1 3",1200 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.1 3.tgz",1201 "integrity": "sha512- wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==",1783 "version": "4.1.18", 1784 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", 1785 "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", 1202 1786 "cpu": [ 1203 1787 "arm64" … … 1214 1798 }, 1215 1799 "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 1216 "version": "4.1.1 3",1217 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.1 3.tgz",1218 "integrity": "sha512- hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==",1800 "version": "4.1.18", 1801 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", 1802 "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", 1219 1803 "cpu": [ 1220 1804 "arm64" … … 1231 1815 }, 1232 1816 "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 1233 "version": "4.1.1 3",1234 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.1 3.tgz",1235 "integrity": "sha512- uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==",1817 "version": "4.1.18", 1818 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", 1819 "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", 1236 1820 "cpu": [ 1237 1821 "x64" … … 1248 1832 }, 1249 1833 "node_modules/@tailwindcss/oxide-linux-x64-musl": { 1250 "version": "4.1.1 3",1251 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.1 3.tgz",1252 "integrity": "sha512- oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==",1834 "version": "4.1.18", 1835 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", 1836 "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", 1253 1837 "cpu": [ 1254 1838 "x64" … … 1265 1849 }, 1266 1850 "node_modules/@tailwindcss/oxide-wasm32-wasi": { 1267 "version": "4.1.1 3",1268 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.1 3.tgz",1269 "integrity": "sha512- +LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==",1851 "version": "4.1.18", 1852 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", 1853 "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", 1270 1854 "bundleDependencies": [ 1271 1855 "@napi-rs/wasm-runtime", … … 1283 1867 "optional": true, 1284 1868 "dependencies": { 1285 "@emnapi/core": "^1. 4.5",1286 "@emnapi/runtime": "^1. 4.5",1287 "@emnapi/wasi-threads": "^1. 0.4",1288 "@napi-rs/wasm-runtime": "^ 0.2.12",1289 "@tybys/wasm-util": "^0.10. 0",1290 "tslib": "^2. 8.0"1869 "@emnapi/core": "^1.7.1", 1870 "@emnapi/runtime": "^1.7.1", 1871 "@emnapi/wasi-threads": "^1.1.0", 1872 "@napi-rs/wasm-runtime": "^1.1.0", 1873 "@tybys/wasm-util": "^0.10.1", 1874 "tslib": "^2.4.0" 1291 1875 }, 1292 1876 "engines": { … … 1295 1879 }, 1296 1880 "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 1297 "version": "4.1.1 3",1298 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.1 3.tgz",1299 "integrity": "sha512- dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==",1881 "version": "4.1.18", 1882 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", 1883 "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", 1300 1884 "cpu": [ 1301 1885 "arm64" … … 1312 1896 }, 1313 1897 "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 1314 "version": "4.1.1 3",1315 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.1 3.tgz",1316 "integrity": "sha512- 3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==",1898 "version": "4.1.18", 1899 "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", 1900 "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", 1317 1901 "cpu": [ 1318 1902 "x64" … … 1329 1913 }, 1330 1914 "node_modules/@tailwindcss/postcss": { 1331 "version": "4.1.1 3",1332 "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.1 3.tgz",1333 "integrity": "sha512- HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==",1915 "version": "4.1.18", 1916 "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", 1917 "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", 1334 1918 "dev": true, 1335 1919 "license": "MIT", 1336 1920 "dependencies": { 1337 1921 "@alloc/quick-lru": "^5.2.0", 1338 "@tailwindcss/node": "4.1.1 3",1339 "@tailwindcss/oxide": "4.1.1 3",1922 "@tailwindcss/node": "4.1.18", 1923 "@tailwindcss/oxide": "4.1.18", 1340 1924 "postcss": "^8.4.41", 1341 "tailwindcss": "4.1.1 3"1925 "tailwindcss": "4.1.18" 1342 1926 } 1343 1927 }, … … 1375 1959 }, 1376 1960 "node_modules/@types/node": { 1377 "version": "20.19. 17",1378 "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19. 17.tgz",1379 "integrity": "sha512- gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==",1961 "version": "20.19.30", 1962 "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", 1963 "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", 1380 1964 "dev": true, 1381 1965 "license": "MIT", … … 1385 1969 }, 1386 1970 "node_modules/@types/react": { 1387 "version": "19. 1.13",1388 "resolved": "https://registry.npmjs.org/@types/react/-/react-19. 1.13.tgz",1389 "integrity": "sha512- hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==",1971 "version": "19.2.10", 1972 "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", 1973 "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", 1390 1974 "dev": true, 1391 1975 "license": "MIT", 1392 1976 "peer": true, 1393 1977 "dependencies": { 1394 "csstype": "^3. 0.2"1978 "csstype": "^3.2.2" 1395 1979 } 1396 1980 }, 1397 1981 "node_modules/@types/react-dom": { 1398 "version": "19. 1.9",1399 "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19. 1.9.tgz",1400 "integrity": "sha512- qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==",1982 "version": "19.2.3", 1983 "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", 1984 "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", 1401 1985 "dev": true, 1402 1986 "license": "MIT", 1403 1987 "peerDependencies": { 1404 "@types/react": "^19. 0.0"1988 "@types/react": "^19.2.0" 1405 1989 } 1406 1990 }, 1407 1991 "node_modules/@typescript-eslint/eslint-plugin": { 1408 "version": "8.44.1", 1409 "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", 1410 "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", 1411 "dev": true, 1412 "license": "MIT", 1413 "dependencies": { 1414 "@eslint-community/regexpp": "^4.10.0", 1415 "@typescript-eslint/scope-manager": "8.44.1", 1416 "@typescript-eslint/type-utils": "8.44.1", 1417 "@typescript-eslint/utils": "8.44.1", 1418 "@typescript-eslint/visitor-keys": "8.44.1", 1419 "graphemer": "^1.4.0", 1420 "ignore": "^7.0.0", 1992 "version": "8.54.0", 1993 "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", 1994 "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", 1995 "dev": true, 1996 "license": "MIT", 1997 "dependencies": { 1998 "@eslint-community/regexpp": "^4.12.2", 1999 "@typescript-eslint/scope-manager": "8.54.0", 2000 "@typescript-eslint/type-utils": "8.54.0", 2001 "@typescript-eslint/utils": "8.54.0", 2002 "@typescript-eslint/visitor-keys": "8.54.0", 2003 "ignore": "^7.0.5", 1421 2004 "natural-compare": "^1.4.0", 1422 "ts-api-utils": "^2. 1.0"2005 "ts-api-utils": "^2.4.0" 1423 2006 }, 1424 2007 "engines": { … … 1430 2013 }, 1431 2014 "peerDependencies": { 1432 "@typescript-eslint/parser": "^8. 44.1",2015 "@typescript-eslint/parser": "^8.54.0", 1433 2016 "eslint": "^8.57.0 || ^9.0.0", 1434 2017 "typescript": ">=4.8.4 <6.0.0" … … 1446 2029 }, 1447 2030 "node_modules/@typescript-eslint/parser": { 1448 "version": "8. 44.1",1449 "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8. 44.1.tgz",1450 "integrity": "sha512- EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==",2031 "version": "8.54.0", 2032 "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", 2033 "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", 1451 2034 "dev": true, 1452 2035 "license": "MIT", 1453 2036 "peer": true, 1454 2037 "dependencies": { 1455 "@typescript-eslint/scope-manager": "8. 44.1",1456 "@typescript-eslint/types": "8. 44.1",1457 "@typescript-eslint/typescript-estree": "8. 44.1",1458 "@typescript-eslint/visitor-keys": "8. 44.1",1459 "debug": "^4. 3.4"2038 "@typescript-eslint/scope-manager": "8.54.0", 2039 "@typescript-eslint/types": "8.54.0", 2040 "@typescript-eslint/typescript-estree": "8.54.0", 2041 "@typescript-eslint/visitor-keys": "8.54.0", 2042 "debug": "^4.4.3" 1460 2043 }, 1461 2044 "engines": { … … 1472 2055 }, 1473 2056 "node_modules/@typescript-eslint/project-service": { 1474 "version": "8. 44.1",1475 "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8. 44.1.tgz",1476 "integrity": "sha512- ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==",1477 "dev": true, 1478 "license": "MIT", 1479 "dependencies": { 1480 "@typescript-eslint/tsconfig-utils": "^8. 44.1",1481 "@typescript-eslint/types": "^8. 44.1",1482 "debug": "^4. 3.4"2057 "version": "8.54.0", 2058 "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", 2059 "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", 2060 "dev": true, 2061 "license": "MIT", 2062 "dependencies": { 2063 "@typescript-eslint/tsconfig-utils": "^8.54.0", 2064 "@typescript-eslint/types": "^8.54.0", 2065 "debug": "^4.4.3" 1483 2066 }, 1484 2067 "engines": { … … 1494 2077 }, 1495 2078 "node_modules/@typescript-eslint/scope-manager": { 1496 "version": "8. 44.1",1497 "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8. 44.1.tgz",1498 "integrity": "sha512- NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==",1499 "dev": true, 1500 "license": "MIT", 1501 "dependencies": { 1502 "@typescript-eslint/types": "8. 44.1",1503 "@typescript-eslint/visitor-keys": "8. 44.1"2079 "version": "8.54.0", 2080 "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", 2081 "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", 2082 "dev": true, 2083 "license": "MIT", 2084 "dependencies": { 2085 "@typescript-eslint/types": "8.54.0", 2086 "@typescript-eslint/visitor-keys": "8.54.0" 1504 2087 }, 1505 2088 "engines": { … … 1512 2095 }, 1513 2096 "node_modules/@typescript-eslint/tsconfig-utils": { 1514 "version": "8. 44.1",1515 "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8. 44.1.tgz",1516 "integrity": "sha512- B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==",2097 "version": "8.54.0", 2098 "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", 2099 "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", 1517 2100 "dev": true, 1518 2101 "license": "MIT", … … 1529 2112 }, 1530 2113 "node_modules/@typescript-eslint/type-utils": { 1531 "version": "8. 44.1",1532 "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8. 44.1.tgz",1533 "integrity": "sha512- KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==",1534 "dev": true, 1535 "license": "MIT", 1536 "dependencies": { 1537 "@typescript-eslint/types": "8. 44.1",1538 "@typescript-eslint/typescript-estree": "8. 44.1",1539 "@typescript-eslint/utils": "8. 44.1",1540 "debug": "^4. 3.4",1541 "ts-api-utils": "^2. 1.0"2114 "version": "8.54.0", 2115 "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", 2116 "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", 2117 "dev": true, 2118 "license": "MIT", 2119 "dependencies": { 2120 "@typescript-eslint/types": "8.54.0", 2121 "@typescript-eslint/typescript-estree": "8.54.0", 2122 "@typescript-eslint/utils": "8.54.0", 2123 "debug": "^4.4.3", 2124 "ts-api-utils": "^2.4.0" 1542 2125 }, 1543 2126 "engines": { … … 1554 2137 }, 1555 2138 "node_modules/@typescript-eslint/types": { 1556 "version": "8. 44.1",1557 "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8. 44.1.tgz",1558 "integrity": "sha512- Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==",2139 "version": "8.54.0", 2140 "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", 2141 "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", 1559 2142 "dev": true, 1560 2143 "license": "MIT", … … 1568 2151 }, 1569 2152 "node_modules/@typescript-eslint/typescript-estree": { 1570 "version": "8.44.1", 1571 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", 1572 "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", 1573 "dev": true, 1574 "license": "MIT", 1575 "dependencies": { 1576 "@typescript-eslint/project-service": "8.44.1", 1577 "@typescript-eslint/tsconfig-utils": "8.44.1", 1578 "@typescript-eslint/types": "8.44.1", 1579 "@typescript-eslint/visitor-keys": "8.44.1", 1580 "debug": "^4.3.4", 1581 "fast-glob": "^3.3.2", 1582 "is-glob": "^4.0.3", 1583 "minimatch": "^9.0.4", 1584 "semver": "^7.6.0", 1585 "ts-api-utils": "^2.1.0" 2153 "version": "8.54.0", 2154 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", 2155 "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", 2156 "dev": true, 2157 "license": "MIT", 2158 "dependencies": { 2159 "@typescript-eslint/project-service": "8.54.0", 2160 "@typescript-eslint/tsconfig-utils": "8.54.0", 2161 "@typescript-eslint/types": "8.54.0", 2162 "@typescript-eslint/visitor-keys": "8.54.0", 2163 "debug": "^4.4.3", 2164 "minimatch": "^9.0.5", 2165 "semver": "^7.7.3", 2166 "tinyglobby": "^0.2.15", 2167 "ts-api-utils": "^2.4.0" 1586 2168 }, 1587 2169 "engines": { … … 1606 2188 } 1607 2189 }, 1608 "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": {1609 "version": "3.3.3",1610 "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",1611 "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",1612 "dev": true,1613 "license": "MIT",1614 "dependencies": {1615 "@nodelib/fs.stat": "^2.0.2",1616 "@nodelib/fs.walk": "^1.2.3",1617 "glob-parent": "^5.1.2",1618 "merge2": "^1.3.0",1619 "micromatch": "^4.0.8"1620 },1621 "engines": {1622 "node": ">=8.6.0"1623 }1624 },1625 "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": {1626 "version": "5.1.2",1627 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",1628 "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",1629 "dev": true,1630 "license": "ISC",1631 "dependencies": {1632 "is-glob": "^4.0.1"1633 },1634 "engines": {1635 "node": ">= 6"1636 }1637 },1638 2190 "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1639 2191 "version": "9.0.5", … … 1653 2205 }, 1654 2206 "node_modules/@typescript-eslint/utils": { 1655 "version": "8. 44.1",1656 "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8. 44.1.tgz",1657 "integrity": "sha512- DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==",1658 "dev": true, 1659 "license": "MIT", 1660 "dependencies": { 1661 "@eslint-community/eslint-utils": "^4. 7.0",1662 "@typescript-eslint/scope-manager": "8. 44.1",1663 "@typescript-eslint/types": "8. 44.1",1664 "@typescript-eslint/typescript-estree": "8. 44.1"2207 "version": "8.54.0", 2208 "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", 2209 "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", 2210 "dev": true, 2211 "license": "MIT", 2212 "dependencies": { 2213 "@eslint-community/eslint-utils": "^4.9.1", 2214 "@typescript-eslint/scope-manager": "8.54.0", 2215 "@typescript-eslint/types": "8.54.0", 2216 "@typescript-eslint/typescript-estree": "8.54.0" 1665 2217 }, 1666 2218 "engines": { … … 1677 2229 }, 1678 2230 "node_modules/@typescript-eslint/visitor-keys": { 1679 "version": "8. 44.1",1680 "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8. 44.1.tgz",1681 "integrity": "sha512- 576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==",1682 "dev": true, 1683 "license": "MIT", 1684 "dependencies": { 1685 "@typescript-eslint/types": "8. 44.1",2231 "version": "8.54.0", 2232 "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", 2233 "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", 2234 "dev": true, 2235 "license": "MIT", 2236 "dependencies": { 2237 "@typescript-eslint/types": "8.54.0", 1686 2238 "eslint-visitor-keys": "^4.2.1" 1687 2239 }, … … 2215 2767 }, 2216 2768 "node_modules/autoprefixer": { 2217 "version": "10.4.2 1",2218 "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2 1.tgz",2219 "integrity": "sha512- O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",2769 "version": "10.4.23", 2770 "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", 2771 "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", 2220 2772 "dev": true, 2221 2773 "funding": [ … … 2235 2787 "license": "MIT", 2236 2788 "dependencies": { 2237 "browserslist": "^4.24.4", 2238 "caniuse-lite": "^1.0.30001702", 2239 "fraction.js": "^4.3.7", 2240 "normalize-range": "^0.1.2", 2789 "browserslist": "^4.28.1", 2790 "caniuse-lite": "^1.0.30001760", 2791 "fraction.js": "^5.3.4", 2241 2792 "picocolors": "^1.1.1", 2242 2793 "postcss-value-parser": "^4.2.0" … … 2269 2820 }, 2270 2821 "node_modules/axe-core": { 2271 "version": "4.1 0.3",2272 "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1 0.3.tgz",2273 "integrity": "sha512- Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",2822 "version": "4.11.1", 2823 "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", 2824 "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", 2274 2825 "dev": true, 2275 2826 "license": "MPL-2.0", … … 2296 2847 }, 2297 2848 "node_modules/baseline-browser-mapping": { 2298 "version": "2.8.6", 2299 "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", 2300 "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", 2301 "dev": true, 2849 "version": "2.9.19", 2850 "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", 2851 "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", 2302 2852 "license": "Apache-2.0", 2303 2853 "bin": { … … 2330 2880 }, 2331 2881 "node_modules/browserslist": { 2332 "version": "4.2 6.2",2333 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.2 6.2.tgz",2334 "integrity": "sha512- ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==",2882 "version": "4.28.1", 2883 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", 2884 "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", 2335 2885 "dev": true, 2336 2886 "funding": [ … … 2351 2901 "peer": true, 2352 2902 "dependencies": { 2353 "baseline-browser-mapping": "^2. 8.3",2354 "caniuse-lite": "^1.0.300017 41",2355 "electron-to-chromium": "^1.5.2 18",2356 "node-releases": "^2.0.2 1",2357 "update-browserslist-db": "^1. 1.3"2903 "baseline-browser-mapping": "^2.9.0", 2904 "caniuse-lite": "^1.0.30001759", 2905 "electron-to-chromium": "^1.5.263", 2906 "node-releases": "^2.0.27", 2907 "update-browserslist-db": "^1.2.0" 2358 2908 }, 2359 2909 "bin": { … … 2425 2975 }, 2426 2976 "node_modules/caniuse-lite": { 2427 "version": "1.0.300017 43",2428 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.300017 43.tgz",2429 "integrity": "sha512- e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==",2977 "version": "1.0.30001766", 2978 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", 2979 "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", 2430 2980 "funding": [ 2431 2981 { … … 2461 3011 } 2462 3012 }, 2463 "node_modules/chownr": {2464 "version": "3.0.0",2465 "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",2466 "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",2467 "dev": true,2468 "license": "BlueOak-1.0.0",2469 "engines": {2470 "node": ">=18"2471 }2472 },2473 3013 "node_modules/class-variance-authority": { 2474 3014 "version": "0.7.1", … … 2541 3081 }, 2542 3082 "node_modules/csstype": { 2543 "version": "3. 1.3",2544 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3. 1.3.tgz",2545 "integrity": "sha512- M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",3083 "version": "3.2.3", 3084 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", 3085 "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", 2546 3086 "dev": true, 2547 3087 "license": "MIT" … … 2626 3166 } 2627 3167 }, 3168 "node_modules/decimal.js": { 3169 "version": "10.6.0", 3170 "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", 3171 "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", 3172 "license": "MIT" 3173 }, 2628 3174 "node_modules/deep-is": { 2629 3175 "version": "0.1.4", … … 2670 3216 }, 2671 3217 "node_modules/detect-libc": { 2672 "version": "2.1.1", 2673 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz", 2674 "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==", 2675 "devOptional": true, 3218 "version": "2.1.2", 3219 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 3220 "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 2676 3221 "license": "Apache-2.0", 2677 3222 "engines": { … … 2708 3253 }, 2709 3254 "node_modules/electron-to-chromium": { 2710 "version": "1.5.2 23",2711 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.2 23.tgz",2712 "integrity": "sha512- qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==",3255 "version": "1.5.282", 3256 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.282.tgz", 3257 "integrity": "sha512-FCPkJtpst28UmFzd903iU7PdeVTfY0KAeJy+Lk0GLZRwgwYHn/irRcaCbQQOmr5Vytc/7rcavsYLvTM8RiHYhQ==", 2713 3258 "dev": true, 2714 3259 "license": "ISC" … … 2722 3267 }, 2723 3268 "node_modules/enhanced-resolve": { 2724 "version": "5.18. 3",2725 "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18. 3.tgz",2726 "integrity": "sha512- d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",3269 "version": "5.18.4", 3270 "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", 3271 "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", 2727 3272 "dev": true, 2728 3273 "license": "MIT", … … 2736 3281 }, 2737 3282 "node_modules/es-abstract": { 2738 "version": "1.24. 0",2739 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24. 0.tgz",2740 "integrity": "sha512- WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",3283 "version": "1.24.1", 3284 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", 3285 "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", 2741 3286 "dev": true, 2742 3287 "license": "MIT", … … 2825 3370 }, 2826 3371 "node_modules/es-iterator-helpers": { 2827 "version": "1.2. 1",2828 "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2. 1.tgz",2829 "integrity": "sha512- uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",3372 "version": "1.2.2", 3373 "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", 3374 "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", 2830 3375 "dev": true, 2831 3376 "license": "MIT", 2832 3377 "dependencies": { 2833 3378 "call-bind": "^1.0.8", 2834 "call-bound": "^1.0. 3",3379 "call-bound": "^1.0.4", 2835 3380 "define-properties": "^1.2.1", 2836 "es-abstract": "^1.2 3.6",3381 "es-abstract": "^1.24.1", 2837 3382 "es-errors": "^1.3.0", 2838 "es-set-tostringtag": "^2. 0.3",3383 "es-set-tostringtag": "^2.1.0", 2839 3384 "function-bind": "^1.1.2", 2840 "get-intrinsic": "^1. 2.6",3385 "get-intrinsic": "^1.3.0", 2841 3386 "globalthis": "^1.0.4", 2842 3387 "gopd": "^1.2.0", … … 2845 3390 "has-symbols": "^1.1.0", 2846 3391 "internal-slot": "^1.1.0", 2847 "iterator.prototype": "^1.1. 4",3392 "iterator.prototype": "^1.1.5", 2848 3393 "safe-array-concat": "^1.1.3" 2849 3394 }, … … 2936 3481 }, 2937 3482 "node_modules/eslint": { 2938 "version": "9.3 6.0",2939 "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.3 6.0.tgz",2940 "integrity": "sha512- hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==",3483 "version": "9.39.2", 3484 "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", 3485 "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", 2941 3486 "dev": true, 2942 3487 "license": "MIT", … … 2945 3490 "@eslint-community/eslint-utils": "^4.8.0", 2946 3491 "@eslint-community/regexpp": "^4.12.1", 2947 "@eslint/config-array": "^0.21. 0",2948 "@eslint/config-helpers": "^0. 3.1",2949 "@eslint/core": "^0.1 5.2",3492 "@eslint/config-array": "^0.21.1", 3493 "@eslint/config-helpers": "^0.4.2", 3494 "@eslint/core": "^0.17.0", 2950 3495 "@eslint/eslintrc": "^3.3.1", 2951 "@eslint/js": "9.3 6.0",2952 "@eslint/plugin-kit": "^0. 3.5",3496 "@eslint/js": "9.39.2", 3497 "@eslint/plugin-kit": "^0.4.1", 2953 3498 "@humanfs/node": "^0.16.6", 2954 3499 "@humanwhocodes/module-importer": "^1.0.1", 2955 3500 "@humanwhocodes/retry": "^0.4.2", 2956 3501 "@types/estree": "^1.0.6", 2957 "@types/json-schema": "^7.0.15",2958 3502 "ajv": "^6.12.4", 2959 3503 "chalk": "^4.0.0", … … 3318 3862 }, 3319 3863 "node_modules/esquery": { 3320 "version": "1. 6.0",3321 "resolved": "https://registry.npmjs.org/esquery/-/esquery-1. 6.0.tgz",3322 "integrity": "sha512- ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",3864 "version": "1.7.0", 3865 "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", 3866 "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", 3323 3867 "dev": true, 3324 3868 "license": "BSD-3-Clause", … … 3415 3959 }, 3416 3960 "node_modules/fastq": { 3417 "version": "1. 19.1",3418 "resolved": "https://registry.npmjs.org/fastq/-/fastq-1. 19.1.tgz",3419 "integrity": "sha512-G wLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",3961 "version": "1.20.1", 3962 "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", 3963 "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", 3420 3964 "dev": true, 3421 3965 "license": "ISC", … … 3505 4049 }, 3506 4050 "node_modules/fraction.js": { 3507 "version": " 4.3.7",3508 "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js- 4.3.7.tgz",3509 "integrity": "sha512- ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",4051 "version": "5.3.4", 4052 "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", 4053 "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", 3510 4054 "dev": true, 3511 4055 "license": "MIT", … … 3514 4058 }, 3515 4059 "funding": { 3516 "type": " patreon",4060 "type": "github", 3517 4061 "url": "https://github.com/sponsors/rawify" 3518 4062 } … … 3557 4101 "funding": { 3558 4102 "url": "https://github.com/sponsors/ljharb" 4103 } 4104 }, 4105 "node_modules/generator-function": { 4106 "version": "2.0.1", 4107 "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", 4108 "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", 4109 "dev": true, 4110 "license": "MIT", 4111 "engines": { 4112 "node": ">= 0.4" 3559 4113 } 3560 4114 }, … … 3617 4171 }, 3618 4172 "node_modules/get-tsconfig": { 3619 "version": "4.1 0.1",3620 "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.1 0.1.tgz",3621 "integrity": "sha512- auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",4173 "version": "4.13.0", 4174 "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", 4175 "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", 3622 4176 "dev": true, 3623 4177 "license": "MIT", … … 3692 4246 "license": "ISC" 3693 4247 }, 3694 "node_modules/graphemer": {3695 "version": "1.4.0",3696 "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",3697 "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",3698 "dev": true,3699 "license": "MIT"3700 },3701 4248 "node_modules/has-bigints": { 3702 4249 "version": "1.1.0", … … 3793 4340 } 3794 4341 }, 4342 "node_modules/html-parse-stringify": { 4343 "version": "3.0.1", 4344 "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", 4345 "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", 4346 "license": "MIT", 4347 "dependencies": { 4348 "void-elements": "3.1.0" 4349 } 4350 }, 4351 "node_modules/i18next": { 4352 "version": "25.8.0", 4353 "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.0.tgz", 4354 "integrity": "sha512-urrg4HMFFMQZ2bbKRK7IZ8/CTE7D8H4JRlAwqA2ZwDRFfdd0K/4cdbNNLgfn9mo+I/h9wJu61qJzH7jCFAhUZQ==", 4355 "funding": [ 4356 { 4357 "type": "individual", 4358 "url": "https://locize.com" 4359 }, 4360 { 4361 "type": "individual", 4362 "url": "https://locize.com/i18next.html" 4363 }, 4364 { 4365 "type": "individual", 4366 "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" 4367 } 4368 ], 4369 "license": "MIT", 4370 "peer": true, 4371 "dependencies": { 4372 "@babel/runtime": "^7.28.4" 4373 }, 4374 "peerDependencies": { 4375 "typescript": "^5" 4376 }, 4377 "peerDependenciesMeta": { 4378 "typescript": { 4379 "optional": true 4380 } 4381 } 4382 }, 4383 "node_modules/icu-minify": { 4384 "version": "4.8.0", 4385 "resolved": "https://registry.npmjs.org/icu-minify/-/icu-minify-4.8.0.tgz", 4386 "integrity": "sha512-CY90QvJwc5ghNW+2gepxz4RWogCnM0ynHEFWSDTfGmE4ZPCPDQfkU36AntjbLcwv1Js2AofIGkxNq/LVVpCCbQ==", 4387 "funding": [ 4388 { 4389 "type": "individual", 4390 "url": "https://github.com/sponsors/amannn" 4391 } 4392 ], 4393 "license": "MIT", 4394 "dependencies": { 4395 "@formatjs/icu-messageformat-parser": "^3.4.0" 4396 } 4397 }, 3795 4398 "node_modules/ignore": { 3796 4399 "version": "5.3.2", … … 3843 4446 "engines": { 3844 4447 "node": ">= 0.4" 4448 } 4449 }, 4450 "node_modules/intl-messageformat": { 4451 "version": "11.1.1", 4452 "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-11.1.1.tgz", 4453 "integrity": "sha512-vnrF2f4vfsdaFY6tuLZfzGcx1GZFMFAq6c7QdK3HSXNcGXEIQncNgbeAcnpjAOszQzq3Jbol2SwgshIGY08WyA==", 4454 "license": "BSD-3-Clause", 4455 "dependencies": { 4456 "@formatjs/ecma402-abstract": "3.1.0", 4457 "@formatjs/fast-memoize": "3.1.0", 4458 "@formatjs/icu-messageformat-parser": "3.5.0", 4459 "tslib": "^2.8.1" 3845 4460 } 3846 4461 }, … … 3994 4609 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3995 4610 "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3996 "dev": true,3997 4611 "license": "MIT", 3998 4612 "engines": { … … 4017 4631 }, 4018 4632 "node_modules/is-generator-function": { 4019 "version": "1.1.0", 4020 "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", 4021 "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", 4022 "dev": true, 4023 "license": "MIT", 4024 "dependencies": { 4025 "call-bound": "^1.0.3", 4026 "get-proto": "^1.0.0", 4633 "version": "1.1.2", 4634 "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", 4635 "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", 4636 "dev": true, 4637 "license": "MIT", 4638 "dependencies": { 4639 "call-bound": "^1.0.4", 4640 "generator-function": "^2.0.0", 4641 "get-proto": "^1.0.1", 4027 4642 "has-tostringtag": "^1.0.2", 4028 4643 "safe-regex-test": "^1.1.0" … … 4039 4654 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 4040 4655 "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 4041 "dev": true,4042 4656 "license": "MIT", 4043 4657 "dependencies": { … … 4279 4893 }, 4280 4894 "node_modules/jiti": { 4281 "version": "2.6. 0",4282 "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6. 0.tgz",4283 "integrity": "sha512- VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==",4895 "version": "2.6.1", 4896 "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", 4897 "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", 4284 4898 "dev": true, 4285 4899 "license": "MIT", … … 4296 4910 }, 4297 4911 "node_modules/js-yaml": { 4298 "version": "4.1. 0",4299 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1. 0.tgz",4300 "integrity": "sha512- wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",4912 "version": "4.1.1", 4913 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 4914 "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 4301 4915 "dev": true, 4302 4916 "license": "MIT", … … 4403 5017 }, 4404 5018 "node_modules/lightningcss": { 4405 "version": "1.30. 1",4406 "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30. 1.tgz",4407 "integrity": "sha512- xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",5019 "version": "1.30.2", 5020 "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", 5021 "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", 4408 5022 "dev": true, 4409 5023 "license": "MPL-2.0", … … 4419 5033 }, 4420 5034 "optionalDependencies": { 4421 "lightningcss-darwin-arm64": "1.30.1", 4422 "lightningcss-darwin-x64": "1.30.1", 4423 "lightningcss-freebsd-x64": "1.30.1", 4424 "lightningcss-linux-arm-gnueabihf": "1.30.1", 4425 "lightningcss-linux-arm64-gnu": "1.30.1", 4426 "lightningcss-linux-arm64-musl": "1.30.1", 4427 "lightningcss-linux-x64-gnu": "1.30.1", 4428 "lightningcss-linux-x64-musl": "1.30.1", 4429 "lightningcss-win32-arm64-msvc": "1.30.1", 4430 "lightningcss-win32-x64-msvc": "1.30.1" 4431 } 4432 }, 4433 "node_modules/lightningcss-darwin-arm64": { 4434 "version": "1.30.1", 4435 "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", 4436 "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", 5035 "lightningcss-android-arm64": "1.30.2", 5036 "lightningcss-darwin-arm64": "1.30.2", 5037 "lightningcss-darwin-x64": "1.30.2", 5038 "lightningcss-freebsd-x64": "1.30.2", 5039 "lightningcss-linux-arm-gnueabihf": "1.30.2", 5040 "lightningcss-linux-arm64-gnu": "1.30.2", 5041 "lightningcss-linux-arm64-musl": "1.30.2", 5042 "lightningcss-linux-x64-gnu": "1.30.2", 5043 "lightningcss-linux-x64-musl": "1.30.2", 5044 "lightningcss-win32-arm64-msvc": "1.30.2", 5045 "lightningcss-win32-x64-msvc": "1.30.2" 5046 } 5047 }, 5048 "node_modules/lightningcss-android-arm64": { 5049 "version": "1.30.2", 5050 "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", 5051 "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", 4437 5052 "cpu": [ 4438 5053 "arm64" … … 4442 5057 "optional": true, 4443 5058 "os": [ 4444 " darwin"5059 "android" 4445 5060 ], 4446 5061 "engines": { … … 4452 5067 } 4453 5068 }, 4454 "node_modules/lightningcss-darwin- x64": {4455 "version": "1.30. 1",4456 "resolved": "https://registry.npmjs.org/lightningcss-darwin- x64/-/lightningcss-darwin-x64-1.30.1.tgz",4457 "integrity": "sha512- k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",4458 "cpu": [ 4459 " x64"5069 "node_modules/lightningcss-darwin-arm64": { 5070 "version": "1.30.2", 5071 "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", 5072 "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", 5073 "cpu": [ 5074 "arm64" 4460 5075 ], 4461 5076 "dev": true, … … 4473 5088 } 4474 5089 }, 4475 "node_modules/lightningcss- freebsd-x64": {4476 "version": "1.30. 1",4477 "resolved": "https://registry.npmjs.org/lightningcss- freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",4478 "integrity": "sha512- kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",5090 "node_modules/lightningcss-darwin-x64": { 5091 "version": "1.30.2", 5092 "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", 5093 "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", 4479 5094 "cpu": [ 4480 5095 "x64" … … 4484 5099 "optional": true, 4485 5100 "os": [ 4486 " freebsd"5101 "darwin" 4487 5102 ], 4488 5103 "engines": { … … 4494 5109 } 4495 5110 }, 4496 "node_modules/lightningcss- linux-arm-gnueabihf": {4497 "version": "1.30. 1",4498 "resolved": "https://registry.npmjs.org/lightningcss- linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",4499 "integrity": "sha512- MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",4500 "cpu": [ 4501 " arm"5111 "node_modules/lightningcss-freebsd-x64": { 5112 "version": "1.30.2", 5113 "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", 5114 "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", 5115 "cpu": [ 5116 "x64" 4502 5117 ], 4503 5118 "dev": true, … … 4505 5120 "optional": true, 4506 5121 "os": [ 4507 " linux"5122 "freebsd" 4508 5123 ], 4509 5124 "engines": { … … 4515 5130 } 4516 5131 }, 4517 "node_modules/lightningcss-linux-arm 64-gnu": {4518 "version": "1.30. 1",4519 "resolved": "https://registry.npmjs.org/lightningcss-linux-arm 64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",4520 "integrity": "sha512- gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",4521 "cpu": [ 4522 "arm 64"5132 "node_modules/lightningcss-linux-arm-gnueabihf": { 5133 "version": "1.30.2", 5134 "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", 5135 "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", 5136 "cpu": [ 5137 "arm" 4523 5138 ], 4524 5139 "dev": true, … … 4536 5151 } 4537 5152 }, 4538 "node_modules/lightningcss-linux-arm64- musl": {4539 "version": "1.30. 1",4540 "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64- musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",4541 "integrity": "sha512- jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",5153 "node_modules/lightningcss-linux-arm64-gnu": { 5154 "version": "1.30.2", 5155 "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", 5156 "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", 4542 5157 "cpu": [ 4543 5158 "arm64" … … 4557 5172 } 4558 5173 }, 4559 "node_modules/lightningcss-linux- x64-gnu": {4560 "version": "1.30. 1",4561 "resolved": "https://registry.npmjs.org/lightningcss-linux- x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",4562 "integrity": "sha512- piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",4563 "cpu": [ 4564 " x64"5174 "node_modules/lightningcss-linux-arm64-musl": { 5175 "version": "1.30.2", 5176 "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", 5177 "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", 5178 "cpu": [ 5179 "arm64" 4565 5180 ], 4566 5181 "dev": true, … … 4578 5193 } 4579 5194 }, 4580 "node_modules/lightningcss-linux-x64- musl": {4581 "version": "1.30. 1",4582 "resolved": "https://registry.npmjs.org/lightningcss-linux-x64- musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",4583 "integrity": "sha512- rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",5195 "node_modules/lightningcss-linux-x64-gnu": { 5196 "version": "1.30.2", 5197 "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", 5198 "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", 4584 5199 "cpu": [ 4585 5200 "x64" … … 4599 5214 } 4600 5215 }, 4601 "node_modules/lightningcss- win32-arm64-msvc": {4602 "version": "1.30. 1",4603 "resolved": "https://registry.npmjs.org/lightningcss- win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",4604 "integrity": "sha512- mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",4605 "cpu": [ 4606 " arm64"5216 "node_modules/lightningcss-linux-x64-musl": { 5217 "version": "1.30.2", 5218 "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", 5219 "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", 5220 "cpu": [ 5221 "x64" 4607 5222 ], 4608 5223 "dev": true, … … 4610 5225 "optional": true, 4611 5226 "os": [ 4612 " win32"5227 "linux" 4613 5228 ], 4614 5229 "engines": { … … 4620 5235 } 4621 5236 }, 5237 "node_modules/lightningcss-win32-arm64-msvc": { 5238 "version": "1.30.2", 5239 "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", 5240 "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", 5241 "cpu": [ 5242 "arm64" 5243 ], 5244 "dev": true, 5245 "license": "MPL-2.0", 5246 "optional": true, 5247 "os": [ 5248 "win32" 5249 ], 5250 "engines": { 5251 "node": ">= 12.0.0" 5252 }, 5253 "funding": { 5254 "type": "opencollective", 5255 "url": "https://opencollective.com/parcel" 5256 } 5257 }, 4622 5258 "node_modules/lightningcss-win32-x64-msvc": { 4623 "version": "1.30. 1",4624 "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30. 1.tgz",4625 "integrity": "sha512- PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",5259 "version": "1.30.2", 5260 "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", 5261 "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", 4626 5262 "cpu": [ 4627 5263 "x64" … … 4687 5323 }, 4688 5324 "node_modules/magic-string": { 4689 "version": "0.30. 19",4690 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30. 19.tgz",4691 "integrity": "sha512- 2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",5325 "version": "0.30.21", 5326 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", 5327 "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", 4692 5328 "dev": true, 4693 5329 "license": "MIT", … … 4751 5387 "funding": { 4752 5388 "url": "https://github.com/sponsors/ljharb" 4753 }4754 },4755 "node_modules/minipass": {4756 "version": "7.1.2",4757 "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",4758 "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",4759 "dev": true,4760 "license": "ISC",4761 "engines": {4762 "node": ">=16 || 14 >=14.17"4763 }4764 },4765 "node_modules/minizlib": {4766 "version": "3.1.0",4767 "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",4768 "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",4769 "dev": true,4770 "license": "MIT",4771 "dependencies": {4772 "minipass": "^7.1.2"4773 },4774 "engines": {4775 "node": ">= 18"4776 5389 } 4777 5390 }, … … 4802 5415 }, 4803 5416 "node_modules/napi-postinstall": { 4804 "version": "0.3. 3",4805 "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3. 3.tgz",4806 "integrity": "sha512- uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==",5417 "version": "0.3.4", 5418 "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", 5419 "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", 4807 5420 "dev": true, 4808 5421 "license": "MIT", … … 4824 5437 "license": "MIT" 4825 5438 }, 5439 "node_modules/negotiator": { 5440 "version": "1.0.0", 5441 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 5442 "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 5443 "license": "MIT", 5444 "engines": { 5445 "node": ">= 0.6" 5446 } 5447 }, 4826 5448 "node_modules/next": { 4827 "version": "1 5.5.9",4828 "resolved": "https://registry.npmjs.org/next/-/next-1 5.5.9.tgz",4829 "integrity": "sha512- agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==",4830 "license": "MIT", 4831 "dependencies": { 4832 "@next/env": "1 5.5.9",5449 "version": "16.1.6", 5450 "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", 5451 "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", 5452 "license": "MIT", 5453 "dependencies": { 5454 "@next/env": "16.1.6", 4833 5455 "@swc/helpers": "0.5.15", 5456 "baseline-browser-mapping": "^2.8.3", 4834 5457 "caniuse-lite": "^1.0.30001579", 4835 5458 "postcss": "8.4.31", … … 4840 5463 }, 4841 5464 "engines": { 4842 "node": " ^18.18.0 || ^19.8.0 || >= 20.0.0"5465 "node": ">=20.9.0" 4843 5466 }, 4844 5467 "optionalDependencies": { 4845 "@next/swc-darwin-arm64": "1 5.5.7",4846 "@next/swc-darwin-x64": "1 5.5.7",4847 "@next/swc-linux-arm64-gnu": "1 5.5.7",4848 "@next/swc-linux-arm64-musl": "1 5.5.7",4849 "@next/swc-linux-x64-gnu": "1 5.5.7",4850 "@next/swc-linux-x64-musl": "1 5.5.7",4851 "@next/swc-win32-arm64-msvc": "1 5.5.7",4852 "@next/swc-win32-x64-msvc": "1 5.5.7",4853 "sharp": "^0.34. 3"5468 "@next/swc-darwin-arm64": "16.1.6", 5469 "@next/swc-darwin-x64": "16.1.6", 5470 "@next/swc-linux-arm64-gnu": "16.1.6", 5471 "@next/swc-linux-arm64-musl": "16.1.6", 5472 "@next/swc-linux-x64-gnu": "16.1.6", 5473 "@next/swc-linux-x64-musl": "16.1.6", 5474 "@next/swc-win32-arm64-msvc": "16.1.6", 5475 "@next/swc-win32-x64-msvc": "16.1.6", 5476 "sharp": "^0.34.4" 4854 5477 }, 4855 5478 "peerDependencies": { … … 4872 5495 }, 4873 5496 "sass": { 5497 "optional": true 5498 } 5499 } 5500 }, 5501 "node_modules/next-intl": { 5502 "version": "4.8.0", 5503 "resolved": "https://registry.npmjs.org/next-intl/-/next-intl-4.8.0.tgz", 5504 "integrity": "sha512-HiKCfG0pQMJ2GhtkQur6C7mpMUBs6lc0+HAZTUDm/5Nwh3dSYi/uAcAl0SiQTd01GmDou6dobd2th4U802lxOg==", 5505 "funding": [ 5506 { 5507 "type": "individual", 5508 "url": "https://github.com/sponsors/amannn" 5509 } 5510 ], 5511 "license": "MIT", 5512 "dependencies": { 5513 "@formatjs/intl-localematcher": "^0.5.4", 5514 "@parcel/watcher": "^2.4.1", 5515 "@swc/core": "^1.15.2", 5516 "icu-minify": "^4.8.0", 5517 "negotiator": "^1.0.0", 5518 "next-intl-swc-plugin-extractor": "^4.8.0", 5519 "po-parser": "^2.1.1", 5520 "use-intl": "^4.8.0" 5521 }, 5522 "peerDependencies": { 5523 "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", 5524 "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", 5525 "typescript": "^5.0.0" 5526 }, 5527 "peerDependenciesMeta": { 5528 "typescript": { 5529 "optional": true 5530 } 5531 } 5532 }, 5533 "node_modules/next-intl-swc-plugin-extractor": { 5534 "version": "4.8.0", 5535 "resolved": "https://registry.npmjs.org/next-intl-swc-plugin-extractor/-/next-intl-swc-plugin-extractor-4.8.0.tgz", 5536 "integrity": "sha512-+uooJAaUUnctq/IZrKJrpoA8yB6/z5kDeraySZlT1+XaoU1i+Onaimo2y/vwlqSKPHVRdqx3aqhwRZPuh71LAw==", 5537 "license": "MIT" 5538 }, 5539 "node_modules/next-intl/node_modules/@swc/core": { 5540 "version": "1.15.11", 5541 "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.11.tgz", 5542 "integrity": "sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==", 5543 "hasInstallScript": true, 5544 "license": "Apache-2.0", 5545 "dependencies": { 5546 "@swc/counter": "^0.1.3", 5547 "@swc/types": "^0.1.25" 5548 }, 5549 "engines": { 5550 "node": ">=10" 5551 }, 5552 "funding": { 5553 "type": "opencollective", 5554 "url": "https://opencollective.com/swc" 5555 }, 5556 "optionalDependencies": { 5557 "@swc/core-darwin-arm64": "1.15.11", 5558 "@swc/core-darwin-x64": "1.15.11", 5559 "@swc/core-linux-arm-gnueabihf": "1.15.11", 5560 "@swc/core-linux-arm64-gnu": "1.15.11", 5561 "@swc/core-linux-arm64-musl": "1.15.11", 5562 "@swc/core-linux-x64-gnu": "1.15.11", 5563 "@swc/core-linux-x64-musl": "1.15.11", 5564 "@swc/core-win32-arm64-msvc": "1.15.11", 5565 "@swc/core-win32-ia32-msvc": "1.15.11", 5566 "@swc/core-win32-x64-msvc": "1.15.11" 5567 }, 5568 "peerDependencies": { 5569 "@swc/helpers": ">=0.5.17" 5570 }, 5571 "peerDependenciesMeta": { 5572 "@swc/helpers": { 4874 5573 "optional": true 4875 5574 } … … 4904 5603 } 4905 5604 }, 5605 "node_modules/node-addon-api": { 5606 "version": "7.1.1", 5607 "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 5608 "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", 5609 "license": "MIT" 5610 }, 4906 5611 "node_modules/node-releases": { 4907 "version": "2.0.2 1",4908 "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2 1.tgz",4909 "integrity": "sha512- 5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==",5612 "version": "2.0.27", 5613 "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", 5614 "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", 4910 5615 "dev": true, 4911 5616 "license": "MIT" 4912 },4913 "node_modules/normalize-range": {4914 "version": "0.1.2",4915 "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",4916 "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",4917 "dev": true,4918 "license": "MIT",4919 "engines": {4920 "node": ">=0.10.0"4921 }4922 5617 }, 4923 5618 "node_modules/object-assign": { … … 5170 5865 "url": "https://github.com/sponsors/jonschlinkert" 5171 5866 } 5867 }, 5868 "node_modules/po-parser": { 5869 "version": "2.1.1", 5870 "resolved": "https://registry.npmjs.org/po-parser/-/po-parser-2.1.1.tgz", 5871 "integrity": "sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==", 5872 "license": "MIT" 5172 5873 }, 5173 5874 "node_modules/possible-typed-array-names": { … … 5272 5973 }, 5273 5974 "node_modules/react": { 5274 "version": "19. 1.0",5275 "resolved": "https://registry.npmjs.org/react/-/react-19. 1.0.tgz",5276 "integrity": "sha512- FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",5975 "version": "19.2.4", 5976 "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", 5977 "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", 5277 5978 "license": "MIT", 5278 5979 "peer": true, … … 5282 5983 }, 5283 5984 "node_modules/react-dom": { 5284 "version": "19. 1.0",5285 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19. 1.0.tgz",5286 "integrity": "sha512- Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",5985 "version": "19.2.4", 5986 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", 5987 "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", 5287 5988 "license": "MIT", 5288 5989 "peer": true, 5289 5990 "dependencies": { 5290 "scheduler": "^0.2 6.0"5991 "scheduler": "^0.27.0" 5291 5992 }, 5292 5993 "peerDependencies": { 5293 "react": "^19.1.0" 5994 "react": "^19.2.4" 5995 } 5996 }, 5997 "node_modules/react-i18next": { 5998 "version": "16.5.4", 5999 "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.4.tgz", 6000 "integrity": "sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g==", 6001 "license": "MIT", 6002 "dependencies": { 6003 "@babel/runtime": "^7.28.4", 6004 "html-parse-stringify": "^3.0.1", 6005 "use-sync-external-store": "^1.6.0" 6006 }, 6007 "peerDependencies": { 6008 "i18next": ">= 25.6.2", 6009 "react": ">= 16.8.0", 6010 "typescript": "^5" 6011 }, 6012 "peerDependenciesMeta": { 6013 "react-dom": { 6014 "optional": true 6015 }, 6016 "react-native": { 6017 "optional": true 6018 }, 6019 "typescript": { 6020 "optional": true 6021 } 5294 6022 } 5295 6023 }, … … 5346 6074 }, 5347 6075 "node_modules/resolve": { 5348 "version": "1.22.1 0",5349 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1 0.tgz",5350 "integrity": "sha512- NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",5351 "dev": true, 5352 "license": "MIT", 5353 "dependencies": { 5354 "is-core-module": "^2.16. 0",6076 "version": "1.22.11", 6077 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", 6078 "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", 6079 "dev": true, 6080 "license": "MIT", 6081 "dependencies": { 6082 "is-core-module": "^2.16.1", 5355 6083 "path-parse": "^1.0.7", 5356 6084 "supports-preserve-symlinks-flag": "^1.0.0" … … 5477 6205 }, 5478 6206 "node_modules/scheduler": { 5479 "version": "0.2 6.0",5480 "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.2 6.0.tgz",5481 "integrity": "sha512- NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",6207 "version": "0.27.0", 6208 "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", 6209 "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", 5482 6210 "license": "MIT" 5483 6211 }, 5484 6212 "node_modules/semver": { 5485 "version": "7.7. 2",5486 "resolved": "https://registry.npmjs.org/semver/-/semver-7.7. 2.tgz",5487 "integrity": "sha512- RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",6213 "version": "7.7.3", 6214 "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 6215 "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 5488 6216 "devOptional": true, 5489 6217 "license": "ISC", … … 5545 6273 }, 5546 6274 "node_modules/sharp": { 5547 "version": "0.34. 4",5548 "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34. 4.tgz",5549 "integrity": "sha512- FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==",6275 "version": "0.34.5", 6276 "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", 6277 "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", 5550 6278 "hasInstallScript": true, 5551 6279 "license": "Apache-2.0", … … 5553 6281 "dependencies": { 5554 6282 "@img/colour": "^1.0.0", 5555 "detect-libc": "^2.1. 0",5556 "semver": "^7.7. 2"6283 "detect-libc": "^2.1.2", 6284 "semver": "^7.7.3" 5557 6285 }, 5558 6286 "engines": { … … 5563 6291 }, 5564 6292 "optionalDependencies": { 5565 "@img/sharp-darwin-arm64": "0.34.4", 5566 "@img/sharp-darwin-x64": "0.34.4", 5567 "@img/sharp-libvips-darwin-arm64": "1.2.3", 5568 "@img/sharp-libvips-darwin-x64": "1.2.3", 5569 "@img/sharp-libvips-linux-arm": "1.2.3", 5570 "@img/sharp-libvips-linux-arm64": "1.2.3", 5571 "@img/sharp-libvips-linux-ppc64": "1.2.3", 5572 "@img/sharp-libvips-linux-s390x": "1.2.3", 5573 "@img/sharp-libvips-linux-x64": "1.2.3", 5574 "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", 5575 "@img/sharp-libvips-linuxmusl-x64": "1.2.3", 5576 "@img/sharp-linux-arm": "0.34.4", 5577 "@img/sharp-linux-arm64": "0.34.4", 5578 "@img/sharp-linux-ppc64": "0.34.4", 5579 "@img/sharp-linux-s390x": "0.34.4", 5580 "@img/sharp-linux-x64": "0.34.4", 5581 "@img/sharp-linuxmusl-arm64": "0.34.4", 5582 "@img/sharp-linuxmusl-x64": "0.34.4", 5583 "@img/sharp-wasm32": "0.34.4", 5584 "@img/sharp-win32-arm64": "0.34.4", 5585 "@img/sharp-win32-ia32": "0.34.4", 5586 "@img/sharp-win32-x64": "0.34.4" 6293 "@img/sharp-darwin-arm64": "0.34.5", 6294 "@img/sharp-darwin-x64": "0.34.5", 6295 "@img/sharp-libvips-darwin-arm64": "1.2.4", 6296 "@img/sharp-libvips-darwin-x64": "1.2.4", 6297 "@img/sharp-libvips-linux-arm": "1.2.4", 6298 "@img/sharp-libvips-linux-arm64": "1.2.4", 6299 "@img/sharp-libvips-linux-ppc64": "1.2.4", 6300 "@img/sharp-libvips-linux-riscv64": "1.2.4", 6301 "@img/sharp-libvips-linux-s390x": "1.2.4", 6302 "@img/sharp-libvips-linux-x64": "1.2.4", 6303 "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", 6304 "@img/sharp-libvips-linuxmusl-x64": "1.2.4", 6305 "@img/sharp-linux-arm": "0.34.5", 6306 "@img/sharp-linux-arm64": "0.34.5", 6307 "@img/sharp-linux-ppc64": "0.34.5", 6308 "@img/sharp-linux-riscv64": "0.34.5", 6309 "@img/sharp-linux-s390x": "0.34.5", 6310 "@img/sharp-linux-x64": "0.34.5", 6311 "@img/sharp-linuxmusl-arm64": "0.34.5", 6312 "@img/sharp-linuxmusl-x64": "0.34.5", 6313 "@img/sharp-wasm32": "0.34.5", 6314 "@img/sharp-win32-arm64": "0.34.5", 6315 "@img/sharp-win32-ia32": "0.34.5", 6316 "@img/sharp-win32-x64": "0.34.5" 5587 6317 } 5588 6318 }, … … 5902 6632 }, 5903 6633 "node_modules/tailwind-merge": { 5904 "version": "3. 3.1",5905 "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3. 3.1.tgz",5906 "integrity": "sha512- gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==",6634 "version": "3.4.0", 6635 "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", 6636 "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", 5907 6637 "license": "MIT", 5908 6638 "funding": { … … 5912 6642 }, 5913 6643 "node_modules/tailwindcss": { 5914 "version": "4.1.1 3",5915 "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.1 3.tgz",5916 "integrity": "sha512- i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==",6644 "version": "4.1.18", 6645 "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", 6646 "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", 5917 6647 "dev": true, 5918 6648 "license": "MIT" 5919 6649 }, 5920 6650 "node_modules/tapable": { 5921 "version": "2. 2.3",5922 "resolved": "https://registry.npmjs.org/tapable/-/tapable-2. 2.3.tgz",5923 "integrity": "sha512- ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==",6651 "version": "2.3.0", 6652 "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", 6653 "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", 5924 6654 "dev": true, 5925 6655 "license": "MIT", … … 5930 6660 "type": "opencollective", 5931 6661 "url": "https://opencollective.com/webpack" 5932 }5933 },5934 "node_modules/tar": {5935 "version": "7.5.1",5936 "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz",5937 "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==",5938 "dev": true,5939 "license": "ISC",5940 "dependencies": {5941 "@isaacs/fs-minipass": "^4.0.0",5942 "chownr": "^3.0.0",5943 "minipass": "^7.1.2",5944 "minizlib": "^3.1.0",5945 "yallist": "^5.0.0"5946 },5947 "engines": {5948 "node": ">=18"5949 6662 } 5950 6663 }, … … 6012 6725 }, 6013 6726 "node_modules/ts-api-utils": { 6014 "version": "2. 1.0",6015 "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2. 1.0.tgz",6016 "integrity": "sha512- CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",6727 "version": "2.4.0", 6728 "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", 6729 "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", 6017 6730 "dev": true, 6018 6731 "license": "MIT", … … 6145 6858 }, 6146 6859 "node_modules/typescript": { 6147 "version": "5.9. 2",6148 "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9. 2.tgz",6149 "integrity": "sha512- CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",6150 "dev ": true,6860 "version": "5.9.3", 6861 "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", 6862 "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", 6863 "devOptional": true, 6151 6864 "license": "Apache-2.0", 6152 6865 "peer": true, … … 6221 6934 }, 6222 6935 "node_modules/update-browserslist-db": { 6223 "version": "1. 1.3",6224 "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1. 1.3.tgz",6225 "integrity": "sha512- UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",6936 "version": "1.2.3", 6937 "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", 6938 "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", 6226 6939 "dev": true, 6227 6940 "funding": [ … … 6261 6974 } 6262 6975 }, 6976 "node_modules/use-intl": { 6977 "version": "4.8.0", 6978 "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-4.8.0.tgz", 6979 "integrity": "sha512-IH56txyiaW26QQzneQf/0PWTa1Os3BMZvwbyDiS8cBjl6mm8dlhlKsgSU6TiSZjV6ZhMv763584jNBEyQV8vtQ==", 6980 "funding": [ 6981 { 6982 "type": "individual", 6983 "url": "https://github.com/sponsors/amannn" 6984 } 6985 ], 6986 "license": "MIT", 6987 "dependencies": { 6988 "@formatjs/fast-memoize": "^3.1.0", 6989 "@schummar/icu-type-parser": "1.21.5", 6990 "icu-minify": "^4.8.0", 6991 "intl-messageformat": "^11.1.0" 6992 }, 6993 "peerDependencies": { 6994 "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" 6995 } 6996 }, 6997 "node_modules/use-sync-external-store": { 6998 "version": "1.6.0", 6999 "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", 7000 "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", 7001 "license": "MIT", 7002 "peerDependencies": { 7003 "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 7004 } 7005 }, 7006 "node_modules/void-elements": { 7007 "version": "3.1.0", 7008 "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", 7009 "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", 7010 "license": "MIT", 7011 "engines": { 7012 "node": ">=0.10.0" 7013 } 7014 }, 6263 7015 "node_modules/which": { 6264 7016 "version": "2.0.2", … … 6345 7097 }, 6346 7098 "node_modules/which-typed-array": { 6347 "version": "1.1. 19",6348 "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1. 19.tgz",6349 "integrity": "sha512- rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",7099 "version": "1.1.20", 7100 "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", 7101 "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", 6350 7102 "dev": true, 6351 7103 "license": "MIT", … … 6376 7128 } 6377 7129 }, 6378 "node_modules/yallist": {6379 "version": "5.0.0",6380 "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",6381 "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",6382 "dev": true,6383 "license": "BlueOak-1.0.0",6384 "engines": {6385 "node": ">=18"6386 }6387 },6388 7130 "node_modules/yocto-queue": { 6389 7131 "version": "0.1.0", -
package.json
r298f9b3 r50f2fb4 17 17 "class-variance-authority": "^0.7.1", 18 18 "clsx": "^2.1.1", 19 "i18next": "^25.8.0", 19 20 "lucide-react": "^0.544.0", 20 "next": "15.5.9", 21 "react": "19.1.0", 22 "react-dom": "19.1.0", 21 "next": "^16.1.6", 22 "next-intl": "^4.8.0", 23 "react": "^19.2.4", 24 "react-dom": "^19.2.4", 25 "react-i18next": "^16.5.4", 23 26 "tailwind-merge": "^3.3.1" 24 27 }, -
src/app/layout.tsx
r298f9b3 r50f2fb4 1 import type { Metadata } from "next";1 "use client"; 2 2 import { Geist, Geist_Mono } from "next/font/google"; 3 3 import "./globals.css"; 4 4 import '@fortawesome/fontawesome-svg-core/styles.css'; 5 5 import { config } from '@fortawesome/fontawesome-svg-core'; 6 import { I18nextProvider } from 'react-i18next'; 7 import i18n from '../i18n'; 6 8 7 // Prevent FontAwesome from adding CSS automatically8 9 config.autoAddCss = false; 9 10 … … 18 19 }); 19 20 20 export const metadata: Metadata = {21 title: "IKnow - Student Portal",22 description: "Student portal for Ss. Cyril and Methodius University",23 };24 25 21 export default function RootLayout({ 26 22 children, … … 30 26 return ( 31 27 <html lang="en"> 32 <body 33 className={`${geistSans.variable} ${geistMono.variable} antialiased`}34 >35 < div className="mx-auto max-w-6xl px-4">{children}</div>28 <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}> 29 <I18nextProvider i18n={i18n}> 30 <div className="mx-auto max-w-6xl px-4">{children}</div> 31 </I18nextProvider> 36 32 </body> 37 33 </html> -
src/app/page.tsx
r298f9b3 r50f2fb4 12 12 import { useState } from 'react'; 13 13 import { login } from '@/lib/auth'; 14 import { useTranslation } from 'react-i18next'; 15 import LanguageSwitcher from '@/components/LanguageSwitcher'; 14 16 15 17 export default function LoginPage() { 18 const { t } = useTranslation(); 16 19 const [showPassword, setShowPassword] = useState(false); 17 20 const [isSubmitting, setIsSubmitting] = useState(false); … … 54 57 <div className="w-full flex flex-col gap-4"> 55 58 <div className="bg-yellow-100 border border-yellow-200 rounded-xl shadow-sm p-5"> 56 <div className="text-sm font-bold text-gray-900 mb-2"> Login for Student</div>59 <div className="text-sm font-bold text-gray-900 mb-2">{t('login_student_title')}</div> 57 60 <div className="text-xs text-gray-800 whitespace-pre-wrap font-mono"> 58 {`"email":"boris@example.com", 59 "password":"your-password-here",`} 61 {t('login_student_example')} 60 62 </div> 61 63 <div className="mt-3 text-xs text-gray-700"> 62 may take up to 30 seconds afte long inactivity64 {t('login_note_slow')} 63 65 </div> 64 66 </div> 65 67 66 68 <div className="bg-yellow-100 border border-yellow-200 rounded-xl shadow-sm p-5"> 67 <div className="text-sm font-bold text-gray-900 mb-2"> Login for Professor</div>69 <div className="text-sm font-bold text-gray-900 mb-2">{t('login_professor_title')}</div> 68 70 <div className="text-xs text-gray-800 whitespace-pre-wrap font-mono"> 69 {`"email":"andonov@gmail.com", 70 "password":"123lol456",`} 71 {t('login_professor_example')} 71 72 </div> 72 73 </div> … … 84 85 </div> 85 86 </div> 86 <h1 className="text-2xl font-bold mb-2"> Добредојде</h1>87 <h1 className="text-2xl font-bold mb-2">{t('login_welcome')}</h1> 87 88 <p className="text-blue-100 text-sm"> 88 Најавете се во вашиот IKnow акаунт89 {t('login_subtitle')} 89 90 </p> 90 91 </div> … … 92 93 {/* Form */} 93 94 <div className="p-8"> 95 {/* Language Switcher above email field, centered */} 96 <div className="flex justify-center mb-6"> 97 <LanguageSwitcher /> 98 </div> 94 99 <form onSubmit={handleSubmit} className="space-y-6"> 95 100 {/* Email Field */} 96 101 <div> 97 102 <label htmlFor="email" className="block text-sm font-medium text-gray-700 mb-2"> 98 Внесете е-пошта103 {t('login_email_label')} 99 104 </label> 100 105 <div className="relative"> … … 110 115 onChange={handleInputChange} 111 116 className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-primary transition-colors" 112 placeholder= "Внесете е-пошта"117 placeholder={t('login_email_placeholder')} 113 118 /> 114 119 </div> … … 118 123 <div> 119 124 <label htmlFor="password" className="block text-sm font-medium text-gray-700 mb-2"> 120 Лозинка125 {t('login_password_label')} 121 126 </label> 122 127 <div className="relative"> … … 132 137 onChange={handleInputChange} 133 138 className="w-full pl-10 pr-12 py-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-primary transition-colors" 134 placeholder= "Внесете лозинка"139 placeholder={t('login_password_placeholder')} 135 140 /> 136 141 <button … … 157 162 /> 158 163 <label htmlFor="remember" className="ml-2 block text-sm text-gray-700"> 159 Запомни ме164 {t('login_remember_me')} 160 165 </label> 161 166 </div> … … 164 169 className="text-sm text-primary hover:text-blue-700 font-medium transition-colors" 165 170 > 166 Заборавена лозинка?171 {t('login_forgot_password')} 167 172 </button> 168 173 </div> … … 170 175 {errorMessage && ( 171 176 <div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"> 172 { errorMessage}177 {t(errorMessage) || errorMessage} 173 178 </div> 174 179 )} … … 181 186 > 182 187 <FontAwesomeIcon icon={faSignInAlt} className="h-4 w-4" /> 183 {isSubmitting ? 'Најави се...' : 'Најави се'}188 {isSubmitting ? t('login_button_loading') : t('login_button')} 184 189 </button> 185 190 </form> … … 189 194 <div className="bg-gray-50 px-8 py-4 border-t border-gray-100"> 190 195 <p className="text-center text-sm text-gray-600"> 191 Немате акаунт?{' '}196 {t('login_no_account')}{' '} 192 197 <button className="text-primary hover:text-blue-700 font-medium transition-colors"> 193 Контактирајте ја администрацијата198 {t('login_contact_admin')} 194 199 </button> 195 200 </p> … … 202 207 <FontAwesomeIcon icon={faGraduationCap} className="text-primary" /> 203 208 <span className="text-sm text-gray-600"> 204 Студентски информационен систем209 {t('login_footer')} 205 210 </span> 206 211 </div> -
src/app/professor/profile/page.tsx
r298f9b3 r50f2fb4 18 18 import { getAccessToken } from "@/lib/auth"; 19 19 import { IconDefinition } from "@fortawesome/fontawesome-svg-core"; 20 import { useTranslation } from 'react-i18next'; 20 21 21 22 type PersonalInfo = { … … 94 95 } 95 96 96 const InfoRow = ({ label, value, icon }: InfoRowProps) => ( 97 <div className="flex justify-between items-center py-3 border-b border-gray-100 last:border-b-0"> 98 <div className="flex items-center gap-2 text-gray-600 font-medium"> 99 {icon && <FontAwesomeIcon icon={icon} className="w-4 h-4" />} 100 <span>{label}:</span> 97 const InfoRow = ({ label, value, icon }: InfoRowProps) => { 98 const { t } = useTranslation(); 99 return ( 100 <div className="flex justify-between items-center py-3 border-b border-gray-100 last:border-b-0"> 101 <div className="flex items-center gap-2 text-gray-600 font-medium"> 102 {icon && <FontAwesomeIcon icon={icon} className="w-4 h-4" />} 103 <span>{t(label)}:</span> 104 </div> 105 <div className="text-gray-900 font-semibold text-right max-w-xs break-words"> 106 {value || t('n_a')} 107 </div> 101 108 </div> 102 <div className="text-gray-900 font-semibold text-right max-w-xs break-words"> 103 {value || "N/A"} 104 </div> 105 </div> 106 ); 109 ); 110 }; 107 111 108 112 interface SectionProps { … … 112 116 } 113 117 114 const Section = ({ title, icon, children }: SectionProps) => ( 115 <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden"> 116 <div className="bg-primary text-white px-6 py-4"> 117 <div className="flex items-center gap-3"> 118 <FontAwesomeIcon icon={icon} className="text-xl" /> 119 <h2 className="text-xl font-bold">{title}</h2> 120 </div> 118 const Section = ({ title, icon, children }: SectionProps) => { 119 const { t } = useTranslation(); 120 return ( 121 <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden"> 122 <div className="bg-primary text-white px-6 py-4"> 123 <div className="flex items-center gap-3"> 124 <FontAwesomeIcon icon={icon} className="text-xl" /> 125 <h2 className="text-xl font-bold">{t(title)}</h2> 126 </div> 127 </div> 128 <div className="p-6">{children}</div> 121 129 </div> 122 <div className="p-6">{children}</div> 123 </div> 124 ); 130 ); 131 }; 125 132 126 133 export default function ProfessorProfilePage() { … … 128 135 const [isLoading, setIsLoading] = useState(true); 129 136 const [errorMessage, setErrorMessage] = useState<string | null>(null); 137 const { t } = useTranslation(); 130 138 131 139 useEffect(() => { … … 177 185 return ( 178 186 <div className="min-h-screen pb-8"> 179 <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6"> Loading...</div>187 <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6">{t('loading')}</div> 180 188 </div> 181 189 ); … … 186 194 <div className="min-h-screen pb-8"> 187 195 <div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"> 188 {errorMessage ?? "Failed to load profile."}196 {errorMessage ?? t('failed_to_load_profile')} 189 197 </div> 190 198 </div> … … 210 218 </h1> 211 219 <div className="text-lg opacity-90"> 212 Индекс: {personalInfo.index} | ЕМБГ: {personalInfo.embg}220 {t('index')}: {personalInfo.index} | {t('embg')}: {personalInfo.embg} 213 221 </div> 214 222 </div> … … 219 227 <div className="grid grid-cols-1 lg:grid-cols-2 gap-6"> 220 228 {/* Personal Information */} 221 <Section title=" Лични податоци" icon={faIdCard}>222 <InfoRow label=" Име" value={personalInfo.firstName} />223 <InfoRow label=" Средно име" value={personalInfo.middleName} />224 <InfoRow label=" Презиме" value={personalInfo.lastName} />225 <InfoRow label=" Моминско презиме" value={personalInfo.maidenName} />226 <InfoRow label=" Датум на раѓање" value={personalInfo.dateOfBirth} icon={faCalendarAlt} />229 <Section title="personal_info" icon={faIdCard}> 230 <InfoRow label="first_name" value={personalInfo.firstName} /> 231 <InfoRow label="middle_name" value={personalInfo.middleName} /> 232 <InfoRow label="last_name" value={personalInfo.lastName} /> 233 <InfoRow label="maiden_name" value={personalInfo.maidenName} /> 234 <InfoRow label="date_of_birth" value={personalInfo.dateOfBirth} icon={faCalendarAlt} /> 227 235 <InfoRow 228 label=" Пол"236 label="gender" 229 237 value={personalInfo.gender} 230 icon={personalInfo.gender === "машки"? faMars : faVenus}238 icon={personalInfo.gender === t('male') ? faMars : faVenus} 231 239 /> 232 <InfoRow label=" Националност" value={personalInfo.nationality} icon={faFlag} />233 <InfoRow label=" Државјанство" value={personalInfo.citizenship} />234 <InfoRow label=" Стипендија" value={personalInfo.scholarship} />235 <InfoRow label=" Тековен план" value={personalInfo.currentPlan} />236 <InfoRow label=" Бр. во матична книга" value={personalInfo.registryNumber} />237 <InfoRow label=" Група на студирање" value={personalInfo.studyGroup} />240 <InfoRow label="nationality" value={personalInfo.nationality} icon={faFlag} /> 241 <InfoRow label="citizenship" value={personalInfo.citizenship} /> 242 <InfoRow label="scholarship" value={personalInfo.scholarship} /> 243 <InfoRow label="current_plan" value={personalInfo.currentPlan} /> 244 <InfoRow label="registry_number" value={personalInfo.registryNumber} /> 245 <InfoRow label="study_group" value={personalInfo.studyGroup} /> 238 246 {personalInfo.notes && ( 239 247 <div className="mt-4 p-4 bg-blue-50 rounded-lg"> 240 <div className="text-sm font-medium text-blue-800 mb-1"> Забелешка:</div>248 <div className="text-sm font-medium text-blue-800 mb-1">{t('note')}:</div> 241 249 <div className="text-sm text-blue-700">{personalInfo.notes}</div> 242 250 </div> … … 245 253 246 254 {/* Birth Information */} 247 <Section title=" Податоци за раѓање" icon={faMapMarkerAlt}>248 <InfoRow label=" Место на раѓање" value={birthInfo.placeOfBirth} />249 <InfoRow label=" Општина на раѓање" value={birthInfo.municipalityOfBirth} />250 <InfoRow label=" Земја" value={birthInfo.country} />255 <Section title="birth_info" icon={faMapMarkerAlt}> 256 <InfoRow label="place_of_birth" value={birthInfo.placeOfBirth} /> 257 <InfoRow label="municipality_of_birth" value={birthInfo.municipalityOfBirth} /> 258 <InfoRow label="country" value={birthInfo.country} /> 251 259 </Section> 252 260 253 261 {/* Contact Information */} 254 262 <div className="lg:col-span-2"> 255 <Section title=" Контакт" icon={faAddressCard}>263 <Section title="contact" icon={faAddressCard}> 256 264 <div className="grid grid-cols-1 md:grid-cols-2 gap-6"> 257 265 <div> 258 <InfoRow label=" Место на живеење" value={contact.placeOfResidence} icon={faMapMarkerAlt} />259 <InfoRow label=" Општина на живеење" value={contact.municipalityOfResidence} />260 <InfoRow label=" Држава" value={contact.country} />261 <InfoRow label=" Адреса" value={contact.address} />262 <InfoRow label=" Адреса на престој" value={contact.temporaryAddress} />266 <InfoRow label="place_of_residence" value={contact.placeOfResidence} icon={faMapMarkerAlt} /> 267 <InfoRow label="municipality_of_residence" value={contact.municipalityOfResidence} /> 268 <InfoRow label="country" value={contact.country} /> 269 <InfoRow label="address" value={contact.address} /> 270 <InfoRow label="temporary_address" value={contact.temporaryAddress} /> 263 271 </div> 264 272 <div> 265 <InfoRow label=" Телефон" value={contact.phone} icon={faPhone} />266 <InfoRow label=" Моб. телефон" value={contact.mobilePhone} icon={faPhone} />267 <InfoRow label=" Број на пасош" value={contact.passportNumber} icon={faPassport} />268 <InfoRow label=" Датум на истекување на пасошот" value={contact.passportExpiryDate} />269 <InfoRow label=" Е-пошта" value={contact.email} icon={faEnvelope} />270 <InfoRow label=" Microsoftemail" value={contact.microsoftEmail} icon={faEnvelope} />273 <InfoRow label="phone" value={contact.phone} icon={faPhone} /> 274 <InfoRow label="mobile_phone" value={contact.mobilePhone} icon={faPhone} /> 275 <InfoRow label="passport_number" value={contact.passportNumber} icon={faPassport} /> 276 <InfoRow label="passport_expiry_date" value={contact.passportExpiryDate} /> 277 <InfoRow label="email" value={contact.email} icon={faEnvelope} /> 278 <InfoRow label="microsoft_email" value={contact.microsoftEmail} icon={faEnvelope} /> 271 279 </div> 272 280 </div> -
src/app/professor/students/page.tsx
r298f9b3 r50f2fb4 2 2 3 3 import { useEffect, useMemo, useState } from "react"; 4 import { useTranslation } from 'react-i18next'; 4 5 5 6 type UsersBySubject = { … … 36 37 37 38 export default function ProfessorStudentsPage() { 39 const { t } = useTranslation(); 38 40 const [subjects, setSubjects] = useState<SubjectsAndUsers[]>([]); 39 41 const [loading, setLoading] = useState(true); … … 129 131 <div className="bg-white rounded-xl shadow-sm border border-gray-200 p-6"> 130 132 <div className="flex flex-col gap-4 md:flex-row md:items-end md:justify-between"> 133 131 134 <div> 132 <h1 className="text-2xl font-semibold text-gray-900"> Professor • Students</h1>135 <h1 className="text-2xl font-semibold text-gray-900">{t('prof_students_title')}</h1> 133 136 <p className="text-gray-700 mt-1"> 134 Data comes from<span className="font-mono">/api/prof/students</span> (demo store).137 {t('prof_students_data_note')} <span className="font-mono">/api/prof/students</span> (demo store). 135 138 </p> 136 139 </div> … … 138 141 <div className="flex flex-col sm:flex-row gap-3"> 139 142 <div className="flex flex-col"> 140 <label className="text-sm text-gray-700"> Filter by subject</label>143 <label className="text-sm text-gray-700">{t('filter_by_subject')}</label> 141 144 <select 142 145 className="border border-gray-300 rounded-lg px-3 py-2" … … 144 147 onChange={(e) => setSubjectFilter(e.target.value)} 145 148 > 146 <option value="all"> All subjects</option>149 <option value="all">{t('all_subjects')}</option> 147 150 {subjects 148 151 .filter((s) => typeof s.Id === "number") 149 152 .map((s) => ( 150 153 <option key={String(s.Id)} value={String(s.Id)}> 151 {s.Name ?? ` Subject${s.Id}`}154 {s.Name ?? `${t('subject')} ${s.Id}`} 152 155 </option> 153 156 ))} … … 156 159 157 160 <div className="flex flex-col"> 158 <label className="text-sm text-gray-700"> Find student by index / ID</label>161 <label className="text-sm text-gray-700">{t('find_student_by_id')}</label> 159 162 <input 160 163 className="border border-gray-300 rounded-lg px-3 py-2" 161 placeholder= "e.g. 20001"164 placeholder={t('student_id_placeholder')} 162 165 value={studentIdQuery} 163 166 onChange={(e) => setStudentIdQuery(e.target.value)} … … 177 180 <thead className="bg-gray-50"> 178 181 <tr> 179 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b"> Student</th>180 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b"> ID</th>181 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b"> Subject</th>182 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b"> Grade</th>183 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b"> Actions</th>182 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">{t('student')}</th> 183 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">{t('id')}</th> 184 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">{t('subject')}</th> 185 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">{t('grade')}</th> 186 <th className="text-left text-sm font-semibold text-gray-700 px-4 py-3 border-b">{t('actions')}</th> 184 187 </tr> 185 188 </thead> … … 188 191 <tr> 189 192 <td className="px-4 py-4 text-gray-700" colSpan={5}> 190 Loading...193 {t('loading')} 191 194 </td> 192 195 </tr> … … 194 197 <tr> 195 198 <td className="px-4 py-4 text-gray-700" colSpan={5}> 196 No students found.199 {t('no_students_found')} 197 200 </td> 198 201 </tr> … … 227 230 </select> 228 231 <span className="text-sm text-gray-600"> 229 Current: {r.grade > 0 ? r.grade : "—"}232 {t('current')}: {r.grade > 0 ? r.grade : t('none')} 230 233 </span> 231 234 </div> … … 245 248 }} 246 249 > 247 Add grade250 {t('add_grade')} 248 251 </button> 249 252 … … 260 263 }} 261 264 > 262 Edit grade265 {t('edit_grade')} 263 266 </button> 264 267 … … 275 278 }} 276 279 > 277 Remove grade280 {t('remove_grade')} 278 281 </button> 279 282 </div> -
src/app/students/applications/page.tsx
r298f9b3 r50f2fb4 14 14 } from '@fortawesome/free-solid-svg-icons'; 15 15 import { useState } from 'react'; 16 import { useTranslation } from 'react-i18next'; 16 17 import applicationsData from '@/data/applications.json'; 17 18 … … 28 29 29 30 const CompletedBadge = ({ completed }: { completed: string }) => { 30 if (completed === "Да") { 31 return ( 32 <span className="inline-flex items-center justify-center w-6 h-6 bg-green-100 text-green-600 rounded-full"> 31 const { t } = useTranslation(); 32 if (completed === t('yes', 'Да')) { 33 return ( 34 <span className="inline-flex items-center justify-center w-6 h-6 bg-green-100 text-green-600 rounded-full" title={t('completed')}> 33 35 <FontAwesomeIcon icon={faCheckCircle} className="w-4 h-4" /> 34 36 </span> … … 36 38 } else { 37 39 return ( 38 <span className="inline-flex items-center justify-center w-6 h-6 bg-red-100 text-red-600 rounded-full" >40 <span className="inline-flex items-center justify-center w-6 h-6 bg-red-100 text-red-600 rounded-full" title={t('not_completed')}> 39 41 <FontAwesomeIcon icon={faTimesCircle} className="w-4 h-4" /> 40 42 </span> … … 64 66 65 67 export default function ApplicationsPage() { 68 const { t } = useTranslation(); 66 69 const [selectedSession, setSelectedSession] = useState(applicationsData.currentSession.id); 67 70 const [isDropdownOpen, setIsDropdownOpen] = useState(false); 68 71 69 72 const currentSessionData = applicationsData.examSessions.find(s => s.id === selectedSession) || applicationsData.currentSession; 70 73 const { applications } = applicationsData; … … 79 82 </div> 80 83 <div> 81 <h1 className="text-3xl font-bold mb-2"> Пријави</h1>84 <h1 className="text-3xl font-bold mb-2">{t('applications_header', 'Пријави')}</h1> 82 85 <p className="text-lg opacity-90"> 83 Електронски пријави за испити86 {t('applications_subheader', 'Електронски пријави за испити')} 84 87 </p> 85 88 </div> … … 92 95 <h2 className="text-lg font-semibold text-gray-900 flex items-center gap-2"> 93 96 <FontAwesomeIcon icon={faCalendarAlt} className="text-primary" /> 94 Избери испитна сесија:97 {t('select_exam_session', 'Избери испитна сесија:')} 95 98 </h2> 96 99 97 100 <div className="relative"> 98 101 <button … … 102 105 <div className="flex items-center justify-between"> 103 106 <span className="text-sm font-medium text-primary"> 104 { currentSessionData.name}107 {t(currentSessionData.id, currentSessionData.name)} 105 108 </span> 106 <FontAwesomeIcon 107 icon={faChevronDown} 109 <FontAwesomeIcon 110 icon={faChevronDown} 108 111 className={`w-4 h-4 text-gray-400 transition-transform ml-4 ${isDropdownOpen ? 'rotate-180' : ''}`} 109 112 /> 110 113 </div> 111 114 </button> 112 115 113 116 {isDropdownOpen && ( 114 117 <div className="absolute z-10 right-0 mt-1 w-80 bg-white border border-gray-200 rounded-lg shadow-lg"> … … 122 125 className="w-full px-4 py-3 text-left text-sm hover:bg-gray-50 focus:outline-none focus:bg-gray-50 first:rounded-t-lg last:rounded-b-lg" 123 126 > 124 <div className="font-medium text-gray-900">{ session.name}</div>125 <div className="text-xs text-gray-500">{session.year} - { session.semester} - {session.session}</div>127 <div className="font-medium text-gray-900">{t(session.id, session.name)}</div> 128 <div className="text-xs text-gray-500">{session.year} - {t(session.semester, session.semester)} - {t(session.session, session.session)}</div> 126 129 </button> 127 130 ))} … … 135 138 <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden"> 136 139 <div className="bg-primary text-white px-6 py-4"> 137 <h2 className="text-xl font-bold"> Пријавени испити</h2>138 </div> 139 140 <h2 className="text-xl font-bold">{t('registered_exams', 'Пријавени испити')}</h2> 141 </div> 142 140 143 <div className="overflow-x-auto"> 141 144 <table className="w-full"> … … 143 146 <tr> 144 147 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">#</th> 145 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Сериски број</th>146 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Код</th>147 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Предмет</th>148 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"> Завршена</th>149 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"> Таксени</th>150 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Датум</th>151 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Наставник</th>152 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"> Декада</th>148 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('serial_number', 'Сериски број')}</th> 149 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('code', 'Код')}</th> 150 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('subject', 'Предмет')}</th> 151 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{t('completed', 'Завршена')}</th> 152 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{t('fee', 'Таксени')}</th> 153 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('date', 'Датум')}</th> 154 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('instructor', 'Наставник')}</th> 155 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{t('decade', 'Декада')}</th> 153 156 </tr> 154 157 </thead> … … 166 169 <div className="flex items-center gap-2"> 167 170 <FontAwesomeIcon icon={faFileText} className="w-4 h-4 text-primary" /> 168 { application.subject}171 {t(application.subject, application.subject)} 169 172 </div> 170 173 </TableCell> … … 179 182 <div className="flex items-center gap-2"> 180 183 <FontAwesomeIcon icon={faUser} className="w-4 h-4 text-gray-400" /> 181 <span className="font-medium text-gray-900">{ application.instructor}</span>184 <span className="font-medium text-gray-900">{t(application.instructor, application.instructor)}</span> 182 185 </div> 183 186 </TableCell> … … 194 197 <FontAwesomeIcon icon={faInfoCircle} className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" /> 195 198 <div> 196 <h3 className="font-medium text-blue-900 mb-1"> Важна забелешка</h3>199 <h3 className="font-medium text-blue-900 mb-1">{t('important_note', 'Важна забелешка')}</h3> 197 200 <p className="text-sm text-blue-800 leading-relaxed"> 198 { applicationsData.note}201 {t('applications_important_note_text')} 199 202 </p> 200 203 </div> … … 211 214 </div> 212 215 <div> 213 <h3 className="text-lg font-bold text-gray-900"> Пријавени испити</h3>216 <h3 className="text-lg font-bold text-gray-900">{t('registered_exams', 'Пријавени испити')}</h3> 214 217 <p className="text-2xl font-bold text-blue-600"> 215 218 {applications.length} … … 225 228 </div> 226 229 <div> 227 <h3 className="text-lg font-bold text-gray-900"> Завршени</h3>230 <h3 className="text-lg font-bold text-gray-900">{t('completed', 'Завршени')}</h3> 228 231 <p className="text-2xl font-bold text-green-600"> 229 {applications.filter(app => app.completed === "Да").length}232 {applications.filter(app => app.completed === t('yes', 'Да')).length} 230 233 </p> 231 234 </div> … … 239 242 </div> 240 243 <div> 241 <h3 className="text-lg font-bold text-gray-900"> Вкупна такса</h3>244 <h3 className="text-lg font-bold text-gray-900">{t('total_fee', 'Вкупна такса')}</h3> 242 245 <p className="text-2xl font-bold text-yellow-600"> 243 246 {applications.reduce((sum, app) => sum + parseFloat(app.fee.replace(',', '.')), 0).toFixed(2)} -
src/app/students/documents/page.tsx
r298f9b3 r50f2fb4 15 15 import { useState } from 'react'; 16 16 import documentsData from '@/data/documents.json'; 17 import { useTranslation } from 'react-i18next'; 17 18 18 19 interface TableCellProps { … … 28 29 29 30 const StatusBadge = ({ status }: { status: string }) => { 30 if (status === "approved") { 31 const { t } = useTranslation(); 32 if (status === t('approved', 'Одобрено')) { 31 33 return ( 32 34 <span className="inline-flex items-center justify-center w-8 h-8 bg-green-100 text-green-600 rounded-full"> … … 43 45 44 46 const PriceBadge = ({ price }: { price: number }) => { 47 const { t } = useTranslation(); 45 48 if (price === 0) { 46 return <span className="font-medium text-green-600"> 0,00</span>;49 return <span className="font-medium text-green-600">{t('free', '0,00')}</span>; 47 50 } 48 51 return <span className="font-medium text-blue-600">{price.toFixed(2)}</span>; … … 55 58 const [currentPage, setCurrentPage] = useState(1); 56 59 const [recordsPerPage, setRecordsPerPage] = useState(15); 60 const { t } = useTranslation(); 57 61 58 62 const selectedDocument = documentsData.documentTypes.find(d => d.id === selectedDocumentType); … … 73 77 </div> 74 78 <div> 75 <h1 className="text-3xl font-bold mb-2"> Документи</h1>79 <h1 className="text-3xl font-bold mb-2">{t('documents')}</h1> 76 80 <p className="text-lg opacity-90"> 77 Барање и преглед на документи81 {t('documents_overview', 'Преглед на вашите документи и нивниот статус.')} 78 82 </p> 79 83 </div> … … 85 89 <h2 className="text-lg font-semibold text-gray-900 mb-6 flex items-center gap-2"> 86 90 <FontAwesomeIcon icon={faFileText} className="text-primary" /> 87 Ново барање за документ91 {t('new_document_request', 'Ново барање за документ')} 88 92 </h2> 89 93 … … 92 96 <div> 93 97 <label className="block text-sm font-medium text-gray-700 mb-2"> 94 Изберете документ:98 {t('select_document', 'Избери документ')}: 95 99 </label> 96 100 <div className="relative"> … … 101 105 <div className="flex items-center justify-between"> 102 106 <span className="text-sm text-gray-900 truncate"> 103 {selectedDocument ?.name || "Изберете документ"}107 {selectedDocument ? t(selectedDocument.id) : t('select_document', 'Избери документ')} 104 108 </span> 105 109 <FontAwesomeIcon … … 121 125 className="w-full px-4 py-3 text-left text-sm hover:bg-gray-50 focus:outline-none focus:bg-gray-50 border-b border-gray-100 last:border-b-0" 122 126 > 123 <div className="font-medium text-gray-900">{ docType.name}</div>127 <div className="font-medium text-gray-900">{t(docType.id)}</div> 124 128 {docType.price > 0 && ( 125 <div className="text-xs text-blue-600 mt-1"> Цена: {docType.price} мкд</div>129 <div className="text-xs text-blue-600 mt-1">{t('price', 'Цена')}: {docType.price} мкд</div> 126 130 )} 127 131 </button> … … 135 139 <div> 136 140 <label className="block text-sm font-medium text-gray-700 mb-2"> 137 Коментар:141 {t('comment', 'Коментар')}: 138 142 </label> 139 143 <textarea … … 142 146 rows={4} 143 147 className="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-primary focus:border-primary resize-none" 144 placeholder= "Додајте коментар..."148 placeholder={t('add_comment', 'Додај коментар')} 145 149 /> 146 150 </div> … … 153 157 > 154 158 <FontAwesomeIcon icon={faFileText} className="w-4 h-4" /> 155 Внеси159 {t('submit', 'Поднеси')} 156 160 </button> 157 161 </div> … … 161 165 <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden"> 162 166 <div className="bg-primary text-white px-6 py-4"> 163 <h2 className="text-xl font-bold"> Мои документи</h2>167 <h2 className="text-xl font-bold">{t('my_documents', 'Мои документи')}</h2> 164 168 </div> 165 169 … … 169 173 <tr> 170 174 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">#</th> 171 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Архива</th>172 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Датум</th>173 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Барање</th>174 <th className="px-4 py-4 text-right text-xs font-medium text-gray-500 uppercase tracking-wider"> Цена</th>175 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"> Платено</th>176 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"> Документ</th>177 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"> Плати онлајн</th>178 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider"> Статус</th>179 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Коментар</th>175 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('archive', 'Архива')}</th> 176 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('date', 'Датум')}</th> 177 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('request', 'Барање')}</th> 178 <th className="px-4 py-4 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">{t('price', 'Цена')}</th> 179 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{t('paid', 'Платено')}</th> 180 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{t('document', 'Документ')}</th> 181 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{t('pay_online', 'Плати онлајн')}</th> 182 <th className="px-4 py-4 text-center text-xs font-medium text-gray-500 uppercase tracking-wider">{t('status', 'Статус')}</th> 183 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('comment', 'Коментар')}</th> 180 184 </tr> 181 185 </thead> … … 187 191 <TableCell className="text-gray-600">{document.date}</TableCell> 188 192 <TableCell className="font-medium text-gray-900 max-w-xs"> 189 { document.request}193 {t(document.request)} 190 194 </TableCell> 191 195 <TableCell className="text-right"> … … 206 210 <FontAwesomeIcon icon={faCheckCircle} className="w-5 h-5 text-green-600" /> 207 211 ) : ( 208 <span className="text-gray-400"> —</span>212 <span className="text-gray-400">{t('none', '—')}</span> 209 213 )} 210 214 </TableCell> … … 214 218 <TableCell> 215 219 {document.comment || ( 216 <span className="text-gray-400"> —</span>220 <span className="text-gray-400">{t('none', '—')}</span> 217 221 )} 218 222 </TableCell> … … 227 231 <div className="flex items-center gap-4 text-sm text-gray-700"> 228 232 <div className="flex items-center gap-2"> 229 <span> Прикажи редови:</span>233 <span>{t('show_rows', 'Прикажи редови')}:</span> 230 234 <select 231 235 value={recordsPerPage} … … 239 243 </div> 240 244 <div> 241 Страна<input245 {t('page', 'Страница')} <input 242 246 type="number" 243 247 min="1" … … 246 250 onChange={(e) => setCurrentPage(Number(e.target.value))} 247 251 className="w-12 border border-gray-300 rounded px-2 py-1 text-sm text-center focus:outline-none focus:ring-1 focus:ring-primary" 248 /> од{totalPages}252 /> {t('of', 'од')} {totalPages} 249 253 </div> 250 254 </div> … … 266 270 </button> 267 271 <span className="px-4 py-2 bg-primary text-white rounded text-sm font-medium"> 268 Прва272 {t('first', 'Прва')} 269 273 </span> 270 274 <button … … 283 287 </button> 284 288 <span className="ml-4 text-sm text-gray-700"> 285 Последна289 {t('last', 'Последна')} 286 290 </span> 287 291 </div> 288 292 289 293 <div className="text-sm text-gray-700"> 290 Вкупно: {documents.length}294 {t('total', 'Вкупно')}: {documents.length} 291 295 </div> 292 296 </div> … … 297 301 <FontAwesomeIcon icon={faMoneyBillWave} className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" /> 298 302 <p className="text-sm text-blue-800 leading-relaxed"> 299 { paymentInfo}303 {t('documents_payment_info', paymentInfo)} 300 304 </p> 301 305 </div> … … 311 315 </div> 312 316 <div> 313 <h3 className="text-lg font-bold text-gray-900"> Вкупно документи</h3>317 <h3 className="text-lg font-bold text-gray-900">{t('total_documents', 'Вкупно документи')}</h3> 314 318 <p className="text-2xl font-bold text-blue-600"> 315 319 {documents.length} … … 325 329 </div> 326 330 <div> 327 <h3 className="text-lg font-bold text-gray-900"> Одобрени</h3>331 <h3 className="text-lg font-bold text-gray-900">{t('approved', 'Одобрени')}</h3> 328 332 <p className="text-2xl font-bold text-green-600"> 329 333 {documents.filter(doc => doc.status === "approved").length} … … 339 343 </div> 340 344 <div> 341 <h3 className="text-lg font-bold text-gray-900"> Вкупна цена</h3>345 <h3 className="text-lg font-bold text-gray-900">{t('total_price', 'Вкупна цена')}</h3> 342 346 <p className="text-2xl font-bold text-yellow-600"> 343 {documents.reduce((sum, doc) => sum + doc.price, 0).toFixed(2)} мкд347 {documents.reduce((sum, doc) => sum + doc.price, 0).toFixed(2)} {t('mkd', 'мкд')} 344 348 </p> 345 349 </div> -
src/app/students/profile/page.tsx
r298f9b3 r50f2fb4 20 20 import { getAccessToken } from '@/lib/auth'; 21 21 import { IconDefinition } from '@fortawesome/fontawesome-svg-core'; 22 import { useTranslation } from 'react-i18next'; 22 23 23 24 type PersonalInfo = { … … 94 95 } 95 96 96 const InfoRow = ({ label, value, icon }: InfoRowProps) => ( 97 <div className="flex justify-between items-center py-3 border-b border-gray-100 last:border-b-0"> 98 <div className="flex items-center gap-2 text-gray-600 font-medium"> 99 {icon && <FontAwesomeIcon icon={icon} className="w-4 h-4" />} 100 <span>{label}:</span> 97 const InfoRow = ({ label, value, icon }: InfoRowProps) => { 98 const { t } = useTranslation(); 99 return ( 100 <div className="flex justify-between items-center py-3 border-b border-gray-100 last:border-b-0"> 101 <div className="flex items-center gap-2 text-gray-600 font-medium"> 102 {icon && <FontAwesomeIcon icon={icon} className="w-4 h-4" />} 103 <span>{t(label)}:</span> 104 </div> 105 <div className="text-gray-900 font-semibold text-right max-w-xs break-words"> 106 {value || t('n_a')} 107 </div> 101 108 </div> 102 <div className="text-gray-900 font-semibold text-right max-w-xs break-words"> 103 {value || "N/A"} 104 </div> 105 </div> 106 ); 109 ); 110 }; 107 111 108 112 interface SectionProps { … … 112 116 } 113 117 114 const Section = ({ title, icon, children }: SectionProps) => ( 115 <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden"> 116 <div className="bg-primary text-white px-6 py-4"> 117 <div className="flex items-center gap-3"> 118 <FontAwesomeIcon icon={icon} className="text-xl" /> 119 <h2 className="text-xl font-bold">{title}</h2> 118 const Section = ({ title, icon, children }: SectionProps) => { 119 const { t } = useTranslation(); 120 return ( 121 <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden"> 122 <div className="bg-primary text-white px-6 py-4"> 123 <div className="flex items-center gap-3"> 124 <FontAwesomeIcon icon={icon} className="text-xl" /> 125 <h2 className="text-xl font-bold">{t(title)}</h2> 126 </div> 127 </div> 128 <div className="p-6"> 129 {children} 120 130 </div> 121 131 </div> 122 <div className="p-6"> 123 {children} 124 </div> 125 </div> 126 ); 132 ); 133 }; 127 134 128 135 export default function ProfilePage() { … … 130 137 const [isLoading, setIsLoading] = useState(true); 131 138 const [errorMessage, setErrorMessage] = useState<string | null>(null); 139 const { t } = useTranslation(); 132 140 133 141 useEffect(() => { … … 180 188 <div className="min-h-screen pb-8"> 181 189 <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6"> 182 Loading...190 {t('loading')} 183 191 </div> 184 192 </div> … … 190 198 <div className="min-h-screen pb-8"> 191 199 <div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"> 192 {errorMessage ?? 'Failed to load profile.'}200 {errorMessage ?? t('failed_to_load_profile')} 193 201 </div> 194 202 </div> … … 214 222 </h1> 215 223 <div className="text-lg opacity-90"> 216 Индекс: {personalInfo.index} | ЕМБГ: {personalInfo.embg}224 {t('index')}: {personalInfo.index} | {t('embg')}: {personalInfo.embg} 217 225 </div> 218 226 <div className="text-base opacity-80 mt-1"> … … 227 235 228 236 {/* Personal Information */} 229 <Section title=" Лични податоци" icon={faIdCard}>230 <InfoRow label=" Име" value={personalInfo.firstName} />231 <InfoRow label=" Средно име" value={personalInfo.middleName} />232 <InfoRow label=" Презиме" value={personalInfo.lastName} />233 <InfoRow label=" Моминско презиме" value={personalInfo.maidenName} />237 <Section title="personal_info" icon={faIdCard}> 238 <InfoRow label="first_name" value={personalInfo.firstName} /> 239 <InfoRow label="middle_name" value={personalInfo.middleName} /> 240 <InfoRow label="last_name" value={personalInfo.lastName} /> 241 <InfoRow label="maiden_name" value={personalInfo.maidenName} /> 234 242 <InfoRow 235 label=" Датум на раѓање"243 label="date_of_birth" 236 244 value={personalInfo.dateOfBirth} 237 245 icon={faCalendarAlt} 238 246 /> 239 247 <InfoRow 240 label=" Пол"248 label="gender" 241 249 value={personalInfo.gender} 242 icon={personalInfo.gender === 'машки'? faMars : faVenus}250 icon={personalInfo.gender === t('male') ? faMars : faVenus} 243 251 /> 244 252 <InfoRow 245 label=" Националност"253 label="nationality" 246 254 value={personalInfo.nationality} 247 255 icon={faFlag} 248 256 /> 249 <InfoRow label=" Државјанство" value={personalInfo.citizenship} />250 <InfoRow label=" Стипендија" value={personalInfo.scholarship} />251 <InfoRow label=" Тековен план" value={personalInfo.currentPlan} />252 <InfoRow label=" Бр. во матична книга" value={personalInfo.registryNumber} />253 <InfoRow label=" Група на студирање" value={personalInfo.studyGroup} />257 <InfoRow label="citizenship" value={personalInfo.citizenship} /> 258 <InfoRow label="scholarship" value={personalInfo.scholarship} /> 259 <InfoRow label="current_plan" value={personalInfo.currentPlan} /> 260 <InfoRow label="registry_number" value={personalInfo.registryNumber} /> 261 <InfoRow label="study_group" value={personalInfo.studyGroup} /> 254 262 {personalInfo.notes && ( 255 263 <div className="mt-4 p-4 bg-blue-50 rounded-lg"> 256 <div className="text-sm font-medium text-blue-800 mb-1"> Забелешка:</div>264 <div className="text-sm font-medium text-blue-800 mb-1">{t('note')}:</div> 257 265 <div className="text-sm text-blue-700">{personalInfo.notes}</div> 258 266 </div> … … 261 269 262 270 {/* Birth Information */} 263 <Section title=" Податоци за раѓање" icon={faMapMarkerAlt}>264 <InfoRow label=" Место на раѓање" value={birthInfo.placeOfBirth} />265 <InfoRow label=" Општина на раѓање" value={birthInfo.municipalityOfBirth} />266 <InfoRow label=" Земја" value={birthInfo.country} />271 <Section title="birth_info" icon={faMapMarkerAlt}> 272 <InfoRow label="place_of_birth" value={birthInfo.placeOfBirth} /> 273 <InfoRow label="municipality_of_birth" value={birthInfo.municipalityOfBirth} /> 274 <InfoRow label="country" value={birthInfo.country} /> 267 275 </Section> 268 276 269 277 {/* Previous Education */} 270 <Section title=" Претходно образование" icon={faSchool}>271 <InfoRow label=" Тип" value={previousEducation.type} />272 <InfoRow label=" Професија" value={previousEducation.profession} />273 <InfoRow label=" Просек" value={previousEducation.average} />274 <InfoRow label=" Јазик" value={previousEducation.language} />275 <InfoRow label=" Земја" value={previousEducation.country} />276 <InfoRow label=" Претходен универзитет" value={previousEducation.previousUniversity} />277 <InfoRow label=" Претходен факултет" value={previousEducation.previousFaculty} />278 <InfoRow label=" Режим на претходни студии" value={previousEducation.previousStudyMode} />278 <Section title="previous_education" icon={faSchool}> 279 <InfoRow label="type" value={previousEducation.type} /> 280 <InfoRow label="profession" value={previousEducation.profession} /> 281 <InfoRow label="average" value={previousEducation.average} /> 282 <InfoRow label="language" value={previousEducation.language} /> 283 <InfoRow label="country" value={previousEducation.country} /> 284 <InfoRow label="previous_university" value={previousEducation.previousUniversity} /> 285 <InfoRow label="previous_faculty" value={previousEducation.previousFaculty} /> 286 <InfoRow label="previous_study_mode" value={previousEducation.previousStudyMode} /> 279 287 </Section> 280 288 281 289 {/* Enrollment Information */} 282 <Section title=" Податоци за упис" icon={faGraduationCap}>283 <InfoRow label=" Година на упис" value={enrollmentInfo.enrollmentYear} />284 <InfoRow label=" Статус" value={enrollmentInfo.status} />285 <InfoRow label=" Циклус" value={enrollmentInfo.cycle} />286 <InfoRow label=" Запишана програма" value={enrollmentInfo.program} />287 <InfoRow label=" Квота на прв упис" value={enrollmentInfo.quota} />288 <InfoRow label=" Бр. дипл. ср. образование" value={enrollmentInfo.secondaryEducationNumber} />289 <InfoRow label=" Кред. пр. образование" value={enrollmentInfo.previousEducationCredits} />290 <Section title="enrollment_info" icon={faGraduationCap}> 291 <InfoRow label="enrollment_year" value={enrollmentInfo.enrollmentYear} /> 292 <InfoRow label="status" value={enrollmentInfo.status} /> 293 <InfoRow label="cycle" value={enrollmentInfo.cycle} /> 294 <InfoRow label="program" value={enrollmentInfo.program} /> 295 <InfoRow label="quota" value={enrollmentInfo.quota} /> 296 <InfoRow label="secondary_education_number" value={enrollmentInfo.secondaryEducationNumber} /> 297 <InfoRow label="previous_education_credits" value={enrollmentInfo.previousEducationCredits} /> 290 298 </Section> 291 299 292 300 {/* Contact Information */} 293 301 <div className="lg:col-span-2"> 294 <Section title=" Контакт" icon={faAddressCard}>302 <Section title="contact" icon={faAddressCard}> 295 303 <div className="grid grid-cols-1 md:grid-cols-2 gap-6"> 296 304 <div> 297 305 <InfoRow 298 label=" Место на живеење"306 label="place_of_residence" 299 307 value={contact.placeOfResidence} 300 308 icon={faMapMarkerAlt} 301 309 /> 302 <InfoRow label=" Општина на живеење" value={contact.municipalityOfResidence} />303 <InfoRow label=" Држава" value={contact.country} />304 <InfoRow label=" Адреса" value={contact.address} />305 <InfoRow label=" Адреса на престој" value={contact.temporaryAddress} />310 <InfoRow label="municipality_of_residence" value={contact.municipalityOfResidence} /> 311 <InfoRow label="country" value={contact.country} /> 312 <InfoRow label="address" value={contact.address} /> 313 <InfoRow label="temporary_address" value={contact.temporaryAddress} /> 306 314 </div> 307 315 <div> 308 <InfoRow label=" Телефон" value={contact.phone} icon={faPhone} />309 <InfoRow label=" Моб. телефон" value={contact.mobilePhone} icon={faPhone} />310 <InfoRow label=" Број на пасош" value={contact.passportNumber} icon={faPassport} />311 <InfoRow label=" Датум на истекување на пасошот" value={contact.passportExpiryDate} />316 <InfoRow label="phone" value={contact.phone} icon={faPhone} /> 317 <InfoRow label="mobile_phone" value={contact.mobilePhone} icon={faPhone} /> 318 <InfoRow label="passport_number" value={contact.passportNumber} icon={faPassport} /> 319 <InfoRow label="passport_expiry_date" value={contact.passportExpiryDate} /> 312 320 <InfoRow 313 label=" Е-пошта"321 label="email" 314 322 value={contact.email} 315 323 icon={faEnvelope} 316 324 /> 317 325 <InfoRow 318 label=" Microsoftemail"326 label="microsoft_email" 319 327 value={contact.microsoftEmail} 320 328 icon={faEnvelope} -
src/app/students/semesters/page.tsx
r298f9b3 r50f2fb4 14 14 import { useEffect, useState } from 'react'; 15 15 import { getAccessToken } from '@/lib/auth'; 16 import { useTranslation } from 'react-i18next'; 16 17 17 18 type Semester = { … … 54 55 55 56 const StatusBadge = ({ status }: { status: string }) => { 57 const { t } = useTranslation(); 56 58 const baseClasses = "px-2 py-1 rounded-full text-xs font-medium"; 57 58 if (status === "валиден") { 59 if (status === t('valid')) { 59 60 return ( 60 61 <span className={`${baseClasses} bg-green-100 text-green-800 flex items-center gap-1`}> 61 62 <FontAwesomeIcon icon={faCheckCircle} className="w-3 h-3" /> 62 { status}63 {t('valid')} 63 64 </span> 64 65 ); 65 66 } 66 67 67 return ( 68 68 <span className={`${baseClasses} bg-gray-100 text-gray-800`}> 69 { status}69 {t(status) || status} 70 70 </span> 71 71 ); … … 73 73 74 74 const YesNoBadge = ({ value }: { value: string }) => { 75 if (value === "Да") { 75 const { t } = useTranslation(); 76 if (value === t('yes')) { 76 77 return ( 77 78 <span className="inline-flex items-center justify-center w-6 h-6 bg-green-100 text-green-600 rounded-full"> … … 79 80 </span> 80 81 ); 81 } else if (value === "Не") {82 } else if (value === t('no')) { 82 83 return ( 83 84 <span className="inline-flex items-center justify-center w-6 h-6 bg-red-100 text-red-600 rounded-full"> … … 112 113 const [isLoading, setIsLoading] = useState(true); 113 114 const [errorMessage, setErrorMessage] = useState<string | null>(null); 115 const { t } = useTranslation(); 114 116 115 117 useEffect(() => { … … 162 164 <div className="min-h-screen pb-8"> 163 165 <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6"> 164 Loading...166 {t('loading')} 165 167 </div> 166 168 </div> … … 187 189 </div> 188 190 <div> 189 <h1 className="text-3xl font-bold mb-2"> Семестри</h1>191 <h1 className="text-3xl font-bold mb-2">{t('semesters')}</h1> 190 192 <p className="text-lg opacity-90"> 191 Преглед на сите запишани семестри и нивниот статус193 {t('semesters_overview')} 192 194 </p> 193 195 </div> … … 198 200 <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden"> 199 201 <div className="bg-primary text-white px-6 py-4"> 200 <h2 className="text-xl font-bold"> Листа на семестри</h2>202 <h2 className="text-xl font-bold">{t('semesters_list')}</h2> 201 203 </div> 202 204 … … 206 208 <tr> 207 209 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">#</th> 208 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Семестар</th>209 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Насока</th>210 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Квота</th>211 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Забелешка</th>212 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Студ.Ком.</th>213 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Сума</th>214 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Платено</th>215 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> УКИМ</th>216 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Креирано на</th>217 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Датум промена</th>218 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Ц.Кр</th>219 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Тип</th>220 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Док.</th>221 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Док1.</th>222 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Вериф.</th>223 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Таксени</th>224 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Потписи</th>225 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Статус</th>226 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Зав.</th>210 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('semester')}</th> 211 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('direction')}</th> 212 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('quota')}</th> 213 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('note')}</th> 214 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('student_com')}</th> 215 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('sum')}</th> 216 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('paid')}</th> 217 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('ukim')}</th> 218 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('created_on')}</th> 219 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('date_changed')}</th> 220 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('credits')}</th> 221 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('type')}</th> 222 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('doc')}</th> 223 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('doc1')}</th> 224 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('verified')}</th> 225 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('taxes')}</th> 226 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('signatures')}</th> 227 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('status')}</th> 228 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('completed')}</th> 227 229 </tr> 228 230 </thead> … … 335 337 </div> 336 338 <div> 337 <h3 className="text-lg font-bold text-gray-900"> Завршени семестри</h3>339 <h3 className="text-lg font-bold text-gray-900">{t('completed_semesters')}</h3> 338 340 <p className="text-2xl font-bold text-green-600"> 339 341 {semesters.filter(s => s.completed !== "Не").length} … … 349 351 </div> 350 352 <div> 351 <h3 className="text-lg font-bold text-gray-900"> Верифицирани</h3>353 <h3 className="text-lg font-bold text-gray-900">{t('verified_semesters')}</h3> 352 354 <p className="text-2xl font-bold text-blue-600"> 353 355 {semesters.filter(s => s.verified === "Да").length} … … 363 365 </div> 364 366 <div> 365 <h3 className="text-lg font-bold text-gray-900"> Вкупно семестри</h3>367 <h3 className="text-lg font-bold text-gray-900">{t('total_semesters')}</h3> 366 368 <p className="text-2xl font-bold text-primary"> 367 369 {semesters.length} -
src/app/students/subjects/page.tsx
r298f9b3 r50f2fb4 9 9 import { useEffect, useState } from 'react'; 10 10 import { getAccessToken } from '@/lib/auth'; 11 import { useTranslation } from 'react-i18next'; 11 12 12 13 interface Subject { … … 147 148 148 149 const StatusBadge = ({ status }: { status: string }) => { 150 const { t } = useTranslation(); 149 151 const baseClasses = "px-3 py-1 rounded-md text-xs font-medium"; 150 151 if (status === "Зад.") { 152 if (status === t('mandatory_short')) { 152 153 return ( 153 154 <span className={`${baseClasses} bg-blue-100 text-blue-800`}> 154 { status}155 {t('mandatory_short')} 155 156 </span> 156 157 ); 157 } else if (status === "Изб.") {158 } else if (status === t('elective_short')) { 158 159 return ( 159 160 <span className={`${baseClasses} bg-green-100 text-green-800`}> 160 { status}161 {t('elective_short')} 161 162 </span> 162 163 ); 163 164 } 164 165 165 return ( 166 166 <span className={`${baseClasses} bg-gray-100 text-gray-800`}> 167 { status}167 {t(status) || status} 168 168 </span> 169 169 ); … … 176 176 const [isLoading, setIsLoading] = useState(true); 177 177 const [errorMessage, setErrorMessage] = useState<string | null>(null); 178 const { t } = useTranslation(); 178 179 179 180 useEffect(() => { … … 275 276 <div className="min-h-screen pb-8"> 276 277 <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6"> 277 Loading...278 {t('loading')} 278 279 </div> 279 280 </div> … … 285 286 <div className="min-h-screen pb-8"> 286 287 <div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"> 287 {errorMessage ?? 'Failed to load subjects.'}288 {errorMessage ?? t('failed_to_load_subjects')} 288 289 </div> 289 290 </div> … … 308 309 </div> 309 310 <div> 310 <h1 className="text-3xl font-bold mb-2"> Предмети</h1>311 <h1 className="text-3xl font-bold mb-2">{t('subjects')}</h1> 311 312 <p className="text-lg opacity-90"> 312 Преглед на запишани предмети по семестри313 {t('subjects_overview')} 313 314 </p> 314 315 </div> … … 325 326 <div className="bg-white rounded-xl p-6 shadow-sm border border-gray-100"> 326 327 <div className="text-sm text-gray-600 mb-2"> 327 Статус: <span className="text-primary font-semibold">Запишан од студент</span>328 {t('status')}: <span className="text-primary font-semibold">{t('enrolled_by_student')}</span> 328 329 </div> 329 330 <div className="text-sm text-gray-600"> 330 Број на тикет: <span className="font-semibold">{currentSemester.ticketNumber}</span>331 {t('ticket_number')}: <span className="font-semibold">{currentSemester.ticketNumber}</span> 331 332 </div> 332 333 </div> … … 335 336 <div className="bg-white rounded-xl p-6 shadow-sm border border-gray-100"> 336 337 <div className="text-sm text-gray-600 mb-2"> 337 Долг од документи: <span className="font-semibold">{currentSemester.debt}</span>338 {t('debt_from_documents')}: <span className="font-semibold">{currentSemester.debt}</span> 338 339 </div> 339 340 340 341 <div className="relative mt-4"> 341 342 <label className="block text-sm font-medium text-gray-700 mb-2"> 342 Избери семестар:343 {t('select_semester')}: 343 344 </label> 344 345 <div className="relative"> … … 370 371 > 371 372 <div className="font-medium text-gray-900">{semester.name}</div> 372 <div className="text-xs text-gray-500"> Статус: {semester.status}</div>373 <div className="text-xs text-gray-500">{t('status')}: {semester.status}</div> 373 374 </button> 374 375 ))} … … 380 381 <div className="mt-4 text-sm"> 381 382 <div className="text-primary font-medium"> 382 Сериски број: {currentSemesterData.serviceNumber}383 {t('serial_number')}: {currentSemesterData.serviceNumber} 383 384 </div> 384 385 </div> … … 389 390 <h3 className="font-semibold text-gray-900 mb-3 flex items-center gap-2"> 390 391 <FontAwesomeIcon icon={faBook} className="w-4 h-4 text-primary" /> 391 Запишани предмети392 {t('enrolled_subjects')} 392 393 </h3> 393 394 <div className="text-3xl font-bold text-primary"> … … 403 404 <h2 className="text-xl font-bold flex items-center gap-2"> 404 405 <FontAwesomeIcon icon={faFileInvoice} /> 405 Финансиски информации406 {t('financial_info')} 406 407 </h2> 407 408 </div> … … 413 414 <div className="space-y-4"> 414 415 <div className="flex justify-between items-center py-2 border-b border-gray-100"> 415 <span className="text-gray-600"> Сума:</span>416 <span className="text-gray-600">{t('sum')}:</span> 416 417 <span className="font-semibold text-primary">{currentSemester.financialInfo.sum}</span> 417 418 </div> 418 419 <div className="flex justify-between items-center py-2 border-b border-gray-100"> 419 <span className="text-gray-600"> Платено:</span>420 <span className="text-gray-600">{t('paid')}:</span> 420 421 <span className="font-semibold text-green-600">{currentSemester.financialInfo.paid}</span> 421 422 </div> 422 423 <div className="flex justify-between items-center py-2 border-b border-gray-100"> 423 <span className="text-gray-600"> Должи:</span>424 <span className="text-gray-600">{t('due')}:</span> 424 425 <span className="font-semibold text-red-600">{currentSemester.financialInfo.due}</span> 425 426 </div> 426 427 <div className="mt-4 p-4 bg-blue-50 rounded-lg"> 427 <div className="text-sm font-medium text-blue-800 mb-1"> Материјални трошоци:</div>428 <div className="text-sm text-blue-700">{ currentSemester.financialInfo.materialCosts}</div>428 <div className="text-sm font-medium text-blue-800 mb-1">{t('material_costs')}:</div> 429 <div className="text-sm text-blue-700">{t('material_costs_info')}</div> 429 430 </div> 430 431 </div> … … 433 434 <div className="space-y-4"> 434 435 <div className="flex justify-between items-center py-2 border-b border-gray-100"> 435 <span className="text-gray-600"> Кредити:</span>436 <span className="text-gray-600">{t('credits')}:</span> 436 437 <span className="font-semibold text-primary">{currentSemester.financialInfo.credits}</span> 437 438 </div> 438 439 <div className="flex justify-between items-center py-2 border-b border-gray-100"> 439 <span className="text-gray-600"> МКСА:</span>440 <span className="text-gray-600">{t('mksa')}:</span> 440 441 <span className="font-semibold">{currentSemester.financialInfo.MKSA}</span> 441 442 </div> 442 443 <div className="flex justify-between items-center py-2 border-b border-gray-100"> 443 <span className="text-gray-600"> Електронско запишување:</span>444 <span className="text-gray-600">{t('electronic_registration')}:</span> 444 445 <span className="font-semibold">{currentSemester.financialInfo.electronicRegistration}</span> 445 446 </div> 446 447 <div className="flex justify-between items-center py-2 border-b border-gray-100"> 447 <span className="text-gray-600"> Е-УКИМ:</span>448 <span className="text-gray-600">{t('eukim')}:</span> 448 449 <span className="font-semibold">{currentSemester.financialInfo.eUKIM}</span> 449 450 </div> 450 451 <div className="flex justify-between items-center py-2 border-b border-gray-100"> 451 <span className="text-gray-600"> Банкарска провизија:</span>452 <span className="text-gray-600">{t('bank_provision')}:</span> 452 453 <span className="font-semibold">{currentSemester.financialInfo.bankProvision}</span> 453 454 </div> 454 455 <div className="flex justify-between items-center py-3 border-t-2 border-primary bg-primary bg-opacity-5 rounded-lg px-4"> 455 <span className="font-bold text-white"> Тотал:</span>456 <span className="font-bold text-white">{t('total')}:</span> 456 457 <span className="font-bold text-xl text-white">{currentSemester.financialInfo.total}</span> 457 458 </div> … … 466 467 <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden"> 467 468 <div className="bg-primary text-white px-6 py-4"> 468 <h2 className="text-xl font-bold"> Листа на предмети</h2>469 <h2 className="text-xl font-bold">{t('subjects_list')}</h2> 469 470 </div> 470 471 … … 474 475 <tr> 475 476 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">#</th> 476 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Код</th>477 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Часови</th>478 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Кој пат</th>479 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Предмет</th>480 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Семестар</th>481 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Статус</th>482 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Потпис</th>483 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Група</th>484 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"> Професор</th>477 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('code')}</th> 478 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('hours')}</th> 479 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('which_time')}</th> 480 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('subject')}</th> 481 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('semester')}</th> 482 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('status')}</th> 483 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('signature')}</th> 484 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('group')}</th> 485 <th className="px-4 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">{t('professor')}</th> 485 486 </tr> 486 487 </thead> … … 495 496 <div className="flex items-center gap-2"> 496 497 <FontAwesomeIcon icon={faBook} className="w-4 h-4 text-primary" /> 497 { subject.name}498 {t(subject.name, subject.name)} 498 499 </div> 499 500 </TableCell> 500 <TableCell className="text-center font-medium text-primary">{ subject.semester}</TableCell>501 <TableCell className="text-center font-medium text-primary">{t(subject.semester.toString(), subject.semester.toString())}</TableCell> 501 502 <TableCell> 502 503 <StatusBadge status={subject.status} /> 503 504 </TableCell> 504 505 <TableCell className="text-center"> 505 {subject.signature ||(506 {subject.signature ? t(subject.signature, subject.signature) : ( 506 507 <span className="text-gray-400">—</span> 507 508 )} 508 509 </TableCell> 509 510 <TableCell className="text-center"> 510 {subject.group ||(511 {subject.group ? t(subject.group, subject.group) : ( 511 512 <span className="text-gray-400">—</span> 512 513 )} 513 514 </TableCell> 514 515 <TableCell> 515 {subject.professor ||(516 {subject.professor ? t(subject.professor, subject.professor) : ( 516 517 <span className="text-gray-400">—</span> 517 518 )} -
src/components/exams.tsx
r298f9b3 r50f2fb4 1 1 "use client" 2 2 import { useEffect, useMemo, useState } from 'react'; 3 import { useTranslation } from 'react-i18next'; 3 4 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 4 5 import { faSort, faSortUp, faSortDown } from '@fortawesome/free-solid-svg-icons'; … … 33 34 34 35 const Exams = () => { 36 const { t } = useTranslation(); 35 37 const [sortField, setSortField] = useState<'grade' | 'date' | null>(null); 36 38 const [sortOrder, setSortOrder] = useState<'asc' | 'desc' | null>(null); … … 185 187 return ( 186 188 <div className="bg-white rounded-lg shadow-sm p-6"> 187 Loading...189 {t('loading', 'Loading...')} 188 190 </div> 189 191 ); … … 194 196 <div className="bg-white rounded-lg shadow-sm p-6"> 195 197 <div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700"> 196 { errorMessage}198 {t('failed_to_load_exams', errorMessage)} 197 199 </div> 198 200 </div> … … 208 210 <div className="text-center"> 209 211 <div className="text-3xl font-bold text-gray-900">{stats.average}</div> 210 <div className="text-sm text-gray-500 mt-1"> Просек</div>212 <div className="text-sm text-gray-500 mt-1">{t('average', 'Просек')}</div> 211 213 </div> 212 214 … … 217 219 <span className="text-lg text-gray-400">/{stats.credits.total}</span> 218 220 </div> 219 <div className="text-sm text-gray-500 mt-1"> Кредити</div>221 <div className="text-sm text-gray-500 mt-1">{t('credits', 'Кредити')}</div> 220 222 </div> 221 223 … … 223 225 <div className="text-center"> 224 226 <div className="text-3xl font-bold text-gray-900">{stats.passed}</div> 225 <div className="text-sm text-gray-500 mt-1"> Положени</div>227 <div className="text-sm text-gray-500 mt-1">{t('passed', 'Положени')}</div> 226 228 </div> 227 229 … … 229 231 <div className="text-center"> 230 232 <div className="text-3xl font-bold text-gray-900">{stats.remaining}</div> 231 <div className="text-sm text-gray-500 mt-1"> Останато</div>233 <div className="text-sm text-gray-500 mt-1">{t('remaining', 'Останато')}</div> 232 234 </div> 233 235 </div> 234 236 235 237 {/* Progress Bar spanning entire statistics section */} 236 238 <div className="w-full bg-gray-200 rounded-full h-2"> 237 <div 239 <div 238 240 className="bg-blue-500 h-2 rounded-full transition-all duration-300" 239 241 style={{ width: `${creditsPercentage}%` }} … … 244 246 {/* Exams Table */} 245 247 <div> 246 <h3 className="text-xl font-semibold text-gray-900 mb-4"> Испити</h3>247 248 <h3 className="text-xl font-semibold text-gray-900 mb-4">{t('exams', 'Испити')}</h3> 249 248 250 <div className="overflow-x-auto"> 249 251 <table className="min-w-full"> … … 251 253 <tr className="border-b border-gray-200"> 252 254 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">#</th> 253 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500"> Предмет</th>254 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500"> Семестар</th>255 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500"> Кредити</th>255 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">{t('subject', 'Предмет')}</th> 256 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">{t('semester', 'Семестар')}</th> 257 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">{t('credits', 'Кредити')}</th> 256 258 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500"> 257 <button 259 <button 258 260 onClick={handleSortByDate} 259 261 className="flex items-center gap-2 px-2 py-1 rounded-md hover:bg-gray-100 hover:text-gray-900 transition-all duration-200 transform hover:scale-105" 260 262 > 261 Датум262 <FontAwesomeIcon 263 icon={getSortIcon('date')} 263 {t('date', 'Датум')} 264 <FontAwesomeIcon 265 icon={getSortIcon('date')} 264 266 className={`text-xs transition-colors duration-200 ${ 265 267 sortField === 'date' ? 'text-blue-600' : 'text-gray-400 group-hover:text-gray-600' … … 269 271 </th> 270 272 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500"> 271 <button 273 <button 272 274 onClick={handleSortByGrade} 273 275 className="flex items-center gap-2 px-2 py-1 rounded-md hover:bg-gray-100 hover:text-gray-900 transition-all duration-200 transform hover:scale-105" 274 276 > 275 Оценка276 <FontAwesomeIcon 277 icon={getSortIcon('grade')} 277 {t('grade', 'Оценка')} 278 <FontAwesomeIcon 279 icon={getSortIcon('grade')} 278 280 className={`text-xs transition-colors duration-200 ${ 279 281 sortField === 'grade' ? 'text-blue-600' : 'text-gray-400 group-hover:text-gray-600' -
src/components/header.tsx
r298f9b3 r50f2fb4 1 1 "use client" 2 2 3 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 3 4 import { faUser } from '@fortawesome/free-solid-svg-icons'; 4 5 import Image from 'next/image'; 5 6 7 import { useEffect, useState } from 'react'; 8 import { getAccessToken, clearAuthTokens } from '@/lib/auth'; 9 import { useTranslation } from 'react-i18next'; 10 import LanguageSwitcher from './LanguageSwitcher'; 11 6 12 const Header = () => { 13 14 const [userName, setUserName] = useState<string>(''); 15 const { t } = useTranslation(); 16 17 useEffect(() => { 18 async function fetchUser() { 19 const token = getAccessToken(); 20 if (!token) return; 21 try { 22 const response = await fetch('https://iknow-api.onrender.com/api/user/getUser', { 23 method: 'GET', 24 headers: { Authorization: `Bearer ${token}` }, 25 }); 26 if (!response.ok) return; 27 const data = await response.json(); 28 // Try both student and professor shape 29 if (data?.personalInfo) { 30 const p = data.personalInfo; 31 setUserName([p.firstName, p.middleName, p.lastName].filter(Boolean).join(' ')); 32 } 33 } catch {} 34 } 35 fetchUser(); 36 return () => {}; 37 }, []); 38 39 const handleLogout = () => { 40 clearAuthTokens(); 41 if (typeof window !== 'undefined') { 42 window.location.href = '/'; 43 } 44 }; 45 7 46 return ( 8 47 <header className="bg-white shadow-sm border-b border-gray-200"> 9 48 <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> 10 <div className="flex justify-between items-center py-4">49 <div className="flex flex-col sm:flex-row sm:justify-between sm:items-center py-4 gap-4 sm:gap-0"> 11 50 {/* Left side - Logos and University Info */} 12 <div className="flex items-center gap- 4">51 <div className="flex items-center gap-2 justify-center sm:justify-start"> 13 52 {/* UKIM Logo */} 14 53 <div className="flex-shrink-0"> … … 21 60 /> 22 61 </div> 23 24 62 {/* FINKI Logo */} 25 63 <div className="flex-shrink-0"> … … 32 70 /> 33 71 </div> 34 35 72 {/* University Text */} 36 73 <div className="hidden sm:block"> 37 74 <div className="text-gray-900 font-medium text-sm"> 38 Универзитет „Св. КИРИЛ И МЕТОДИЈ“ - Скопје75 {t('university')} 39 76 </div> 40 77 <div className="text-gray-700 text-sm"> 41 Факултет за информатички науки и компјутерско инженерство78 {t('faculty')} 42 79 </div> 43 80 </div> 44 81 </div> 45 46 82 {/* Right side - User Profile */} 47 <div className="flex items-center gap-4"> 48 <div className="flex items-center gap-3"> 83 <div className="flex flex-col sm:flex-row items-center gap-2 sm:gap-4 w-full sm:w-auto justify-center sm:justify-end"> 84 {/* Language Switcher - now left of user info */} 85 <div className="sm:mr-2 w-full sm:w-auto flex justify-center sm:justify-end"> 86 <LanguageSwitcher /> 87 </div> 88 <div className="flex items-center gap-2 sm:gap-3 w-full sm:w-auto justify-center sm:justify-end"> 49 89 {/* User Avatar */} 50 <div className=" flex items-center justify-center w-10 h-10 bg-gray-800 text-white rounded-full">90 <div className="hidden sm:flex items-center justify-center w-10 h-10 bg-gray-800 text-white rounded-full"> 51 91 <FontAwesomeIcon icon={faUser} className="text-sm" /> 52 92 </div> 53 54 93 {/* User Name */} 55 94 <div className="hidden sm:block text-gray-900 font-medium"> 56 Стефан Савески95 {userName || '...'} 57 96 </div> 58 59 {/* Logout Button */} 60 <button className="text-blue-600 hover:text-blue-800 font-medium text-sm transition-colors duration-200"> 61 Logout 97 {/* Logout Button - more stylish and full width on mobile */} 98 <button 99 className="w-full sm:w-auto ml-0 sm:ml-2 px-4 py-2 border-2 border-primary text-primary bg-white rounded-lg font-semibold flex items-center justify-center gap-2 hover:bg-blue-50 transition-all duration-200 shadow-sm" 100 onClick={handleLogout} 101 > 102 <svg xmlns='http://www.w3.org/2000/svg' className='h-4 w-4' fill='none' viewBox='0 0 24 24' stroke='currentColor'><path strokeLinecap='round' strokeLinejoin='round' strokeWidth={2} d='M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a2 2 0 01-2 2H7a2 2 0 01-2-2V7a2 2 0 012-2h4a2 2 0 012 2v1' /></svg> 103 {t('logout')} 62 104 </button> 63 105 </div> -
src/components/navbar.tsx
r298f9b3 r50f2fb4 10 10 import { useState } from 'react'; 11 11 import Link from 'next/link'; 12 import { useTranslation } from 'react-i18next'; 12 13 13 14 const Navbar = () => { … … 18 19 }; 19 20 21 const { t } = useTranslation(); 20 22 const menuItems = [ 21 { icon: faUser, label: 'Профил', href: '/students/profile' },22 { icon: faBookmark, label: 'Семестри', href: '/students/semesters' },23 { icon: faBook, label: 'Предмети', href: '/students/subjects' },24 { icon: faPenToSquare, label: 'Пријави', href: '/students/applications' },25 { icon: faListCheck, label: 'Положени', href: '/students/exams' },26 { icon: faFilePdf, label: 'Документи', href: '/students/documents' }23 { icon: faUser, label: t('profile'), href: '/students/profile' }, 24 { icon: faBookmark, label: t('semesters'), href: '/students/semesters' }, 25 { icon: faBook, label: t('subjects'), href: '/students/subjects' }, 26 { icon: faPenToSquare, label: t('applications'), href: '/students/applications' }, 27 { icon: faListCheck, label: t('exams'), href: '/students/exams' }, 28 { icon: faFilePdf, label: t('documents'), href: '/students/documents' } 27 29 ]; 28 30 -
src/components/professor-navbar.tsx
r298f9b3 r50f2fb4 5 5 import Link from "next/link"; 6 6 import { useState } from "react"; 7 import { useTranslation } from 'react-i18next'; 7 8 8 9 const ProfessorNavbar = () => { … … 13 14 }; 14 15 16 const { t } = useTranslation(); 15 17 const menuItems = [ 16 { icon: faUser, label: "Профил", href: "/professor/profile" },17 { icon: faUsers, label: "Студенти", href: "/professor/students" },18 { icon: faUser, label: t('profile'), href: "/professor/profile" }, 19 { icon: faUsers, label: t('students') || 'Студенти', href: "/professor/students" }, 18 20 ]; 19 21 -
tsconfig.json
r298f9b3 r50f2fb4 2 2 "compilerOptions": { 3 3 "target": "ES2017", 4 "lib": ["dom", "dom.iterable", "esnext"], 4 "lib": [ 5 "dom", 6 "dom.iterable", 7 "esnext" 8 ], 5 9 "allowJs": true, 6 10 "skipLibCheck": true, 7 11 "strict": true, 8 "noEmit": true,9 12 "esModuleInterop": true, 10 13 "module": "esnext", … … 12 15 "resolveJsonModule": true, 13 16 "isolatedModules": true, 14 "jsx": " preserve",17 "jsx": "react-jsx", 15 18 "incremental": true, 16 19 "plugins": [ … … 20 23 ], 21 24 "paths": { 22 "@/*": ["./src/*"] 23 } 25 "@/*": [ 26 "./src/*" 27 ] 28 }, 29 "noEmit": true 24 30 }, 25 "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 "exclude": ["node_modules"] 31 "include": [ 32 "next-env.d.ts", 33 "**/*.ts", 34 "**/*.tsx", 35 ".next/types/**/*.ts", 36 ".next/dev/types/**/*.ts" 37 ], 38 "exclude": [ 39 "node_modules" 40 ] 27 41 }
Note:
See TracChangeset
for help on using the changeset viewer.
