gukgjzkgjhgjh
This commit is contained in:
85
frontend/src/components/home/ContactMe/ContactMeForm.tsx
Normal file
85
frontend/src/components/home/ContactMe/ContactMeForm.tsx
Normal file
@@ -0,0 +1,85 @@
|
||||
import React, { useState, useRef } from "react"
|
||||
import styles from "./contact-me.module.css"
|
||||
import { LuMousePointerClick } from "react-icons/lu";
|
||||
|
||||
export default function ContactMeForm() {
|
||||
const [opened, setOpened] = useState(false)
|
||||
const [contentMoveUp, setContentMoveUp] = useState(false)
|
||||
const [openingBehind, setOpeningBehind] = useState(false)
|
||||
// const [success, setSuccess] = useState(false)
|
||||
const openingRef = useRef<HTMLDivElement>(null)
|
||||
|
||||
function handleSubmit() {
|
||||
// form submission logic here
|
||||
}
|
||||
|
||||
const toggleOpen = () => {
|
||||
if (!opened) {
|
||||
setOpened(true)
|
||||
setOpeningBehind(false)
|
||||
setContentMoveUp(false)
|
||||
// Wait for the rotate-opening animation to finish before moving content up
|
||||
// The actual moveUp will be handled in onTransitionEnd
|
||||
} else {
|
||||
setContentMoveUp(false)
|
||||
setOpeningBehind(false)
|
||||
setTimeout(() => setOpened(false), 1000) // match transition duration
|
||||
}
|
||||
}
|
||||
|
||||
const handleTransitionEnd = (e: React.TransitionEvent<HTMLDivElement>) => {
|
||||
if (opened && e.propertyName === "transform") {
|
||||
setContentMoveUp(true)
|
||||
setTimeout(() => setOpeningBehind(true), 10)
|
||||
}
|
||||
if (!opened && e.propertyName === "transform") {
|
||||
setOpeningBehind(false)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
<div className={styles["contact-me"]}>
|
||||
<div
|
||||
ref={openingRef}
|
||||
className={
|
||||
[
|
||||
styles.opening,
|
||||
opened ? styles["rotate-opening"] : "",
|
||||
openingBehind ? styles["opening-behind"] : ""
|
||||
].filter(Boolean).join(" ")
|
||||
}
|
||||
onClick={toggleOpen}
|
||||
onTransitionEnd={handleTransitionEnd}
|
||||
>
|
||||
<LuMousePointerClick/>
|
||||
</div>
|
||||
|
||||
<div
|
||||
className={[
|
||||
styles.content,
|
||||
contentMoveUp ? styles["content-moveup"] : ''
|
||||
].filter(Boolean).join(' ')}
|
||||
>
|
||||
<form onSubmit={handleSubmit}>
|
||||
<input
|
||||
type="email"
|
||||
name="email"
|
||||
placeholder="Váš email"
|
||||
required
|
||||
/>
|
||||
<textarea
|
||||
name="message"
|
||||
placeholder="Vaše zpráva"
|
||||
required
|
||||
/>
|
||||
<input type="hidden" name="state" />
|
||||
<input type="submit"/>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div className={styles.cover}></div>
|
||||
<div className={styles.triangle}></div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
161
frontend/src/components/home/ContactMe/contact-me.module.css
Normal file
161
frontend/src/components/home/ContactMe/contact-me.module.css
Normal file
@@ -0,0 +1,161 @@
|
||||
.contact-me {
|
||||
margin: 15em auto;
|
||||
margin-top: 15em;
|
||||
margin-bottom: 3em;
|
||||
position: relative;
|
||||
aspect-ratio: 16 / 9;
|
||||
background: var(--c-background-light);
|
||||
max-width: 100vw;
|
||||
border: 2px solid var(--c-lines);
|
||||
border-radius: 0.75em;
|
||||
width: 30em;
|
||||
}
|
||||
/* .mail-box sibling styles were unused; removed to satisfy linter */
|
||||
|
||||
.contact-me .opening {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 2;
|
||||
transform-origin: top;
|
||||
padding-top: 4em;
|
||||
clip-path: polygon(0 0, 100% 0, 50% 50%);
|
||||
background: linear-gradient(135deg, var(--c-boxes), var(--c-other));
|
||||
transition: transform 1s ease, background 0.5s ease;
|
||||
text-align: center;
|
||||
color: var(--c-text);
|
||||
}
|
||||
.rotate-opening{
|
||||
background: linear-gradient(135deg, var(--c-background-light), var(--c-boxes));
|
||||
transform: rotateX(180deg);
|
||||
}
|
||||
|
||||
.opening svg{
|
||||
margin: auto;
|
||||
font-size: 3em;
|
||||
margin-top: -0.5em;
|
||||
}
|
||||
|
||||
|
||||
.contact-me .content {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
z-index: 1;
|
||||
transition: all 1s ease-out;
|
||||
}
|
||||
.content-moveup{
|
||||
transform: translateY(-70%);
|
||||
}
|
||||
.content-moveup-index { z-index: 2 !important; }
|
||||
|
||||
.contact-me .content form{
|
||||
width: 90%;
|
||||
display: flex;
|
||||
gap: 1em;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
justify-content: center;
|
||||
margin: auto;
|
||||
background: color-mix(in hsl, var(--c-background-light), transparent 35%);
|
||||
backdrop-filter: blur(6px);
|
||||
padding: 1.5em;
|
||||
border: 0.35em dashed var(--c-lines);
|
||||
border-radius: 0.75em;
|
||||
color: var(--c-text);
|
||||
}
|
||||
.contact-me .content form div{
|
||||
width: -webkit-fill-available;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.contact-me .content form input[type=submit]{
|
||||
margin: auto;
|
||||
border: none;
|
||||
background: linear-gradient(135deg, var(--c-other), var(--c-boxes));
|
||||
color: var(--c-text);
|
||||
padding: 0.85em 1.5em;
|
||||
cursor: pointer;
|
||||
border-radius: 0.75em;
|
||||
font-weight: 600;
|
||||
box-shadow: 0 0 12px -3px rgba(112,162,136,0.5);
|
||||
transition: transform 0.2s ease, box-shadow 0.3s ease;
|
||||
}
|
||||
.contact-me .content form input[type=submit]:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 0 20px -2px rgba(112,162,136,0.65);
|
||||
}
|
||||
|
||||
.contact-me .content form input[type=text],
|
||||
.contact-me .content form input[type=email],
|
||||
.contact-me .content form textarea{
|
||||
background: var(--c-background-light);
|
||||
border: 1px solid var(--c-lines);
|
||||
padding: 0.6em 0.75em;
|
||||
border-radius: 0.5em;
|
||||
color: var(--c-text);
|
||||
}
|
||||
.contact-me .content form input[type=text]::placeholder,
|
||||
.contact-me .content form input[type=email]::placeholder,
|
||||
.contact-me .content form textarea::placeholder{ color: color-mix(in srgb, var(--c-lines), white 25%); }
|
||||
|
||||
.opening-behind { z-index: 0 !important; }
|
||||
|
||||
.contact-me .cover {
|
||||
border-radius: 1em;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 2;
|
||||
clip-path: polygon(0 0, 50% 50%, 100% 0, 100% 100%, 0 100%);
|
||||
background: var(--c-background);
|
||||
}
|
||||
.contact-me .triangle{
|
||||
border-radius: 1em;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 3;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
clip-path: polygon(100% 0, 0 100%, 100% 100%);
|
||||
background: linear-gradient(135deg, var(--c-boxes), var(--c-background-light));
|
||||
}
|
||||
|
||||
@keyframes shake {
|
||||
0% { transform: translateX(0); }
|
||||
25% { transform: translateX(-2px) rotate(-8deg); }
|
||||
50% { transform: translateX(2px) rotate(4deg); }
|
||||
75% { transform: translateX(-1px) rotate(-2deg); }
|
||||
100% { transform: translateX(0); }
|
||||
}
|
||||
|
||||
|
||||
.contact-me .opening i {
|
||||
color: #797979;
|
||||
font-size: 5em;
|
||||
display: inline-block;
|
||||
animation: 0.4s ease-in-out 2s infinite normal none running shake;
|
||||
animation-delay: 2s;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@media only screen and (max-width: 990px){
|
||||
.contact-me{
|
||||
aspect-ratio: unset;
|
||||
margin-top: 3ch;
|
||||
background: transparent;
|
||||
border: none;
|
||||
}
|
||||
.contact-me .opening,
|
||||
.contact-me .cover,
|
||||
.contact-me .triangle { display: none; }
|
||||
.contact-me .content { position: relative; width: 100%; transform: none !important; }
|
||||
.contact-me .content form { backdrop-filter: none; border: 1px solid var(--c-lines); }
|
||||
}
|
||||
BIN
frontend/src/components/home/ContactMe/readme.png
Normal file
BIN
frontend/src/components/home/ContactMe/readme.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 61 KiB |
Reference in New Issue
Block a user