gukgjzkgjhgjh

This commit is contained in:
2026-04-20 00:04:15 +02:00
parent 5280a87e8b
commit 659999f4fd
409 changed files with 19957 additions and 5176 deletions

View 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>
)
}

View 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); }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB