Forgot to add a file like normal
diff --git a/Components/overlays/christmas.js b/Components/overlays/christmas.js
new file mode 100644
index 0000000..dc2283e
--- /dev/null
+++ b/Components/overlays/christmas.js
@@ -0,0 +1,17 @@
+import React from "react";
+import Snowfall from 'react-snowfall'
+
+React.useLayoutEffect = React.useEffect
+
+function Christmas({  }) {
+    return (
+        <div style={{width: "100%", height: "100%"}}>
+            <Snowfall
+                snowflakeCount={100}
+                color="#C4C4C4AA"
+            />
+        </div>
+    )
+}
+
+export default Christmas;
diff --git a/embed/index.js b/embed/index.js
new file mode 100644
index 0000000..7ef2ced
--- /dev/null
+++ b/embed/index.js
@@ -0,0 +1,106 @@
+import HCaptcha from 'react-hcaptcha';
+import Axios from 'axios';
+import Router from 'next/router';
+import React from 'react';
+import Header from '../../../Components/Header'
+import { useReward } from 'react-rewards';
+import { Card, CardRow } from '../../../Components/Card';
+
+import { AutoLayout, Panel, Title, Text, Divider } from '../../../Components/Panels';
+import { List, ListItem } from '../../../Components/Texttools';
+import { useColorMode } from 'theme-ui';
+import Styles from '../../../styles/nucleus/embed.module.css';
+
+
+function Embed(props) {
+    const [clicked, setClicked] = React.useState(false);
+    const [theme, setTheme] = useColorMode()
+
+    const { reward: reward, isAnimating: isAnimating } = useReward('confetti', 'confetti', {
+        elementSize: 10,
+        elementCount: 150,
+        startVelocity: 35,
+        lifetime: 300,
+        decay: 0.94,
+        spread: 170,
+        position: "absolute",
+        colors: ["#68D49E"]
+    });
+
+    async function submitForm(tkn) {
+        if ( clicked ) {
+            Router.push('/nucleus/verify/alreadyVerified', '/nucleus/verify/success');
+        }
+        setClicked(true);
+        reward();
+        let code = await Axios.post('/api/nucleus/verify/complete', {
+            code: props.code,
+            tkn: tkn
+        });
+        setTimeout(() => {
+            if (code.data.success === true ) return Router.push('/nucleus/verify/success','/nucleus/verify')
+            else return Router.push('/nucleus/verify/failure','/nucleus/verify')
+        }, 2500);
+    }
+
+    return <>
+        <Header
+            name="Embed Editor"
+            subtext={`Editing embed in ${props.gName}`}
+            gradient={["F27878", "D96B6B"]}
+            wave="web/waves/header/nucleus"
+            buttons={[]}
+        />
+        <AutoLayout>
+            <Panel>
+                <Title>Preview</Title>
+                <Divider name="preview"/>
+                <div className={Styles.previewEmbed}>
+                    <div className={Styles.left}></div>
+                        <div className={Styles.title}><input ></input></div>
+                        <div className={Styles.description}><input ></input></div>
+                    </div>
+                    <div className={Styles.right}>
+                        <div className={Styles.uploadImage} />
+                    </div>
+                    <>
+
+                    </>
+                <div className={Styles.footer}>
+                    <ImageUpload size={64} />
+                </div>
+            </Panel>
+            <Panel halfSize={false} id="invite">
+            <Title>Invite</Title>
+            <Divider />
+            <CardRow>
+                <Card
+                    wave="nucleus"
+                    icon="bots/nucleus/circle"
+                    buttonText={"FFFFFF"} gradient={["F27878", "D96B6B"]}
+                    title="Nucleus"
+                    subtext="Invite Nucleus to your server"
+                    buttons={[
+                        {color: "424242", link: "https://discord.com/api/oauth2/authorize?client_id=715989276382462053&permissions=121295465718&scope=bot%20applications.commands", text: "Invite"}
+                    ]}
+                    url="https://discord.com/api/oauth2/authorize?client_id=715989276382462053&permissions=121295465718&scope=bot%20applications.commands"
+                />
+            </CardRow>
+        </Panel>
+        </AutoLayout>
+    </>
+}
+
+export default Embed;
+export async function getServerSideProps(ctx) {
+    return {
+        props: {
+            gID: code.data.gID,
+            gName: code.data.gName,
+            mID: code.data.mID,
+            cID: code.data.cID,
+            headers: headers,
+            code: ctx.query.code
+        }
+    }
+}
\ No newline at end of file
diff --git a/pages/api/season.js b/pages/api/season.js
new file mode 100644
index 0000000..87d650d
--- /dev/null
+++ b/pages/api/season.js
@@ -0,0 +1,32 @@
+function getSeason() {
+    let year = new Date().getFullYear();
+
+    const dates = {
+        pride: [new Date(`${year}-6-1`), new Date(`${year}-6-31`)],
+        halloween: [new Date(`${year}-10-25`), new Date(`${year}-11-1`)],
+        trans: [new Date(`${year}-11-13`), new Date(`${year}-11-19`)],
+        christmas: [new Date(`${year}-12-1`), new Date(`${year}-12-26`)]
+    }
+    const filePaths = {
+        normal: "normal",
+        halloween: "seasonal/halloween",
+        christmas: "seasonal/christmas",
+        pride: "seasonal/pride",
+        trans: "seasonal/trans"
+    }
+
+    let current = new Date();
+    let currentSeason = Object.keys(dates).find((str) => current >= dates[str][0] && current <= dates[str][1]) || "normal";
+
+    return {
+        season: currentSeason,
+        filePath: filePaths[currentSeason]
+    }
+}
+
+const Season = async (req, res) => {
+    return res.status(200).send(getSeason());
+}
+
+export default Season;
+export { getSeason };
diff --git a/styles/nucleus/rolemenu.module.css b/styles/nucleus/rolemenu.module.css
new file mode 100644
index 0000000..174a5ae
--- /dev/null
+++ b/styles/nucleus/rolemenu.module.css
@@ -0,0 +1,32 @@
+.optionBox {
+    display: flex;
+    flex-direction: row;
+    justify-content: left;
+    align-items: center;
+    width: 100%;
+}
+
+/* .optionBox input {
+    position: absolute;
+    opacity: 0;
+    height: 0;
+    width: 0;
+} */
+
+.options {
+    display: flex;
+    flex-direction: column;
+    gap: 10px;
+    justify-content: left;
+    align-items: center;
+    width: fit-content;
+    height: 100%;
+}
+
+/* .option {
+    height: 20px;
+    width: 20px;
+    position: absolute;
+    border: solid 5px red !important;
+    background-color: blue;
+} */
\ No newline at end of file
diff --git a/todo/rolemenu/index.js b/todo/rolemenu/index.js
new file mode 100644
index 0000000..a057f9f
--- /dev/null
+++ b/todo/rolemenu/index.js
@@ -0,0 +1,131 @@
+import Axios from 'axios';
+import Router from 'next/router';
+import React from 'react';
+import Header from '../../Components/Header'
+import { useReward } from 'react-rewards';
+
+import { AutoLayout, Panel, Title, Text, Divider } from '../../Components/Panels';
+import { useColorMode } from 'theme-ui';
+import Styles from '../../../styles/nucleus/rolemenu.module.css';
+
+function RoleMenu(props) {
+    const [clicked, setClicked] = React.useState(false);
+    const [formState, setFormState] = React.useState({});
+    const [theme, setTheme] = useColorMode()
+
+    const { reward: reward, isAnimating: isAnimating } = useReward('confetti', 'confetti', {
+        elementSize: 10,
+        elementCount: 150,
+        startVelocity: 35,
+        lifetime: 300,
+        decay: 0.94,
+        spread: 170,
+        position: "absolute",
+        colors: ["#68D49E"]
+    });
+
+    function handleChange(event) {
+        const { name, value } = event.target;
+        setFormState({ ...formState, [name]: value });
+    }
+
+    async function submitForm() {
+        if (!isAnimating) reward();
+        return
+        let code = await Axios.post('/api/nucleus/rolemenu/complete', {
+            code: props.code
+        });
+        setTimeout(() => {
+            if (code.data.success === true ) return Router.push('/nucleus/rolemenu/success','/nucleus/rolemenu')
+            else return Router.push('/nucleus/rolemenu/failure','/nucleus/rolemenu')
+        }, 2500);
+    }
+
+    return <>
+        <Header
+            name={props.guildName}
+            customImage={props.guildIcon}
+            roundImage={true}
+            subtext={`Welcome, ${props.username}`}
+            gradient={["F27878", "D96B6B"]}
+            wave="web/waves/header/nucleus"
+            buttons={[]}
+        />
+        <form onSubmit={submitForm}>
+            <AutoLayout>
+                {props.data.map((item, index) => {
+                    return <Panel key={index} halfSize={true}>
+                        <Title>{item.name}</Title>
+                        <Divider/>
+                        <Text>{item.description}</Text>
+                        <div className={Styles.options}>
+                            {
+                                item.options.map((props, optionIndex) => {return <div className={Styles.optionBox}>
+                                    <input
+                                        type={item.max === 1 ? "radio" : "checkbox"}
+                                        style={{borderRadius: item.max === 1 ? "50%" : "5px"}}
+                                        className={Styles.option}
+                                        key={item.name + optionIndex}
+                                        id={item.name + optionIndex.toString()}
+                                        name={item.name}
+                                        value={props.name}
+                                        onChange={handleChange}
+                                    />
+                                    <label htmlFor={item.name + optionIndex.toString()}>{props.name}</label>
+                                </div>})
+                            }
+                        </div>
+                    </Panel>
+                })}
+                <Panel halfSize={false}>
+                    <Title>Save</Title>
+                    <Divider/>
+                    <Text>
+                        After selecting all your roles, click the button below to save your choices.
+                    </Text>
+                    <div id="confetti" />
+                    <div className={Styles.submit}>
+                        <button type="submit" disabled={isAnimating}>
+                            {isAnimating ? "Saving..." : "Save"}
+                        </button>
+                    </div>
+                </Panel>
+            </AutoLayout>
+        </form>
+    </>
+}
+
+export default RoleMenu;
+export async function getServerSideProps(ctx) {
+    if(!ctx.query.code) {
+        return {
+            redirect: {
+                destination: '/nucleus',
+                permanent: true
+            }
+        }
+    }
+    let code;
+    try {
+        code = (await Axios.get(`http://localhost:10000/rolemenu/${ctx.query.code}`)).data;
+    } catch (e) {
+        return {
+            redirect: {
+                destination: '/nucleus/rolemenu/failure',
+                permanent: true
+            }
+        }
+    }
+    let headers = ctx.req.headers;
+    return {
+        props: {
+            guild: code.guild,
+            guildName: code.guildName,
+            guildIcon: code.guildIcon,
+            user: code.user,
+            username: code.username,
+            data: code.data,
+            headers: headers
+        }
+    }
+}
\ No newline at end of file