-
Notifications
You must be signed in to change notification settings - Fork 88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Design-handoff | Yoga Studio | UX collab #56
base: main
Are you sure you want to change the base?
Changes from all commits
97b7439
55d6c49
ffa3f11
2be1d7c
f721f46
9db2ec7
32559e0
18db402
415bce2
3a8347e
bc882b2
8ea9e9c
3d29447
cb58d39
a6cfe7e
50f19c4
22fa149
b2a9fea
624bce1
5ac5e1f
91610a2
93926db
b674858
ceb7edc
d74cdc4
e571a11
70eb344
39754b8
7d38186
21d9cf7
d9fdef8
025a0fb
823c6dc
8b35bfe
da944f0
669469b
790a13b
b0d5608
bc0b455
456c2b7
1f6edc1
db14938
6170359
c60cd44
d3fc427
f3d7ece
904ced9
8019300
5b6af46
472b509
3984df4
7021dac
3ca8caf
4d598e2
0bbde3f
e4f082c
e422fa4
b8bb267
bd23c2f
94b753d
d107ed8
df2158a
993721c
6864944
6377f4a
8344d5f
01d7632
92144b5
46c184d
fdfc8bb
5cd2e4c
aac00e1
48c920f
913f16d
b3262b7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,5 +16,6 @@ module.exports = { | |
'warn', | ||
{ allowConstantExport: true }, | ||
], | ||
'react/prop-types': "off" | ||
}, | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,27 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
|
||
<head> | ||
<meta name="description" | ||
content="Y Studio - An exclusive yoga studio in central Stockholm or other bigger city, specialized in ashtanga yoga."> | ||
<meta charset="UTF-8" /> | ||
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> | ||
<link rel="preconnect" href="https://fonts.googleapis.com"> | ||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | ||
<link rel="apple-touch-icon" sizes="180x180" href="./src/assets/apple-touch-icon.png"> | ||
<link rel="icon" type="image/png" sizes="32x32" href="./src/assets/favicon-32x32.png"> | ||
<link rel="icon" type="image/png" sizes="16x16" href="./src/assets/favicon-16x16.png"> | ||
<link rel="manifest" href="/src/site.webmanifest"> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
<title>Music Releases - Project - Week 5</title> | ||
|
||
<link rel="preconnect" href="https://fonts.googleapis.com"> | ||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | ||
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet"> | ||
<title>Y Studio</title> | ||
</head> | ||
|
||
<body> | ||
<div id="root"></div> | ||
<script type="module" src="/src/main.jsx"></script> | ||
</body> | ||
</html> | ||
|
||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
export default { | ||
plugins: { | ||
tailwindcss: {}, | ||
autoprefixer: {}, | ||
}, | ||
} |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,24 @@ | ||
import { Footer } from "./components/Footer"; | ||
import { Hero } from "./components/Hero"; | ||
import { Strength } from "./components/Strength"; | ||
import { Reviews } from "./components/Reviews"; | ||
import { Philosophy } from "./components/Philosophy"; | ||
import { articles as articlesData } from './components/Copy'; | ||
import { customerReviews as reviewData } from './components/Copy'; | ||
import { mainText as mainData } from './components/Copy'; | ||
import { subText as subData } from './components/Copy'; | ||
import leftblob from "/images/leftblob.svg"; | ||
import rightblob from "/images/rightblob.svg"; | ||
import mainImg from "/assets/main-image.svg" | ||
|
||
export const App = () => { | ||
return <div>Find me in src/app.jsx!</div>; | ||
}; | ||
return ( | ||
<div> | ||
<Hero heroImg={mainImg} mainText={mainData} subText={subData} /> | ||
<Reviews customerReviews={reviewData} leftBlob={leftblob} rightBlob={rightblob} /> | ||
<Philosophy articles={articlesData} /> | ||
<Strength /> | ||
<Footer /> | ||
</div> | ||
) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
export const customerReviews = ['"High quality yoga classes with skilled teachers"', '"I really appreciate their flexible schedules"', '"These classes are tough – and really get the work done"']; | ||
|
||
export const articles = [ | ||
{ | ||
title: "Our philosophy", | ||
copy: "We believe in your power within. But sometimes it needs a little help.", | ||
image: "./images/philosophy.jpg", | ||
}, | ||
{ | ||
title: "Our classes", | ||
copy: "We focus on Ashtanga yoga, a physically demanding kind of yoga.", | ||
image: "./images/classes.jpg", | ||
} | ||
, | ||
|
||
{ | ||
title: "Our locations", | ||
copy: "Choose between any of our high-end yoga studios for your exercise.", | ||
image: "./images/location.jpg", | ||
}, | ||
] | ||
|
||
export const mainText = "Find your power"; | ||
|
||
export const subText = "Anywhere. Anytime."; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
import { useTranslation } from "react-i18next" | ||
|
||
export const Footer = () => { | ||
const { t, i18n } = useTranslation() | ||
|
||
return ( | ||
<footer className="bottom-0 mt-2 w-full font-Inter text-darkblue"> | ||
<section> | ||
<div className="bg-lightblue p-6 text-center"> | ||
<h2 className="text-lg pb-1">{t("footer.join")}</h2> | ||
<input type="text" placeholder={t("footer.placeholder")} className="bg-lightblue border border-darkblue py-0.5 rounded-2xl text-center text-darkblue max-sm:w-3/5"/> | ||
<button className=" bg-steelblue px-4 py-0.5 rounded-3xl font-semibold transition hover:text-beige ml-2">{t("footer.sign")}</button> | ||
</div> | ||
|
||
<div className="flex flex-col gap-2 text-center bg-steelblue p-4 desktop:hidden"> | ||
<label className="text-lg font-semibold">{t("footer.studio")}</label> | ||
<ul className="flex flex-col"> | ||
<li>{t("footer.office")}</li> | ||
<li>Stadsgatan 4</li> | ||
<li>111 11 Stockholm</li> | ||
<li>+46 1234</li> | ||
<li>[email protected]</li> | ||
</ul> | ||
</div> | ||
|
||
<div className="text-center bg-steelblue p-4 desktop:hidden"> | ||
<p className="text-lg font-semibold">{t("footer.shop")}</p> | ||
|
||
<nav className="mt-1"> | ||
<ul className="gap-2"> | ||
<li> | ||
<a className="transition hover:text-beige" href="/"> | ||
{t("footer.props")} | ||
</a> | ||
</li> | ||
|
||
<li> | ||
<a className="transition hover:text-beige" href="/"> | ||
{t("footer.clothing")} | ||
</a> | ||
</li> | ||
|
||
<li> | ||
<a className="transition hover:text-beige" href="/"> | ||
{t("footer.reading")} | ||
</a> | ||
</li> | ||
</ul> | ||
</nav> | ||
</div> | ||
|
||
<div className="text-center bg-steelblue p-4 desktop:hidden"> | ||
<p className="text-lg font-semibold">{t("footer.privacy")}</p> | ||
|
||
<nav className="mt-1"> | ||
<ul className="gap-2"> | ||
<li> | ||
<a className="transition hover:text-beige" href="/"> | ||
{t("footer.conditions")} | ||
</a> | ||
</li> | ||
</ul> | ||
</nav> | ||
</div> | ||
|
||
<div className="bg-steelblue w-full desktop:flex desktop:items-center desktop:justify-center p-1"> | ||
<ul className="hidden desktop:flex flex-row justify-center mb-2 space-y-2 lg:mb-0 sm:space-y-0 sm:space-x-20"> | ||
<li> | ||
<a href="/" className="transition hover:text-beige">{t("footer.about")}</a> | ||
</li> | ||
<li> | ||
<a href="/" className="transition hover:text-beige">{t("footer.contact")}</a> | ||
</li> | ||
<li> | ||
<a href="/" className="transition hover:text-beige">{t("footer.shop")}</a> | ||
</li> | ||
<li> | ||
<a href="/" className="transition hover:text-beige">{t("footer.privacy")}</a> | ||
</li> | ||
</ul> | ||
|
||
<div className="text-center desktop:mb-2 desktop:ml-10"> | ||
<select name="" id="" value={i18n.language} onChange={(e) => i18n.changeLanguage(e.target.value)} className="bg-steelblue border-4 border-darkblue rounded-2xl p-1"> | ||
<option value="en">{t("footer.en")}</option> | ||
<option value="sv">{t("footer.sw")}</option> | ||
</select> | ||
</div> | ||
</div> | ||
|
||
<div className="bg-steelblue text-center py-2 desktop:text-left desktop:py-0"> | ||
<p className="text-xs text-darkblue md:text-sm">Copyright © 2024 Y Studio Stockholm</p> | ||
</div> | ||
</section> | ||
</footer> | ||
) | ||
} | ||
|
||
/*<div className="bg-steelblue p-6"> | ||
<select name="" id="" value={i18n.language} onChange={(e) => i18n.changeLanguage(e.target.value)} className="bg-steelblue border-none"> | ||
<option value="" disabled selected>{t("footer.select")}</option> | ||
<option value="en">{t("footer.en")}</option> | ||
<option value="sv">{t("footer.sw")}</option> | ||
</select> | ||
</div>*/ | ||
|
||
/*<div className="bg-steelblue text-center sm:text-left p-6"> | ||
<button onClick={() => changeLanguage("en")} className="border-2 border-beige text-beige transition hover:text-darkblue hover:border-darkblue">{t("footer.en")}</button> | ||
<button onClick={() => changeLanguage("sv")} className="border-2 border-beige text-beige transition hover:text-darkblue hover:border-darkblue ml-2">{t("footer.sw")}</button> | ||
</div>*/ | ||
|
||
/*const changeLanguage = (language) => { | ||
i18n.changeLanguage(language) | ||
}*/ | ||
|
||
|
||
/* <option value="" selected disabled>{t("footer.select")}</option>*/ | ||
Comment on lines
+98
to
+116
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't forget to delete not used code and comments |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
import { useState } from "react"; | ||
|
||
export const Booking = () => { | ||
const [selectedDateTime, setSelectedDateTime] = useState(null); | ||
const [showDropdown, setShowDropdown] = useState(false); | ||
|
||
const handleDateTimeSelection = (date, time) => { | ||
const dateTime = `${date} at ${time}`; | ||
setSelectedDateTime(dateTime); | ||
setShowDropdown(false); | ||
}; | ||
|
||
const toggleDropdown = () => { | ||
setShowDropdown(!showDropdown); | ||
}; | ||
|
||
return ( | ||
<div className="w-fit-content flex flex-col mt-24 items-start text-darkblue z-3"> | ||
<div> | ||
<div className="mb-2 lg:mb-4 font-Roboto font-semibold text-2xl md:text-4xl lg:text-4xl xl:text-4xl"> | ||
Find your power | ||
</div> | ||
|
||
<div className="mb-4 lg:mb-5 font-roboto text-xl md:text-2xl lg:text-2xl">Anywhere. Anytime.</div> | ||
<div className="relative inline-block"> | ||
<button | ||
onClick={toggleDropdown} | ||
className="py-2 px-4 bg-darkblue text-white rounded-full font-roboto font-semibold text-sm lg:text-base xl:text-lg" | ||
> | ||
{selectedDateTime ? `Book for ${selectedDateTime}` : "Book now"} | ||
</button> | ||
|
||
{showDropdown && ( | ||
<div className="absolute top-10 bg-white shadow-md rounded-md py-2 mt-1"> | ||
{/* Date picker */} | ||
<input | ||
type="date" | ||
onChange={(e) => | ||
handleDateTimeSelection(e.target.value, e.target.value) | ||
} | ||
className="cursor-pointer py-1 px-4 hover:bg-gray-200" | ||
/> | ||
{/* Time picker */} | ||
<select | ||
onChange={(e) => | ||
handleDateTimeSelection( | ||
e.target.parentElement.firstChild.value, | ||
e.target.value | ||
) | ||
} | ||
className="cursor-pointer py-1 px-4 hover:bg-gray-200" | ||
> | ||
<option value="">Select time</option> | ||
<option value="9:00 AM">9:00 AM</option> | ||
<option value="11:00 AM">11:00 AM</option> | ||
<option value="2:00 PM">2:00 PM</option> | ||
</select> | ||
Comment on lines
+35
to
+57
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Where is this function used? I cannot book anything 😢 |
||
</div> | ||
)} | ||
</div> | ||
</div> | ||
</div> | ||
); | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import { Booking } from "./Booking" | ||
import { Top } from "./Top" | ||
|
||
export const Header = () => { | ||
return ( | ||
<div className="top-0 w-full h-screen flex flex-col box-border bg-cover bg-center bg-no-repeat" style={{ | ||
backgroundImage: `url('/assets/main-image.svg')`, | ||
}}> | ||
<Top /> | ||
<div className="absolute bottom-1/2 left-1/4"> | ||
<Booking /> | ||
</div> | ||
</div> | ||
) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
import searchIcon from '/assets/search-icon.svg' | ||
import menuIcon from '/assets/menu-icon.svg' | ||
|
||
export const Top = () => { | ||
return ( | ||
<div className="z-2 flex flex-row justify-between items-center m-4 box-border"> | ||
<div className="flex flex-col justify-center items-center text-darkblue"> | ||
<div className="text-4xl md:7xl lg:text-8xl font-medium font-Roboto">Y</div> | ||
<div className="text-sm md:text-2xl lg:text-3xl font-Roboto">Studio</div> | ||
</div> | ||
|
||
<div className="flex"> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this div can be left out |
||
<div className="flex flex-row gap-5"> | ||
<div className="cursor-pointer"> | ||
<img src={searchIcon} alt="search-icon" className="w-6 md:w-8 lg:w-10" /> | ||
</div> | ||
<div className="cursor-pointer"> | ||
<img src={menuIcon} alt="menu-icon" className="w-6 md:w-8 lg:w-10" /> | ||
</div> | ||
</div> | ||
</div> | ||
</div> | ||
|
||
)} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is actually super cool! Even cooler if you had implemented for the whole page and not only limited for the footer 😉