diff --git a/src/canvas/canvas.css b/src/canvas/canvas.css index 8f321d2..e6eea98 100644 --- a/src/canvas/canvas.css +++ b/src/canvas/canvas.css @@ -76,10 +76,20 @@ font-family: inherit; font-size: inherit; padding: 0.15em 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.card-title--empty { + opacity: 0.35; +} + +.card-title--editing { cursor: text; } -.card-title::placeholder { +.card-title--editing::placeholder { color: var(--text); opacity: 0.35; } diff --git a/src/canvas/cards/CardHeader.tsx b/src/canvas/cards/CardHeader.tsx index 82647a4..52ce6aa 100644 --- a/src/canvas/cards/CardHeader.tsx +++ b/src/canvas/cards/CardHeader.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect, useRef, useState } from "react"; interface Props { title: string; @@ -9,16 +9,45 @@ interface Props { } export function CardHeader({ title, placeholder, onTitleChange, onClose, dragProps }: Props) { + const [editing, setEditing] = useState(false); + const inputRef = useRef(null); + + useEffect(() => { + if (editing && inputRef.current) { + inputRef.current.focus(); + inputRef.current.select(); + } + }, [editing]); + + const beginEdit = (e: React.MouseEvent) => { + e.preventDefault(); + setEditing(true); + }; + return ( -
- onTitleChange(e.target.value)} - onPointerDown={(e) => e.stopPropagation()} - /> +
+ {editing ? ( + onTitleChange(e.target.value)} + onBlur={() => setEditing(false)} + onKeyDown={(e) => { + if (e.key === "Enter" || e.key === "Escape") { + e.preventDefault(); + setEditing(false); + } + }} + onPointerDown={(e) => e.stopPropagation()} + /> + ) : ( + + {title || placeholder} + + )}