diff --git a/content/index.md b/content/index.md index eddd27a1c..a9e9273bb 100644 --- a/content/index.md +++ b/content/index.md @@ -1,38 +1,3 @@ --- title: "Komeno" --- - - - -
- icon -
- Komeno -
-

- Software Engineer -

-
diff --git a/quartz.layout.ts b/quartz.layout.ts index 335eeded2..073290417 100644 --- a/quartz.layout.ts +++ b/quartz.layout.ts @@ -15,36 +15,62 @@ export const sharedPageComponents: SharedLayout = { // components for pages that display a single page (e.g. a single note) export const defaultContentPageLayout: PageLayout = { beforeBody: [ + Component.ConditionalRender({ + component: Component.HomeHero(), + condition: (props) => props.fileData.slug === "index", + }), + Component.ConditionalRender({ + component: Component.HomeProfile(), + condition: (props) => props.fileData.slug === "index", + }), + Component.ConditionalRender({ + component: Component.HomeArticles(), + condition: (props) => props.fileData.slug === "index", + }), ], left: [ - Component.PageTitle(), - Component.MobileOnly(Component.Spacer()), - //Component.Search(), + Component.ConditionalRender({ + component: Component.PageTitle(), + condition: (props) => props.fileData.slug !== "index", + }), + Component.ConditionalRender({ + component: Component.MobileOnly(Component.Spacer()), + condition: (props) => props.fileData.slug !== "index", + }), Component.Darkmode(), - Component.DesktopOnly(Component.LinksList({ + Component.ConditionalRender({ + component: Component.DesktopOnly(Component.LinksList({ links: { - "E-Mail": "mailto:riceset@icloud.com", - GitHub: "https://github.com/riceset", - LinkedIn: "https://www.linkedin.com/in/riceset/", - } - })), - Component.Explorer(), + "E-Mail": "mailto:riceset@icloud.com", + GitHub: "https://github.com/riceset", + LinkedIn: "https://www.linkedin.com/in/riceset/", + }, + })), + condition: (props) => props.fileData.slug !== "index", + }), + Component.ConditionalRender({ + component: Component.Explorer(), + condition: (props) => props.fileData.slug !== "index", + }), ], right: [ - Component.DesktopOnly(Component.RecentNotes({ - title: "Latest", - limit: 8 - })), - Component.MobileOnly(Component.RecentNotes({ - title: "Latest", - limit: 1 - })), - Component.MobileOnly(Component.LinksList({ + Component.ConditionalRender({ + component: Component.DesktopOnly(Component.RecentNotes({ title: "Latest", limit: 8 })), + condition: (props) => props.fileData.slug !== "index", + }), + Component.ConditionalRender({ + component: Component.MobileOnly(Component.RecentNotes({ title: "Latest", limit: 1 })), + condition: (props) => props.fileData.slug !== "index", + }), + Component.ConditionalRender({ + component: Component.MobileOnly(Component.LinksList({ links: { - GitHub: "https://github.com/riceset", - LinkedIn: "https://www.linkedin.com/in/riceset/", - } - })) + GitHub: "https://github.com/riceset", + LinkedIn: "https://www.linkedin.com/in/riceset/", + }, + })), + condition: (props) => props.fileData.slug !== "index", + }), ], } diff --git a/quartz/components/HomeArticles.tsx b/quartz/components/HomeArticles.tsx new file mode 100644 index 000000000..c2616585d --- /dev/null +++ b/quartz/components/HomeArticles.tsx @@ -0,0 +1,54 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { resolveRelative } from "../util/path" +import { byDateAndAlphabetical } from "./PageList" +import { Date, getDate } from "./Date" +import style from "./styles/homeArticles.scss" + +const BookIcon = () => ( + + + + +) + +const HomeArticles: QuartzComponent = ({ allFiles, fileData, cfg }: QuartzComponentProps) => { + const pages = allFiles + .filter((page) => page.slug !== "index") + .sort(byDateAndAlphabetical(cfg)) + + if (pages.length === 0) return null + + return ( +
+

+ + Articles +

+ +
+ ) +} + +HomeArticles.css = style +export default (() => HomeArticles) satisfies QuartzComponentConstructor diff --git a/quartz/components/HomeHero.tsx b/quartz/components/HomeHero.tsx new file mode 100644 index 000000000..696fa9bfe --- /dev/null +++ b/quartz/components/HomeHero.tsx @@ -0,0 +1,57 @@ +import { QuartzComponent, QuartzComponentConstructor } from "./types" +import style from "./styles/homeHero.scss" + +const MailIcon = () => ( + + + + +) + +const GitHubIcon = () => ( + + + +) + +const LinkedInIcon = () => ( + + + +) + +const HomeHero: QuartzComponent = () => { + return ( +
+
+ Komeno +
+

Komeno

+

Software Engineer

+

+ Software engineer and linguist. Interning at MIXI, Inc building iOS features for + FamilyAlbum. MEXT Scholar at Tokyo University of Foreign Studies. 42 Network alumnus. + Native in English, Japanese, and Portuguese — also speak Spanish and Mandarin. +

+ +
+
+
+ ) +} + +HomeHero.css = style +export default (() => HomeHero) satisfies QuartzComponentConstructor diff --git a/quartz/components/HomeProfile.tsx b/quartz/components/HomeProfile.tsx new file mode 100644 index 000000000..35dd7941c --- /dev/null +++ b/quartz/components/HomeProfile.tsx @@ -0,0 +1,189 @@ +import { QuartzComponent, QuartzComponentConstructor } from "./types" +import style from "./styles/homeProfile.scss" + +// ── Icons ────────────────────────────────────────────────────────────────── + +const BriefcaseIcon = () => ( + + + + + + +) + +const GraduationCapIcon = () => ( + + + + +) + +const GlobeIcon = () => ( + + + + + +) + +// ── Data ─────────────────────────────────────────────────────────────────── + +interface ExperienceItem { + role: string + company: string + companyUrl: string + logo: string + period: string + location: string + description: string + tags?: string[] +} + +interface EducationItem { + degree: string + institution: string + institutionUrl: string + logo: string + period: string +} + +interface Language { + flag: string + name: string + level: string +} + +const experience: ExperienceItem[] = [ + { + role: "Product Development Engineer", + company: "MIXI, Inc", + companyUrl: "https://mixi.co.jp", + logo: "/static/logos/mixi.svg", + period: "Jan 2026 – Present", + location: "Tokyo, Japan", + description: + "Building and optimizing iOS features for FamilyAlbum, a photo-sharing platform with 27M+ users across 175 countries, used by 60% of parents in Japan.", + tags: ["Swift", "iOS", "Agile"], + }, + { + role: "Google Student Ambassador", + company: "Google Japan", + companyUrl: "https://about.google/intl/ALL_jp/", + logo: "/static/logos/google.svg", + period: "Aug 2025 – Feb 2026", + location: "Tokyo, Japan", + description: + "Collaborated with Google Japan to bridge AI and university students — exploring practical Gemini use cases and promoting responsible AI integration on campus.", + tags: ["AI", "Gemini"], + }, +] + +const education: EducationItem[] = [ + { + degree: "B.A. Language and Area Studies", + institution: "Tokyo University of Foreign Studies", + institutionUrl: "https://www.tufs.ac.jp/english/", + logo: "/static/logos/tufs.svg", + period: "2024 – 2028", + }, + { + degree: "Computer Software Engineering", + institution: "42 Network (Paris / São Paulo / Tokyo)", + institutionUrl: "https://42.fr", + logo: "/static/logos/42.svg", + period: "2022 – 2025", + }, +] + +const languages: Language[] = [ + { flag: "🇧🇷", name: "Portuguese", level: "Native" }, + { flag: "🇺🇸", name: "English", level: "Native" }, + { flag: "🇯🇵", name: "Japanese", level: "Native · JLPT N1" }, + { flag: "🇪🇸", name: "Spanish", level: "Professional · TOEIC 945" }, + { flag: "🇨🇳", name: "Mandarin", level: "Working · HSK 3 · TOCFL 4" }, +] + +// ── Component ────────────────────────────────────────────────────────────── + +const HomeProfile: QuartzComponent = () => { + return ( +
+ + {/* Experience */} +
+

