diff --git a/next.config.mjs b/next.config.mjs index 5bf1654..b1ee349 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -13,6 +13,15 @@ const nextConfig = { }) return config }, + async redirects() { + return [ + { + source: '/grist-2024-qr', + destination: '/grist-paris-summit-2024#agenda', + permanent: true, + }, + ] + }, } export default nextConfig diff --git a/src/fonts/README.md b/src/fonts/README.md index f308dee..3b9252f 100644 --- a/src/fonts/README.md +++ b/src/fonts/README.md @@ -15,7 +15,7 @@ Doing this is OK while we control 100% of the content we render. For now the sub > Glyphhanger is not integrated locally as it requires a few python dependencies… if needed, install glyphhanger locally on your machine to update the files. > Glyphhanger v5.0.0 was used. -Command used to generate files in this folder: +Command used to generate files in this folder (please update it as you add characters): ```bash # pwd = src/fonts @@ -23,7 +23,7 @@ glyphhanger \ --subset="./sources/*.woff2" \ --formats=woff2 \ --output=./subsetted \ - --whitelist="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÀàâÇçèÉÊËéêëÏîïÔôùûŒœÆ &•#…€$~˚°%\_=+-×÷\*/[]{}()<>,.:;?@«»©™←↑→↓↖↗↘↙√≤≥'\!\’\“\”\\\`\"" + --whitelist="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÀàâäÇçèÉÊËéêëÏîïÔôùûŒœÆłń &•#…€$~˚°%\_=+-×÷\*/[]{}()<>,.:;?@«»©™←↑→↓↖↗↘↙√≤≥'\!\’\“\”\\\`\"" ``` You guessed it: the important part of the command is the `whitelist` param that lists all characters we want to keep in the subsetted file. diff --git a/src/fonts/subsetted/Marianne-Bold-subset.woff2 b/src/fonts/subsetted/Marianne-Bold-subset.woff2 index 09aa43b..a6eb0f7 100644 Binary files a/src/fonts/subsetted/Marianne-Bold-subset.woff2 and b/src/fonts/subsetted/Marianne-Bold-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Bold_Italic-subset.woff2 b/src/fonts/subsetted/Marianne-Bold_Italic-subset.woff2 index 4dac51d..53eddc3 100644 Binary files a/src/fonts/subsetted/Marianne-Bold_Italic-subset.woff2 and b/src/fonts/subsetted/Marianne-Bold_Italic-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-ExtraBold-subset.woff2 b/src/fonts/subsetted/Marianne-ExtraBold-subset.woff2 index 0d35dc8..60a32c6 100644 Binary files a/src/fonts/subsetted/Marianne-ExtraBold-subset.woff2 and b/src/fonts/subsetted/Marianne-ExtraBold-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-ExtraBold_Italic-subset.woff2 b/src/fonts/subsetted/Marianne-ExtraBold_Italic-subset.woff2 index 6c9ea28..2fd19ea 100644 Binary files a/src/fonts/subsetted/Marianne-ExtraBold_Italic-subset.woff2 and b/src/fonts/subsetted/Marianne-ExtraBold_Italic-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Light-subset.woff2 b/src/fonts/subsetted/Marianne-Light-subset.woff2 index f3e66d2..ac418b3 100644 Binary files a/src/fonts/subsetted/Marianne-Light-subset.woff2 and b/src/fonts/subsetted/Marianne-Light-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Light_Italic-subset.woff2 b/src/fonts/subsetted/Marianne-Light_Italic-subset.woff2 index e472768..2606257 100644 Binary files a/src/fonts/subsetted/Marianne-Light_Italic-subset.woff2 and b/src/fonts/subsetted/Marianne-Light_Italic-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Medium-subset.woff2 b/src/fonts/subsetted/Marianne-Medium-subset.woff2 index 8f4512c..91ddace 100644 Binary files a/src/fonts/subsetted/Marianne-Medium-subset.woff2 and b/src/fonts/subsetted/Marianne-Medium-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Medium_Italic-subset.woff2 b/src/fonts/subsetted/Marianne-Medium_Italic-subset.woff2 index 66b254f..b741bba 100644 Binary files a/src/fonts/subsetted/Marianne-Medium_Italic-subset.woff2 and b/src/fonts/subsetted/Marianne-Medium_Italic-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Regular-subset.woff2 b/src/fonts/subsetted/Marianne-Regular-subset.woff2 index b75fc46..dfb56a0 100644 Binary files a/src/fonts/subsetted/Marianne-Regular-subset.woff2 and b/src/fonts/subsetted/Marianne-Regular-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Regular_Italic-subset.woff2 b/src/fonts/subsetted/Marianne-Regular_Italic-subset.woff2 index 0494ada..5a0ef22 100644 Binary files a/src/fonts/subsetted/Marianne-Regular_Italic-subset.woff2 and b/src/fonts/subsetted/Marianne-Regular_Italic-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Thin-subset.woff2 b/src/fonts/subsetted/Marianne-Thin-subset.woff2 index 5f031ed..9132aec 100644 Binary files a/src/fonts/subsetted/Marianne-Thin-subset.woff2 and b/src/fonts/subsetted/Marianne-Thin-subset.woff2 differ diff --git a/src/fonts/subsetted/Marianne-Thin_Italic-subset.woff2 b/src/fonts/subsetted/Marianne-Thin_Italic-subset.woff2 index 8e7a917..e5ae6a1 100644 Binary files a/src/fonts/subsetted/Marianne-Thin_Italic-subset.woff2 and b/src/fonts/subsetted/Marianne-Thin_Italic-subset.woff2 differ diff --git a/src/pages/grist-paris-summit-2024.tsx b/src/pages/grist-paris-summit-2024.tsx index 8710964..4813498 100644 --- a/src/pages/grist-paris-summit-2024.tsx +++ b/src/pages/grist-paris-summit-2024.tsx @@ -1,4 +1,10 @@ -import { ReactNode, useEffect } from 'react' +import { + Children, + cloneElement, + HTMLAttributes, + ReactNode, + useEffect, +} from 'react' import { Layout } from '@/components/Layout' import { ContentSection } from '@/components/ContentSection' import { DoubleBlock } from '@/sections/DoubleBlock' @@ -9,30 +15,233 @@ import SuiteLogo from '@/assets/logo/suite-numerique.svg' import GristGouvLogo from '@/assets/grist-summit/gristgouv-hex.svg' import GristDinum from '@/assets/grist-summit/grist-and-dinum.png' -const ProgramItem = ({ +const ThemeIcon = ({ + theme, + size, + withAlt = true, +}: { + theme: 'real-world' | 'power-user' | 'commons' + size?: 'xs' + withAlt?: boolean +}) => { + const label = `Theme: ${ + theme === 'real-world' + ? `Real-world Grist Examples` + : theme === 'power-user' + ? 'Become a Grist Power User' + : 'The La Suite Project and Digital Commons' + }` + return ( + + ) +} + +/** specific timeslots shenanigans to take less space on unimportant stuff + * yes this is a mess + **/ +const adjustVerticalSpaceAndPos = (hourAndMinutes: number) => { + let verticalPosAdjustment = 0 + let verticalSpace = 0 + if ([9, 10, 12.5, 15.5].includes(hourAndMinutes)) { + verticalSpace = 1 + } + if (hourAndMinutes !== 9) { + verticalPosAdjustment -= 1 + } + if (hourAndMinutes > 10) { + } + if (hourAndMinutes > 12.5) { + verticalPosAdjustment -= 5 + } + if (hourAndMinutes > 14) { + verticalPosAdjustment += 1 + } + if (hourAndMinutes > 15.5) { + } + return { verticalPosAdjustment, verticalSpace } +} + +const AgendaTimespot = ({ + fr, + en, + rows = 1, +}: { + fr: string + en: string + rows?: number +}) => { + const fullTimeslot = fr.endsWith('h') ? `${fr}00` : fr + const hour = Number(fullTimeslot.slice(0, -3)) + const minutes = Number(fullTimeslot.slice(-2)) + const hourAndMinutes = hour + minutes / 60 + let verticalPos = 1 + (hour - 9) * 4 + (minutes > 0 ? (minutes / 60) * 4 : 0) + const adjustment = adjustVerticalSpaceAndPos(hourAndMinutes) + verticalPos += adjustment.verticalPosAdjustment + return ( + + Main Stage + + + Big Table + + + Classrooms + + > + ) +} + +const AgendaItem = ({ time, + stage, + duration, + theme, + type, title, author, children, }: { - time: string - title: string + time: + | '9h' + | '9h30' + | '9h45' + | '10h' + | '10h30' + | '11h' + | '11h30' + | '12h' + | '12h30' + | '14h' + | '14h30' + | '15h' + | '15h30' + | '16h' + | '16h30' + | '17h' + | '17h15' + title: ReactNode author?: string + type?: 'informal' + stage: 'main' | 'table' | 'classrooms' | 'break' | 'plenary' + theme?: 'real-world' | 'power-user' | 'commons' + duration: '15m' | '30m' | '45m' | '1h' | '1h30' + className?: string children?: ReactNode }) => { + // col-span-3 row-span-1 row-span-2 row-span-3 row-span-4 row-span-5 row-span-6 col-start-1 col-start-2 col-start-3 col-start-4 col-start-5 + // row-start-1 row-start-2 row-start-3 row-start-4 row-start-5 row-start-6 row-start-7 + // row-start-8 row-start-9 row-start-10 row-start-11 row-start-12 row-start-13 + // row-start-14 row-start-15 row-start-16 row-start-17 row-start-18 row-start-19 row-start-20 row-start-21 + // row-start-22 row-start-23 row-start-24 row-start-25 row-start-26 row-start-27 row-start-28 row-start-29 + // row-start-30 row-start-31 row-start-32 row-start-33 row-start-34 + const fullTimeslot = time.endsWith('h') ? `${time}00` : time + const hour = Number(fullTimeslot.slice(0, -3)) + const minutes = Number(fullTimeslot.slice(-2)) + const hourAndMinutes = hour + minutes / 60 + + const stageStyles = + stage === 'break' + ? 'mb-2 md:mb-4 p-2 lg:p-4' + : 'mb-2 md:mb-4 p-2 lg:p-4 lg:shadow border border-[#6a6af4] bg-[#fafafa] bsg-[#e3e3fd]' + const typeStyles = type === 'informal' ? 'border-dashed' : '' + + let verticalPos = 1 + (hour - 9) * 4 + (minutes > 0 ? (minutes / 60) * 4 : 0) + let verticalSpace = + duration === '15m' + ? 1 + : duration === '30m' + ? 2 + : duration === '45m' + ? 3 + : duration === '1h' + ? 4 + : 6 + + const adjustment = adjustVerticalSpaceAndPos(hourAndMinutes) + verticalPos += adjustment.verticalPosAdjustment + if (adjustment.verticalSpace) { + verticalSpace = adjustment.verticalSpace + } + const stagesColStart = stage === 'main' ? 2 : stage === 'table' ? 3 : 4 + const inSpecificTrack = + stage === 'main' || stage === 'table' || stage === 'classrooms' return ( -
+ ) +} + +const AgendaRooms = ({ row }: { row: number }) => { + return ( + <> +- {time} -
-{author}
- )} - {!!children &&Duration: {duration}
+ {!!author && ( ++ {author} +
+ )} +{children}
: children} ++ La majeure partie de l'évènement se déroulera{' '} + en anglais afin d'inclure nos partenaires + internationaux dans les discussions. +
++ Une transcription et traduction en direct de + certaines prises de paroles publiques aura lieu. +
+- Le programme détaillé sera bientôt disponible. + Les portes ouvrent à 9h. Les conférences se déroulent en anglais + dans trois salles (Main Stage,{' '} + Big Table et Classrooms) et sont + réparties en trois thématiques : +
++ Des transcriptions en anglais et français, ainsi qu'une traduction + en français en direct ont lieu pour les conférences du{' '} + Main Stage. +
++ Le programme est détaillé en anglais.
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce - condimentum efficitur massa, vel gravida augue ultrices vel. - Etiam massa leo, mattis at nunc nec, laoreet molestie ante. -
-- La majeure partie de l'évènement se déroulera{' '} - en anglais afin d'inclure nos partenaires - internationaux dans les discussions. -
-- Pas de panique si vous ne parlez pas anglais :{' '} - une transcription et traduction en direct des - prises de paroles publiques aura lieu. -
-