Animated Hello Kitty Wink

๐Ÿถ๐Ÿพ

    [css] height ๊ธธ์ด ๋Š˜๋ ธ์„ ๋•Œ, ์œ„์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ๋Š˜์–ด๋‚˜๊ฒŒ ํ•˜๊ธฐ

    ๋ฌธ์ œ ๋ง‰๋Œ€๊ทธ๋ž˜ํ”„(?)์ฒ˜๋Ÿผ ์œ„์ชฝ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค๊ณ ์ž ํ–ˆ๋Š”๋ฐ height๊ธธ์ด๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ๋Š˜์–ด๋‚˜์„œ ์œ„์น˜๋ฅผ ๋งž์ถ”๊ธฐ ์‰ฝ์ง€ ์•Š์•˜๋‹ค (height๊ธธ์ด๊ฐ€ props์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ์Œ) ๋‚ด๊ฐ€ ์ฒดํฌํ•œ ๊ฐœ์ˆ˜๋งŒํผ ๊ทธ๋ž˜ํ”„์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ ธ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ค€์ด ์•„๋ž˜์ชฝ์ด ๋˜์–ด์•ผํ–ˆ์Œ ํ•ด๊ฒฐ transform: scaleY(-1); transform-origin: top; ์š”์†Œ์˜ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์š”์†Œ๋ฅผ ์ˆ˜์ง์œผ๋กœ ๋’ค์ง‘์–ด ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋ฉด heigth๋ฅผ ๋Š˜๋ ธ์„๋•Œ ์œ„์ชฝ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    [react] div ํฌ๊ธฐ content ๊ธธ์ด์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ

    ๋ฌธ์ œ {field} {date} navigate(`/edit/${date}`)} /> ๐Ÿ“ {title} {content} PostConatiner๊ฐ€ ํ•˜์–€์ƒ‰ ๋ฐ•์Šค์ผ ๋•Œ, content์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ์„ธ๋กœ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ ธ์•ผํ–ˆ๋‹ค. ํ•ด๊ฒฐ const textBoxRef = useRef(null); useEffect(() => { if (textBoxRef.current) { const textBoxHeight = textBoxRef.current.clientHeight + 70; const container = document.getElementById("PostsContaioner"); if (container) { container.style.height = `${textBoxHeight}px`; } } }, [..

    [redux] react์—์„œ redux-toolkit ์‚ฌ์šฉ

    ๊ฐœ์ธํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ๋„ ๊ณ„์† props๋กœ ์—ฐ๊ฒฐ-์—ฐ๊ฒฐํ•ด์„œ ๋„˜๊ฒจ์•ผํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ท€์ฐฎ์Œ๊ณผ .. ๊ทธ๋ ‡๊ฒŒ ๊ณ„์† ์ž์‹์œผ๋กœ ๋„˜๊ธฐ๋‹ค๋ณด๋‹ˆ ์—ฐ๊ด€๋˜์ง€ ์•Š์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋“ค๊นŒ์ง€ ๋ฆฌ๋žœ๋”๋ง์ด ๋˜์–ด์•ผํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌธ์ œ๋ฅผ ๋Š๋ผ๊ณ  ์žˆ๋Š” ์™€์ค‘ ์ƒํ™œ์ฝ”๋”ฉ ๋ฆฌ๋•์Šค ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜๊ณ , ์ด์–ด ๋ฆฌ๋•์Šค ํˆดํ‚ท๊นŒ์ง€ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค. redux - js ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - store๋ผ๋Š” ํ•˜๋‚˜๋ฟ์ธ ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„ - action์„ ํ†ตํ•ด์„œ ์ƒํƒœ ๋ณ€๊ฒฝ - ๋ณ€๊ฒฝ์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ๋งŒ ๊ฐ€๋Šฅ ๐ŸŒŸ store ์ƒํƒœ๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” ํ•˜๋‚˜์˜ ๊ณต๊ฐ„ ๐ŸŒŸ action store์— ์šด๋ฐ˜ํ•  ๋ฐ์ดํ„ฐ ๐ŸŒŸ reducer action์„ reducer๊ฐ€ ๋ฐ›์•„ store์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ๐ŸŒŸ dispatch store์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ action์„ ๋ฐœ์ƒ์‹œํ‚ด ac..

    [pocketBase] pocketBase ์‚ฌ์šฉ

    ์œ ํŠœ๋ธŒ ๋ณด๋‹ค๊ฐ€ "๋‹จ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•"์ด๋ผ๋Š” ํƒ€์ดํ‹€๋กœ pocketBase์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์˜ฌ๋ผ์™€์„œ ๋ณด๋‹ˆ๊นŒ ํฅ๋ฏธ๊ฐ€ ์ƒ๊ฒจ์„œ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ๊ฒฐ์ • ! ํ˜ผ์ž ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์•˜๋‹ค ์‚ฌ์šฉ ์ „ ๋‹ค์šด๋กœ๋“œ pocketBase Docs์— ๊ฐ€์„œ ์šด์˜์ฒด์ œ์— ๋งž์ถฐ ๋‹ค์šด๋กœ๋“œ ๋‹ค์šด๋ฐ›์€ ํŒŒ์ผ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด ./pocketbase serve ์˜ค๋ฅ˜ ?! (mac) ๊ทธ๋Ÿฐ๋ฐ.. 'pocketbase'์€(๋Š”) Apple์—์„œ ์•…์„ฑ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค... ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์•„๋ž˜ ์ฒ˜๋Ÿผ ์„ค์ •์— ๋“ค์–ด๊ฐ€์„œ ๊ทธ๋ž˜๋„ ํ—ˆ์šฉ์„ ํด๋ฆญ ๊ทธ ๋’ค์— ๋‹ค์‹œ ์ณ๋ณด๋‹ˆ ์ด๋ ‡๊ฒŒ ์ž˜ ๋œฌ๋‹ค ๐Ÿฅณ ์‚ฌ์šฉ admin http://127.0.0.1:8090/_/ ๋“ค์–ด๊ฐ€๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์ € ์ปฌ๋ ‰์…˜์ด ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ์ƒํƒœ์—..

    [styled-components] styled-components ์žฌ์‚ฌ์šฉ & props

    ์ปดํฌ๋„ŒํŠธ ํ™•์žฅ(์žฌ์‚ฌ์šฉ)ํ•˜๊ธฐ ๋ฒ„ํŠผ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ ๋ฒ„ํŠผ์„ ์žฌ์‚ฌ์šฉํ•ด ๊ธ€์žํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋ฒ„ํŠผ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ const SimpleBtn = syteld.button` color:white; background-color:green; `; const LargeBtn = styeld(SimpleBtn)` font-size: 50px; `; ๊ด„ํ˜ธ () ์•ˆ์— ๋„ฃ์–ด์คŒ์œผ๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ LargeBtn์€ color, background-color๋ฅผ ์ƒ์†(?) ๋ฐ›๊ฒŒ ๋จ Props ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ const ReactBtn = styled.button` color: ${(props)=> props.primary? "white" : "black"} `; // 1. Normal // 2. Primary 1์€ pr..

    [style-components] props ์˜ค๋ฅ˜

    ๋ฌธ์ œ Warning: React does not recognize the isVisible prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase isVisible instead. If you accidentally passed it from a parent component, remove it from the DOM element. {work.workDeadline < today ? "๋งˆ๊ฐ๋‚ ์งœ๊ฐ€ ์ง€๋‚œ todo์ž…๋‹ˆ๋‹ค !" : work.workDeadline === today ? "์˜ค๋Š˜๊นŒ์ง€ ๋๋‚ด์•ผํ•˜๋Š” todo์ž…๋‹ˆ๋‹ค !" : null} const Dead..

    [css] cursor ๋ณ€๊ฒฝ

    cursor๋ฅผ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์คฌ๋‹ค ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ ๋˜์ง€ ์•Š์„๊ฒฝ์šฐ ๋’ค์— auto๋กœ ์‹คํ–‰๋œ๋‹ค cursor: url("/public/images/cur.png"), auto; โœ”๏ธ ์ด๋ฏธ์ง€ ์ ์šฉ์ด ์•ˆ๋  ๊ฒฝ์šฐ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ 128px์ดํ•˜์—ฌ์•ผ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•˜๋‹ˆ๊นŒ ์ด๊ฑฐ ๊ผญ ํ™•์ธ ! ๊ฒฝ๋กœ ํ™•์ธ ! ๋‚˜๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ ์šฉ์ด ์•ˆ๋˜์—ˆ์—ˆ๋‹ค ๐Ÿ˜… ๐Ÿ’ญ ๋งŒ๋“ค์–ด์ง„ ์ปค์„œ ์ด์šฉ https://www.cursors-4u.com/cursor/2009/11/11/animated-hello-kitty-wink.html Animated Hello Kitty Wink Cursor Option #1 - Universal CSS/HTML Code This CSS/HTML Code of Animated ..

    [css] Animate.css ์‚ฌ์šฉ

    https://animate.style/ Animate.css | A cross-browser library of CSS animations. Animate.css is a library of ready-to-use, cross-browser animations for you to use in your projects. Great for emphasis, home pages, sliders, and attention-guiding hints. animate.style ์‚ฌ์ดํŠธ์—์„œ ๋‹ค์–‘ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์›ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋‚ด ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ! ์„ค์น˜ npm install animate.css --save ์ ์šฉ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ์„ ์œ„ํ•œ js ํŒŒ์ผ์— import 'animate.cs..

    [react] ์ƒˆ๋กœ๊ณ ์นจํ•ด์•ผ ๊ฒŒ์‹œ๋ฌผ ๋œจ๋Š” ๋ฌธ์ œ

    ๋ฌธ์ œ ๋กœ๊ทธ์ธ / ๋กœ๊ทธ์•„์›ƒ์„ firebase ์ธ์ฆ์„ ํ†ตํ•ด ํ•˜๊ณ , user ์ •๋ณด์— ๋”ฐ๋ผ ๋‚ด๊ฐ€ ์“ด ๊ธ€๋งŒ ๋ณด์—ฌ์•ผํ•˜๋Š”๋ฐ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์ด์ „ ๋กœ๊ทธ์ธ์„ ํ–ˆ๋˜ user์˜ ๊ฒŒ์‹œ๊ธ€์ด ๋ณด์ด๊ณ  ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด์•ผ ๊ทธ๋•Œ๋ถ€ํ„ฐ ์ง€๊ธˆ user๊ฐ€ ์“ด ๊ฒŒ์‹œ๋ฌผ์ด ๋ณด์ž„ ํ•ด๊ฒฐ ๊ทธ๋ƒฅ .. user๋ฅผ state๋กœ ๊ด€๋ฆฌ๋ฅผ ์•ˆํ•œ๊ฑฐ์˜€์Œ ๐Ÿ˜ฎ‍๐Ÿ’จ ๋˜ user๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ useEffect dep์— user๋ฅผ ์ถ”๊ฐ€ํ•ด์คฌ์–ด์•ผํ–ˆ๋‹ค ๐Ÿ˜จ // const user = JSON.parse(localStorage.getItem("user")); ์ด๋ ‡๊ฒŒ ๋˜์–ด์žˆ์—ˆ์Œ const [user, setUser] = useState(JSON.parse(localStorage.getItem("user"))); const uid = user && user...