+ + Experience +

+
+ {experience.map((item) => ( +
+
+ +
+
+ {item.role} + {item.company} +
+
+ {item.period} + {item.location} +
+
+
+ {item.description && ( +
+

{item.description}

+
+ )} +
+ ))} +
+
+ + {/* Education */} +
+

+ + Education +

+
+ {education.map((item) => ( +
+ +
+ {item.institution} + {item.degree} +
+ {item.period} +
+ ))} +
+
+ + {/* Languages */} +
+

+ + Languages +

+
+ {languages.map((lang) => ( +
+ + {lang.flag} + {lang.name} + + {lang.level} +
+ ))} +
+
+ +
+ ) +} + +HomeProfile.css = style +export default (() => HomeProfile) satisfies QuartzComponentConstructor diff --git a/quartz/components/index.ts b/quartz/components/index.ts index 560035ca7..894a9d79d 100644 --- a/quartz/components/index.ts +++ b/quartz/components/index.ts @@ -3,6 +3,9 @@ import TagContent from "./pages/TagContent" import FolderContent from "./pages/FolderContent" import NotFound from "./pages/404" import ArticleTitle from "./ArticleTitle" +import HomeHero from "./HomeHero" +import HomeProfile from "./HomeProfile" +import HomeArticles from "./HomeArticles" import Darkmode from "./Darkmode" import ReaderMode from "./ReaderMode" import Head from "./Head" @@ -27,6 +30,9 @@ import LinksList from "./LinksList" export { ArticleTitle, + HomeHero, + HomeProfile, + HomeArticles, Content, TagContent, FolderContent, diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index 545809ed3..559dc5539 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -288,7 +288,7 @@ export function renderPage( {RightComponent} - {slug !== "index" &&