Versie 0.2.0

This commit is contained in:
Atreides Assets committed 2026-10-29 11:57:29 +01:00
commit e77d8fd373
495 files changed
+81026

No files matched your search

+46
View File
@@ -0,0 +1,46 @@
// Generated, do not edit. sha256:6afcbeb7660ad5dcdb3d575aeb4495b0e547e5f54ce5b5f18abe560cc6fb7b7e
const FOCUS_ANCHORS = ['data-field', 'data-convert', 'data-save', 'data-cancel'];
const SELECTION_TYPES = new Set(['text', 'search', 'url', 'tel', 'password']);
function hasSelection(node) {
if (!node) return false;
if (node.tagName === 'TEXTAREA') return true;
return node.tagName === 'INPUT' && SELECTION_TYPES.has(node.type);
}
function focusAnchor(node) {
for (const attr of FOCUS_ANCHORS) {
const host = node.closest(`[${attr}]`);
if (!host) continue;
const value = host.getAttribute(attr);
return { sel: value ? `[${attr}="${value}"]` : `[${attr}]`, node: host };
}
return null;
}
export function captureFocus(el, editing) {
if (!editing) return null;
const active = document.activeElement;
if (!active || !el.contains(active)) return null;
const anchor = focusAnchor(active);
if (!anchor) return null;
if (!hasSelection(anchor.node)) return { sel: anchor.sel, start: null, end: null };
return { sel: anchor.sel, start: anchor.node.selectionStart, end: anchor.node.selectionEnd };
}
export function restoreFocus(el, snap) {
if (!snap) return;
const field = el.querySelector(snap.sel);
if (!field || typeof field.focus !== 'function') return;
field.focus({ preventScroll: true });
if (snap.start == null || !hasSelection(field)) return;
try { field.setSelectionRange(snap.start, snap.end); } catch { }
}
const FOCUSABLE = 'input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled])';
export function focusFirstField(el) {
const row = el.querySelector('[data-edit-row]');
if (!row) return;
const field = row.querySelector(FOCUSABLE) || el.querySelector(`.edit-expand-row ${FOCUSABLE}`);
if (field) field.focus();
}