feat: unit descriptions with tooltip action and admin textarea
This commit is contained in:
40
src/lib/actions/tooltip.ts
Normal file
40
src/lib/actions/tooltip.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* Svelte action: show a native `title` tooltip after a 500ms hover delay.
|
||||
* If text is empty, does nothing.
|
||||
*/
|
||||
export function tooltip(node: HTMLElement, text: string) {
|
||||
let timer: ReturnType<typeof setTimeout> | null = null;
|
||||
|
||||
function enter() {
|
||||
if (!text) return;
|
||||
timer = setTimeout(() => {
|
||||
node.title = text;
|
||||
}, 500);
|
||||
}
|
||||
|
||||
function leave() {
|
||||
if (timer !== null) {
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
}
|
||||
node.removeAttribute('title');
|
||||
}
|
||||
|
||||
node.addEventListener('mouseenter', enter);
|
||||
node.addEventListener('mouseleave', leave);
|
||||
|
||||
return {
|
||||
update(newText: string) {
|
||||
text = newText;
|
||||
// If title is currently set, update it immediately
|
||||
if (node.title) {
|
||||
node.title = newText || '';
|
||||
}
|
||||
},
|
||||
destroy() {
|
||||
if (timer !== null) clearTimeout(timer);
|
||||
node.removeEventListener('mouseenter', enter);
|
||||
node.removeEventListener('mouseleave', leave);
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user