diff --git a/components/Code.module.css b/components/Code.module.css index ba3d5b71..d317052c 100644 --- a/components/Code.module.css +++ b/components/Code.module.css @@ -2,5 +2,5 @@ padding: 0 calc(4rem / 16); background: var(--code-background); border-radius: calc(5rem / 16); - word-wrap: break-word; + overflow-wrap: break-word; } diff --git a/components/EventCard.module.css b/components/EventCard.module.css index 27393553..9d7b5ae7 100644 --- a/components/EventCard.module.css +++ b/components/EventCard.module.css @@ -2,7 +2,7 @@ display: flex; flex-direction: row; box-sizing: border-box; - padding: calc(24rem / 16); + padding: calc(20rem / 16) 0; } .card aside { @@ -12,18 +12,17 @@ .card aside img { width: 100%; - margin-bottom: 1rem; -} - -.spacer { - margin-top: calc(76rem / 16); } .registerButton { - display: block; + margin-top: 1rem; font-weight: bold; } +.registerButtonWithPoster { + display: block; +} + .content > h1 { font-size: calc(24rem / 16); font-weight: 700; @@ -45,3 +44,70 @@ font-size: 1rem; margin-bottom: calc(14rem / 16); } + +.mobileLearnMore { + display: none; +} + +@media only screen and (max-width: calc(768rem / 16)) { + .card { + flex-direction: column; + } + + .card aside { + margin: 0 auto; + max-width: calc(300rem / 16); + } + + .card aside img { + box-sizing: border-box; + border: calc(1rem / 16) solid var(--text); + } + + .content { + margin-top: 1rem; + } + + .content { + text-align: center; + } + + .content > h1, + .content > h2 { + font-size: 1rem; + line-height: calc(30 / 16); + } + + .content > h2 { + margin-bottom: 0; + } + + .mobileShowDescriptionContent { + text-align: unset; + } + + .mobileShowDescriptionContent > h1 { + font-size: calc(24rem / 16); + margin-bottom: calc(8rem / 16); + } + + .registerButton { + display: block; + } + + .mobileLearnMore { + display: unset; + } + + .mobileShowDescriptionContent .mobileLearnMore { + display: none; + } + + .children { + display: none; + } + + .mobileShowDescriptionContent .children { + display: unset; + } +} diff --git a/components/EventCard.tsx b/components/EventCard.tsx index eeae0997..e9e5eaec 100644 --- a/components/EventCard.tsx +++ b/components/EventCard.tsx @@ -3,10 +3,11 @@ import React, { ReactNode } from "react"; import { Button } from "./Button"; import { EventSetting } from "./EventSetting"; import { Image } from "./Image"; +import { Link } from "./Link"; import styles from "./EventCard.module.css"; -interface EventCardProps { +interface BaseProps { name: string; short: string; date: Date; @@ -17,7 +18,12 @@ interface EventCardProps { children: ReactNode; } +type EventCardProps = + | (BaseProps & { showDescription?: false; link: string }) + | (BaseProps & { showDescription: true; link?: string }); + export function EventCard({ + link, name, date, online, @@ -25,13 +31,42 @@ export function EventCard({ poster, registerLink, children, + showDescription = false, }: EventCardProps) { return (
- -
-

{name}

-

- -

-
{children}
); diff --git a/components/EventSetting.module.css b/components/EventSetting.module.css index f9fbfb01..7edfef49 100644 --- a/components/EventSetting.module.css +++ b/components/EventSetting.module.css @@ -2,7 +2,7 @@ .separator { display: none; } - + .setting { display: block; } diff --git a/components/Image.module.css b/components/Image.module.css new file mode 100644 index 00000000..0e712845 --- /dev/null +++ b/components/Image.module.css @@ -0,0 +1,4 @@ +.image { + /* So that image doesn't overflow on mobile screens */ + max-width: 100%; +} diff --git a/components/Image.tsx b/components/Image.tsx index 8175af56..2ab05c22 100644 --- a/components/Image.tsx +++ b/components/Image.tsx @@ -1,8 +1,14 @@ import React, { ImgHTMLAttributes } from "react"; +import styles from "./Image.module.css"; + export function Image(props: ImgHTMLAttributes) { + const classes = props.className + ? [props.className, styles.image] + : [styles.image]; + if (props.src?.startsWith("http://") || props.src?.startsWith("https://")) { - return ; + return ; } const { src: relativeSrc = "" } = props; @@ -16,5 +22,5 @@ export function Image(props: ImgHTMLAttributes) { absoluteSrc += "/" + relativeSrc; } - return ; + return ; } diff --git a/components/Link.module.css b/components/Link.module.css index 8edbfa31..3ed8f8ac 100644 --- a/components/Link.module.css +++ b/components/Link.module.css @@ -3,6 +3,7 @@ transition-duration: 0.3s; text-decoration: none; white-space: normal; + overflow-wrap: anywhere; } .link:hover { diff --git a/components/playground.tsx b/components/playground.tsx index 7aa9facc..1a6be704 100644 --- a/components/playground.tsx +++ b/components/playground.tsx @@ -146,13 +146,23 @@ export function EventDescriptionCardDemo() { export function EventCardDemo() { return ( <> - {events.map(({ Content, metadata }) => ( - - - + {events.map(({ Content, metadata }, idx) => ( + <> + + + + + + + ))} ); diff --git a/lib/events.ts b/lib/events.ts index db6f5cb0..2007a89c 100644 --- a/lib/events.ts +++ b/lib/events.ts @@ -27,7 +27,9 @@ export async function getEventTermsByYear(year: string): Promise { } interface Metadata { + slug: string; name: string; + poster?: string; short: string; date: string; online: boolean; @@ -52,7 +54,7 @@ export async function getEventBySlug( return { content: await serialize(content), - metadata: metadata as Metadata, + metadata: { ...metadata, slug } as Metadata, }; } @@ -122,12 +124,14 @@ export async function getEventsPageProps({ new Date(a.metadata.date).getTime() - new Date(b.metadata.date).getTime() ); + const currentDate = Date.now(); + const pastEvents = events - .filter((event) => new Date(event.metadata.date).getTime() < Date.now()) + .filter((event) => new Date(event.metadata.date).getTime() < currentDate) .reverse(); const futureEvents = events.filter( - (event) => new Date(event.metadata.date).getTime() >= Date.now() + (event) => new Date(event.metadata.date).getTime() >= currentDate ); const current = getCurrentTerm(); diff --git a/pages/_app.tsx b/pages/_app.tsx index e705b5ec..71f1a530 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -8,6 +8,7 @@ import { Code } from "@/components/Code"; import { DefaultLayout } from "@/components/DefaultLayout"; import { Footer } from "@/components/Footer"; import { HorizontalLine } from "@/components/HorizontalLine"; +import { Image } from "@/components/Image"; import { Link } from "@/components/Link"; import { Navbar } from "@/components/Navbar"; import { Pre } from "@/components/Pre"; @@ -35,6 +36,7 @@ export default function App({ Component, pageProps }: AppProps): JSX.Element { button: Button, pre: Pre, inlineCode: Code, + img: Image, }} >
diff --git a/pages/events/[year]/[term]/[event].tsx b/pages/events/[year]/[term]/[event].tsx index 21bfce26..193d4725 100644 --- a/pages/events/[year]/[term]/[event].tsx +++ b/pages/events/[year]/[term]/[event].tsx @@ -18,6 +18,7 @@ export default function EventInfoPage(props: Props) { diff --git a/pages/events/[year]/[term]/index.module.css b/pages/events/[year]/[term]/index.module.css index ab651690..ce7de862 100644 --- a/pages/events/[year]/[term]/index.module.css +++ b/pages/events/[year]/[term]/index.module.css @@ -8,12 +8,6 @@ border-bottom: 1px solid var(--primary-heading); } -@media only screen and (max-width: calc(768rem / 16)) { - .main { - margin-top: calc(60rem / 16); - } -} - .header a { color: var(--text); font-size: calc(18rem / 16); @@ -31,3 +25,7 @@ .miniEventCards { margin-top: calc(30rem / 16); } + +.main > .miniEventCards { + margin-top: 0; +} diff --git a/pages/events/[year]/[term]/index.tsx b/pages/events/[year]/[term]/index.tsx index f8b9f1fd..c0b1b670 100644 --- a/pages/events/[year]/[term]/index.tsx +++ b/pages/events/[year]/[term]/index.tsx @@ -72,6 +72,7 @@ export default function Term(props: Props) { {...metadata} date={new Date(metadata.date)} key={metadata.name + metadata.date.toString()} + link={`/events/${props.year}/${props.term}/${metadata.slug}`} >