Compare commits

10 Commits

16 changed files with 398 additions and 362 deletions
+4 -4
View File
@@ -1,10 +1,10 @@
# konstitisyon.la # konstitisyon.nu
Plateforme collaborative dédiée à la rédaction citoyenne d'une constitution. Ce projet vise à permettre aux citoyens de participer activement au processus de rédaction constitutionnelle à travers un système transparent et démocratique. Plateforme collaborative dédiée à la rédaction citoyenne d'une constitution. Ce projet vise à permettre aux citoyens de participer activement au processus de rédaction constitutionnelle à travers un système transparent et démocratique.
## Vision du projet ## Vision du projet
L'objectif de konstitisyon.la est de démocratiser le processus de rédaction constitutionnelle en : L'objectif de konstitisyon.nu est de démocratiser le processus de rédaction constitutionnelle en :
- Permettant à chaque citoyen de proposer des modifications - Permettant à chaque citoyen de proposer des modifications
- Facilitant le débat et la discussion autour des propositions - Facilitant le débat et la discussion autour des propositions
- Assurant la transparence du processus de rédaction - Assurant la transparence du processus de rédaction
@@ -41,9 +41,9 @@ L'objectif de konstitisyon.la est de démocratiser le processus de rédaction co
### Structure du projet ### Structure du projet
``` ```
konstitisyon.la/ konstitisyon.nu/
├── app/ # Routes et pages Next.js ├── app/ # Routes et pages Next.js
├── components/ ├── components/
│ ├── konstitisyon/ # Composants liés à la constitution │ ├── konstitisyon/ # Composants liés à la constitution
│ └── versions/ # Gestion des versions et votes │ └── versions/ # Gestion des versions et votes
├── lib/ # Utilitaires et configurations ├── lib/ # Utilitaires et configurations
-4
View File
@@ -22,10 +22,6 @@ export const options = {
const user = await res.json() const user = await res.json()
if (!res.ok && user) {
throw new Error('E-mail ou mot de passe incorrect')
}
if (res.ok && user) { if (res.ok && user) {
return user return user
} }
+3 -1
View File
@@ -19,7 +19,9 @@ export default function LoginForm() {
}) })
if (response?.error) { if (response?.error) {
if (response.error === 'Configuration') { if (response.error === 'CredentialsSignin') {
setError('E-mail ou mot de passe incorrect')
} else if (response.error === 'Configuration') {
setError('Une erreur sest produite, contactez ladministrateur !') setError('Une erreur sest produite, contactez ladministrateur !')
} else { } else {
setError(response.error) setError(response.error)
+2 -2
View File
@@ -3,8 +3,8 @@ import {redirect} from 'next/navigation'
import ResetPasswordForm from './form.js' import ResetPasswordForm from './form.js'
export default async function ResetPasswordPage({searchParams}) { export default async function ResetPasswordPage({searchParams}) {
console.log('searchParams', searchParams) const params = await searchParams
const {token} = searchParams const {token} = params
if (!token) { if (!token) {
redirect('/login') redirect('/login')
+44 -36
View File
@@ -1,7 +1,7 @@
'use client' 'use client'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import {useEffect, useState} from 'react' import {useEffect, useState, useMemo} from 'react'
import {signOut} from 'next-auth/react' import {signOut} from 'next-auth/react'
import {useRouter} from 'next/navigation' import {useRouter} from 'next/navigation'
import Box from '@mui/material/Box' import Box from '@mui/material/Box'
@@ -15,7 +15,7 @@ import PersonAddIcon from '@mui/icons-material/PersonAdd'
import {createDirectus, realtime, staticToken} from '@directus/sdk' import {createDirectus, realtime, staticToken} from '@directus/sdk'
import ConfirmationAlert from './confirmation-alert.js' import ConfirmationAlert from './confirmation-alert.js'
const apiWsUrl = process.env.DIRECTUS_API_WS_URL || process.env.NEXT_PUBLIC_DIRECTUS_API_WS_URL const apiUrl = process.env.DIRECTUS_API_URL || process.env.NEXT_PUBLIC_DIRECTUS_API_URL
const LightTooltip = styled(({className, ...props}) => ( const LightTooltip = styled(({className, ...props}) => (
<Tooltip {...props} classes={{popper: className}} /> <Tooltip {...props} classes={{popper: className}} />
@@ -32,62 +32,70 @@ export default function Sign({session, navButton}) {
const router = useRouter() const router = useRouter()
const [isOpen, setIsOpen] = useState(false) const [isOpen, setIsOpen] = useState(false)
const directusClientWS = createDirectus(apiWsUrl)
.with(staticToken(session?.user?.accessToken))
.with(realtime())
const handleSignout = () => { const handleSignout = () => {
setIsOpen(false) setIsOpen(false)
signOut() signOut()
} }
async function subscribe() {
const {subscription} = await directusClientWS.subscribe('directus_versions', {
event: 'create',
query: {
fields: ['*'],
filter: {
collection: {
_eq: 'titres'
}
}
}
})
for await (const item of subscription) {
console.log('New version created:', item)
}
}
useEffect(() => { useEffect(() => {
let cleanup = () => {} let cleanup = () => {}
if (session) { if (session?.user?.accessToken) {
(async () => { (async () => {
try { try {
await directusClientWS.connect() console.log('Creating WebSocket client with token...')
directusClientWS.onWebSocket('open', () => { // Create client with static token
console.log({event: 'onopen'}) const client = createDirectus(apiUrl)
subscribe() .with(staticToken(session.user.accessToken))
.with(realtime())
console.log('Connecting to WebSocket...')
await client.connect()
client.onWebSocket('open', () => {
console.log({event: 'onopen', message: 'WebSocket connection opened'})
}) })
directusClientWS.onWebSocket('message', message => { client.onWebSocket('message', message => {
console.log({event: 'onmessage', message})
// Once authenticated, subscribe
if (message.type === 'auth' && message.status === 'ok') { if (message.type === 'auth' && message.status === 'ok') {
console.log({event: 'onmessage', message}) console.log('WebSocket authenticated successfully!')
// Subscribe to version changes
;(async () => {
const {subscription} = await client.subscribe('directus_versions', {
event: 'create',
query: {
fields: ['*'],
filter: {
collection: {
_eq: 'titres'
}
}
}
})
for await (const item of subscription) {
console.log('New version created:', item)
}
})()
} }
}) })
directusClientWS.onWebSocket('close', () => { client.onWebSocket('close', () => {
console.log({event: 'onclose'}) console.log({event: 'onclose', message: 'WebSocket connection closed'})
}) })
directusClientWS.onWebSocket('error', error => { client.onWebSocket('error', error => {
console.log({event: 'onerror', error}) console.log({event: 'onerror', error})
}) })
cleanup = () => { cleanup = () => {
directusClientWS.disconnect() console.log('Disconnecting WebSocket...')
client.disconnect()
} }
} catch (error) { } catch (error) {
console.error('WebSocket connection error:', error) console.error('WebSocket connection error:', error)
@@ -96,7 +104,7 @@ export default function Sign({session, navButton}) {
} }
return () => cleanup() return () => cleanup()
}, [session]) // eslint-disable-line react-hooks/exhaustive-deps }, [session?.user?.accessToken])
return ( return (
<> <>
+44 -42
View File
@@ -46,7 +46,7 @@ const renderMarkdownToHtml = async content => {
} }
} }
export default function ExportPdfButton({versionData, size = 'medium', variant = 'outlined'}) { export default function ExportPdfButton({versionData, isOutdated = false, size = 'medium', variant = 'outlined'}) {
const [isExporting, setIsExporting] = useState(false) const [isExporting, setIsExporting] = useState(false)
const handleExportPdf = async () => { const handleExportPdf = async () => {
@@ -86,55 +86,55 @@ export default function ExportPdfButton({versionData, size = 'medium', variant =
.pdf-content p { margin: 10px 0; } .pdf-content p { margin: 10px 0; }
.pdf-content strong, .pdf-content b { font-weight: bold; } .pdf-content strong, .pdf-content b { font-weight: bold; }
.pdf-content em, .pdf-content i { font-style: italic; } .pdf-content em, .pdf-content i { font-style: italic; }
.pdf-content ul, .pdf-content ol { .pdf-content ul, .pdf-content ol {
margin: 10px 0; margin: 10px 0;
padding-left: 25px; padding-left: 25px;
} }
.pdf-content li { margin: 5px 0; } .pdf-content li { margin: 5px 0; }
.pdf-content blockquote { .pdf-content blockquote {
margin: 15px 0; margin: 15px 0;
padding: 10px 20px; padding: 10px 20px;
border-left: 4px solid #1976d2; border-left: 4px solid #1976d2;
background-color: #f5f5f5; background-color: #f5f5f5;
font-style: italic; font-style: italic;
} }
.pdf-content code { .pdf-content code {
background-color: #f5f5f5; background-color: #f5f5f5;
padding: 2px 4px; padding: 2px 4px;
border-radius: 3px; border-radius: 3px;
font-family: 'Courier New', monospace; font-family: 'Courier New', monospace;
font-size: 13px; font-size: 13px;
} }
.pdf-content pre { .pdf-content pre {
background-color: #f5f5f5; background-color: #f5f5f5;
padding: 15px; padding: 15px;
border-radius: 5px; border-radius: 5px;
overflow-x: auto; overflow-x: auto;
margin: 15px 0; margin: 15px 0;
} }
.pdf-content pre code { .pdf-content pre code {
background: none; background: none;
padding: 0; padding: 0;
} }
.pdf-content a { color: #1976d2; text-decoration: underline; } .pdf-content a { color: #1976d2; text-decoration: underline; }
.pdf-content hr { .pdf-content hr {
border: none; border: none;
border-top: 1px solid #ccc; border-top: 1px solid #ccc;
margin: 20px 0; margin: 20px 0;
} }
.pdf-content table { .pdf-content table {
border-collapse: collapse; border-collapse: collapse;
margin: 15px 0; margin: 15px 0;
width: 100%; width: 100%;
} }
.pdf-content th, .pdf-content td { .pdf-content th, .pdf-content td {
border: 1px solid #ccc; border: 1px solid #ccc;
padding: 8px; padding: 8px;
text-align: left; text-align: left;
} }
.pdf-content th { .pdf-content th {
background-color: #f5f5f5; background-color: #f5f5f5;
font-weight: bold; font-weight: bold;
} }
` `
document.head.append(styleElement) document.head.append(styleElement)
@@ -142,7 +142,8 @@ export default function ExportPdfButton({versionData, size = 'medium', variant =
const authorName = versionData.user_created?.split('-')[0] || 'Système' const authorName = versionData.user_created?.split('-')[0] || 'Système'
const createdAt = new Date(versionData.date_created) const createdAt = new Date(versionData.date_created)
const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000)) const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000))
const voteStatus = createdAt < threeDaysAgo ? 'fermé' : 'ouvert' const isExpired = createdAt < threeDaysAgo
const voteStatus = (isExpired || isOutdated) ? 'fermé' : 'ouvert'
const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f' const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f'
// Render markdown content to HTML // Render markdown content to HTML
@@ -177,7 +178,7 @@ export default function ExportPdfButton({versionData, size = 'medium', variant =
</div> </div>
<div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #eee; font-size: 12px; color: #888; text-align: center;"> <div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #eee; font-size: 12px; color: #888; text-align: center;">
Exporté depuis Konstitisyon.la le ${formatDate(new Date(), 'PPpp')} Exporté depuis Konstitisyon.nu le ${formatDate(new Date(), 'PPpp')}
</div> </div>
` `
@@ -251,6 +252,7 @@ export default function ExportPdfButton({versionData, size = 'medium', variant =
ExportPdfButton.propTypes = { ExportPdfButton.propTypes = {
versionData: PropTypes.object.isRequired, versionData: PropTypes.object.isRequired,
isOutdated: PropTypes.bool,
size: PropTypes.oneOf(['small', 'medium', 'large']), size: PropTypes.oneOf(['small', 'medium', 'large']),
variant: PropTypes.oneOf(['text', 'outlined', 'contained']) variant: PropTypes.oneOf(['text', 'outlined', 'contained'])
} }
+1 -1
View File
@@ -2,7 +2,7 @@
import {useState, useRef, useEffect} from 'react' import {useState, useRef, useEffect} from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import Grid from '@mui/material/Grid2' import Grid from '@mui/material/Grid'
import Typography from '@mui/material/Typography' import Typography from '@mui/material/Typography'
import HomeIcon from '@mui/icons-material/Home' import HomeIcon from '@mui/icons-material/Home'
import Box from '@mui/material/Box' import Box from '@mui/material/Box'
+44 -3
View File
@@ -1,4 +1,4 @@
import {forwardRef, useRef, useState} from 'react' import {forwardRef, useRef, useState, useEffect} from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import Table from '@mui/material/Table' import Table from '@mui/material/Table'
import TableBody from '@mui/material/TableBody' import TableBody from '@mui/material/TableBody'
@@ -84,7 +84,8 @@ function rowContent({
setError, setError,
setIsErrorAlertOpen, setIsErrorAlertOpen,
setIsOpenComparison, setIsOpenComparison,
setVersionCompare setVersionCompare,
outdatedStatusMap
}) { }) {
const handleButtonClick = async versionId => { const handleButtonClick = async versionId => {
const version = await compareVersion({ const version = await compareVersion({
@@ -102,6 +103,8 @@ function rowContent({
} }
} }
const isOutdated = outdatedStatusMap[row.id] || false
return ( return (
<> <>
{columns.map(column => ( {columns.map(column => (
@@ -137,11 +140,13 @@ function rowContent({
/> />
<ExportPdfButton <ExportPdfButton
versionData={row} versionData={row}
isOutdated={isOutdated}
size='small' size='small'
variant='text' variant='text'
/> />
<PrintButton <PrintButton
versionData={row} versionData={row}
isOutdated={isOutdated}
size='small' size='small'
variant='text' variant='text'
/> />
@@ -182,6 +187,42 @@ export default function ListVersions({
dateTo: '', dateTo: '',
status: '' status: ''
}) })
const [outdatedStatusMap, setOutdatedStatusMap] = useState({})
// Fetch outdated status for all versions
useEffect(() => {
async function fetchOutdatedStatus() {
const statusMap = {}
await Promise.all(
data.map(async version => {
try {
const comparisonData = await compareVersion({
accessToken,
userId,
versionId: version.id,
countdownRef,
setError,
setIsErrorAlertOpen
})
if (comparisonData) {
statusMap[version.id] = comparisonData.outdated || false
}
} catch (error) {
console.warn(`Failed to fetch outdated status for version ${version.id}:`, error)
statusMap[version.id] = false
}
})
)
setOutdatedStatusMap(statusMap)
}
if (data.length > 0) {
fetchOutdatedStatus()
}
}, [data, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen])
// Filter data based on search and filters // Filter data based on search and filters
const filteredData = filterVersions(data, searchTerm, filters) const filteredData = filterVersions(data, searchTerm, filters)
@@ -261,7 +302,7 @@ export default function ListVersions({
components={VirtuosoTableComponents} components={VirtuosoTableComponents}
fixedHeaderContent={fixedHeaderContent} fixedHeaderContent={fixedHeaderContent}
itemContent={(index, row) => rowContent({ itemContent={(index, row) => rowContent({
index, row, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen, setIsOpenComparison, setVersionCompare index, row, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen, setIsOpenComparison, setVersionCompare, outdatedStatusMap
})} })}
/> />
</Paper> </Paper>
+6 -4
View File
@@ -49,7 +49,7 @@ const renderMarkdownToHtml = async content => {
} }
} }
export default function PrintButton({versionData, size = 'medium', variant = 'outlined'}) { export default function PrintButton({versionData, isOutdated = false, size = 'medium', variant = 'outlined'}) {
const [isPrinting, setIsPrinting] = useState(false) const [isPrinting, setIsPrinting] = useState(false)
const [snackbar, setSnackbar] = useState({open: false, message: '', severity: 'success'}) const [snackbar, setSnackbar] = useState({open: false, message: '', severity: 'success'})
@@ -61,7 +61,8 @@ export default function PrintButton({versionData, size = 'medium', variant = 'ou
const authorName = versionData.user_created?.split('-')[0] || 'Système' const authorName = versionData.user_created?.split('-')[0] || 'Système'
const createdAt = new Date(versionData.date_created) const createdAt = new Date(versionData.date_created)
const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000)) const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000))
const voteStatus = createdAt < threeDaysAgo ? 'fermé' : 'ouvert' const isExpired = createdAt < threeDaysAgo
const voteStatus = (isExpired || isOutdated) ? 'fermé' : 'ouvert'
const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f' const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f'
// Render markdown content to HTML // Render markdown content to HTML
@@ -81,7 +82,7 @@ export default function PrintButton({versionData, size = 'medium', variant = 'ou
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${versionData.name} - Konstitisyon.la</title> <title>${versionData.name} - Konstitisyon.nu</title>
<style> <style>
/* Print-optimized styles */ /* Print-optimized styles */
@media print { @media print {
@@ -318,7 +319,7 @@ export default function PrintButton({versionData, size = 'medium', variant = 'ou
</div> </div>
<div class="footer"> <div class="footer">
Imprimé depuis Konstitisyon.la le ${formatDate(new Date(), 'PPpp')} Imprimé depuis Konstitisyon.nu le ${formatDate(new Date(), 'PPpp')}
</div> </div>
</body> </body>
</html> </html>
@@ -390,6 +391,7 @@ export default function PrintButton({versionData, size = 'medium', variant = 'ou
PrintButton.propTypes = { PrintButton.propTypes = {
versionData: PropTypes.object.isRequired, versionData: PropTypes.object.isRequired,
isOutdated: PropTypes.bool,
size: PropTypes.oneOf(['small', 'medium', 'large']), size: PropTypes.oneOf(['small', 'medium', 'large']),
variant: PropTypes.oneOf(['text', 'outlined', 'contained']) variant: PropTypes.oneOf(['text', 'outlined', 'contained'])
} }
+1 -1
View File
@@ -26,7 +26,7 @@ export default function ShareButton({
// Use native share API if available // Use native share API if available
await navigator.share({ await navigator.share({
title: `Version: ${versionName}`, title: `Version: ${versionName}`,
text: 'Découvrez cette version sur Konstitisyon.la', text: 'Découvrez cette version sur Konstitisyon.nu',
url url
}) })
} else if (navigator.clipboard && window.isSecureContext) { } else if (navigator.clipboard && window.isSecureContext) {
+1 -1
View File
@@ -1,7 +1,7 @@
import Box from '@mui/material/Box' import Box from '@mui/material/Box'
import Typography from '@mui/material/Typography' import Typography from '@mui/material/Typography'
import Paper from '@mui/material/Paper' import Paper from '@mui/material/Paper'
import Grid from '@mui/material/Grid2' import Grid from '@mui/material/Grid'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import Snackbar from '@mui/material/Snackbar' import Snackbar from '@mui/material/Snackbar'
import Alert from '@mui/material/Alert' import Alert from '@mui/material/Alert'
+13 -15
View File
@@ -54,20 +54,18 @@ export default function VersionPage({session, versionId, viewMode}) {
setVersionData(version) setVersionData(version)
// If in comparison mode, also fetch comparison data // Fetch comparison data (needed for outdated status even if not in comparison mode)
if (viewMode === 'comparison') { const comparison = await compareVersion({
const comparison = await compareVersion({ accessToken,
accessToken, userId,
userId, versionId,
versionId, countdownRef,
countdownRef, setError,
setError, setIsErrorAlertOpen
setIsErrorAlertOpen })
})
if (comparison) { if (comparison) {
setVersionCompare({...comparison, versionId}) setVersionCompare({...comparison, versionId})
}
} }
} catch (error) { } catch (error) {
console.error('Failed to fetch version:', error) console.error('Failed to fetch version:', error)
@@ -79,7 +77,7 @@ export default function VersionPage({session, versionId, viewMode}) {
} }
fetchVersionData() fetchVersionData()
}, [accessToken, userId, versionId, viewMode]) }, [accessToken, userId, versionId])
const handleBack = () => { const handleBack = () => {
router.push('/dashboard') router.push('/dashboard')
@@ -107,7 +105,7 @@ export default function VersionPage({session, versionId, viewMode}) {
// Use native share API if available // Use native share API if available
await navigator.share({ await navigator.share({
title: `Version: ${versionData?.name || 'Version'}`, title: `Version: ${versionData?.name || 'Version'}`,
text: 'Découvrez cette version sur Konstitisyon.la', text: 'Découvrez cette version sur Konstitisyon.nu',
url url
}) })
setSnackbar({ setSnackbar({
+61 -10
View File
@@ -1,4 +1,4 @@
import {useRef, useState} from 'react' import {useRef, useState, useEffect} from 'react'
import {useTheme} from '@mui/material/styles' import {useTheme} from '@mui/material/styles'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import Box from '@mui/material/Box' import Box from '@mui/material/Box'
@@ -34,17 +34,25 @@ import PrintButton from './print-button.js'
import {formatDate} from '@/lib/format.js' import {formatDate} from '@/lib/format.js'
import {compareVersion} from '@/lib/directus.js' import {compareVersion} from '@/lib/directus.js'
function getVersionStatus(version, index, totalVersions) { function getVersionStatus(version, index, totalVersions, data) {
// Logic to determine version status based on position and data // Logic to determine version status based on position and data
if (index === 0) { // Find which version is the "main" (published) by checking if it matches current content
return 'current' // Most recent // This would require the current item content to be passed
} // For now, we assume the most recent is current unless it's been promoted
// Check if this is the initial version
if (index === totalVersions - 1) { if (index === totalVersions - 1) {
return 'initial' // First version return 'initial' // First version
} }
return 'archived' // Intermediate versions // If there's a more recent version after this one, this is outdated
// unless this IS the main version (would need item content to determine)
if (index > 0) {
return 'outdated' // Older versions are outdated
}
// Most recent version is current (being edited/proposed)
return 'current'
} }
function getStatusConfig(status) { function getStatusConfig(status) {
@@ -115,15 +123,56 @@ function VersionCard({
onVoteResult onVoteResult
}) { }) {
const theme = useTheme() const theme = useTheme()
const status = getVersionStatus(version, index, totalVersions) const [versionStatus, setVersionStatus] = useState(null)
const [isOutdated, setIsOutdated] = useState(false)
// Fetch real status from API
useEffect(() => {
async function fetchVersionStatus() {
try {
const comparisonData = await compareVersion({
accessToken,
userId,
versionId: version.id,
countdownRef,
setError,
setIsErrorAlertOpen
})
if (comparisonData) {
// Store outdated flag for vote disabling
setIsOutdated(comparisonData.outdated)
// Determine status based on API response
let status
if (comparisonData.outdated) {
status = 'outdated'
} else if (index === totalVersions - 1) {
status = 'initial'
} else {
status = 'current'
}
setVersionStatus(status)
}
} catch (error) {
// Fallback to position-based status on error
setVersionStatus(getVersionStatus(version, index, totalVersions, null))
}
}
fetchVersionStatus()
}, [version.id, index, totalVersions, accessToken, userId, countdownRef, setError, setIsErrorAlertOpen])
const status = versionStatus || getVersionStatus(version, index, totalVersions, null)
const statusConfig = getStatusConfig(status) const statusConfig = getStatusConfig(status)
const userDisplayName = version.user_created?.split('-')[0] || 'Système' const userDisplayName = version.user_created?.split('-')[0] || 'Système'
// Check if voting is disabled (after 3 days) // Check if voting is disabled (after 3 days OR if outdated)
const createdAt = new Date(version.date_created) const createdAt = new Date(version.date_created)
const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000)) const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000))
const isVoteDisabled = createdAt < threeDaysAgo const isExpired = createdAt < threeDaysAgo
const isVoteDisabled = isExpired || isOutdated
const handleCompareClick = async () => { const handleCompareClick = async () => {
const comparisonData = await compareVersion({ const comparisonData = await compareVersion({
@@ -214,7 +263,7 @@ function VersionCard({
size='small' size='small'
variant='outlined' variant='outlined'
/> />
{isVoteDisabled && ( {isExpired && !isOutdated && (
<Chip <Chip
label='Vote fermé' label='Vote fermé'
color='error' color='error'
@@ -260,11 +309,13 @@ function VersionCard({
/> />
<ExportPdfButton <ExportPdfButton
versionData={version} versionData={version}
isOutdated={isOutdated}
size='small' size='small'
variant='text' variant='text'
/> />
<PrintButton <PrintButton
versionData={version} versionData={version}
isOutdated={isOutdated}
size='small' size='small'
variant='text' variant='text'
/> />
+13
View File
@@ -0,0 +1,13 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
// Optimiser les imports pour réduire la mémoire
optimizePackageImports: ['@mui/material', '@mui/icons-material', '@emotion/react', '@emotion/styled'],
},
// Réduire l'utilisation mémoire
compress: true,
// Désactiver les source maps en dev pour économiser la mémoire
productionBrowserSourceMaps: false,
}
module.exports = nextConfig
+14 -14
View File
@@ -6,25 +6,25 @@
"lint": "xo" "lint": "xo"
}, },
"dependencies": { "dependencies": {
"@directus/sdk": "^18.0.1", "@directus/sdk": "^20.3.0",
"@emotion/cache": "^11.13.5", "@emotion/cache": "^11.14.0",
"@emotion/react": "^11.13.5", "@emotion/react": "^11.14.0",
"@emotion/styled": "^11.13.5", "@emotion/styled": "^11.14.1",
"@fontsource/roboto": "^5.1.0", "@fontsource/roboto": "^5.2.9",
"@mui/icons-material": "^6.1.9", "@mui/icons-material": "^7.3.6",
"@mui/lab": "^7.0.0-beta.14", "@mui/lab": "^7.0.1-beta.20",
"@mui/material": "^6.1.9", "@mui/material": "^7.3.6",
"@mui/material-nextjs": "^6.1.9", "@mui/material-nextjs": "^7.3.6",
"@uiw/react-md-editor": "^4.0.8", "@uiw/react-md-editor": "^4.0.11",
"date-fns": "^3.6.0", "date-fns": "^4.1.0",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
"jspdf": "^3.0.1", "jspdf": "^4.0.0",
"marked": "^16.1.1", "marked": "^17.0.1",
"next": "^16.1.0", "next": "^16.1.0",
"next-auth": "5.0.0-beta.25", "next-auth": "5.0.0-beta.25",
"react": "^19.2.3", "react": "^19.2.3",
"react-dom": "^19.2.3", "react-dom": "^19.2.3",
"react-virtuoso": "^4.10.2", "react-virtuoso": "^4.18.1",
"use-debounce": "^10.0.5" "use-debounce": "^10.0.5"
}, },
"devDependencies": { "devDependencies": {
+147 -224
View File
@@ -57,17 +57,15 @@
dependencies: dependencies:
regenerator-runtime "^0.14.0" regenerator-runtime "^0.14.0"
"@babel/runtime@^7.14.6", "@babel/runtime@^7.17.2", "@babel/runtime@^7.26.7", "@babel/runtime@^7.27.1", "@babel/runtime@^7.27.6": "@babel/runtime@^7.14.6", "@babel/runtime@^7.17.2":
version "7.27.6" version "7.27.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6"
integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==
"@babel/runtime@^7.26.0": "@babel/runtime@^7.28.4":
version "7.26.0" version "7.28.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326"
integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
dependencies:
regenerator-runtime "^0.14.0"
"@babel/types@^7.24.0": "@babel/types@^7.24.0":
version "7.24.5" version "7.24.5"
@@ -78,10 +76,10 @@
"@babel/helper-validator-identifier" "^7.24.5" "@babel/helper-validator-identifier" "^7.24.5"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@directus/sdk@^18.0.1": "@directus/sdk@^20.3.0":
version "18.0.1" version "20.3.0"
resolved "https://registry.yarnpkg.com/@directus/sdk/-/sdk-18.0.1.tgz#35219fbc1a06d382d0fa94092b23e7ed6743dd3e" resolved "https://registry.yarnpkg.com/@directus/sdk/-/sdk-20.3.0.tgz#a7c02c135a348b99300191f3be760e974d746714"
integrity sha512-vUYhqn7qwuaIcqbVRhQtKhjGB9DNhumnzauOg0M8dVnuxk6BgW1W6ZYzkhXmP1vcsU3RohM1l8KPTxOkjikktg== integrity sha512-auy59B0A7Ri+4JDy0JcdFHnsHvOkl3ixWMWYciXAbm4oYIE9S4be8xEpIwA5qhlPTOprJ6JHPWo9rEvcrLwNtA==
"@emnapi/runtime@^1.7.0": "@emnapi/runtime@^1.7.0":
version "1.7.1" version "1.7.1"
@@ -107,17 +105,6 @@
source-map "^0.5.7" source-map "^0.5.7"
stylis "4.2.0" stylis "4.2.0"
"@emotion/cache@^11.13.5":
version "11.13.5"
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.13.5.tgz#e78dad0489e1ed7572507ba8ed9d2130529e4266"
integrity sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==
dependencies:
"@emotion/memoize" "^0.9.0"
"@emotion/sheet" "^1.4.0"
"@emotion/utils" "^1.4.2"
"@emotion/weak-memoize" "^0.4.0"
stylis "4.2.0"
"@emotion/cache@^11.14.0": "@emotion/cache@^11.14.0":
version "11.14.0" version "11.14.0"
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76"
@@ -146,16 +133,16 @@
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102"
integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
"@emotion/react@^11.13.5": "@emotion/react@^11.14.0":
version "11.13.5" version "11.14.0"
resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.13.5.tgz#fc818ff5b13424f86501ba4d0740f343ae20b8d9" resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d"
integrity sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ== integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
dependencies: dependencies:
"@babel/runtime" "^7.18.3" "@babel/runtime" "^7.18.3"
"@emotion/babel-plugin" "^11.13.5" "@emotion/babel-plugin" "^11.13.5"
"@emotion/cache" "^11.13.5" "@emotion/cache" "^11.14.0"
"@emotion/serialize" "^1.3.3" "@emotion/serialize" "^1.3.3"
"@emotion/use-insertion-effect-with-fallbacks" "^1.1.0" "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0"
"@emotion/utils" "^1.4.2" "@emotion/utils" "^1.4.2"
"@emotion/weak-memoize" "^0.4.0" "@emotion/weak-memoize" "^0.4.0"
hoist-non-react-statics "^3.3.1" hoist-non-react-statics "^3.3.1"
@@ -176,16 +163,16 @@
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c"
integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
"@emotion/styled@^11.13.5": "@emotion/styled@^11.14.1":
version "11.13.5" version "11.14.1"
resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.13.5.tgz#0fa6602227414c5e42cf267506e3c35bae655df9" resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.14.1.tgz#8c34bed2948e83e1980370305614c20955aacd1c"
integrity sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ== integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==
dependencies: dependencies:
"@babel/runtime" "^7.18.3" "@babel/runtime" "^7.18.3"
"@emotion/babel-plugin" "^11.13.5" "@emotion/babel-plugin" "^11.13.5"
"@emotion/is-prop-valid" "^1.3.0" "@emotion/is-prop-valid" "^1.3.0"
"@emotion/serialize" "^1.3.3" "@emotion/serialize" "^1.3.3"
"@emotion/use-insertion-effect-with-fallbacks" "^1.1.0" "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0"
"@emotion/utils" "^1.4.2" "@emotion/utils" "^1.4.2"
"@emotion/unitless@^0.10.0": "@emotion/unitless@^0.10.0":
@@ -193,10 +180,10 @@
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745"
integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==
"@emotion/use-insertion-effect-with-fallbacks@^1.1.0": "@emotion/use-insertion-effect-with-fallbacks@^1.2.0":
version "1.1.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf" resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf"
integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw== integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==
"@emotion/utils@^1.4.2": "@emotion/utils@^1.4.2":
version "1.4.2" version "1.4.2"
@@ -255,10 +242,10 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
"@fontsource/roboto@^5.1.0": "@fontsource/roboto@^5.2.9":
version "5.1.0" version "5.2.9"
resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-5.1.0.tgz#00230737ec09c60ae877a5e33d067c0607fdd5ba" resolved "https://registry.yarnpkg.com/@fontsource/roboto/-/roboto-5.2.9.tgz#55092cf992ab8d5082be73b79b42f383a9c0903c"
integrity sha512-cFRRC1s6RqPygeZ8Uw/acwVHqih8Czjt6Q0MwoUoDe9U3m4dH1HmNDRBZyqlMSFwgNAUKgFImncKdmDHyKpwdg== integrity sha512-ZTkyHiPk74B/aj8BZWbsxD5Yu+Lq+nR64eV4wirlrac2qXR7jYk2h6JlLYuOuoruTkGQWNw2fMuKNavw7/rg0w==
"@humanwhocodes/config-array@^0.11.14": "@humanwhocodes/config-array@^0.11.14":
version "0.11.14" version "0.11.14"
@@ -438,160 +425,108 @@
wrap-ansi "^8.1.0" wrap-ansi "^8.1.0"
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
"@mui/core-downloads-tracker@^6.1.9": "@mui/core-downloads-tracker@^7.3.6":
version "6.1.9" version "7.3.6"
resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.9.tgz#7f538205f7f877cdc335d06ef7e671fe840cf68f" resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.6.tgz#e7e3a4dc161a377be8224aa988410e89571ab40a"
integrity sha512-TWqj7b1w5cmSz4H/uf+y2AHxAH4ldPR7D2bz0XVyn60GCAo/zRbRPx7cF8gTs/i7CiYeHzV6dtat0VpMwOtolw== integrity sha512-QaYtTHlr8kDFN5mE1wbvVARRKH7Fdw1ZuOjBJcFdVpfNfRYKF3QLT4rt+WaB6CKJvpqxRsmEo0kpYinhH5GeHg==
"@mui/icons-material@^6.1.9": "@mui/icons-material@^7.3.6":
version "6.1.9" version "7.3.6"
resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-6.1.9.tgz#68b1003d3e29db4f5d5e5f46a4333f34762aeeeb" resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-7.3.6.tgz#c0092afd04a661603d9751c851e0099a27c1d556"
integrity sha512-AzlhIT51rdjkZ/EcUV2dbhNkNSUHIqCnNoUxodpiTw8buyAUBd+qnxg5OBSuPpun/ZEdSSB8Q7Uyh6zqjiMsEQ== integrity sha512-0FfkXEj22ysIq5pa41A2NbcAhJSvmcZQ/vcTIbjDsd6hlslG82k5BEBqqS0ZJprxwIL3B45qpJ+bPHwJPlF7uQ==
dependencies: dependencies:
"@babel/runtime" "^7.26.0" "@babel/runtime" "^7.28.4"
"@mui/lab@^7.0.0-beta.14": "@mui/lab@^7.0.1-beta.20":
version "7.0.0-beta.14" version "7.0.1-beta.20"
resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-7.0.0-beta.14.tgz#9a62359d3438ea8598d4fe1ad865e168bb857c5e" resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-7.0.1-beta.20.tgz#e63282cf686c46c44b36066c99dc7e3cf3acdf86"
integrity sha512-pn+ZvylDcBKQOo17oa/PhtIA/UFQFq8RvpN+r/jHrztz/CjMDju2CWBne0txvQ5JIS8uTIGp2/IsTa7II1g5wg== integrity sha512-xZW+gLO0htUjL02lZRhrziyOuz/azdwqgyiyjKvn52W2wbbcXtFhDVp3ns7YYiQAF9I+Sgu1g1a2HZutOlqeWw==
dependencies: dependencies:
"@babel/runtime" "^7.27.1" "@babel/runtime" "^7.28.4"
"@mui/system" "^7.1.1" "@mui/system" "^7.3.6"
"@mui/types" "^7.4.3" "@mui/types" "^7.4.9"
"@mui/utils" "^7.1.1" "@mui/utils" "^7.3.6"
clsx "^2.1.1" clsx "^2.1.1"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/material-nextjs@^6.1.9": "@mui/material-nextjs@^7.3.6":
version "6.1.9" version "7.3.6"
resolved "https://registry.yarnpkg.com/@mui/material-nextjs/-/material-nextjs-6.1.9.tgz#30cf5f11557dac6ba51bc1ba2878824b5a3292cd" resolved "https://registry.yarnpkg.com/@mui/material-nextjs/-/material-nextjs-7.3.6.tgz#199555bb3a7d6c49bdd40d08b7cf4da82917392f"
integrity sha512-QIJANZt6tkRLoeRsIa0KoC4+MMywTIPQbthL2U2VXHLyrRan00+Yc2M+NFP85/EnPxNEUCRf19l4WKNaPtyetQ== integrity sha512-2fP1QyBRY9rT02/ykNw0yz9aAWy5ZVp+YzkLEqio9VTkIYkon/xSUQX7PfHLOWUbKlkwoKtCQOjsvrYtSOyKnQ==
dependencies: dependencies:
"@babel/runtime" "^7.26.0" "@babel/runtime" "^7.28.4"
"@mui/material@^6.1.9": "@mui/material@^7.3.6":
version "6.1.9" version "7.3.6"
resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.1.9.tgz#e596944ea4d95f16bdc9dd83ebd1b7067e5957be" resolved "https://registry.yarnpkg.com/@mui/material/-/material-7.3.6.tgz#6bd4705ca97d80fd5ae1b6b2b7c56ba0cfab0d6a"
integrity sha512-NwqIN0bdsgzSbZd5JFcC+2ez0XW/XNs8uiV2PDHrqQ4qf/FEasFJG1z6g8JbCN0YlTrHZekVb17X0Fv0qcYJfQ== integrity sha512-R4DaYF3dgCQCUAkr4wW1w26GHXcf5rCmBRHVBuuvJvaGLmZdD8EjatP80Nz5JCw0KxORAzwftnHzXVnjR8HnFw==
dependencies: dependencies:
"@babel/runtime" "^7.26.0" "@babel/runtime" "^7.28.4"
"@mui/core-downloads-tracker" "^6.1.9" "@mui/core-downloads-tracker" "^7.3.6"
"@mui/system" "^6.1.9" "@mui/system" "^7.3.6"
"@mui/types" "^7.2.19" "@mui/types" "^7.4.9"
"@mui/utils" "^6.1.9" "@mui/utils" "^7.3.6"
"@popperjs/core" "^2.11.8" "@popperjs/core" "^2.11.8"
"@types/react-transition-group" "^4.4.11" "@types/react-transition-group" "^4.4.12"
clsx "^2.1.1" clsx "^2.1.1"
csstype "^3.1.3" csstype "^3.1.3"
prop-types "^15.8.1" prop-types "^15.8.1"
react-is "^18.3.1" react-is "^19.2.0"
react-transition-group "^4.4.5" react-transition-group "^4.4.5"
"@mui/private-theming@^6.1.9": "@mui/private-theming@^7.3.6":
version "6.1.9" version "7.3.6"
resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.1.9.tgz#14b84e31bff4caef9b85d77870869d733fde39f6" resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-7.3.6.tgz#1ca65a08e8f7f538d9a10ba974f1f4db5231a969"
integrity sha512-7aum/O1RquBYhfwL/7egDyl9GqJgPM6hoJDFFBbhF6Sgv9yI9v4w3ArKUkuVvR0CtVj4NXRVMKEioh1bjUzvuA== integrity sha512-Ws9wZpqM+FlnbZXaY/7yvyvWQo1+02Tbx50mVdNmzWEi51C51y56KAbaDCYyulOOBL6BJxuaqG8rNNuj7ivVyw==
dependencies: dependencies:
"@babel/runtime" "^7.26.0" "@babel/runtime" "^7.28.4"
"@mui/utils" "^6.1.9" "@mui/utils" "^7.3.6"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/private-theming@^7.2.0": "@mui/styled-engine@^7.3.6":
version "7.2.0" version "7.3.6"
resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-7.2.0.tgz#8d601e0949c81598da4621559181f1ac8231efc5" resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-7.3.6.tgz#dde8e6ae32c9b5b400dcd37afd9514a5344f7d91"
integrity sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw== integrity sha512-+wiYbtvj+zyUkmDB+ysH6zRjuQIJ+CM56w0fEXV+VDNdvOuSywG+/8kpjddvvlfMLsaWdQe5oTuYGBcodmqGzQ==
dependencies: dependencies:
"@babel/runtime" "^7.27.6" "@babel/runtime" "^7.28.4"
"@mui/utils" "^7.2.0"
prop-types "^15.8.1"
"@mui/styled-engine@^6.1.9":
version "6.1.9"
resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-6.1.9.tgz#ef2c39d3e3eda94490e1822d1f23c4fb924651f1"
integrity sha512-xynSLlJRxHLzSfQaiDjkaTx8LiFb9ByVa7aOdwFnTxGWFMY1F+mkXwAUY4jDDE+MAxkWxlzzQE0wOohnsxhdQg==
dependencies:
"@babel/runtime" "^7.26.0"
"@emotion/cache" "^11.13.5"
"@emotion/serialize" "^1.3.3"
"@emotion/sheet" "^1.4.0"
csstype "^3.1.3"
prop-types "^15.8.1"
"@mui/styled-engine@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-7.2.0.tgz#98bf5abe1f80adabd66d4f9c13ea9e4a2616908e"
integrity sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==
dependencies:
"@babel/runtime" "^7.27.6"
"@emotion/cache" "^11.14.0" "@emotion/cache" "^11.14.0"
"@emotion/serialize" "^1.3.3" "@emotion/serialize" "^1.3.3"
"@emotion/sheet" "^1.4.0" "@emotion/sheet" "^1.4.0"
csstype "^3.1.3" csstype "^3.1.3"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/system@^6.1.9": "@mui/system@^7.3.6":
version "6.1.9" version "7.3.6"
resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.1.9.tgz#7b8735e7cbb6df552416607b9c00404557aa4e31" resolved "https://registry.yarnpkg.com/@mui/system/-/system-7.3.6.tgz#460f82fc6fe1b79b8c04dc97694f6b162ffc3d25"
integrity sha512-8x+RucnNp21gfFYsklCaZf0COXbv3+v0lrVuXONxvPEkESi2rwLlOi8UPJfcz6LxZOAX3v3oQ7qw18vnpgueRg== integrity sha512-8fehAazkHNP1imMrdD2m2hbA9sl7Ur6jfuNweh5o4l9YPty4iaZzRXqYvBCWQNwFaSHmMEj2KPbyXGp7Bt73Rg==
dependencies: dependencies:
"@babel/runtime" "^7.26.0" "@babel/runtime" "^7.28.4"
"@mui/private-theming" "^6.1.9" "@mui/private-theming" "^7.3.6"
"@mui/styled-engine" "^6.1.9" "@mui/styled-engine" "^7.3.6"
"@mui/types" "^7.2.19" "@mui/types" "^7.4.9"
"@mui/utils" "^6.1.9" "@mui/utils" "^7.3.6"
clsx "^2.1.1" clsx "^2.1.1"
csstype "^3.1.3" csstype "^3.1.3"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/system@^7.1.1": "@mui/types@^7.4.9":
version "7.2.0" version "7.4.9"
resolved "https://registry.yarnpkg.com/@mui/system/-/system-7.2.0.tgz#b13f99cb5937912228f29175d6ea67857d626d70" resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.9.tgz#99accc87920b4c8c4ce33c5076a58f7f81b528fa"
integrity sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A== integrity sha512-dNO8Z9T2cujkSIaCnWwprfeKmTWh97cnjkgmpFJ2sbfXLx8SMZijCYHOtP/y5nnUb/Rm2omxbDMmtUoSaUtKaw==
dependencies: dependencies:
"@babel/runtime" "^7.27.6" "@babel/runtime" "^7.28.4"
"@mui/private-theming" "^7.2.0"
"@mui/styled-engine" "^7.2.0"
"@mui/types" "^7.4.4"
"@mui/utils" "^7.2.0"
clsx "^2.1.1"
csstype "^3.1.3"
prop-types "^15.8.1"
"@mui/types@^7.2.19": "@mui/utils@^7.3.6":
version "7.2.19" version "7.3.6"
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.19.tgz#c941954dd24393fdce5f07830d44440cf4ab6c80" resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.3.6.tgz#508fbe864832f99b215d134eb89e1198cdc66b34"
integrity sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA== integrity sha512-jn+Ba02O6PiFs7nKva8R2aJJ9kJC+3kQ2R0BbKNY3KQQ36Qng98GnPRFTlbwYTdMD6hLEBKaMLUktyg/rTfd2w==
"@mui/types@^7.4.3", "@mui/types@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.4.tgz#0c5cd56905231e27096b41d096f1c948c26bdd5d"
integrity sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==
dependencies: dependencies:
"@babel/runtime" "^7.27.6" "@babel/runtime" "^7.28.4"
"@mui/types" "^7.4.9"
"@mui/utils@^6.1.9":
version "6.1.9"
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.9.tgz#821612300f66684054fd6e36336cfea91f050fbe"
integrity sha512-N7uzBp7p2or+xanXn3aH2OTINC6F/Ru/U8h6amhRZEev8bJhKN86rIDIoxZZ902tj+09LXtH83iLxFMjMHyqNA==
dependencies:
"@babel/runtime" "^7.26.0"
"@mui/types" "^7.2.19"
"@types/prop-types" "^15.7.13"
clsx "^2.1.1"
prop-types "^15.8.1"
react-is "^18.3.1"
"@mui/utils@^7.1.1", "@mui/utils@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.2.0.tgz#31062697b41aa8ea8ef04e3d3fadca1dec3e1de1"
integrity sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==
dependencies:
"@babel/runtime" "^7.27.6"
"@mui/types" "^7.4.4"
"@types/prop-types" "^15.7.15" "@types/prop-types" "^15.7.15"
clsx "^2.1.1" clsx "^2.1.1"
prop-types "^15.8.1" prop-types "^15.8.1"
react-is "^19.1.0" react-is "^19.2.0"
"@next/env@16.1.0": "@next/env@16.1.0":
version "16.1.0" version "16.1.0"
@@ -776,6 +711,11 @@
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
"@types/pako@^2.0.3":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@types/pako/-/pako-2.0.4.tgz#c3575ef8125e176c345fa0e7b301c1db41170c15"
integrity sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==
"@types/parse-json@^4.0.0": "@types/parse-json@^4.0.0":
version "4.0.2" version "4.0.2"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
@@ -786,16 +726,6 @@
resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.5.tgz#72499abbb4c4ec9982446509d2f14fb8483869d6" resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.5.tgz#72499abbb4c4ec9982446509d2f14fb8483869d6"
integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ== integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==
"@types/prop-types@*":
version "15.7.12"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
"@types/prop-types@^15.7.13":
version "15.7.13"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451"
integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
"@types/prop-types@^15.7.15": "@types/prop-types@^15.7.15":
version "15.7.15" version "15.7.15"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7"
@@ -806,20 +736,10 @@
resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04" resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04"
integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw== integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==
"@types/react-transition-group@^4.4.11": "@types/react-transition-group@^4.4.12":
version "4.4.11" version "4.4.12"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044"
integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA== integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
dependencies:
"@types/react" "*"
"@types/react@*":
version "18.3.2"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd"
integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==
dependencies:
"@types/prop-types" "*"
csstype "^3.0.2"
"@types/trusted-types@^2.0.7": "@types/trusted-types@^2.0.7":
version "2.0.7" version "2.0.7"
@@ -941,10 +861,10 @@
remark-github-blockquote-alert "^1.0.0" remark-github-blockquote-alert "^1.0.0"
unist-util-visit "^5.0.0" unist-util-visit "^5.0.0"
"@uiw/react-md-editor@^4.0.8": "@uiw/react-md-editor@^4.0.11":
version "4.0.8" version "4.0.11"
resolved "https://registry.yarnpkg.com/@uiw/react-md-editor/-/react-md-editor-4.0.8.tgz#40b37e1e26966bccb4ee3dab33239da66bc698dd" resolved "https://registry.yarnpkg.com/@uiw/react-md-editor/-/react-md-editor-4.0.11.tgz#cd33452fe83b91c836badfee567c8d0b57c1a8b8"
integrity sha512-S3mOzZeGmJNhzdXJxRTCwsFMDp8nBWeQUf59cK3L6QHzDUHnRoHpcmWpfVRyKGKSg8zaI2+meU5cYWf8kYn3mQ== integrity sha512-F0OR5O1v54EkZYvJj3ew0I7UqLiPeU34hMAY4MdXS3hI86rruYi5DHVkG/VuvLkUZW7wIETM2QFtZ459gKIjQA==
dependencies: dependencies:
"@babel/runtime" "^7.14.6" "@babel/runtime" "^7.14.6"
"@uiw/react-markdown-preview" "^5.0.6" "@uiw/react-markdown-preview" "^5.0.6"
@@ -1140,11 +1060,6 @@ arrify@^3.0.0:
resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc"
integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==
atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
available-typed-arrays@^1.0.7: available-typed-arrays@^1.0.7:
version "1.0.7" version "1.0.7"
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
@@ -1223,11 +1138,6 @@ browserslist@^4.23.0:
node-releases "^2.0.14" node-releases "^2.0.14"
update-browserslist-db "^1.0.13" update-browserslist-db "^1.0.13"
btoa@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73"
integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==
builtin-modules@^3.3.0: builtin-modules@^3.3.0:
version "3.3.0" version "3.3.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
@@ -1484,10 +1394,10 @@ data-view-byte-offset@^1.0.0:
es-errors "^1.3.0" es-errors "^1.3.0"
is-data-view "^1.0.1" is-data-view "^1.0.1"
date-fns@^3.6.0: date-fns@^4.1.0:
version "3.6.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14"
integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==
debug@^3.2.7: debug@^3.2.7:
version "3.2.7" version "3.2.7"
@@ -2218,6 +2128,15 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fast-png@^6.2.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/fast-png/-/fast-png-6.4.0.tgz#807fc353ccab060d09151b7d082786e02d8e92d6"
integrity sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==
dependencies:
"@types/pako" "^2.0.3"
iobuffer "^5.3.2"
pako "^2.1.0"
fastq@^1.6.0: fastq@^1.6.0:
version "1.17.1" version "1.17.1"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
@@ -2824,6 +2743,11 @@ interpret@^1.4.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
iobuffer@^5.3.2:
version "5.4.0"
resolved "https://registry.yarnpkg.com/iobuffer/-/iobuffer-5.4.0.tgz#f85dff957fd0579257472f0a4cfe5ed3430e63e1"
integrity sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==
irregular-plurals@^3.3.0: irregular-plurals@^3.3.0:
version "3.5.0" version "3.5.0"
resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b"
@@ -3218,14 +3142,13 @@ json5@^1.0.2:
dependencies: dependencies:
minimist "^1.2.0" minimist "^1.2.0"
jspdf@^3.0.1: jspdf@^4.0.0:
version "3.0.1" version "4.0.0"
resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-3.0.1.tgz#d81e1964f354f60412516eb2449ea2cccd4d2a3b" resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-4.0.0.tgz#3731c0a1a7d8afe28c681891236f8ad4a662d893"
integrity sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg== integrity sha512-w12U97Z6edKd2tXDn3LzTLg7C7QLJlx0BPfM3ecjK2BckUl9/81vZ+r5gK4/3KQdhAcEZhENUxRhtgYBj75MqQ==
dependencies: dependencies:
"@babel/runtime" "^7.26.7" "@babel/runtime" "^7.28.4"
atob "^2.1.2" fast-png "^6.2.0"
btoa "^1.2.1"
fflate "^0.8.1" fflate "^0.8.1"
optionalDependencies: optionalDependencies:
canvg "^3.0.11" canvg "^3.0.11"
@@ -3341,10 +3264,10 @@ markdown-table@^3.0.0:
resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a"
integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==
marked@^16.1.1: marked@^17.0.1:
version "16.1.1" version "17.0.1"
resolved "https://registry.yarnpkg.com/marked/-/marked-16.1.1.tgz#a7839dcf19fa5e349cad12c561f231320690acd4" resolved "https://registry.yarnpkg.com/marked/-/marked-17.0.1.tgz#9db34197ac145e5929572ee49ef701e37ee9b2e6"
integrity sha512-ij/2lXfCRT71L6u0M29tJPhP0bM5shLL3u5BePhFwPELj2blMJ6GDtD7PfJhRLhJ/c2UwrK17ySVcDzy2YHjHQ== integrity sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==
mdast-util-find-and-replace@^3.0.0: mdast-util-find-and-replace@^3.0.0:
version "3.0.2" version "3.0.2"
@@ -4117,6 +4040,11 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
pako@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86"
integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==
parent-module@^1.0.0: parent-module@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -4344,15 +4272,10 @@ react-is@^16.13.1, react-is@^16.7.0:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-is@^18.3.1: react-is@^19.2.0:
version "18.3.1" version "19.2.3"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.2.3.tgz#eec2feb69c7fb31f77d0b5c08c10ae1c88886b29"
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== integrity sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==
react-is@^19.1.0:
version "19.1.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.1.0.tgz#805bce321546b7e14c084989c77022351bbdd11b"
integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==
react-markdown@~9.0.1: react-markdown@~9.0.1:
version "9.0.3" version "9.0.3"
@@ -4380,10 +4303,10 @@ react-transition-group@^4.4.5:
loose-envify "^1.4.0" loose-envify "^1.4.0"
prop-types "^15.6.2" prop-types "^15.6.2"
react-virtuoso@^4.10.2: react-virtuoso@^4.18.1:
version "4.10.2" version "4.18.1"
resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.10.2.tgz#a27308a3c4cfeb24722032acc0b6a46055c26967" resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.18.1.tgz#3eb7078f2739a31b96c723374019e587deeb6ebc"
integrity sha512-os6n9QKeKRF+8mnQR/vGy/xrFf6vXIzuaAVL54q5k2st2d5QIEwI+KDKaflMUmMvnDbPxf68bs+CF5bY3YI7qA== integrity sha512-KF474cDwaSb9+SJ380xruBB4P+yGWcVkcu26HtMqYNMTYlYbrNy8vqMkE+GpAApPPufJqgOLMoWMFG/3pJMXUA==
react@^19.2.3: react@^19.2.3:
version "19.2.3" version "19.2.3"