feat: add combined codebase
This commit is contained in:
34
src/components/PollTitle.ts
Normal file
34
src/components/PollTitle.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import * as Y from "yjs";
|
||||
|
||||
export function PollTitle(ydoc: Y.Doc, yTitle: Y.Text): HTMLElement {
|
||||
const wrapper = document.createElement("div");
|
||||
wrapper.className = "poll-title-wrapper";
|
||||
|
||||
const input = document.createElement("input");
|
||||
input.type = "text";
|
||||
input.id = "poll-title";
|
||||
input.className = "poll-title-input";
|
||||
input.placeholder = "Untitled Poll";
|
||||
input.maxLength = 120;
|
||||
input.setAttribute("aria-label", "Poll title");
|
||||
input.value = yTitle.toString();
|
||||
|
||||
wrapper.appendChild(input);
|
||||
|
||||
// Sync from Yjs → input (only when not focused to avoid cursor jump)
|
||||
yTitle.observe(() => {
|
||||
if (document.activeElement !== input) {
|
||||
input.value = yTitle.toString();
|
||||
}
|
||||
});
|
||||
|
||||
// Sync from input → Yjs
|
||||
input.addEventListener("input", () => {
|
||||
ydoc.transact(() => {
|
||||
yTitle.delete(0, yTitle.length);
|
||||
yTitle.insert(0, input.value);
|
||||
});
|
||||
});
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
Reference in New Issue
Block a user