diff --git a/apps/pyconkr/src/components/layout/Footer/Mobile/MobileFooter.tsx b/apps/pyconkr/src/components/layout/Footer/Mobile/MobileFooter.tsx
new file mode 100644
index 0000000..f8d9f87
--- /dev/null
+++ b/apps/pyconkr/src/components/layout/Footer/Mobile/MobileFooter.tsx
@@ -0,0 +1,221 @@
+import styled from "@emotion/styled";
+import * as Common from "@frontend/common";
+import { Article, Email, Facebook, GitHub, Instagram, LinkedIn, X, YouTube } from "@mui/icons-material";
+import * as React from "react";
+
+import FlickrIcon from "@apps/pyconkr/assets/thirdparty/flickr.svg?react";
+
+import { useAppContext } from "../../../../contexts/app_context";
+
+interface IconItem {
+ icon: React.FC<{ width?: number; height?: number }>;
+ alt: string;
+ href: string;
+}
+
+const defaultIcons: IconItem[] = [
+ {
+ icon: Facebook,
+ alt: "facebook",
+ href: "https://www.facebook.com/pyconkorea/",
+ },
+ {
+ icon: YouTube,
+ alt: "YouTube",
+ href: "https://www.youtube.com/c/PyConKRtube",
+ },
+ { icon: X, alt: "X", href: "https://x.com/PyConKR" },
+ { icon: GitHub, alt: "github", href: "https://github.com/pythonkr" },
+ {
+ icon: Instagram,
+ alt: "Instagram",
+ href: "https://www.instagram.com/pycon_korea/",
+ },
+ {
+ icon: LinkedIn,
+ alt: "LinkedIn",
+ href: "https://www.linkedin.com/company/pyconkorea/",
+ },
+ { icon: Article, alt: "blog", href: "https://blog.pycon.kr/" },
+ {
+ icon: FlickrIcon,
+ alt: "Flickr",
+ href: "https://www.flickr.com/photos/126829363@N08/",
+ },
+];
+
+const Bar: React.FC = () =>
|
;
+
+export default function MobileFooter() {
+ const { sendEmail } = Common.Hooks.Common.useEmail();
+ const { language } = useAppContext();
+
+ const title = language === "ko" ? "Weave with Python, 파이콘 한국 2025" : "Weave with Python, Pycon KR 2025";
+ const committeeTitle =
+ language === "ko"
+ ? "파이콘 한국 2025는 파이콘 한국 준비위원회가 만들고 있습니다"
+ : "PyCon Korea 2025 is organized by the PyCon Korea Organizing Committee";
+ const djangoTitle = language === "ko" ? "파이썬 웹 프레임워크 Django로 만들었습니다" : "Built with the Django web framework for Python";
+
+ const links = [
+ {
+ text: language === "ko" ? "파이콘 한국 행동 강령(CoC)" : "PyCon Korea Code of Conduct",
+ href: "https://pythonkr.github.io/pycon-code-of-conduct/ko/coc/a_intent_and_purpose.html",
+ },
+ {
+ text: language === "ko" ? "서비스 이용 약관" : "Terms of Service",
+ href: "/about/terms-of-service",
+ },
+ {
+ text: language === "ko" ? "개인 정보 처리 방침" : "Privacy Policy",
+ href: "/about/privacy-policy",
+ },
+ ];
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ {links.map((link, index) => (
+
+
+ {link.text}
+
+ {index < links.length - 1 && |}
+
+ ))}
+
+
+
+
+
+ {defaultIcons.map((icon) => (
+
+
+
+ ))}
+
+
+
+ );
+}
+
+const FooterContainer = styled.footer`
+ background: linear-gradient(to bottom, #ffffff 0%, #e4fdff 25%, #92c9cc 50%, #5cadb3 75%, #095a5f 100%);
+ color: ${({ theme }) => theme.palette.common.white};
+ font-size: 0.75rem;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ max-height: 16rem;
+ padding: 5rem 0 1rem 0;
+`;
+
+const FooterContent = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 0.75rem;
+`;
+
+const FooterText = styled.div`
+ padding: 0 2rem;
+ margin: 0.1rem;
+
+ font-size: 9pt;
+
+ a > button {
+ margin-left: 0.25rem;
+ padding: 0.05rem 0.25rem;
+ font-size: 8pt;
+ color: ${({ theme }) => theme.palette.common.white};
+ border-color: ${({ theme }) => theme.palette.common.white};
+
+ gap: 0.25rem;
+
+ & span {
+ margin-left: -2px;
+ margin-right: 0;
+
+ & svg {
+ font-size: 12pt !important;
+ }
+ }
+ }
+
+ strong {
+ font-size: 12pt;
+ }
+`;
+
+const FooterBoldText = styled.text`
+ font-weight: 600;
+`;
+
+const FooterNormalText = styled.text`
+ font-weight: 400;
+`;
+
+const FooterSlogan = styled.div`
+ text-align: center;
+`;
+
+const FooterLinkSlogan = styled.div`
+ display: flex;
+ gap: 0.3rem;
+`;
+
+const FooterLinks = styled.div`
+ display: flex;
+ align-items: center;
+ gap: 0.3rem;
+`;
+
+const FooterIcons = styled.div`
+ display: flex;
+ align-items: center;
+ gap: 9px;
+`;
+
+const Link = styled.a`
+ color: ${({ theme }) => theme.palette.common.white};
+ text-decoration: none;
+ &:hover {
+ text-decoration: underline;
+ }
+`;
+
+const Separator = styled.span`
+ color: ${({ theme }) => theme.palette.common.white};
+ opacity: 0.5;
+ margin: 0.05rem 0;
+`;
+
+const IconLink = styled.a`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ cursor: pointer;
+
+ &:hover {
+ opacity: 0.8;
+ }
+
+ img {
+ width: 20px;
+ height: 20px;
+ }
+`;
diff --git a/apps/pyconkr/src/components/layout/Footer/index.tsx b/apps/pyconkr/src/components/layout/Footer/index.tsx
index 3f940f4..4c59f08 100644
--- a/apps/pyconkr/src/components/layout/Footer/index.tsx
+++ b/apps/pyconkr/src/components/layout/Footer/index.tsx
@@ -1,12 +1,13 @@
import styled from "@emotion/styled";
import * as Common from "@frontend/common";
import { Article, Email, Facebook, GitHub, Instagram, LinkedIn, OpenInNew, X, YouTube } from "@mui/icons-material";
-import { Button } from "@mui/material";
+import { Button, useMediaQuery, useTheme } from "@mui/material";
import * as React from "react";
import FlickrIcon from "@apps/pyconkr/assets/thirdparty/flickr.svg?react";
import { useAppContext } from "../../../contexts/app_context";
+import MobileFooter from "./Mobile/MobileFooter";
interface IconItem {
icon: React.FC<{ width?: number; height?: number }>;
@@ -49,6 +50,9 @@ const Bar: React.FC = () =>
-
-
- {corpPasamoStr}
-
- {corpAddressStr}
-
- {corpRepresentatorStr}
-
- {corpPhoneStr}
-
- {corpCompanyNumberStr}
-
- }>
- {corpCheckBtnStr}
-
-
-
- {corpMailOrderSalesRegistrationNumberStr}
-
- {hostingProviderStr}
-
- {contractEmailStr}
- pyconkr@pycon.kr
-
-
- {links.map((link, index) => (
-
-
- {link.text}
-
- {index < links.length - 1 && |}
-
- ))}
-
-
-
-
-
- {defaultIcons.map((icon) => (
-
-
+ console.log("isMobile " + isMobile);
+
+ if (isMobile) {
+ return ;
+ } else {
+ return (
+
+
+
+ {corpPasamoStr}
+
+ {corpAddressStr}
+
+ {corpRepresentatorStr}
+
+ {corpPhoneStr}
+
+ {corpCompanyNumberStr}
+
+ }>
+ {corpCheckBtnStr}
+
+
+
+ {corpMailOrderSalesRegistrationNumberStr}
+
+ {hostingProviderStr}
+
+ {contractEmailStr}
+ pyconkr@pycon.kr
+
+
+ {links.map((link, index) => (
+
+
+ {link.text}
+
+ {index < links.length - 1 && |}
+
+ ))}
+
+
+
+
- ))}
-
- {copyrightStr}
-
-
- );
+ {defaultIcons.map((icon) => (
+
+
+
+ ))}
+
+ {copyrightStr}
+
+
+ );
+ }
}
const FooterContainer = styled.footer`
@@ -195,6 +205,7 @@ const FooterLinks = styled.div`
align-items: center;
gap: 0.625rem;
`;
+
const FooterIcons = styled.div`
display: flex;
align-items: center;