Merge pull request #1 from buildspace/redesign

Redesign
This commit is contained in:
Alec Dilanchian authored and GitHub committed 2022-11-22 21:24:29 -05:00
commit 9a2ba5438e
4 files changed
+420 -145

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

+1
View File
@@ -1,4 +1,5 @@
import './styles.css'; import './styles.css';
const App = ({ Component, pageProps }) => { const App = ({ Component, pageProps }) => {
return <Component {...pageProps} />; return <Component {...pageProps} />;
}; };
+68 -46
View File
@@ -12,6 +12,8 @@ const Home = () => {
}; };
const generateAction = useCallback(async () => { const generateAction = useCallback(async () => {
if (isGenerating) return;
setIsGenerating(true); setIsGenerating(true);
const response = await fetch('/api/generate', { const response = await fetch('/api/generate', {
method: 'POST', method: 'POST',
@@ -29,60 +31,80 @@ const Home = () => {
); );
setIsGenerating(false); setIsGenerating(false);
}, [input]); }, [input, isGenerating]);
useEffect(() => {
const keydownHandler = async (event) => {
if ((event.metaKey || event.ctrlKey) && event.code === 'Enter') {
event.preventDefault();
await generateAction();
}
};
window.addEventListener('keydown', keydownHandler);
return () => {
window.removeEventListener('keydown', keydownHandler);
};
}, [generateAction]);
return ( return (
<div className="root"> <div className="root">
<div className="container"> <div className="container">
<div className="content"> <div className="header">
<div className="header"> <div className="header-title">
<p className="header-title">Scratchpad</p> <h1>GPT-3</h1>
<p className="header-subtitle"> <h1>Writer</h1>
Write your first song in the style of your favorite artist.
</p>
</div> </div>
<div className="text-container"> <div className="header-subtitle">
<textarea <h2>Write your first song in the style of your favorite artist.</h2>
className="text-area"
placeholder="write some lyrics here to get started"
value={input}
onChange={onChange}
/>
<textarea
className="text-area text-area-output"
placeholder="your lyrics and song titles will go here"
value={output}
disabled
/>
</div> </div>
<button </div>
className="generate-button" <div className="prompt-container">
onClick={generateAction} <textarea className="prompt-box" value={input} onChange={onChange} />
disabled={isGenerating} <div className="prompt-buttons">
> <div className="key-stroke">
{isGenerating ? ( <p>cmd/ctrl + enter</p>
<div class="lds-ring"> </div>
<div></div> <div className="or">
<div></div> <p>OR</p>
<div></div> </div>
<div></div> <a
className={
isGenerating ? 'generate-button loading' : 'generate-button'
}
onClick={generateAction}
>
<div className="generate">
{isGenerating ? <span class="loader"></span> : <p>Generate</p>}
</div> </div>
) : ( </a>
<p>Generate</p> </div>
)}
</button>
</div>
<div className="footer">
<Image src={buildspaceLogo} width={25} alt="buildspace logo" />
<p>build on</p>
<a
href="https://buildspace.so/builds/ai-writer"
target="_blank"
rel="noreferrer"
>
buildspace
</a>
</div> </div>
{output && (
<div className="output">
<div className="output-header-container">
<div className="output-header">
<h3>Output</h3>
</div>
</div>
<div className="output-content">
<p>{output}</p>
</div>
</div>
)}
</div>
<div className="badge-container grow">
<a
href="https://buildspace.so/builds/ai-writer"
target="_blank"
rel="noreferrer"
>
<div className="badge">
<Image src={buildspaceLogo} alt="buildspace logo" />
<p>build with buildspace</p>
</div>
</a>
</div> </div>
</div> </div>
); );
+351 -99
View File
@@ -1,158 +1,410 @@
@import url('https: //fonts.googleapis.com/css?family=Manrope&display=swap');
body { body {
margin: 0; margin: 0;
font-family: SF Pro Display, Inter, serif; padding: 0;
font-family: 'Manrope', sans-serif;
} }
.root { .root {
display: flex; display: flex;
min-height: 100vh; place-content: center flex-start;
background-color: #fff; align-items: center;
font-family: SF Pro Display, background-color: rgb(0, 0, 0);
serif; flex-flow: column nowrap;
gap: 10px;
height: 100vh;
overflow: scroll;
padding: 0px;
position: relative;
} }
.container { .container {
display: flex; display: flex;
width: 100%; place-content: center flex-start;
flex-direction: column;
justify-content: center;
align-items: center;
}
.content {
display: flex;
flex-direction: column;
width: 50%;
height: 100%;
color: #000;
justify-content: center;
align-items: center; align-items: center;
flex: 0 0 auto;
flex-flow: column nowrap;
gap: 10px;
height: fit-content;
max-width: 1200px;
overflow: scroll;
padding: 50px;
position: relative;
width: auto;
gap: 64px;
} }
.header { .header {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
width: 100%;
align-items: center; align-items: center;
color: #FFF
} }
.header-title { .header-title {
font-weight: bold; display: flex;
font-size: 2.5rem; gap: 12px;
}
.header-title h1 {
width: 100%;
font-weight: 700;
font-size: 72px;
letter-spacing: -4px;
line-height: 1.2em;
margin: 0; margin: 0;
padding-top: 1em;
letter-spacing: -0.04em;
} }
.header-subtitle { .header-title h1:last-child {
text-align: center; color: rgb(255, 79, 18)
font-size: 1rem;
} }
.text-container { .header-subtitle h2 {
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 1.4em;
color: rgba(255, 255, 255, 0.75);
}
.prompt-container {
place-content: flex-end center;
align-items: center;
display: flex;
flex: 0 0 auto;
flex-flow: column nowrap;
gap: 16px;
height: min-content;
padding: 0px;
width: min-content;
}
.prompt-box {
border-bottom-width: 1px;
border-color: rgba(255, 255, 255, 0.1);
border-left-width: 1px;
border-right-width: 1px;
border-style: solid;
border-top-width: 1px;
place-content: flex-start;
align-items: flex-start;
background-color: rgba(255, 255, 255, 0.05);
border-radius: 16px;
display: flex;
flex: 0 0 auto;
flex-flow: column nowrap;
gap: 10px;
height: 150px;
overflow: hidden;
padding: 20px;
position: relative;
width: 610px;
max-width: 1200px;
will-change: transform;
overflow: auto;
outline: none;
resize: none;
font-family: "Manrope", serif;
font-size: 16px;
font-style: normal;
font-weight: 600;
letter-spacing: 0px;
line-height: 1.6em;
text-align: start;
color: rgba(255, 255, 255, 0.75);
text-decoration: none;
text-transform: none;
}
.prompt-box:focus {
border-color:rgba(255, 255, 255, 0.75)
}
.prompt-buttons {
display: flex;
place-content: center;
align-items: center;
justify-content: flex-end;
flex: 0 0 auto;
flex-flow: row nowrap;
gap: 12px;
height: min-content;
overflow: hidden;
padding: 0px;
position: relative;
width: 100%;
}
.key-stroke {
outline: none;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: flex-start;
align-items: center; flex-shrink: 0;
width: 100% transform: none;
} }
.text-area { .key-stroke p {
font-family: SF Pro Display, color: rgba(255, 255, 255, 0.75);
serif; flex: 0 0 auto;
color: #000; height: auto;
width: 100%;
height: 75px;
font-size: 14px;
border-radius: 5px;
margin-top: 10px;
margin-bottom: 10px;
padding: 5px;
background-color: #EDF2F7;
border-color: rgba(118, 118, 118, 0.3);
border-width: 2px;
}
.text-area-output {
position: relative; position: relative;
height: 250px; white-space: pre;
width: auto;
}
.or {
outline: none;
display: flex;
flex-direction: column;
justify-content: flex-start;
flex-shrink: 0;
transform: none;
}
.or p {
color: rgba(255, 255, 255, 0.25)
} }
.generate-button { .generate-button {
width: 40%; place-content: flex-start;
font-family: Inter, align-items: flex-start;
sans-serif; background-color: rgb(255, 79, 18);
border-radius: 5px; border-radius: 100px;
padding-top: 10px; display: flex;
padding-bottom: 10px; flex: 0 0 auto;
padding-left: 10px; flex-flow: column nowrap;
padding-right: 10px; gap: 10px;
margin-top: 20px; height: min-content;
border-style: none; overflow: hidden;
padding: 16px 24px;
position: relative;
text-decoration: none;
width: min-content;
will-change: transform;
cursor: pointer; cursor: pointer;
font-weight: bold;
font-size: 14px;
} }
.generate-button p { .generate {
outline: none;
display: flex;
flex-direction: column;
justify-content: flex-start;
flex-shrink: 0;
transform: none;
}
.generate p {
color: rgb(255, 255, 255);
margin: 0; margin: 0;
} }
.generate-button:disabled { .loading {
background-color: #d2d2d2; opacity: 0.7;
cursor: default;
} }
.footer { .badge-container {
display: flex;
bottom: 20px;
flex: 0 0 auto;
height: auto;
left: 20px;
position: fixed;
width: auto;
z-index: 1;
}
.badge-container a {
border-bottom-width: 1px;
border-color: rgba(255, 255, 255, 0.1);
border-left-width: 1px;
border-right-width: 1px;
border-style: solid;
border-top-width: 1px;
background-color: rgb(0, 0, 0);
border-radius: 54.3478% / 238.095%;
filter: grayscale(1);
transform: none;
transform-origin: 50% 50% 0px;
font-size: 14px;
font-weight: 700;
letter-spacing: -0.5px;
line-height: 1em;
color: #fff;
padding: 12px;
text-decoration: none;
}
.badge {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center;
padding: 10px;
} }
.footer p { .badge img {
padding-left: 5px; width: 21px;
height: 17px;
image-rendering: pixelated;
flex-shrink: 0;
fill: black;
color: black;
transform: none;
transform-origin: 50% 50% 0px;
padding-right: 5px;
} }
.footer a { .badge p {
margin: 0;
}
.grow {
transition: all .2s ease-in-out;
}
.grow:hover {
transform: scale(1.1);
}
.output {
place-content: center flex-start;
align-items: center;
display: flex;
flex: 0 0 auto;
flex-flow: column nowrap;
gap: 10px;
height: min-content;
max-width: 1200px;
overflow: hidden;
position: relative;
width: 100%;
}
.output-header-container {
place-content: center;
align-items: center;
display: flex;
flex: 0 0 auto;
flex-flow: column nowrap;
gap: 16px;
height: min-content;
overflow: hidden;
padding: 0px;
position: relative;
width: 100%;
}
.output-header h3 {
font-family: "Manrope", serif;
font-size: 28px;
font-style: normal;
font-weight: 800;
letter-spacing: 0px;
line-height: 1.4em;
text-align: start;
color: #ffffff;
text-decoration: none; text-decoration: none;
font-weight: 500; text-transform: none;
color:#63b3ed; margin: 0;
padding-left: 5px;
} }
.output-content {
outline: none;
display: flex;
/* max-width: 25%; */
flex-direction: column;
justify-content: flex-start;
flex-shrink: 0;
transform: none;
}
.output-content p {
text-align: center;
white-space: pre-line;
color: rgba(255, 255, 255, 0.5);
}
@media (min-width: 810px) and (max-width: 1199px) {
.container {
max-width: 600px;
width: 100%;
}
.prompt-container {
max-width: 600px;
width: 100%;
}
.prompt-box {
width: 100%;
}
}
@media (max-width: 809px) {
.container {
max-width: 500px;
width: 100%;
}
.prompt-container {
max-width: 500px;
width: 100%;
}
.prompt-box {
width: 100%;
}
}
@media (max-width: 600px) {
.container {
max-width: 400px;
width: 100%;
}
.header-title h1 {
font-size: 50px;
}
.header-subtitle h2 {
text-align: center;
}
.key-stroke, .or {
display: none;
}
.prompt-buttons {
justify-content: center;
}
.prompt-container {
max-width: 400px;
width: 100%;
}
.prompt-box {
width: 100%;
}
}
/* Loading ring animation */ /* Loading ring animation */
.lds-ring { .loader {
display: inline-block;
position: relative;
width: px;
height: 20px;
}
.lds-ring div {
box-sizing: border-box;
display: block;
position: absolute;
width: 18px; width: 18px;
height: 18px; height: 18px;
margin: 4px;
border: 2px solid #000;
border-radius: 50%; border-radius: 50%;
animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; display: inline-block;
border-color: #000 transparent transparent transparent; border-top: 2px solid #FFF;
border-right: 2px solid transparent;
box-sizing: border-box;
animation: rotation 1s linear infinite;
} }
.lds-ring div:nth-child(1) { @keyframes rotation {
animation-delay: -0.45s;
}
.lds-ring div:nth-child(2) {
animation-delay: -0.3s;
}
.lds-ring div:nth-child(3) {
animation-delay: -0.15s;
}
@keyframes lds-ring {
0% { 0% {
transform: rotate(0deg); transform: rotate(0deg);
} }