1+ import { LuChevronRight , LuCircleCheck , LuPalette , LuSmartphone } from "react-icons/lu" ;
12import { NavLink } from "react-router" ;
23import Header from "../components/Header" ;
3-
4- export default function LandingPage ( ) {
5- return (
6- < >
7- < Header />
8- < div className = "min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100" >
9- < HeroSection />
10- < FeaturesSection />
11- < Footer />
12- </ div >
13- </ >
14- ) ;
15- }
4+ import { EXTERNAL_LINKS } from "../constants/links" ;
165
176function HeroSection ( ) {
187 return (
19- < section className = "relative overflow-hidden" >
20- < div className = "container relative z-10 mx-auto flex max-w-5xl flex-col items-center gap-12 px-6 py-16 sm:gap-14 md:py-20 lg:flex-row lg:gap-10 xl:gap-14 " >
21- < div className = "max-w-lg grow text-center lg:text-left" >
22- < h1 className = "font-bold text-4xl text-gray-800 leading-snug md:text-5xl" >
23- < span className = "text-primary" > 「いつヒマ?」</ span > で< br />
24- 日程調整しよう
25- </ h1 >
26- < p className = "mt-6 text-gray-600 text-md leading-relaxed md:text-xl" >
27- とりあえずみんなの空いている時間を訊いてから、何を何時間やるか決めたい。そんな仲間うちでの日程調整に最適なツールです。
28- </ p >
29- < NavLink to = "/new" className = "btn btn-primary btn-lg mt-10 px-8 shadow-lg duration-300 hover:shadow-xl" >
30- 今すぐイベントを作成
31- </ NavLink >
32- </ div >
33- < div className = "relative w-60 shrink-0 sm:w-64 md:w-72 lg:w-80 xl:w-[22rem]" >
34- < div aria-hidden className = "-inset-8 absolute rounded-full bg-primary/10 blur-3xl" />
35- < img src = "/mock-mobile.png" alt = "イツヒマアプリの画面" className = "relative h-auto w-72" />
8+ < section id = "hero" >
9+ < div className = "overflow-hidden bg-slate-50" >
10+ < div className = "container mx-auto max-w-7xl px-4 py-10 sm:px-6 lg:px-8 lg:py-14" >
11+ < div className = "grid items-center gap-12 lg:grid-cols-2 lg:gap-8" >
12+ < div className = "mx-auto max-w-2xl text-center lg:mx-0 lg:text-left" >
13+ < h1 className = "mb-6 font-bold text-4xl text-slate-900 leading-[1.25] tracking-tight sm:text-5xl md:text-6xl" >
14+ < span className = "text-primary" > 「いつヒマ?」</ span > で< br />
15+ 日程調整しよう
16+ </ h1 >
17+ < p className = "mx-auto max-w-lg text-lg text-slate-600 lg:mx-0" >
18+ とりあえずみんなの空いている時間を訊いてから、何を何時間やるか決めたい。そんな仲間うちでの調整に最適な、シンプルで直感的なツールです。
19+ </ p >
20+ < NavLink
21+ to = "/new"
22+ className = "hover:-translate-y-0.5 mt-8 inline-flex items-center justify-center gap-2 rounded-xl bg-primary px-8 py-3.5 font-bold text-base text-white shadow-lg shadow-primary/30 transition-all hover:bg-primary/90 hover:shadow-xl focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2"
23+ >
24+ イベントを作成
25+ < LuChevronRight className = "h-4 w-4" />
26+ </ NavLink >
27+ </ div >
28+
29+ < div className = "mx-auto w-full max-w-[320px] lg:max-w-[400px]" >
30+ < img src = "/mock-mobile.png" alt = "App Screenshot" className = "h-auto w-full object-cover" />
31+ </ div >
32+ </ div >
3633 </ div >
3734 </ div >
3835 </ section >
@@ -42,41 +39,48 @@ function HeroSection() {
4239function FeaturesSection ( ) {
4340 const features = [
4441 {
45- icon : "🚫" ,
46- title : "候補日程の設定なし" ,
47- description : "みんなが空いている時間を選ぶだけなので、主催者が候補日程を設定する必要がありません。" ,
42+ icon : < LuCircleCheck className = "h-6 w-6 text-emerald-500" /> ,
43+ title : "候補日程は不要" ,
44+ description :
45+ "参加者が各々の空いている日程を入力することで日程調整を行います。幹事が候補日程を大量に作成する必要はありません。" ,
46+ color : "bg-emerald-50" ,
4847 } ,
4948 {
50- icon : "🔗" ,
51- title : "URLで簡単共有" ,
52- description : "作成したイベントのURLをコピーして友達に送れば、すぐに日程調整が可能です。" ,
49+ icon : < LuPalette className = "h-6 w-6 text-primary" /> ,
50+ title : "複数の参加形態に対応" ,
51+ description : "「対面」「オンライン」など、複数の参加形態を自由に設定可能です。" ,
52+ color : "bg-primary/10" ,
5353 } ,
5454 {
55- icon : "📱" ,
56- title : "直感的な操作" ,
57- description : "複数日程も一気にドラッグで選択可能。スマホでも簡単に操作できます。" ,
55+ icon : < LuSmartphone className = "h-6 w-6 text-blue-500" /> ,
56+ title : "スマホでも簡単に入力可能" ,
57+ description : "スマホでも、複数の日程をドラッグで一気に選択可能です。" ,
58+ color : "bg-blue-50" ,
5859 } ,
59- ] ;
60+ ] as const ;
6061
6162 return (
62- < section className = "bg-white px-4 py-16" >
63- < div className = "mx-auto max-w-6xl" >
64- < div className = "mb-16 text-center" >
65- < h2 className = "mb-4 font-bold text-3xl text-gray-800" > イツヒマの特長</ h2 >
66- < p className = "text-gray-600 text-md" > 仲間うちでのスムーズな日程調整に特化</ p >
67- </ div >
68-
69- < div className = "grid gap-8 md:grid-cols-2 lg:grid-cols-3" >
70- { features . map ( ( feature ) => (
71- < div
72- key = { feature . title }
73- className = "rounded-xl bg-gray-50 p-6 transition-shadow duration-300 hover:shadow-lg"
74- >
75- < div className = "mb-4 text-4xl" > { feature . icon } </ div >
76- < h3 className = "mb-3 font-semibold text-gray-800 text-xl" > { feature . title } </ h3 >
77- < p className = "text-gray-600 leading-relaxed" > { feature . description } </ p >
78- </ div >
79- ) ) }
63+ < section id = "features" >
64+ < div className = "bg-white py-24" >
65+ < div className = "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8" >
66+ < div className = "mx-auto text-center" >
67+ < h2 className = "font-bold text-3xl text-slate-900 sm:text-4xl" > イツヒマの特徴</ h2 >
68+ < p className = "mt-4 text-lg text-slate-600" > イツヒマは仲間うちでのスムーズな日程調整に特化しています。</ p >
69+ </ div >
70+ < div className = "mt-16 grid gap-8 md:grid-cols-3" >
71+ { features . map ( ( feature ) => (
72+ < div
73+ key = { feature . title }
74+ className = "flex flex-col rounded-2xl border border-slate-100 bg-white p-8 shadow-sm"
75+ >
76+ < div className = { `inline-flex h-14 w-14 items-center justify-center rounded-xl ${ feature . color } ` } >
77+ { feature . icon }
78+ </ div >
79+ < h3 className = "mt-6 font-bold text-slate-900 text-xl" > { feature . title } </ h3 >
80+ < p className = "mt-3 text-slate-600" > { feature . description } </ p >
81+ </ div >
82+ ) ) }
83+ </ div >
8084 </ div >
8185 </ div >
8286 </ section >
@@ -85,47 +89,59 @@ function FeaturesSection() {
8589
8690function Footer ( ) {
8791 return (
88- < footer className = "bg-primary px-4 py-12 text-white " >
89- < div className = "mx-auto max-w-6xl " >
90- < div className = "grid gap-8 md:grid-cols-2 md :gap-16 " >
92+ < footer className = "bg-slate-900 py-12 text-slate-300 " >
93+ < div className = "mx-auto max-w-7xl px-6 sm:px-8 lg:px-10 " >
94+ < div className = "grid gap-12 md:grid-cols-2 lg :gap-24 " >
9195 < div >
92- < h3 className = "mb-4 font-bold text-xl" > イツヒマについて</ h3 >
93- < p className = "text-sm leading-relaxed opacity-90" >
94- イツヒマは、「いつヒマ?」で日程調整できるツールです。
95- < br />
96- 候補日程の設定なしで、仲間うちでの日程調整をスムーズに行うことができます。
97- </ p >
96+ < div className = "flex items-center gap-2 text-white" >
97+ < img src = "/logo-white.svg" alt = "イツヒマ" className = "h-6 w-6" />
98+ < span className = "font-bold font-mplus text-xl tracking-tight" > イツヒマ</ span >
99+ </ div >
100+ < p className = "mt-6 max-w-md text-slate-400 text-sm" > 「いつヒマ?」で日程調整しよう</ p >
98101 </ div >
99102 < div >
100- < h3 className = "mb-4 font-bold text-xl" > リンク </ h3 >
101- < ul className = "space-y-2 text-sm" >
103+ < h3 className = "font-bold text-sm text-white" > サポート </ h3 >
104+ < ul className = "mt-4 text-sm" >
102105 < li >
103106 < a
104- href = "https://utcode.notion.site/1e4ca5f557bc80f2b697ca7b9342dc89?pvs=4"
107+ href = { EXTERNAL_LINKS . GUIDE }
105108 target = "_blank"
106109 rel = "noreferrer noopener"
107- className = "block opacity-90 transition-opacity duration-200 hover:opacity-100 "
110+ className = "hover:text-slate-400 "
108111 >
109- 使い方ページ
112+ 使い方
110113 </ a >
111114 </ li >
112- < li >
115+ < li className = "mt-3" >
113116 < a
114- href = "https://forms.gle/AB6xbgKjnDv5m1nm6"
117+ href = { EXTERNAL_LINKS . FEEDBACK }
115118 target = "_blank"
116119 rel = "noreferrer noopener"
117- className = "block opacity-90 transition-opacity duration-200 hover:opacity-100 "
120+ className = "hover:text-slate-400 "
118121 >
119122 ご意見・バグ報告
120123 </ a >
121124 </ li >
122125 </ ul >
123126 </ div >
124127 </ div >
125- < div className = "mt-8 border-white/20 border-t pt-8 text-center" >
126- < p className = "text-sm opacity-75" > © 2024 イツヒマ (アルファ版) </ p >
128+ < div className = "mt-12 border-slate-800 border-t pt-8 text-center text-slate-500 text-xs " >
129+ < p > © { new Date ( ) . getFullYear ( ) } イツヒマ All rights reserved. </ p >
127130 </ div >
128131 </ div >
129132 </ footer >
130133 ) ;
131134}
135+
136+ export default function LandingPage ( ) {
137+ return (
138+ < div className = "min-h-screen bg-slate-50 text-slate-900" >
139+ < Header />
140+ < main >
141+ < HeroSection />
142+ < FeaturesSection />
143+ </ main >
144+ < Footer />
145+ </ div >
146+ ) ;
147+ }
0 commit comments