Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
feat(lang): logic for internationalization
Browse filesMechanism is now in place, must fill in translations.
- frontend/eslint.config.js +4 -0
- frontend/package.json +4 -1
- frontend/src/App.jsx +5 -41
- frontend/src/components/Footer/Footer.jsx +0 -30
- frontend/src/components/Footer/Footer.tsx +91 -0
- frontend/src/components/LanguageSelect/LanguageSelect.jsx +44 -0
- frontend/src/i18n.tsx +57 -0
- frontend/src/main.jsx +9 -1
- frontend/src/pages/LeaderboardPage/{LeaderboardPage.jsx → LeaderboardPage.tsx} +9 -1
- frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/SearchBar.jsx +3 -4
- frontend/tsconfig.app.json +29 -0
- frontend/tsconfig.json +8 -0
- frontend/tsconfig.node.json +25 -0
- frontend/vite.config.js +5 -1
frontend/eslint.config.js
CHANGED
|
@@ -24,6 +24,10 @@ export default [
|
|
| 24 |
'react-refresh': reactRefresh,
|
| 25 |
},
|
| 26 |
rules: {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
...js.configs.recommended.rules,
|
| 28 |
...react.configs.recommended.rules,
|
| 29 |
...react.configs['jsx-runtime'].rules,
|
|
|
|
| 24 |
'react-refresh': reactRefresh,
|
| 25 |
},
|
| 26 |
rules: {
|
| 27 |
+
"@typescript-eslint/no-unused-vars": [
|
| 28 |
+
"error",
|
| 29 |
+
{ varsIgnorePattern: "^i18n$" },
|
| 30 |
+
],
|
| 31 |
...js.configs.recommended.rules,
|
| 32 |
...react.configs.recommended.rules,
|
| 33 |
...react.configs['jsx-runtime'].rules,
|
frontend/package.json
CHANGED
|
@@ -41,6 +41,9 @@
|
|
| 41 |
"eslint-plugin-react-hooks": "^5.0.0",
|
| 42 |
"eslint-plugin-react-refresh": "^0.4.16",
|
| 43 |
"globals": "^15.14.0",
|
| 44 |
-
"
|
|
|
|
|
|
|
|
|
|
| 45 |
}
|
| 46 |
}
|
|
|
|
| 41 |
"eslint-plugin-react-hooks": "^5.0.0",
|
| 42 |
"eslint-plugin-react-refresh": "^0.4.16",
|
| 43 |
"globals": "^15.14.0",
|
| 44 |
+
"i18nifty": "^3.2.3",
|
| 45 |
+
"typescript": "^5.7.3",
|
| 46 |
+
"vite": "^6.0.5",
|
| 47 |
+
"vite-tsconfig-paths": "^5.1.4"
|
| 48 |
}
|
| 49 |
}
|
frontend/src/App.jsx
CHANGED
|
@@ -6,19 +6,18 @@ import {
|
|
| 6 |
useSearchParams,
|
| 7 |
useLocation,
|
| 8 |
} from "react-router-dom";
|
| 9 |
-
import { ThemeProvider } from "@mui/material/styles";
|
| 10 |
import { Box, CssBaseline } from "@mui/material";
|
| 11 |
-
// import Navigation from "./components/Navigation/Navigation";
|
| 12 |
import Navigation from "./components/Navigation/Navigation";
|
| 13 |
import LeaderboardPage from "./pages/LeaderboardPage/LeaderboardPage";
|
| 14 |
import AddModelPage from "./pages/AddModelPage/AddModelPage";
|
| 15 |
import QuotePage from "./pages/QuotePage/QuotePage";
|
| 16 |
import VoteModelPage from "./pages/VoteModelPage/VoteModelPage";
|
| 17 |
import { Header } from "@codegouvfr/react-dsfr/Header";
|
| 18 |
-
import
|
| 19 |
import MuiDsfrThemeProvider from "@codegouvfr/react-dsfr/mui";
|
| 20 |
import { headerFooterDisplayItem } from "@codegouvfr/react-dsfr/Display";
|
| 21 |
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
|
|
| 22 |
import LeaderboardProvider from "./pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext";
|
| 23 |
const queryClient = new QueryClient({
|
| 24 |
defaultOptions: {
|
|
@@ -101,7 +100,8 @@ function App() {
|
|
| 101 |
}}
|
| 102 |
quickAccessItems={[
|
| 103 |
// other quick access items...
|
| 104 |
-
headerFooterDisplayItem
|
|
|
|
| 105 |
]}
|
| 106 |
id="fr-header-simple-header-with-service-title-and-tagline"
|
| 107 |
serviceTagline="Tableau de référence pour les grands modèles de langages en français"
|
|
@@ -125,43 +125,7 @@ function App() {
|
|
| 125 |
<Route path="/vote" element={<VoteModelPage />} />
|
| 126 |
</Routes>
|
| 127 |
</Box>
|
| 128 |
-
<Footer
|
| 129 |
-
accessibility="fully compliant"
|
| 130 |
-
contentDescription="
|
| 131 |
-
L'évaluation des systèmes d'IA est un enjeu stratégique sur lequel la France s'est historiquement démarquée.
|
| 132 |
-
|
| 133 |
-
Ce classement, ou leaderboard, s'inspire directement de l'Open LLM Leaderboard et permet de comparer différents modèles d'IA génératifs à l'aide de jeux de données spécifiquement adaptés aux environnements et à la culture francophones.
|
| 134 |
-
"
|
| 135 |
-
partnersLogos={{
|
| 136 |
-
sub: [
|
| 137 |
-
{
|
| 138 |
-
alt: 'Logo Inria',
|
| 139 |
-
href: '#',
|
| 140 |
-
imgUrl: '/inr_logo_rouge.png'
|
| 141 |
-
},
|
| 142 |
-
{
|
| 143 |
-
alt: 'Logo CNRS',
|
| 144 |
-
href: '#',
|
| 145 |
-
imgUrl: '/LOGO_CNRS_BLEU.png'
|
| 146 |
-
},
|
| 147 |
-
{
|
| 148 |
-
alt: 'Logo LNE',
|
| 149 |
-
href: '#',
|
| 150 |
-
imgUrl: '/logo-lne.svgz'
|
| 151 |
-
},
|
| 152 |
-
{
|
| 153 |
-
alt: 'Logo DGE',
|
| 154 |
-
href: '#',
|
| 155 |
-
imgUrl: '/logo_DGE.png'
|
| 156 |
-
},
|
| 157 |
-
{
|
| 158 |
-
alt: 'Logo huggingface',
|
| 159 |
-
href: '#',
|
| 160 |
-
imgUrl: '/hf-logo-with-title.svg'
|
| 161 |
-
}
|
| 162 |
-
]
|
| 163 |
-
}}
|
| 164 |
-
/>
|
| 165 |
</Box>
|
| 166 |
</LeaderboardProvider>
|
| 167 |
</Router>
|
|
|
|
| 6 |
useSearchParams,
|
| 7 |
useLocation,
|
| 8 |
} from "react-router-dom";
|
|
|
|
| 9 |
import { Box, CssBaseline } from "@mui/material";
|
|
|
|
| 10 |
import Navigation from "./components/Navigation/Navigation";
|
| 11 |
import LeaderboardPage from "./pages/LeaderboardPage/LeaderboardPage";
|
| 12 |
import AddModelPage from "./pages/AddModelPage/AddModelPage";
|
| 13 |
import QuotePage from "./pages/QuotePage/QuotePage";
|
| 14 |
import VoteModelPage from "./pages/VoteModelPage/VoteModelPage";
|
| 15 |
import { Header } from "@codegouvfr/react-dsfr/Header";
|
| 16 |
+
import Footer from "./components/Footer/Footer";
|
| 17 |
import MuiDsfrThemeProvider from "@codegouvfr/react-dsfr/mui";
|
| 18 |
import { headerFooterDisplayItem } from "@codegouvfr/react-dsfr/Display";
|
| 19 |
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
| 20 |
+
import { LanguageSelect } from "./components/LanguageSelect/LanguageSelect";
|
| 21 |
import LeaderboardProvider from "./pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext";
|
| 22 |
const queryClient = new QueryClient({
|
| 23 |
defaultOptions: {
|
|
|
|
| 100 |
}}
|
| 101 |
quickAccessItems={[
|
| 102 |
// other quick access items...
|
| 103 |
+
headerFooterDisplayItem,
|
| 104 |
+
<LanguageSelect />
|
| 105 |
]}
|
| 106 |
id="fr-header-simple-header-with-service-title-and-tagline"
|
| 107 |
serviceTagline="Tableau de référence pour les grands modèles de langages en français"
|
|
|
|
| 125 |
<Route path="/vote" element={<VoteModelPage />} />
|
| 126 |
</Routes>
|
| 127 |
</Box>
|
| 128 |
+
<Footer />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
</Box>
|
| 130 |
</LeaderboardProvider>
|
| 131 |
</Router>
|
frontend/src/components/Footer/Footer.jsx
DELETED
|
@@ -1,30 +0,0 @@
|
|
| 1 |
-
import React from "react";
|
| 2 |
-
import { Box, Typography, Link } from "@mui/material";
|
| 3 |
-
|
| 4 |
-
const Footer = () => {
|
| 5 |
-
return (
|
| 6 |
-
<Box
|
| 7 |
-
component="footer"
|
| 8 |
-
sx={{
|
| 9 |
-
width: "100%",
|
| 10 |
-
py: 4,
|
| 11 |
-
textAlign: "center",
|
| 12 |
-
}}
|
| 13 |
-
>
|
| 14 |
-
<Typography variant="body2" color="text.secondary" sx={{ mx: 4 }}>
|
| 15 |
-
© 2024 Hugging Face - Open LLM Leaderboard - Made with 🤗 by the HF team
|
| 16 |
-
-{" "}
|
| 17 |
-
<Link
|
| 18 |
-
href="https://huggingface.co"
|
| 19 |
-
target="_blank"
|
| 20 |
-
rel="noopener noreferrer"
|
| 21 |
-
color="inherit"
|
| 22 |
-
>
|
| 23 |
-
huggingface.co
|
| 24 |
-
</Link>
|
| 25 |
-
</Typography>
|
| 26 |
-
</Box>
|
| 27 |
-
);
|
| 28 |
-
};
|
| 29 |
-
|
| 30 |
-
export default Footer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/src/components/Footer/Footer.tsx
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import {addFooterTranslations, Footer} from "@codegouvfr/react-dsfr/Footer";
|
| 2 |
+
|
| 3 |
+
// import { Box, Typography, Link } from "@mui/material";
|
| 4 |
+
|
| 5 |
+
const footer = () => {
|
| 6 |
+
<Footer
|
| 7 |
+
accessibility="fully compliant"
|
| 8 |
+
contentDescription="
|
| 9 |
+
L'évaluation des systèmes d'IA est un enjeu stratégique sur lequel la France s'est historiquement démarquée.
|
| 10 |
+
|
| 11 |
+
Ce classement, ou leaderboard, s'inspire directement de l'Open LLM Leaderboard et permet de comparer différents modèles d'IA génératifs à l'aide de jeux de données spécifiquement adaptés aux environnements et à la culture francophones.
|
| 12 |
+
"
|
| 13 |
+
partnersLogos={{
|
| 14 |
+
sub: [
|
| 15 |
+
{
|
| 16 |
+
alt: 'Logo Inria',
|
| 17 |
+
href: '#',
|
| 18 |
+
imgUrl: '/inr_logo_rouge.png'
|
| 19 |
+
},
|
| 20 |
+
{
|
| 21 |
+
alt: 'Logo CNRS',
|
| 22 |
+
href: '#',
|
| 23 |
+
imgUrl: '/LOGO_CNRS_BLEU.png'
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
alt: 'Logo LNE',
|
| 27 |
+
href: '#',
|
| 28 |
+
imgUrl: '/logo-lne.svgz'
|
| 29 |
+
},
|
| 30 |
+
{
|
| 31 |
+
alt: 'Logo DGE',
|
| 32 |
+
href: '#',
|
| 33 |
+
imgUrl: '/logo_DGE.png'
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
alt: 'Logo huggingface',
|
| 37 |
+
href: '#',
|
| 38 |
+
imgUrl: '/hf-logo-with-title.svg'
|
| 39 |
+
}
|
| 40 |
+
]
|
| 41 |
+
}}
|
| 42 |
+
/>
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
addFooterTranslations({
|
| 46 |
+
lang: "en",
|
| 47 |
+
messages: {
|
| 48 |
+
accessibility: "Accessibility",
|
| 49 |
+
"fully compliant": "Partially compliant",
|
| 50 |
+
|
| 51 |
+
}
|
| 52 |
+
});
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
addFooterTranslations({
|
| 56 |
+
lang: "fr",
|
| 57 |
+
messages: {
|
| 58 |
+
accessibility: "Accesibilité",
|
| 59 |
+
"fully compliant": "Partielle",
|
| 60 |
+
|
| 61 |
+
}
|
| 62 |
+
});
|
| 63 |
+
|
| 64 |
+
// const Footer = () => {
|
| 65 |
+
// return (
|
| 66 |
+
// <Box
|
| 67 |
+
// component="footer"
|
| 68 |
+
// sx={{
|
| 69 |
+
// width: "100%",
|
| 70 |
+
// py: 4,
|
| 71 |
+
// textAlign: "center",
|
| 72 |
+
// }}
|
| 73 |
+
// >
|
| 74 |
+
// <Typography variant="body2" color="text.secondary" sx={{ mx: 4 }}>
|
| 75 |
+
// © 2024 Hugging Face - Open LLM Leaderboard - Made with 🤗 by the HF team
|
| 76 |
+
// -{" "}
|
| 77 |
+
// <Link
|
| 78 |
+
// href="https://huggingface.co"
|
| 79 |
+
// target="_blank"
|
| 80 |
+
// rel="noopener noreferrer"
|
| 81 |
+
// color="inherit"
|
| 82 |
+
// >
|
| 83 |
+
// huggingface.co
|
| 84 |
+
// </Link>
|
| 85 |
+
// </Typography>
|
| 86 |
+
// </Box>
|
| 87 |
+
// );
|
| 88 |
+
// };
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
export default footer;
|
frontend/src/components/LanguageSelect/LanguageSelect.jsx
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import React from 'react';import {
|
| 2 |
+
LanguageSelect as LanguageSelect_base,
|
| 3 |
+
addLanguageSelectTranslations
|
| 4 |
+
} from "@codegouvfr/react-dsfr/LanguageSelect";
|
| 5 |
+
|
| 6 |
+
import { useLang, languages} from "i18n";
|
| 7 |
+
|
| 8 |
+
// NOTE: This component can be used inside or outside of the Header component.
|
| 9 |
+
export function LanguageSelect(props) {
|
| 10 |
+
|
| 11 |
+
const { id } = props;
|
| 12 |
+
|
| 13 |
+
const { lang, setLang } = useLang();
|
| 14 |
+
|
| 15 |
+
return (
|
| 16 |
+
<LanguageSelect_base
|
| 17 |
+
id={id}
|
| 18 |
+
supportedLangs={languages}
|
| 19 |
+
lang={lang} // "en" or "fr"
|
| 20 |
+
setLang={setLang}
|
| 21 |
+
fullNameByLang={{
|
| 22 |
+
en: "English",
|
| 23 |
+
fr: "Français"
|
| 24 |
+
}}
|
| 25 |
+
/>
|
| 26 |
+
);
|
| 27 |
+
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
languages.forEach(lang =>
|
| 31 |
+
addLanguageSelectTranslations({
|
| 32 |
+
lang: lang,
|
| 33 |
+
messages: {
|
| 34 |
+
"select language": (() => {
|
| 35 |
+
switch (lang) {
|
| 36 |
+
case "en": return "Select language";
|
| 37 |
+
/* spell-checker: disable */
|
| 38 |
+
case "fr": return "Choisir la langue";
|
| 39 |
+
/* spell-checker: enable */
|
| 40 |
+
}
|
| 41 |
+
})()
|
| 42 |
+
}
|
| 43 |
+
})
|
| 44 |
+
);
|
frontend/src/i18n.tsx
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { createI18nApi, declareComponentKeys } from "i18nifty";
|
| 2 |
+
|
| 3 |
+
//List the languages you with to support
|
| 4 |
+
export const languages = ["en", "fr"] as const;
|
| 5 |
+
|
| 6 |
+
//If the user's browser language doesn't match any
|
| 7 |
+
//of the languages above specify the language to fallback to:
|
| 8 |
+
export const fallbackLanguage = "en";
|
| 9 |
+
|
| 10 |
+
export type Language = typeof languages[number];
|
| 11 |
+
|
| 12 |
+
export type LocalizedString = Parameters<typeof resolveLocalizedString>[0];
|
| 13 |
+
|
| 14 |
+
export const {
|
| 15 |
+
useTranslation,
|
| 16 |
+
resolveLocalizedString,
|
| 17 |
+
useLang,
|
| 18 |
+
$lang,
|
| 19 |
+
useResolveLocalizedString,
|
| 20 |
+
/** For use outside of React */
|
| 21 |
+
getTranslation,
|
| 22 |
+
} = createI18nApi<
|
| 23 |
+
| import ("pages/LeaderboardPage/LeaderboardPage").I18n
|
| 24 |
+
>()(
|
| 25 |
+
{
|
| 26 |
+
languages,
|
| 27 |
+
fallbackLanguage
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
"en": {
|
| 31 |
+
"LeaderboardPage": {
|
| 32 |
+
"greating": ({ who })=> `Hello ${who}`,
|
| 33 |
+
"how are you": "How are you feeling today?",
|
| 34 |
+
"learn more": ({ href }) => (
|
| 35 |
+
<>
|
| 36 |
+
Learn more about
|
| 37 |
+
<a href={href}>this website</a>.
|
| 38 |
+
</>
|
| 39 |
+
)
|
| 40 |
+
},
|
| 41 |
+
},
|
| 42 |
+
/* spell-checker: disable */
|
| 43 |
+
"fr": {
|
| 44 |
+
"LeaderboardPage": {
|
| 45 |
+
"greating": ({ who })=> `Bonjour ${who}`,
|
| 46 |
+
"how are you": "Comment vous sentez vous au jour d'hui?",
|
| 47 |
+
"learn more": ({ href }) => (
|
| 48 |
+
<>
|
| 49 |
+
En savoir plus à propos de
|
| 50 |
+
<a href={href}>ce site web</a>.
|
| 51 |
+
</>
|
| 52 |
+
)
|
| 53 |
+
},
|
| 54 |
+
}
|
| 55 |
+
/* spell-checker: enable */
|
| 56 |
+
}
|
| 57 |
+
);
|
frontend/src/main.jsx
CHANGED
|
@@ -2,8 +2,16 @@ import { StrictMode } from 'react'
|
|
| 2 |
import { createRoot } from 'react-dom/client'
|
| 3 |
import './index.css'
|
| 4 |
import App from './App.jsx'
|
|
|
|
| 5 |
import { startReactDsfr } from "@codegouvfr/react-dsfr/spa";
|
| 6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
|
| 8 |
createRoot(document.getElementById('root')).render(
|
| 9 |
<StrictMode>
|
|
|
|
| 2 |
import { createRoot } from 'react-dom/client'
|
| 3 |
import './index.css'
|
| 4 |
import App from './App.jsx'
|
| 5 |
+
import { useLang } from "i18n";
|
| 6 |
import { startReactDsfr } from "@codegouvfr/react-dsfr/spa";
|
| 7 |
+
|
| 8 |
+
startReactDsfr({
|
| 9 |
+
defaultColorScheme: "system",
|
| 10 |
+
useLang: function useLangDsfr() {
|
| 11 |
+
const { lang } = useLang();
|
| 12 |
+
return lang;
|
| 13 |
+
}
|
| 14 |
+
});
|
| 15 |
|
| 16 |
createRoot(document.getElementById('root')).render(
|
| 17 |
<StrictMode>
|
frontend/src/pages/LeaderboardPage/{LeaderboardPage.jsx → LeaderboardPage.tsx}
RENAMED
|
@@ -2,9 +2,9 @@ import { useEffect } from "react";
|
|
| 2 |
import Leaderboard from "./components/Leaderboard/Leaderboard";
|
| 3 |
import { Box } from "@mui/material";
|
| 4 |
import PageHeader from "../../components/shared/PageHeader";
|
| 5 |
-
import Logo from "../../components/Logo/Logo";
|
| 6 |
import { useLeaderboardData } from "./components/Leaderboard/hooks/useLeaderboardData";
|
| 7 |
import { useLeaderboard } from "./components/Leaderboard/context/LeaderboardContext";
|
|
|
|
| 8 |
|
| 9 |
function LeaderboardPage() {
|
| 10 |
const { data, isLoading, error } = useLeaderboardData();
|
|
@@ -34,6 +34,7 @@ function LeaderboardPage() {
|
|
| 34 |
</Box> */}
|
| 35 |
<PageHeader
|
| 36 |
title="Leaderboard"
|
|
|
|
| 37 |
// subtitle={
|
| 38 |
// <>
|
| 39 |
// Comparer les grands modèles de langages {" "}
|
|
@@ -47,4 +48,11 @@ function LeaderboardPage() {
|
|
| 47 |
);
|
| 48 |
}
|
| 49 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
export default LeaderboardPage;
|
|
|
|
| 2 |
import Leaderboard from "./components/Leaderboard/Leaderboard";
|
| 3 |
import { Box } from "@mui/material";
|
| 4 |
import PageHeader from "../../components/shared/PageHeader";
|
|
|
|
| 5 |
import { useLeaderboardData } from "./components/Leaderboard/hooks/useLeaderboardData";
|
| 6 |
import { useLeaderboard } from "./components/Leaderboard/context/LeaderboardContext";
|
| 7 |
+
import { declareComponentKeys } from "i18nifty";
|
| 8 |
|
| 9 |
function LeaderboardPage() {
|
| 10 |
const { data, isLoading, error } = useLeaderboardData();
|
|
|
|
| 34 |
</Box> */}
|
| 35 |
<PageHeader
|
| 36 |
title="Leaderboard"
|
| 37 |
+
subtitle={""}
|
| 38 |
// subtitle={
|
| 39 |
// <>
|
| 40 |
// Comparer les grands modèles de langages {" "}
|
|
|
|
| 48 |
);
|
| 49 |
}
|
| 50 |
|
| 51 |
+
const { i18n } = declareComponentKeys<
|
| 52 |
+
| { K: "greating"; P: { who: string; } }
|
| 53 |
+
| "how are you"
|
| 54 |
+
| { K: "learn more"; P: { href: string; }; R: JSX.Element }
|
| 55 |
+
>()({ LeaderboardPage });
|
| 56 |
+
export type I18n = typeof i18n;
|
| 57 |
+
|
| 58 |
export default LeaderboardPage;
|
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/SearchBar.jsx
CHANGED
|
@@ -185,7 +185,7 @@ const SearchBar = ({
|
|
| 185 |
<InputBase
|
| 186 |
value={localValue}
|
| 187 |
onChange={handleLocalChange}
|
| 188 |
-
placeholder='
|
| 189 |
sx={{
|
| 190 |
flex: 1,
|
| 191 |
fontSize: "1rem",
|
|
@@ -286,7 +286,7 @@ const SearchBar = ({
|
|
| 286 |
display: { xs: "none", md: "block" },
|
| 287 |
}}
|
| 288 |
>
|
| 289 |
-
|
| 290 |
</Typography>
|
| 291 |
</Box>
|
| 292 |
<InfoIconWithTooltip
|
|
@@ -316,8 +316,7 @@ const SearchBar = ({
|
|
| 316 |
lineHeight: 1.5,
|
| 317 |
}}
|
| 318 |
>
|
| 319 |
-
|
| 320 |
-
terms
|
| 321 |
</Typography>
|
| 322 |
</Box>
|
| 323 |
)}
|
|
|
|
| 185 |
<InputBase
|
| 186 |
value={localValue}
|
| 187 |
onChange={handleLocalChange}
|
| 188 |
+
placeholder='Recherce par nom de modèle • essayez "meta @architecture:llama @license:mit"'
|
| 189 |
sx={{
|
| 190 |
flex: 1,
|
| 191 |
fontSize: "1rem",
|
|
|
|
| 286 |
display: { xs: "none", md: "block" },
|
| 287 |
}}
|
| 288 |
>
|
| 289 |
+
Filtres avancés
|
| 290 |
</Typography>
|
| 291 |
</Box>
|
| 292 |
<InfoIconWithTooltip
|
|
|
|
| 316 |
lineHeight: 1.5,
|
| 317 |
}}
|
| 318 |
>
|
| 319 |
+
Supporte la recherche stricte et les expressions régulières • Utilisez des points virgules pour plusieurs termes
|
|
|
|
| 320 |
</Typography>
|
| 321 |
</Box>
|
| 322 |
)}
|
frontend/tsconfig.app.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"compilerOptions": {
|
| 3 |
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
| 4 |
+
"target": "ES2020",
|
| 5 |
+
"useDefineForClassFields": true,
|
| 6 |
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
| 7 |
+
"module": "ESNext",
|
| 8 |
+
"skipLibCheck": true,
|
| 9 |
+
"baseUrl": "src",
|
| 10 |
+
|
| 11 |
+
/* Bundler mode */
|
| 12 |
+
"moduleResolution": "bundler",
|
| 13 |
+
"allowImportingTsExtensions": true,
|
| 14 |
+
"isolatedModules": true,
|
| 15 |
+
"moduleDetection": "force",
|
| 16 |
+
"noEmit": true,
|
| 17 |
+
"jsx": "react-jsx",
|
| 18 |
+
"allowJs": true,
|
| 19 |
+
|
| 20 |
+
/* Linting */
|
| 21 |
+
"strict": true,
|
| 22 |
+
"noUnusedLocals": true,
|
| 23 |
+
"noUnusedParameters": true,
|
| 24 |
+
"noFallthroughCasesInSwitch": true,
|
| 25 |
+
"noUncheckedSideEffectImports": true
|
| 26 |
+
},
|
| 27 |
+
"include": ["src"]
|
| 28 |
+
}
|
| 29 |
+
|
frontend/tsconfig.json
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"files": [],
|
| 3 |
+
"references": [
|
| 4 |
+
{ "path": "./tsconfig.app.json" },
|
| 5 |
+
{ "path": "./tsconfig.node.json" }
|
| 6 |
+
]
|
| 7 |
+
}
|
| 8 |
+
|
frontend/tsconfig.node.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"compilerOptions": {
|
| 3 |
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
| 4 |
+
"target": "ES2022",
|
| 5 |
+
"lib": ["ES2023"],
|
| 6 |
+
"module": "ESNext",
|
| 7 |
+
"skipLibCheck": true,
|
| 8 |
+
|
| 9 |
+
/* Bundler mode */
|
| 10 |
+
"moduleResolution": "bundler",
|
| 11 |
+
"allowImportingTsExtensions": true,
|
| 12 |
+
"isolatedModules": true,
|
| 13 |
+
"moduleDetection": "force",
|
| 14 |
+
"noEmit": true,
|
| 15 |
+
|
| 16 |
+
/* Linting */
|
| 17 |
+
"strict": true,
|
| 18 |
+
"noUnusedLocals": true,
|
| 19 |
+
"noUnusedParameters": true,
|
| 20 |
+
"noFallthroughCasesInSwitch": true,
|
| 21 |
+
"noUncheckedSideEffectImports": true
|
| 22 |
+
},
|
| 23 |
+
"include": ["vite.config.ts"]
|
| 24 |
+
}
|
| 25 |
+
|
frontend/vite.config.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
| 1 |
import { defineConfig } from 'vite'
|
|
|
|
| 2 |
import react from '@vitejs/plugin-react'
|
| 3 |
|
| 4 |
// https://vite.dev/config/
|
| 5 |
export default defineConfig({
|
| 6 |
-
plugins: [
|
|
|
|
|
|
|
|
|
|
| 7 |
server: {
|
| 8 |
proxy: {
|
| 9 |
'/api': {
|
|
|
|
| 1 |
import { defineConfig } from 'vite'
|
| 2 |
+
import tsconfigPaths from "vite-tsconfig-paths";
|
| 3 |
import react from '@vitejs/plugin-react'
|
| 4 |
|
| 5 |
// https://vite.dev/config/
|
| 6 |
export default defineConfig({
|
| 7 |
+
plugins: [
|
| 8 |
+
react(),
|
| 9 |
+
tsconfigPaths()
|
| 10 |
+
],
|
| 11 |
server: {
|
| 12 |
proxy: {
|
| 13 |
'/api': {
|