Changeset 50f2fb4


Ignore:
Timestamp:
01/30/26 01:40:27 (8 months ago)
Author:
Stefan-Saveski <stefansaveski19@…>
Branches:
master
Children:
ba52069
Parents:
298f9b3
Message:

Added dual language feature.

Files:
5 added
16 edited

Legend:

Unmodified
Added
Removed
  • package-lock.json

    r298f9b3 r50f2fb4  
    1616        "class-variance-authority": "^0.7.1",
    1717        "clsx": "^2.1.1",
     18        "i18next": "^25.8.0",
    1819        "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",
    2225        "tailwind-merge": "^3.3.1"
    2326      },
     
    5053      }
    5154    },
     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    },
    5264    "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==",
    5668      "dev": true,
    5769      "license": "MIT",
     
    6375    },
    6476    "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==",
    6880      "license": "MIT",
    6981      "optional": true,
     
    8496    },
    8597    "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==",
    89101      "dev": true,
    90102      "license": "MIT",
     
    116128    },
    117129    "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==",
    121133      "dev": true,
    122134      "license": "MIT",
     
    126138    },
    127139    "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==",
    131143      "dev": true,
    132144      "license": "Apache-2.0",
    133145      "dependencies": {
    134         "@eslint/object-schema": "^2.1.6",
     146        "@eslint/object-schema": "^2.1.7",
    135147        "debug": "^4.3.1",
    136148        "minimatch": "^3.1.2"
     
    141153    },
    142154    "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==",
    146158      "dev": true,
    147159      "license": "Apache-2.0",
     160      "dependencies": {
     161        "@eslint/core": "^0.17.0"
     162      },
    148163      "engines": {
    149164        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
     
    151166    },
    152167    "node_modules/@eslint/core": {
    153       "version": "0.15.2",
    154       "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.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==",
    156171      "dev": true,
    157172      "license": "Apache-2.0",
     
    164179    },
    165180    "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==",
    169184      "dev": true,
    170185      "license": "MIT",
     
    176191        "ignore": "^5.2.0",
    177192        "import-fresh": "^3.2.1",
    178         "js-yaml": "^4.1.0",
     193        "js-yaml": "^4.1.1",
    179194        "minimatch": "^3.1.2",
    180195        "strip-json-comments": "^3.1.1"
     
    188203    },
    189204    "node_modules/@eslint/js": {
    190       "version": "9.36.0",
    191       "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.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==",
    193208      "dev": true,
    194209      "license": "MIT",
     
    201216    },
    202217    "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==",
    206221      "dev": true,
    207222      "license": "Apache-2.0",
     
    211226    },
    212227    "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==",
    216231      "dev": true,
    217232      "license": "Apache-2.0",
    218233      "dependencies": {
    219         "@eslint/core": "^0.15.2",
     234        "@eslint/core": "^0.17.0",
    220235        "levn": "^0.4.1"
    221236      },
     
    224239      }
    225240    },
     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    },
    226302    "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==",
    230306      "license": "MIT",
    231307      "engines": {
     
    234310    },
    235311    "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==",
    239315      "license": "MIT",
    240316      "peer": true,
    241317      "dependencies": {
    242         "@fortawesome/fontawesome-common-types": "7.0.1"
     318        "@fortawesome/fontawesome-common-types": "7.1.0"
    243319      },
    244320      "engines": {
     
    247323    },
    248324    "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==",
    252328      "license": "(CC-BY-4.0 AND MIT)",
    253329      "dependencies": {
    254         "@fortawesome/fontawesome-common-types": "7.0.1"
     330        "@fortawesome/fontawesome-common-types": "7.1.0"
    255331      },
    256332      "engines": {
     
    259335    },
    260336    "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==",
    264340      "license": "(CC-BY-4.0 AND MIT)",
    265341      "dependencies": {
    266         "@fortawesome/fontawesome-common-types": "7.0.1"
     342        "@fortawesome/fontawesome-common-types": "7.1.0"
    267343      },
    268344      "engines": {
     
    271347    },
    272348    "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==",
    276352      "license": "(CC-BY-4.0 AND MIT)",
    277353      "dependencies": {
    278         "@fortawesome/fontawesome-common-types": "7.0.1"
     354        "@fortawesome/fontawesome-common-types": "7.1.0"
    279355      },
    280356      "engines": {
     
    283359    },
    284360    "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==",
    288364      "license": "MIT",
    289365      "engines": {
     
    358434    },
    359435    "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==",
    363439      "cpu": [
    364440        "arm64"
     
    376452      },
    377453      "optionalDependencies": {
    378         "@img/sharp-libvips-darwin-arm64": "1.2.3"
     454        "@img/sharp-libvips-darwin-arm64": "1.2.4"
    379455      }
    380456    },
    381457    "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==",
    385461      "cpu": [
    386462        "x64"
     
    398474      },
    399475      "optionalDependencies": {
    400         "@img/sharp-libvips-darwin-x64": "1.2.3"
     476        "@img/sharp-libvips-darwin-x64": "1.2.4"
    401477      }
    402478    },
    403479    "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==",
    407483      "cpu": [
    408484        "arm64"
     
    418494    },
    419495    "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==",
    423499      "cpu": [
    424500        "x64"
     
    434510    },
    435511    "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==",
    439515      "cpu": [
    440516        "arm"
     
    450526    },
    451527    "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==",
    455531      "cpu": [
    456532        "arm64"
     
    466542    },
    467543    "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==",
    471547      "cpu": [
    472548        "ppc64"
     
    481557      }
    482558    },
     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    },
    483575    "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==",
    487579      "cpu": [
    488580        "s390x"
     
    498590    },
    499591    "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==",
    503595      "cpu": [
    504596        "x64"
     
    514606    },
    515607    "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-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/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==",
    519611      "cpu": [
    520612        "arm64"
     
    530622    },
    531623    "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==",
    535627      "cpu": [
    536628        "x64"
     
    546638    },
    547639    "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==",
    551643      "cpu": [
    552644        "arm"
     
    564656      },
    565657      "optionalDependencies": {
    566         "@img/sharp-libvips-linux-arm": "1.2.3"
     658        "@img/sharp-libvips-linux-arm": "1.2.4"
    567659      }
    568660    },
    569661    "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==",
    573665      "cpu": [
    574666        "arm64"
     
    586678      },
    587679      "optionalDependencies": {
    588         "@img/sharp-libvips-linux-arm64": "1.2.3"
     680        "@img/sharp-libvips-linux-arm64": "1.2.4"
    589681      }
    590682    },
    591683    "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==",
    595687      "cpu": [
    596688        "ppc64"
     
    608700      },
    609701      "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"
    611725      }
    612726    },
    613727    "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==",
    617731      "cpu": [
    618732        "s390x"
     
    630744      },
    631745      "optionalDependencies": {
    632         "@img/sharp-libvips-linux-s390x": "1.2.3"
     746        "@img/sharp-libvips-linux-s390x": "1.2.4"
    633747      }
    634748    },
    635749    "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==",
    639753      "cpu": [
    640754        "x64"
     
    652766      },
    653767      "optionalDependencies": {
    654         "@img/sharp-libvips-linux-x64": "1.2.3"
     768        "@img/sharp-libvips-linux-x64": "1.2.4"
    655769      }
    656770    },
    657771    "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==",
    661775      "cpu": [
    662776        "arm64"
     
    674788      },
    675789      "optionalDependencies": {
    676         "@img/sharp-libvips-linuxmusl-arm64": "1.2.3"
     790        "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
    677791      }
    678792    },
    679793    "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==",
    683797      "cpu": [
    684798        "x64"
     
    696810      },
    697811      "optionalDependencies": {
    698         "@img/sharp-libvips-linuxmusl-x64": "1.2.3"
     812        "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
    699813      }
    700814    },
    701815    "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==",
    705819      "cpu": [
    706820        "wasm32"
     
    709823      "optional": true,
    710824      "dependencies": {
    711         "@emnapi/runtime": "^1.5.0"
     825        "@emnapi/runtime": "^1.7.0"
    712826      },
    713827      "engines": {
     
    719833    },
    720834    "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==",
    724838      "cpu": [
    725839        "arm64"
     
    738852    },
    739853    "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==",
    743857      "cpu": [
    744858        "ia32"
     
    757871    },
    758872    "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==",
    762876      "cpu": [
    763877        "x64"
     
    773887      "funding": {
    774888        "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"
    788889      }
    789890    },
     
    852953    },
    853954    "node_modules/@next/env": {
    854       "version": "15.5.9",
    855       "resolved": "https://registry.npmjs.org/@next/env/-/env-15.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==",
    857958      "license": "MIT"
    858959    },
     
    868969    },
    869970    "node_modules/@next/swc-darwin-arm64": {
    870       "version": "15.5.7",
    871       "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.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==",
    873974      "cpu": [
    874975        "arm64"
     
    884985    },
    885986    "node_modules/@next/swc-darwin-x64": {
    886       "version": "15.5.7",
    887       "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.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==",
    889990      "cpu": [
    890991        "x64"
     
    9001001    },
    9011002    "node_modules/@next/swc-linux-arm64-gnu": {
    902       "version": "15.5.7",
    903       "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.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==",
    9051006      "cpu": [
    9061007        "arm64"
     
    9161017    },
    9171018    "node_modules/@next/swc-linux-arm64-musl": {
    918       "version": "15.5.7",
    919       "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.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==",
    9211022      "cpu": [
    9221023        "arm64"
     
    9321033    },
    9331034    "node_modules/@next/swc-linux-x64-gnu": {
    934       "version": "15.5.7",
    935       "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.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==",
    9371038      "cpu": [
    9381039        "x64"
     
    9481049    },
    9491050    "node_modules/@next/swc-linux-x64-musl": {
    950       "version": "15.5.7",
    951       "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.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==",
    9531054      "cpu": [
    9541055        "x64"
     
    9641065    },
    9651066    "node_modules/@next/swc-win32-arm64-msvc": {
    966       "version": "15.5.7",
    967       "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.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==",
    9691070      "cpu": [
    9701071        "arm64"
     
    9801081    },
    9811082    "node_modules/@next/swc-win32-x64-msvc": {
    982       "version": "15.5.7",
    983       "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.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==",
    9851086      "cpu": [
    9861087        "x64"
     
    10431144      }
    10441145    },
     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    },
    10451453    "node_modules/@rtsao/scc": {
    10461454      "version": "1.1.0",
     
    10511459    },
    10521460    "node_modules/@rushstack/eslint-patch": {
    1053       "version": "1.12.0",
    1054       "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.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==",
    10561464      "dev": true,
    10571465      "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"
    10581638    },
    10591639    "node_modules/@swc/helpers": {
     
    10661646      }
    10671647    },
     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    },
    10681657    "node_modules/@tailwindcss/node": {
    1069       "version": "4.1.13",
    1070       "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.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==",
    10721661      "dev": true,
    10731662      "license": "MIT",
     
    10751664        "@jridgewell/remapping": "^2.3.4",
    10761665        "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",
    10801669        "source-map-js": "^1.2.1",
    1081         "tailwindcss": "4.1.13"
     1670        "tailwindcss": "4.1.18"
    10821671      }
    10831672    },
    10841673    "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",
    10951679      "engines": {
    10961680        "node": ">= 10"
    10971681      },
    10981682      "optionalDependencies": {
    1099         "@tailwindcss/oxide-android-arm64": "4.1.13",
    1100         "@tailwindcss/oxide-darwin-arm64": "4.1.13",
    1101         "@tailwindcss/oxide-darwin-x64": "4.1.13",
    1102         "@tailwindcss/oxide-freebsd-x64": "4.1.13",
    1103         "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13",
    1104         "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13",
    1105         "@tailwindcss/oxide-linux-arm64-musl": "4.1.13",
    1106         "@tailwindcss/oxide-linux-x64-gnu": "4.1.13",
    1107         "@tailwindcss/oxide-linux-x64-musl": "4.1.13",
    1108         "@tailwindcss/oxide-wasm32-wasi": "4.1.13",
    1109         "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13",
    1110         "@tailwindcss/oxide-win32-x64-msvc": "4.1.13"
     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"
    11111695      }
    11121696    },
    11131697    "node_modules/@tailwindcss/oxide-android-arm64": {
    1114       "version": "4.1.13",
    1115       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.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==",
    11171701      "cpu": [
    11181702        "arm64"
     
    11291713    },
    11301714    "node_modules/@tailwindcss/oxide-darwin-arm64": {
    1131       "version": "4.1.13",
    1132       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.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==",
    11341718      "cpu": [
    11351719        "arm64"
     
    11461730    },
    11471731    "node_modules/@tailwindcss/oxide-darwin-x64": {
    1148       "version": "4.1.13",
    1149       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.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==",
    11511735      "cpu": [
    11521736        "x64"
     
    11631747    },
    11641748    "node_modules/@tailwindcss/oxide-freebsd-x64": {
    1165       "version": "4.1.13",
    1166       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.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==",
    11681752      "cpu": [
    11691753        "x64"
     
    11801764    },
    11811765    "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
    1182       "version": "4.1.13",
    1183       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.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==",
    11851769      "cpu": [
    11861770        "arm"
     
    11971781    },
    11981782    "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
    1199       "version": "4.1.13",
    1200       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.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==",
    12021786      "cpu": [
    12031787        "arm64"
     
    12141798    },
    12151799    "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
    1216       "version": "4.1.13",
    1217       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.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==",
    12191803      "cpu": [
    12201804        "arm64"
     
    12311815    },
    12321816    "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
    1233       "version": "4.1.13",
    1234       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.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==",
    12361820      "cpu": [
    12371821        "x64"
     
    12481832    },
    12491833    "node_modules/@tailwindcss/oxide-linux-x64-musl": {
    1250       "version": "4.1.13",
    1251       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.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==",
    12531837      "cpu": [
    12541838        "x64"
     
    12651849    },
    12661850    "node_modules/@tailwindcss/oxide-wasm32-wasi": {
    1267       "version": "4.1.13",
    1268       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.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==",
    12701854      "bundleDependencies": [
    12711855        "@napi-rs/wasm-runtime",
     
    12831867      "optional": true,
    12841868      "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"
    12911875      },
    12921876      "engines": {
     
    12951879    },
    12961880    "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
    1297       "version": "4.1.13",
    1298       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.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==",
    13001884      "cpu": [
    13011885        "arm64"
     
    13121896    },
    13131897    "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
    1314       "version": "4.1.13",
    1315       "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.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==",
    13171901      "cpu": [
    13181902        "x64"
     
    13291913    },
    13301914    "node_modules/@tailwindcss/postcss": {
    1331       "version": "4.1.13",
    1332       "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.13.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==",
    13341918      "dev": true,
    13351919      "license": "MIT",
    13361920      "dependencies": {
    13371921        "@alloc/quick-lru": "^5.2.0",
    1338         "@tailwindcss/node": "4.1.13",
    1339         "@tailwindcss/oxide": "4.1.13",
     1922        "@tailwindcss/node": "4.1.18",
     1923        "@tailwindcss/oxide": "4.1.18",
    13401924        "postcss": "^8.4.41",
    1341         "tailwindcss": "4.1.13"
     1925        "tailwindcss": "4.1.18"
    13421926      }
    13431927    },
     
    13751959    },
    13761960    "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==",
    13801964      "dev": true,
    13811965      "license": "MIT",
     
    13851969    },
    13861970    "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==",
    13901974      "dev": true,
    13911975      "license": "MIT",
    13921976      "peer": true,
    13931977      "dependencies": {
    1394         "csstype": "^3.0.2"
     1978        "csstype": "^3.2.2"
    13951979      }
    13961980    },
    13971981    "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==",
    14011985      "dev": true,
    14021986      "license": "MIT",
    14031987      "peerDependencies": {
    1404         "@types/react": "^19.0.0"
     1988        "@types/react": "^19.2.0"
    14051989      }
    14061990    },
    14071991    "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",
    14212004        "natural-compare": "^1.4.0",
    1422         "ts-api-utils": "^2.1.0"
     2005        "ts-api-utils": "^2.4.0"
    14232006      },
    14242007      "engines": {
     
    14302013      },
    14312014      "peerDependencies": {
    1432         "@typescript-eslint/parser": "^8.44.1",
     2015        "@typescript-eslint/parser": "^8.54.0",
    14332016        "eslint": "^8.57.0 || ^9.0.0",
    14342017        "typescript": ">=4.8.4 <6.0.0"
     
    14462029    },
    14472030    "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==",
    14512034      "dev": true,
    14522035      "license": "MIT",
    14532036      "peer": true,
    14542037      "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"
    14602043      },
    14612044      "engines": {
     
    14722055    },
    14732056    "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"
    14832066      },
    14842067      "engines": {
     
    14942077    },
    14952078    "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"
    15042087      },
    15052088      "engines": {
     
    15122095    },
    15132096    "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==",
    15172100      "dev": true,
    15182101      "license": "MIT",
     
    15292112    },
    15302113    "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"
    15422125      },
    15432126      "engines": {
     
    15542137    },
    15552138    "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==",
    15592142      "dev": true,
    15602143      "license": "MIT",
     
    15682151    },
    15692152    "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"
    15862168      },
    15872169      "engines": {
     
    16062188      }
    16072189    },
    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     },
    16382190    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
    16392191      "version": "9.0.5",
     
    16532205    },
    16542206    "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"
    16652217      },
    16662218      "engines": {
     
    16772229    },
    16782230    "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",
    16862238        "eslint-visitor-keys": "^4.2.1"
    16872239      },
     
    22152767    },
    22162768    "node_modules/autoprefixer": {
    2217       "version": "10.4.21",
    2218       "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.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==",
    22202772      "dev": true,
    22212773      "funding": [
     
    22352787      "license": "MIT",
    22362788      "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",
    22412792        "picocolors": "^1.1.1",
    22422793        "postcss-value-parser": "^4.2.0"
     
    22692820    },
    22702821    "node_modules/axe-core": {
    2271       "version": "4.10.3",
    2272       "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.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==",
    22742825      "dev": true,
    22752826      "license": "MPL-2.0",
     
    22962847    },
    22972848    "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==",
    23022852      "license": "Apache-2.0",
    23032853      "bin": {
     
    23302880    },
    23312881    "node_modules/browserslist": {
    2332       "version": "4.26.2",
    2333       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.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==",
    23352885      "dev": true,
    23362886      "funding": [
     
    23512901      "peer": true,
    23522902      "dependencies": {
    2353         "baseline-browser-mapping": "^2.8.3",
    2354         "caniuse-lite": "^1.0.30001741",
    2355         "electron-to-chromium": "^1.5.218",
    2356         "node-releases": "^2.0.21",
    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"
    23582908      },
    23592909      "bin": {
     
    24252975    },
    24262976    "node_modules/caniuse-lite": {
    2427       "version": "1.0.30001743",
    2428       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.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==",
    24302980      "funding": [
    24312981        {
     
    24613011      }
    24623012    },
    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     },
    24733013    "node_modules/class-variance-authority": {
    24743014      "version": "0.7.1",
     
    25413081    },
    25423082    "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==",
    25463086      "dev": true,
    25473087      "license": "MIT"
     
    26263166      }
    26273167    },
     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    },
    26283174    "node_modules/deep-is": {
    26293175      "version": "0.1.4",
     
    26703216    },
    26713217    "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==",
    26763221      "license": "Apache-2.0",
    26773222      "engines": {
     
    27083253    },
    27093254    "node_modules/electron-to-chromium": {
    2710       "version": "1.5.223",
    2711       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.223.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==",
    27133258      "dev": true,
    27143259      "license": "ISC"
     
    27223267    },
    27233268    "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==",
    27273272      "dev": true,
    27283273      "license": "MIT",
     
    27363281    },
    27373282    "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==",
    27413286      "dev": true,
    27423287      "license": "MIT",
     
    28253370    },
    28263371    "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==",
    28303375      "dev": true,
    28313376      "license": "MIT",
    28323377      "dependencies": {
    28333378        "call-bind": "^1.0.8",
    2834         "call-bound": "^1.0.3",
     3379        "call-bound": "^1.0.4",
    28353380        "define-properties": "^1.2.1",
    2836         "es-abstract": "^1.23.6",
     3381        "es-abstract": "^1.24.1",
    28373382        "es-errors": "^1.3.0",
    2838         "es-set-tostringtag": "^2.0.3",
     3383        "es-set-tostringtag": "^2.1.0",
    28393384        "function-bind": "^1.1.2",
    2840         "get-intrinsic": "^1.2.6",
     3385        "get-intrinsic": "^1.3.0",
    28413386        "globalthis": "^1.0.4",
    28423387        "gopd": "^1.2.0",
     
    28453390        "has-symbols": "^1.1.0",
    28463391        "internal-slot": "^1.1.0",
    2847         "iterator.prototype": "^1.1.4",
     3392        "iterator.prototype": "^1.1.5",
    28483393        "safe-array-concat": "^1.1.3"
    28493394      },
     
    29363481    },
    29373482    "node_modules/eslint": {
    2938       "version": "9.36.0",
    2939       "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.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==",
    29413486      "dev": true,
    29423487      "license": "MIT",
     
    29453490        "@eslint-community/eslint-utils": "^4.8.0",
    29463491        "@eslint-community/regexpp": "^4.12.1",
    2947         "@eslint/config-array": "^0.21.0",
    2948         "@eslint/config-helpers": "^0.3.1",
    2949         "@eslint/core": "^0.15.2",
     3492        "@eslint/config-array": "^0.21.1",
     3493        "@eslint/config-helpers": "^0.4.2",
     3494        "@eslint/core": "^0.17.0",
    29503495        "@eslint/eslintrc": "^3.3.1",
    2951         "@eslint/js": "9.36.0",
    2952         "@eslint/plugin-kit": "^0.3.5",
     3496        "@eslint/js": "9.39.2",
     3497        "@eslint/plugin-kit": "^0.4.1",
    29533498        "@humanfs/node": "^0.16.6",
    29543499        "@humanwhocodes/module-importer": "^1.0.1",
    29553500        "@humanwhocodes/retry": "^0.4.2",
    29563501        "@types/estree": "^1.0.6",
    2957         "@types/json-schema": "^7.0.15",
    29583502        "ajv": "^6.12.4",
    29593503        "chalk": "^4.0.0",
     
    33183862    },
    33193863    "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==",
    33233867      "dev": true,
    33243868      "license": "BSD-3-Clause",
     
    34153959    },
    34163960    "node_modules/fastq": {
    3417       "version": "1.19.1",
    3418       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
    3419       "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/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==",
    34203964      "dev": true,
    34213965      "license": "ISC",
     
    35054049    },
    35064050    "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==",
    35104054      "dev": true,
    35114055      "license": "MIT",
     
    35144058      },
    35154059      "funding": {
    3516         "type": "patreon",
     4060        "type": "github",
    35174061        "url": "https://github.com/sponsors/rawify"
    35184062      }
     
    35574101      "funding": {
    35584102        "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"
    35594113      }
    35604114    },
     
    36174171    },
    36184172    "node_modules/get-tsconfig": {
    3619       "version": "4.10.1",
    3620       "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.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==",
    36224176      "dev": true,
    36234177      "license": "MIT",
     
    36924246      "license": "ISC"
    36934247    },
    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     },
    37014248    "node_modules/has-bigints": {
    37024249      "version": "1.1.0",
     
    37934340      }
    37944341    },
     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    },
    37954398    "node_modules/ignore": {
    37964399      "version": "5.3.2",
     
    38434446      "engines": {
    38444447        "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"
    38454460      }
    38464461    },
     
    39944609      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
    39954610      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
    3996       "dev": true,
    39974611      "license": "MIT",
    39984612      "engines": {
     
    40174631    },
    40184632    "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",
    40274642        "has-tostringtag": "^1.0.2",
    40284643        "safe-regex-test": "^1.1.0"
     
    40394654      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
    40404655      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
    4041       "dev": true,
    40424656      "license": "MIT",
    40434657      "dependencies": {
     
    42794893    },
    42804894    "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==",
    42844898      "dev": true,
    42854899      "license": "MIT",
     
    42964910    },
    42974911    "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==",
    43014915      "dev": true,
    43024916      "license": "MIT",
     
    44035017    },
    44045018    "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==",
    44085022      "dev": true,
    44095023      "license": "MPL-2.0",
     
    44195033      },
    44205034      "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==",
    44375052      "cpu": [
    44385053        "arm64"
     
    44425057      "optional": true,
    44435058      "os": [
    4444         "darwin"
     5059        "android"
    44455060      ],
    44465061      "engines": {
     
    44525067      }
    44535068    },
    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"
    44605075      ],
    44615076      "dev": true,
     
    44735088      }
    44745089    },
    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==",
    44795094      "cpu": [
    44805095        "x64"
     
    44845099      "optional": true,
    44855100      "os": [
    4486         "freebsd"
     5101        "darwin"
    44875102      ],
    44885103      "engines": {
     
    44945109      }
    44955110    },
    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"
    45025117      ],
    45035118      "dev": true,
     
    45055120      "optional": true,
    45065121      "os": [
    4507         "linux"
     5122        "freebsd"
    45085123      ],
    45095124      "engines": {
     
    45155130      }
    45165131    },
    4517     "node_modules/lightningcss-linux-arm64-gnu": {
    4518       "version": "1.30.1",
    4519       "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
    4520       "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
    4521       "cpu": [
    4522         "arm64"
     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"
    45235138      ],
    45245139      "dev": true,
     
    45365151      }
    45375152    },
    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==",
    45425157      "cpu": [
    45435158        "arm64"
     
    45575172      }
    45585173    },
    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"
    45655180      ],
    45665181      "dev": true,
     
    45785193      }
    45795194    },
    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==",
    45845199      "cpu": [
    45855200        "x64"
     
    45995214      }
    46005215    },
    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"
    46075222      ],
    46085223      "dev": true,
     
    46105225      "optional": true,
    46115226      "os": [
    4612         "win32"
     5227        "linux"
    46135228      ],
    46145229      "engines": {
     
    46205235      }
    46215236    },
     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    },
    46225258    "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==",
    46265262      "cpu": [
    46275263        "x64"
     
    46875323    },
    46885324    "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==",
    46925328      "dev": true,
    46935329      "license": "MIT",
     
    47515387      "funding": {
    47525388        "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"
    47765389      }
    47775390    },
     
    48025415    },
    48035416    "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==",
    48075420      "dev": true,
    48085421      "license": "MIT",
     
    48245437      "license": "MIT"
    48255438    },
     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    },
    48265448    "node_modules/next": {
    4827       "version": "15.5.9",
    4828       "resolved": "https://registry.npmjs.org/next/-/next-15.5.9.tgz",
    4829       "integrity": "sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==",
    4830       "license": "MIT",
    4831       "dependencies": {
    4832         "@next/env": "15.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",
    48335455        "@swc/helpers": "0.5.15",
     5456        "baseline-browser-mapping": "^2.8.3",
    48345457        "caniuse-lite": "^1.0.30001579",
    48355458        "postcss": "8.4.31",
     
    48405463      },
    48415464      "engines": {
    4842         "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
     5465        "node": ">=20.9.0"
    48435466      },
    48445467      "optionalDependencies": {
    4845         "@next/swc-darwin-arm64": "15.5.7",
    4846         "@next/swc-darwin-x64": "15.5.7",
    4847         "@next/swc-linux-arm64-gnu": "15.5.7",
    4848         "@next/swc-linux-arm64-musl": "15.5.7",
    4849         "@next/swc-linux-x64-gnu": "15.5.7",
    4850         "@next/swc-linux-x64-musl": "15.5.7",
    4851         "@next/swc-win32-arm64-msvc": "15.5.7",
    4852         "@next/swc-win32-x64-msvc": "15.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"
    48545477      },
    48555478      "peerDependencies": {
     
    48725495        },
    48735496        "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": {
    48745573          "optional": true
    48755574        }
     
    49045603      }
    49055604    },
     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    },
    49065611    "node_modules/node-releases": {
    4907       "version": "2.0.21",
    4908       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.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==",
    49105615      "dev": true,
    49115616      "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       }
    49225617    },
    49235618    "node_modules/object-assign": {
     
    51705865        "url": "https://github.com/sponsors/jonschlinkert"
    51715866      }
     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"
    51725873    },
    51735874    "node_modules/possible-typed-array-names": {
     
    52725973    },
    52735974    "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==",
    52775978      "license": "MIT",
    52785979      "peer": true,
     
    52825983    },
    52835984    "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==",
    52875988      "license": "MIT",
    52885989      "peer": true,
    52895990      "dependencies": {
    5290         "scheduler": "^0.26.0"
     5991        "scheduler": "^0.27.0"
    52915992      },
    52925993      "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        }
    52946022      }
    52956023    },
     
    53466074    },
    53476075    "node_modules/resolve": {
    5348       "version": "1.22.10",
    5349       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.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",
    53556083        "path-parse": "^1.0.7",
    53566084        "supports-preserve-symlinks-flag": "^1.0.0"
     
    54776205    },
    54786206    "node_modules/scheduler": {
    5479       "version": "0.26.0",
    5480       "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.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==",
    54826210      "license": "MIT"
    54836211    },
    54846212    "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==",
    54886216      "devOptional": true,
    54896217      "license": "ISC",
     
    55456273    },
    55466274    "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==",
    55506278      "hasInstallScript": true,
    55516279      "license": "Apache-2.0",
     
    55536281      "dependencies": {
    55546282        "@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"
    55576285      },
    55586286      "engines": {
     
    55636291      },
    55646292      "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"
    55876317      }
    55886318    },
     
    59026632    },
    59036633    "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==",
    59076637      "license": "MIT",
    59086638      "funding": {
     
    59126642    },
    59136643    "node_modules/tailwindcss": {
    5914       "version": "4.1.13",
    5915       "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.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==",
    59176647      "dev": true,
    59186648      "license": "MIT"
    59196649    },
    59206650    "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==",
    59246654      "dev": true,
    59256655      "license": "MIT",
     
    59306660        "type": "opencollective",
    59316661        "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"
    59496662      }
    59506663    },
     
    60126725    },
    60136726    "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==",
    60176730      "dev": true,
    60186731      "license": "MIT",
     
    61456858    },
    61466859    "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,
    61516864      "license": "Apache-2.0",
    61526865      "peer": true,
     
    62216934    },
    62226935    "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==",
    62266939      "dev": true,
    62276940      "funding": [
     
    62616974      }
    62626975    },
     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    },
    62637015    "node_modules/which": {
    62647016      "version": "2.0.2",
     
    63457097    },
    63467098    "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==",
    63507102      "dev": true,
    63517103      "license": "MIT",
     
    63767128      }
    63777129    },
    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     },
    63887130    "node_modules/yocto-queue": {
    63897131      "version": "0.1.0",
  • package.json

    r298f9b3 r50f2fb4  
    1717    "class-variance-authority": "^0.7.1",
    1818    "clsx": "^2.1.1",
     19    "i18next": "^25.8.0",
    1920    "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",
    2326    "tailwind-merge": "^3.3.1"
    2427  },
  • src/app/layout.tsx

    r298f9b3 r50f2fb4  
    1 import type { Metadata } from "next";
     1"use client";
    22import { Geist, Geist_Mono } from "next/font/google";
    33import "./globals.css";
    44import '@fortawesome/fontawesome-svg-core/styles.css';
    55import { config } from '@fortawesome/fontawesome-svg-core';
     6import { I18nextProvider } from 'react-i18next';
     7import i18n from '../i18n';
    68
    7 // Prevent FontAwesome from adding CSS automatically
    89config.autoAddCss = false;
    910
     
    1819});
    1920
    20 export const metadata: Metadata = {
    21   title: "IKnow - Student Portal",
    22   description: "Student portal for Ss. Cyril and Methodius University",
    23 };
    24 
    2521export default function RootLayout({
    2622  children,
     
    3026  return (
    3127    <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>
    3632      </body>
    3733    </html>
  • src/app/page.tsx

    r298f9b3 r50f2fb4  
    1212import { useState } from 'react';
    1313import { login } from '@/lib/auth';
     14import { useTranslation } from 'react-i18next';
     15import LanguageSwitcher from '@/components/LanguageSwitcher';
    1416
    1517export default function LoginPage() {
     18  const { t } = useTranslation();
    1619  const [showPassword, setShowPassword] = useState(false);
    1720  const [isSubmitting, setIsSubmitting] = useState(false);
     
    5457              <div className="w-full flex flex-col gap-4">
    5558                <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>
    5760                  <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')}
    6062                  </div>
    6163                  <div className="mt-3 text-xs text-gray-700">
    62                     may take up to 30 seconds afte long inactivity
     64                    {t('login_note_slow')}
    6365                  </div>
    6466                </div>
    6567
    6668                <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>
    6870                  <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')}
    7172                  </div>
    7273                </div>
     
    8485                </div>
    8586              </div>
    86               <h1 className="text-2xl font-bold mb-2">Добредојде</h1>
     87              <h1 className="text-2xl font-bold mb-2">{t('login_welcome')}</h1>
    8788              <p className="text-blue-100 text-sm">
    88                 Најавете се во вашиот IKnow акаунт
     89                {t('login_subtitle')}
    8990              </p>
    9091            </div>
     
    9293            {/* Form */}
    9394            <div className="p-8">
     95              {/* Language Switcher above email field, centered */}
     96              <div className="flex justify-center mb-6">
     97                <LanguageSwitcher />
     98              </div>
    9499              <form onSubmit={handleSubmit} className="space-y-6">
    95100                {/* Email Field */}
    96101                <div>
    97102                  <label htmlFor="email" className="block text-sm font-medium text-gray-700 mb-2">
    98                     Внесете е-пошта
     103                    {t('login_email_label')}
    99104                  </label>
    100105                  <div className="relative">
     
    110115                      onChange={handleInputChange}
    111116                      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')}
    113118                    />
    114119                  </div>
     
    118123                <div>
    119124                  <label htmlFor="password" className="block text-sm font-medium text-gray-700 mb-2">
    120                     Лозинка
     125                    {t('login_password_label')}
    121126                  </label>
    122127                  <div className="relative">
     
    132137                      onChange={handleInputChange}
    133138                      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')}
    135140                    />
    136141                    <button
     
    157162                    />
    158163                    <label htmlFor="remember" className="ml-2 block text-sm text-gray-700">
    159                       Запомни ме
     164                      {t('login_remember_me')}
    160165                    </label>
    161166                  </div>
     
    164169                    className="text-sm text-primary hover:text-blue-700 font-medium transition-colors"
    165170                  >
    166                     Заборавена лозинка?
     171                    {t('login_forgot_password')}
    167172                  </button>
    168173                </div>
     
    170175                {errorMessage && (
    171176                  <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}
    173178                  </div>
    174179                )}
     
    181186                >
    182187                  <FontAwesomeIcon icon={faSignInAlt} className="h-4 w-4" />
    183                   {isSubmitting ? 'Најави се...' : 'Најави се'}
     188                  {isSubmitting ? t('login_button_loading') : t('login_button')}
    184189                </button>
    185190              </form>
     
    189194            <div className="bg-gray-50 px-8 py-4 border-t border-gray-100">
    190195              <p className="text-center text-sm text-gray-600">
    191                 Немате акаунт?{' '}
     196                {t('login_no_account')}{' '}
    192197                <button className="text-primary hover:text-blue-700 font-medium transition-colors">
    193                   Контактирајте ја администрацијата
     198                  {t('login_contact_admin')}
    194199                </button>
    195200              </p>
     
    202207                    <FontAwesomeIcon icon={faGraduationCap} className="text-primary" />
    203208                    <span className="text-sm text-gray-600">
    204                       Студентски информационен систем
     209                      {t('login_footer')}
    205210                    </span>
    206211                  </div>
  • src/app/professor/profile/page.tsx

    r298f9b3 r50f2fb4  
    1818import { getAccessToken } from "@/lib/auth";
    1919import { IconDefinition } from "@fortawesome/fontawesome-svg-core";
     20import { useTranslation } from 'react-i18next';
    2021
    2122type PersonalInfo = {
     
    9495}
    9596
    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>
     97const 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>
    101108    </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};
    107111
    108112interface SectionProps {
     
    112116}
    113117
    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>
     118const 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>
    121129    </div>
    122     <div className="p-6">{children}</div>
    123   </div>
    124 );
     130  );
     131};
    125132
    126133export default function ProfessorProfilePage() {
     
    128135  const [isLoading, setIsLoading] = useState(true);
    129136  const [errorMessage, setErrorMessage] = useState<string | null>(null);
     137  const { t } = useTranslation();
    130138
    131139  useEffect(() => {
     
    177185    return (
    178186      <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>
    180188      </div>
    181189    );
     
    186194      <div className="min-h-screen pb-8">
    187195        <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')}
    189197        </div>
    190198      </div>
     
    210218            </h1>
    211219            <div className="text-lg opacity-90">
    212               Индекс: {personalInfo.index} | ЕМБГ: {personalInfo.embg}
     220              {t('index')}: {personalInfo.index} | {t('embg')}: {personalInfo.embg}
    213221            </div>
    214222          </div>
     
    219227      <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
    220228        {/* 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} />
    227235          <InfoRow
    228             label="Пол"
     236            label="gender"
    229237            value={personalInfo.gender}
    230             icon={personalInfo.gender === "машки" ? faMars : faVenus}
     238            icon={personalInfo.gender === t('male') ? faMars : faVenus}
    231239          />
    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} />
    238246          {personalInfo.notes && (
    239247            <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>
    241249              <div className="text-sm text-blue-700">{personalInfo.notes}</div>
    242250            </div>
     
    245253
    246254        {/* 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} />
    251259        </Section>
    252260
    253261        {/* Contact Information */}
    254262        <div className="lg:col-span-2">
    255           <Section title="Контакт" icon={faAddressCard}>
     263          <Section title="contact" icon={faAddressCard}>
    256264            <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
    257265              <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} />
    263271              </div>
    264272              <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="Microsoft email" 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} />
    271279              </div>
    272280            </div>
  • src/app/professor/students/page.tsx

    r298f9b3 r50f2fb4  
    22
    33import { useEffect, useMemo, useState } from "react";
     4import { useTranslation } from 'react-i18next';
    45
    56type UsersBySubject = {
     
    3637
    3738export default function ProfessorStudentsPage() {
     39  const { t } = useTranslation();
    3840  const [subjects, setSubjects] = useState<SubjectsAndUsers[]>([]);
    3941  const [loading, setLoading] = useState(true);
     
    129131    <div className="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
    130132      <div className="flex flex-col gap-4 md:flex-row md:items-end md:justify-between">
     133
    131134        <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>
    133136          <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).
    135138          </p>
    136139        </div>
     
    138141        <div className="flex flex-col sm:flex-row gap-3">
    139142          <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>
    141144            <select
    142145              className="border border-gray-300 rounded-lg px-3 py-2"
     
    144147              onChange={(e) => setSubjectFilter(e.target.value)}
    145148            >
    146               <option value="all">All subjects</option>
     149              <option value="all">{t('all_subjects')}</option>
    147150              {subjects
    148151                .filter((s) => typeof s.Id === "number")
    149152                .map((s) => (
    150153                  <option key={String(s.Id)} value={String(s.Id)}>
    151                     {s.Name ?? `Subject ${s.Id}`}
     154                    {s.Name ?? `${t('subject')} ${s.Id}`}
    152155                  </option>
    153156                ))}
     
    156159
    157160          <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>
    159162            <input
    160163              className="border border-gray-300 rounded-lg px-3 py-2"
    161               placeholder="e.g. 20001"
     164              placeholder={t('student_id_placeholder')}
    162165              value={studentIdQuery}
    163166              onChange={(e) => setStudentIdQuery(e.target.value)}
     
    177180          <thead className="bg-gray-50">
    178181            <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>
    184187            </tr>
    185188          </thead>
     
    188191              <tr>
    189192                <td className="px-4 py-4 text-gray-700" colSpan={5}>
    190                   Loading...
     193                  {t('loading')}
    191194                </td>
    192195              </tr>
     
    194197              <tr>
    195198                <td className="px-4 py-4 text-gray-700" colSpan={5}>
    196                   No students found.
     199                  {t('no_students_found')}
    197200                </td>
    198201              </tr>
     
    227230                        </select>
    228231                        <span className="text-sm text-gray-600">
    229                           Current: {r.grade > 0 ? r.grade : "—"}
     232                          {t('current')}: {r.grade > 0 ? r.grade : t('none')}
    230233                        </span>
    231234                      </div>
     
    245248                          }}
    246249                        >
    247                           Add grade
     250                          {t('add_grade')}
    248251                        </button>
    249252
     
    260263                          }}
    261264                        >
    262                           Edit grade
     265                          {t('edit_grade')}
    263266                        </button>
    264267
     
    275278                          }}
    276279                        >
    277                           Remove grade
     280                          {t('remove_grade')}
    278281                        </button>
    279282                      </div>
  • src/app/students/applications/page.tsx

    r298f9b3 r50f2fb4  
    1414} from '@fortawesome/free-solid-svg-icons';
    1515import { useState } from 'react';
     16import { useTranslation } from 'react-i18next';
    1617import applicationsData from '@/data/applications.json';
    1718
     
    2829
    2930const 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')}>
    3335        <FontAwesomeIcon icon={faCheckCircle} className="w-4 h-4" />
    3436      </span>
     
    3638  } else {
    3739    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')}>
    3941        <FontAwesomeIcon icon={faTimesCircle} className="w-4 h-4" />
    4042      </span>
     
    6466
    6567export default function ApplicationsPage() {
     68  const { t } = useTranslation();
    6669  const [selectedSession, setSelectedSession] = useState(applicationsData.currentSession.id);
    6770  const [isDropdownOpen, setIsDropdownOpen] = useState(false);
    68  
     71
    6972  const currentSessionData = applicationsData.examSessions.find(s => s.id === selectedSession) || applicationsData.currentSession;
    7073  const { applications } = applicationsData;
     
    7982          </div>
    8083          <div>
    81             <h1 className="text-3xl font-bold mb-2">Пријави</h1>
     84            <h1 className="text-3xl font-bold mb-2">{t('applications_header', 'Пријави')}</h1>
    8285            <p className="text-lg opacity-90">
    83               Електронски пријави за испити
     86              {t('applications_subheader', 'Електронски пријави за испити')}
    8487            </p>
    8588          </div>
     
    9295          <h2 className="text-lg font-semibold text-gray-900 flex items-center gap-2">
    9396            <FontAwesomeIcon icon={faCalendarAlt} className="text-primary" />
    94             Избери испитна сесија:
     97            {t('select_exam_session', 'Избери испитна сесија:')}
    9598          </h2>
    96          
     99
    97100          <div className="relative">
    98101            <button
     
    102105              <div className="flex items-center justify-between">
    103106                <span className="text-sm font-medium text-primary">
    104                   {currentSessionData.name}
     107                  {t(currentSessionData.id, currentSessionData.name)}
    105108                </span>
    106                 <FontAwesomeIcon 
    107                   icon={faChevronDown} 
     109                <FontAwesomeIcon
     110                  icon={faChevronDown}
    108111                  className={`w-4 h-4 text-gray-400 transition-transform ml-4 ${isDropdownOpen ? 'rotate-180' : ''}`}
    109112                />
    110113              </div>
    111114            </button>
    112            
     115
    113116            {isDropdownOpen && (
    114117              <div className="absolute z-10 right-0 mt-1 w-80 bg-white border border-gray-200 rounded-lg shadow-lg">
     
    122125                    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"
    123126                  >
    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>
    126129                  </button>
    127130                ))}
     
    135138      <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden">
    136139        <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
    140143        <div className="overflow-x-auto">
    141144          <table className="w-full">
     
    143146              <tr>
    144147                <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>
    153156              </tr>
    154157            </thead>
     
    166169                    <div className="flex items-center gap-2">
    167170                      <FontAwesomeIcon icon={faFileText} className="w-4 h-4 text-primary" />
    168                       {application.subject}
     171                      {t(application.subject, application.subject)}
    169172                    </div>
    170173                  </TableCell>
     
    179182                    <div className="flex items-center gap-2">
    180183                      <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>
    182185                    </div>
    183186                  </TableCell>
     
    194197            <FontAwesomeIcon icon={faInfoCircle} className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
    195198            <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>
    197200              <p className="text-sm text-blue-800 leading-relaxed">
    198                 {applicationsData.note}
     201                {t('applications_important_note_text')}
    199202              </p>
    200203            </div>
     
    211214            </div>
    212215            <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>
    214217              <p className="text-2xl font-bold text-blue-600">
    215218                {applications.length}
     
    225228            </div>
    226229            <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>
    228231              <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}
    230233              </p>
    231234            </div>
     
    239242            </div>
    240243            <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>
    242245              <p className="text-2xl font-bold text-yellow-600">
    243246                {applications.reduce((sum, app) => sum + parseFloat(app.fee.replace(',', '.')), 0).toFixed(2)}
  • src/app/students/documents/page.tsx

    r298f9b3 r50f2fb4  
    1515import { useState } from 'react';
    1616import documentsData from '@/data/documents.json';
     17import { useTranslation } from 'react-i18next';
    1718
    1819interface TableCellProps {
     
    2829
    2930const StatusBadge = ({ status }: { status: string }) => {
    30   if (status === "approved") {
     31  const { t } = useTranslation();
     32  if (status === t('approved', 'Одобрено')) {
    3133    return (
    3234      <span className="inline-flex items-center justify-center w-8 h-8 bg-green-100 text-green-600 rounded-full">
     
    4345
    4446const PriceBadge = ({ price }: { price: number }) => {
     47  const { t } = useTranslation();
    4548  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>;
    4750  }
    4851  return <span className="font-medium text-blue-600">{price.toFixed(2)}</span>;
     
    5558  const [currentPage, setCurrentPage] = useState(1);
    5659  const [recordsPerPage, setRecordsPerPage] = useState(15);
     60  const { t } = useTranslation();
    5761
    5862  const selectedDocument = documentsData.documentTypes.find(d => d.id === selectedDocumentType);
     
    7377          </div>
    7478          <div>
    75             <h1 className="text-3xl font-bold mb-2">Документи</h1>
     79            <h1 className="text-3xl font-bold mb-2">{t('documents')}</h1>
    7680            <p className="text-lg opacity-90">
    77               Барање и преглед на документи
     81              {t('documents_overview', 'Преглед на вашите документи и нивниот статус.')}
    7882            </p>
    7983          </div>
     
    8589        <h2 className="text-lg font-semibold text-gray-900 mb-6 flex items-center gap-2">
    8690          <FontAwesomeIcon icon={faFileText} className="text-primary" />
    87           Ново барање за документ
     91          {t('new_document_request', 'Ново барање за документ')}
    8892        </h2>
    8993       
     
    9296          <div>
    9397            <label className="block text-sm font-medium text-gray-700 mb-2">
    94               Изберете документ:
     98              {t('select_document', 'Избери документ')}:
    9599            </label>
    96100            <div className="relative">
     
    101105                <div className="flex items-center justify-between">
    102106                  <span className="text-sm text-gray-900 truncate">
    103                     {selectedDocument?.name || "Изберете документ"}
     107                    {selectedDocument ? t(selectedDocument.id) : t('select_document', 'Избери документ')}
    104108                  </span>
    105109                  <FontAwesomeIcon
     
    121125                      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"
    122126                    >
    123                       <div className="font-medium text-gray-900">{docType.name}</div>
     127                      <div className="font-medium text-gray-900">{t(docType.id)}</div>
    124128                      {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>
    126130                      )}
    127131                    </button>
     
    135139          <div>
    136140            <label className="block text-sm font-medium text-gray-700 mb-2">
    137               Коментар:
     141              {t('comment', 'Коментар')}:
    138142            </label>
    139143            <textarea
     
    142146              rows={4}
    143147              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', 'Додај коментар')}
    145149            />
    146150          </div>
     
    153157          >
    154158            <FontAwesomeIcon icon={faFileText} className="w-4 h-4" />
    155             Внеси
     159            {t('submit', 'Поднеси')}
    156160          </button>
    157161        </div>
     
    161165      <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden">
    162166        <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>
    164168        </div>
    165169       
     
    169173              <tr>
    170174                <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>
    180184              </tr>
    181185            </thead>
     
    187191                  <TableCell className="text-gray-600">{document.date}</TableCell>
    188192                  <TableCell className="font-medium text-gray-900 max-w-xs">
    189                     {document.request}
     193                    {t(document.request)}
    190194                  </TableCell>
    191195                  <TableCell className="text-right">
     
    206210                      <FontAwesomeIcon icon={faCheckCircle} className="w-5 h-5 text-green-600" />
    207211                    ) : (
    208                       <span className="text-gray-400"></span>
     212                      <span className="text-gray-400">{t('none', '—')}</span>
    209213                    )}
    210214                  </TableCell>
     
    214218                  <TableCell>
    215219                    {document.comment || (
    216                       <span className="text-gray-400"></span>
     220                      <span className="text-gray-400">{t('none', '—')}</span>
    217221                    )}
    218222                  </TableCell>
     
    227231          <div className="flex items-center gap-4 text-sm text-gray-700">
    228232            <div className="flex items-center gap-2">
    229               <span>Прикажи редови:</span>
     233              <span>{t('show_rows', 'Прикажи редови')}:</span>
    230234              <select
    231235                value={recordsPerPage}
     
    239243            </div>
    240244            <div>
    241               Страна <input
     245              {t('page', 'Страница')} <input
    242246                type="number"
    243247                min="1"
     
    246250                onChange={(e) => setCurrentPage(Number(e.target.value))}
    247251                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}
    249253            </div>
    250254          </div>
     
    266270            </button>
    267271            <span className="px-4 py-2 bg-primary text-white rounded text-sm font-medium">
    268               Прва
     272              {t('first', 'Прва')}
    269273            </span>
    270274            <button
     
    283287            </button>
    284288            <span className="ml-4 text-sm text-gray-700">
    285               Последна
     289              {t('last', 'Последна')}
    286290            </span>
    287291          </div>
    288292
    289293          <div className="text-sm text-gray-700">
    290             Вкупно: {documents.length}
     294            {t('total', 'Вкупно')}: {documents.length}
    291295          </div>
    292296        </div>
     
    297301            <FontAwesomeIcon icon={faMoneyBillWave} className="w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0" />
    298302            <p className="text-sm text-blue-800 leading-relaxed">
    299               {paymentInfo}
     303              {t('documents_payment_info', paymentInfo)}
    300304            </p>
    301305          </div>
     
    311315            </div>
    312316            <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>
    314318              <p className="text-2xl font-bold text-blue-600">
    315319                {documents.length}
     
    325329            </div>
    326330            <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>
    328332              <p className="text-2xl font-bold text-green-600">
    329333                {documents.filter(doc => doc.status === "approved").length}
     
    339343            </div>
    340344            <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>
    342346              <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', 'мкд')}
    344348              </p>
    345349            </div>
  • src/app/students/profile/page.tsx

    r298f9b3 r50f2fb4  
    2020import { getAccessToken } from '@/lib/auth';
    2121import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
     22import { useTranslation } from 'react-i18next';
    2223
    2324type PersonalInfo = {
     
    9495}
    9596
    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>
     97const 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>
    101108    </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};
    107111
    108112interface SectionProps {
     
    112116}
    113117
    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>
     118const 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}
    120130      </div>
    121131    </div>
    122     <div className="p-6">
    123       {children}
    124     </div>
    125   </div>
    126 );
     132  );
     133};
    127134
    128135export default function ProfilePage() {
     
    130137  const [isLoading, setIsLoading] = useState(true);
    131138  const [errorMessage, setErrorMessage] = useState<string | null>(null);
     139  const { t } = useTranslation();
    132140
    133141  useEffect(() => {
     
    180188      <div className="min-h-screen pb-8">
    181189        <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6">
    182           Loading...
     190          {t('loading')}
    183191        </div>
    184192      </div>
     
    190198      <div className="min-h-screen pb-8">
    191199        <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')}
    193201        </div>
    194202      </div>
     
    214222            </h1>
    215223            <div className="text-lg opacity-90">
    216               Индекс: {personalInfo.index} | ЕМБГ: {personalInfo.embg}
     224              {t('index')}: {personalInfo.index} | {t('embg')}: {personalInfo.embg}
    217225            </div>
    218226            <div className="text-base opacity-80 mt-1">
     
    227235       
    228236        {/* 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} />
    234242          <InfoRow
    235             label="Датум на раѓање"
     243            label="date_of_birth"
    236244            value={personalInfo.dateOfBirth}
    237245            icon={faCalendarAlt}
    238246          />
    239247          <InfoRow
    240             label="Пол"
     248            label="gender"
    241249            value={personalInfo.gender}
    242             icon={personalInfo.gender === 'машки' ? faMars : faVenus}
     250            icon={personalInfo.gender === t('male') ? faMars : faVenus}
    243251          />
    244252          <InfoRow
    245             label="Националност"
     253            label="nationality"
    246254            value={personalInfo.nationality}
    247255            icon={faFlag}
    248256          />
    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} />
    254262          {personalInfo.notes && (
    255263            <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>
    257265              <div className="text-sm text-blue-700">{personalInfo.notes}</div>
    258266            </div>
     
    261269
    262270        {/* 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} />
    267275        </Section>
    268276
    269277        {/* 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} />
    279287        </Section>
    280288
    281289        {/* 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} />
    290298        </Section>
    291299
    292300        {/* Contact Information */}
    293301        <div className="lg:col-span-2">
    294           <Section title="Контакт" icon={faAddressCard}>
     302          <Section title="contact" icon={faAddressCard}>
    295303            <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
    296304              <div>
    297305                <InfoRow
    298                   label="Место на живеење"
     306                  label="place_of_residence"
    299307                  value={contact.placeOfResidence}
    300308                  icon={faMapMarkerAlt}
    301309                />
    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} />
    306314              </div>
    307315              <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} />
    312320                <InfoRow
    313                   label="Е-пошта"
     321                  label="email"
    314322                  value={contact.email}
    315323                  icon={faEnvelope}
    316324                />
    317325                <InfoRow
    318                   label="Microsoft email"
     326                  label="microsoft_email"
    319327                  value={contact.microsoftEmail}
    320328                  icon={faEnvelope}
  • src/app/students/semesters/page.tsx

    r298f9b3 r50f2fb4  
    1414import { useEffect, useState } from 'react';
    1515import { getAccessToken } from '@/lib/auth';
     16import { useTranslation } from 'react-i18next';
    1617
    1718type Semester = {
     
    5455
    5556const StatusBadge = ({ status }: { status: string }) => {
     57  const { t } = useTranslation();
    5658  const baseClasses = "px-2 py-1 rounded-full text-xs font-medium";
    57  
    58   if (status === "валиден") {
     59  if (status === t('valid')) {
    5960    return (
    6061      <span className={`${baseClasses} bg-green-100 text-green-800 flex items-center gap-1`}>
    6162        <FontAwesomeIcon icon={faCheckCircle} className="w-3 h-3" />
    62         {status}
     63        {t('valid')}
    6364      </span>
    6465    );
    6566  }
    66  
    6767  return (
    6868    <span className={`${baseClasses} bg-gray-100 text-gray-800`}>
    69       {status}
     69      {t(status) || status}
    7070    </span>
    7171  );
     
    7373
    7474const YesNoBadge = ({ value }: { value: string }) => {
    75   if (value === "Да") {
     75  const { t } = useTranslation();
     76  if (value === t('yes')) {
    7677    return (
    7778      <span className="inline-flex items-center justify-center w-6 h-6 bg-green-100 text-green-600 rounded-full">
     
    7980      </span>
    8081    );
    81   } else if (value === "Не") {
     82  } else if (value === t('no')) {
    8283    return (
    8384      <span className="inline-flex items-center justify-center w-6 h-6 bg-red-100 text-red-600 rounded-full">
     
    112113  const [isLoading, setIsLoading] = useState(true);
    113114  const [errorMessage, setErrorMessage] = useState<string | null>(null);
     115  const { t } = useTranslation();
    114116
    115117  useEffect(() => {
     
    162164      <div className="min-h-screen pb-8">
    163165        <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6">
    164           Loading...
     166          {t('loading')}
    165167        </div>
    166168      </div>
     
    187189          </div>
    188190          <div>
    189             <h1 className="text-3xl font-bold mb-2">Семестри</h1>
     191            <h1 className="text-3xl font-bold mb-2">{t('semesters')}</h1>
    190192            <p className="text-lg opacity-90">
    191               Преглед на сите запишани семестри и нивниот статус
     193              {t('semesters_overview')}
    192194            </p>
    193195          </div>
     
    198200      <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden">
    199201        <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>
    201203        </div>
    202204       
     
    206208              <tr>
    207209                <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>
    227229              </tr>
    228230            </thead>
     
    335337            </div>
    336338            <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>
    338340              <p className="text-2xl font-bold text-green-600">
    339341                {semesters.filter(s => s.completed !== "Не").length}
     
    349351            </div>
    350352            <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>
    352354              <p className="text-2xl font-bold text-blue-600">
    353355                {semesters.filter(s => s.verified === "Да").length}
     
    363365            </div>
    364366            <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>
    366368              <p className="text-2xl font-bold text-primary">
    367369                {semesters.length}
  • src/app/students/subjects/page.tsx

    r298f9b3 r50f2fb4  
    99import { useEffect, useState } from 'react';
    1010import { getAccessToken } from '@/lib/auth';
     11import { useTranslation } from 'react-i18next';
    1112
    1213interface Subject {
     
    147148
    148149const StatusBadge = ({ status }: { status: string }) => {
     150  const { t } = useTranslation();
    149151  const baseClasses = "px-3 py-1 rounded-md text-xs font-medium";
    150  
    151   if (status === "Зад.") {
     152  if (status === t('mandatory_short')) {
    152153    return (
    153154      <span className={`${baseClasses} bg-blue-100 text-blue-800`}>
    154         {status}
     155        {t('mandatory_short')}
    155156      </span>
    156157    );
    157   } else if (status === "Изб.") {
     158  } else if (status === t('elective_short')) {
    158159    return (
    159160      <span className={`${baseClasses} bg-green-100 text-green-800`}>
    160         {status}
     161        {t('elective_short')}
    161162      </span>
    162163    );
    163164  }
    164  
    165165  return (
    166166    <span className={`${baseClasses} bg-gray-100 text-gray-800`}>
    167       {status}
     167      {t(status) || status}
    168168    </span>
    169169  );
     
    176176  const [isLoading, setIsLoading] = useState(true);
    177177  const [errorMessage, setErrorMessage] = useState<string | null>(null);
     178  const { t } = useTranslation();
    178179
    179180  useEffect(() => {
     
    275276      <div className="min-h-screen pb-8">
    276277        <div className="bg-white rounded-xl shadow-sm border border-gray-100 p-6">
    277           Loading...
     278          {t('loading')}
    278279        </div>
    279280      </div>
     
    285286      <div className="min-h-screen pb-8">
    286287        <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')}
    288289        </div>
    289290      </div>
     
    308309          </div>
    309310          <div>
    310             <h1 className="text-3xl font-bold mb-2">Предмети</h1>
     311            <h1 className="text-3xl font-bold mb-2">{t('subjects')}</h1>
    311312            <p className="text-lg opacity-90">
    312               Преглед на запишани предмети по семестри
     313              {t('subjects_overview')}
    313314            </p>
    314315          </div>
     
    325326          <div className="bg-white rounded-xl p-6 shadow-sm border border-gray-100">
    326327            <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>
    328329            </div>
    329330            <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>
    331332            </div>
    332333          </div>
     
    335336          <div className="bg-white rounded-xl p-6 shadow-sm border border-gray-100">
    336337            <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>
    338339            </div>
    339340           
    340341            <div className="relative mt-4">
    341342              <label className="block text-sm font-medium text-gray-700 mb-2">
    342                 Избери семестар:
     343                {t('select_semester')}:
    343344              </label>
    344345              <div className="relative">
     
    370371                      >
    371372                        <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>
    373374                      </button>
    374375                    ))}
     
    380381            <div className="mt-4 text-sm">
    381382              <div className="text-primary font-medium">
    382                 Сериски број: {currentSemesterData.serviceNumber}
     383                {t('serial_number')}: {currentSemesterData.serviceNumber}
    383384              </div>
    384385            </div>
     
    389390            <h3 className="font-semibold text-gray-900 mb-3 flex items-center gap-2">
    390391              <FontAwesomeIcon icon={faBook} className="w-4 h-4 text-primary" />
    391               Запишани предмети
     392              {t('enrolled_subjects')}
    392393            </h3>
    393394            <div className="text-3xl font-bold text-primary">
     
    403404              <h2 className="text-xl font-bold flex items-center gap-2">
    404405                <FontAwesomeIcon icon={faFileInvoice} />
    405                 Финансиски информации
     406                {t('financial_info')}
    406407              </h2>
    407408            </div>
     
    413414                <div className="space-y-4">
    414415                  <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>
    416417                    <span className="font-semibold text-primary">{currentSemester.financialInfo.sum}</span>
    417418                  </div>
    418419                  <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>
    420421                    <span className="font-semibold text-green-600">{currentSemester.financialInfo.paid}</span>
    421422                  </div>
    422423                  <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>
    424425                    <span className="font-semibold text-red-600">{currentSemester.financialInfo.due}</span>
    425426                  </div>
    426427                  <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>
    429430                  </div>
    430431                </div>
     
    433434                <div className="space-y-4">
    434435                  <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>
    436437                    <span className="font-semibold text-primary">{currentSemester.financialInfo.credits}</span>
    437438                  </div>
    438439                  <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>
    440441                    <span className="font-semibold">{currentSemester.financialInfo.MKSA}</span>
    441442                  </div>
    442443                  <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>
    444445                    <span className="font-semibold">{currentSemester.financialInfo.electronicRegistration}</span>
    445446                  </div>
    446447                  <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>
    448449                    <span className="font-semibold">{currentSemester.financialInfo.eUKIM}</span>
    449450                  </div>
    450451                  <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>
    452453                    <span className="font-semibold">{currentSemester.financialInfo.bankProvision}</span>
    453454                  </div>
    454455                  <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>
    456457                    <span className="font-bold text-xl text-white">{currentSemester.financialInfo.total}</span>
    457458                  </div>
     
    466467      <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden">
    467468        <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>
    469470        </div>
    470471       
     
    474475              <tr>
    475476                <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>
    485486              </tr>
    486487            </thead>
     
    495496                    <div className="flex items-center gap-2">
    496497                      <FontAwesomeIcon icon={faBook} className="w-4 h-4 text-primary" />
    497                       {subject.name}
     498                      {t(subject.name, subject.name)}
    498499                    </div>
    499500                  </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>
    501502                  <TableCell>
    502503                    <StatusBadge status={subject.status} />
    503504                  </TableCell>
    504505                  <TableCell className="text-center">
    505                     {subject.signature || (
     506                    {subject.signature ? t(subject.signature, subject.signature) : (
    506507                      <span className="text-gray-400">—</span>
    507508                    )}
    508509                  </TableCell>
    509510                  <TableCell className="text-center">
    510                     {subject.group || (
     511                    {subject.group ? t(subject.group, subject.group) : (
    511512                      <span className="text-gray-400">—</span>
    512513                    )}
    513514                  </TableCell>
    514515                  <TableCell>
    515                     {subject.professor || (
     516                    {subject.professor ? t(subject.professor, subject.professor) : (
    516517                      <span className="text-gray-400">—</span>
    517518                    )}
  • src/components/exams.tsx

    r298f9b3 r50f2fb4  
    11"use client"
    22import { useEffect, useMemo, useState } from 'react';
     3import { useTranslation } from 'react-i18next';
    34import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
    45import { faSort, faSortUp, faSortDown } from '@fortawesome/free-solid-svg-icons';
     
    3334
    3435const Exams = () => {
     36  const { t } = useTranslation();
    3537  const [sortField, setSortField] = useState<'grade' | 'date' | null>(null);
    3638  const [sortOrder, setSortOrder] = useState<'asc' | 'desc' | null>(null);
     
    185187    return (
    186188      <div className="bg-white rounded-lg shadow-sm p-6">
    187         Loading...
     189        {t('loading', 'Loading...')}
    188190      </div>
    189191    );
     
    194196      <div className="bg-white rounded-lg shadow-sm p-6">
    195197        <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)}
    197199        </div>
    198200      </div>
     
    208210          <div className="text-center">
    209211            <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>
    211213          </div>
    212214
     
    217219              <span className="text-lg text-gray-400">/{stats.credits.total}</span>
    218220            </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>
    220222          </div>
    221223
     
    223225          <div className="text-center">
    224226            <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>
    226228          </div>
    227229
     
    229231          <div className="text-center">
    230232            <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>
    232234          </div>
    233235        </div>
    234        
     236
    235237        {/* Progress Bar spanning entire statistics section */}
    236238        <div className="w-full bg-gray-200 rounded-full h-2">
    237           <div 
     239          <div
    238240            className="bg-blue-500 h-2 rounded-full transition-all duration-300"
    239241            style={{ width: `${creditsPercentage}%` }}
     
    244246      {/* Exams Table */}
    245247      <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
    248250        <div className="overflow-x-auto">
    249251          <table className="min-w-full">
     
    251253              <tr className="border-b border-gray-200">
    252254                <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>
    256258                <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">
    257                   <button 
     259                  <button
    258260                    onClick={handleSortByDate}
    259261                    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"
    260262                  >
    261                     Датум
    262                     <FontAwesomeIcon 
    263                       icon={getSortIcon('date')} 
     263                    {t('date', 'Датум')}
     264                    <FontAwesomeIcon
     265                      icon={getSortIcon('date')}
    264266                      className={`text-xs transition-colors duration-200 ${
    265267                        sortField === 'date' ? 'text-blue-600' : 'text-gray-400 group-hover:text-gray-600'
     
    269271                </th>
    270272                <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">
    271                   <button 
     273                  <button
    272274                    onClick={handleSortByGrade}
    273275                    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"
    274276                  >
    275                     Оценка
    276                     <FontAwesomeIcon 
    277                       icon={getSortIcon('grade')} 
     277                    {t('grade', 'Оценка')}
     278                    <FontAwesomeIcon
     279                      icon={getSortIcon('grade')}
    278280                      className={`text-xs transition-colors duration-200 ${
    279281                        sortField === 'grade' ? 'text-blue-600' : 'text-gray-400 group-hover:text-gray-600'
  • src/components/header.tsx

    r298f9b3 r50f2fb4  
    11"use client"
     2
    23import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
    34import { faUser } from '@fortawesome/free-solid-svg-icons';
    45import Image from 'next/image';
    56
     7import { useEffect, useState } from 'react';
     8import { getAccessToken, clearAuthTokens } from '@/lib/auth';
     9import { useTranslation } from 'react-i18next';
     10import LanguageSwitcher from './LanguageSwitcher';
     11
    612const 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
    746  return (
    847    <header className="bg-white shadow-sm border-b border-gray-200">
    948      <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">
    1150          {/* 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">
    1352            {/* UKIM Logo */}
    1453            <div className="flex-shrink-0">
     
    2160              />
    2261            </div>
    23            
    2462            {/* FINKI Logo */}
    2563            <div className="flex-shrink-0">
     
    3270              />
    3371            </div>
    34            
    3572            {/* University Text */}
    3673            <div className="hidden sm:block">
    3774              <div className="text-gray-900 font-medium text-sm">
    38                 Универзитет „Св. КИРИЛ И МЕТОДИЈ“ - Скопје
     75                {t('university')}
    3976              </div>
    4077              <div className="text-gray-700 text-sm">
    41                 Факултет за информатички науки и компјутерско инженерство
     78                {t('faculty')}
    4279              </div>
    4380            </div>
    4481          </div>
    45 
    4682          {/* 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">
    4989              {/* 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">
    5191                <FontAwesomeIcon icon={faUser} className="text-sm" />
    5292              </div>
    53              
    5493              {/* User Name */}
    5594              <div className="hidden sm:block text-gray-900 font-medium">
    56                 Стефан Савески
     95                {userName || '...'}
    5796              </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')}
    62104              </button>
    63105            </div>
  • src/components/navbar.tsx

    r298f9b3 r50f2fb4  
    1010import { useState } from 'react';
    1111import Link from 'next/link';
     12import { useTranslation } from 'react-i18next';
    1213
    1314const Navbar = () => {
     
    1819  };
    1920
     21  const { t } = useTranslation();
    2022  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' }
    2729  ];
    2830
  • src/components/professor-navbar.tsx

    r298f9b3 r50f2fb4  
    55import Link from "next/link";
    66import { useState } from "react";
     7import { useTranslation } from 'react-i18next';
    78
    89const ProfessorNavbar = () => {
     
    1314  };
    1415
     16  const { t } = useTranslation();
    1517  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" },
    1820  ];
    1921
  • tsconfig.json

    r298f9b3 r50f2fb4  
    22  "compilerOptions": {
    33    "target": "ES2017",
    4     "lib": ["dom", "dom.iterable", "esnext"],
     4    "lib": [
     5      "dom",
     6      "dom.iterable",
     7      "esnext"
     8    ],
    59    "allowJs": true,
    610    "skipLibCheck": true,
    711    "strict": true,
    8     "noEmit": true,
    912    "esModuleInterop": true,
    1013    "module": "esnext",
     
    1215    "resolveJsonModule": true,
    1316    "isolatedModules": true,
    14     "jsx": "preserve",
     17    "jsx": "react-jsx",
    1518    "incremental": true,
    1619    "plugins": [
     
    2023    ],
    2124    "paths": {
    22       "@/*": ["./src/*"]
    23     }
     25      "@/*": [
     26        "./src/*"
     27      ]
     28    },
     29    "noEmit": true
    2430  },
    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  ]
    2741}
Note: See TracChangeset for help on using the changeset viewer.