MediaWiki:Gadget-GrAnnotations.js: Difference between revisions
No edit summary |
No edit summary |
||
| Line 81: | Line 81: | ||
' </button>', | ' </button>', | ||
' <button class="gra-fab-btn gra-fab-btn-dismiss" id="gra-fab-dismiss" type="button" aria-label="Dismiss">', | ' <button class="gra-fab-btn gra-fab-btn-dismiss" id="gra-fab-dismiss" type="button" aria-label="Dismiss">', | ||
' <span class="gra-icon gra-icon-dismiss" aria-hidden="true"></span>', | ' <span class="gra-icon gra-icon-dismiss" aria-hidden="true">\u2715</span>', | ||
' <span class="gra-fab-btn-label">Close</span>', | ' <span class="gra-fab-btn-label">Close</span>', | ||
' </button>', | ' </button>', | ||
| Line 123: | Line 123: | ||
$ntComposer = $( [ | $ntComposer = $( [ | ||
'<div class="gra-composer" id="gra-nt-composer" role="dialog" aria-label="Add note">', | '<div class="gra-composer" id="gra-nt-composer" role="dialog" aria-label="Add note">', | ||
' <div class="gra | ' <div class="gra-composer-user">', | ||
' < | ' <div class="gra-avatar">' + esc(currentUser ? userInitial : '✎') + '</div>', | ||
' < | ' <div class="gra-composer-uname">' + esc(currentUser || 'Notes') + '</div>', | ||
' </div>', | ' </div>', | ||
' <textarea class="gra-composer-input" id="gra-nt-input" placeholder="Write a note…" rows="3"></textarea>', | ' <textarea class="gra-composer-input" id="gra-nt-input" placeholder="Write a note…" rows="3"></textarea>', | ||
' <div class="gra-composer-actions">', | ' <div class="gra-composer-actions">', | ||
' <button class="gra-btn-cancel" id="gra-nt-cancel">Cancel</button>', | ' <button class="gra-btn-cancel" id="gra-nt-cancel">Cancel</button>', | ||
' <button class="gra-btn-submit" id="gra-nt-submit" disabled>Save</button>', | ' <button class="gra-btn-submit" id="gra-nt-submit" disabled>Save Note</button>', | ||
' </div>', | ' </div>', | ||
'</div>', | '</div>', | ||
| Line 140: | Line 140: | ||
' <div class="gra-bm-composer-label">', | ' <div class="gra-bm-composer-label">', | ||
' <span class="gra-icon gra-icon-bookmark" aria-hidden="true"></span>', | ' <span class="gra-icon gra-icon-bookmark" aria-hidden="true"></span>', | ||
' | ' Save bookmark', | ||
' </div>', | ' </div>', | ||
' <input class="gra-composer-input" id="gra-bm-input" type="text" placeholder="Name this bookmark…" autocomplete="off">', | ' <input class="gra-composer-input" id="gra-bm-input" type="text" placeholder="Name this bookmark…" autocomplete="off">', | ||
| Line 472: | Line 472: | ||
html += '<div class="gra-note-card" data-gra-id="'+esc(n.id)+'">' | html += '<div class="gra-note-card" data-gra-id="'+esc(n.id)+'">' | ||
+ '<div class="gra-card-header">' | + '<div class="gra-card-header">' | ||
+ '< | + '<div class="gra-avatar">✎</div>' | ||
+ '<div class="gra-card-meta">' | + '<div class="gra-card-meta">' | ||
+ (n.ts ? '<div class="gra-card-ts">'+esc(fmtTs(n.ts))+'</div>' : '') | + (n.ts ? '<div class="gra-card-ts">'+esc(fmtTs(n.ts))+'</div>' : '') | ||
| Line 545: | Line 545: | ||
}); | }); | ||
/* Mobile: show fab | /* Separate timers so mobile + desktop never clobber each other */ | ||
var _selTimer = null; /* desktop debounce */ | |||
var _mobShowTimer = null; /* mobile show-on-touchend */ | |||
/* Mobile: show fab quickly after finger lifts (selection settled). | |||
180ms feels instant while still letting the range stabilise. */ | |||
document.addEventListener('touchend', function(e) { | document.addEventListener('touchend', function(e) { | ||
if (!_mobile) return; | if (!_mobile) return; | ||
if ($fab[0] && $fab[0].contains(e.target)) return; | if ($fab[0] && $fab[0].contains(e.target)) return; | ||
clearTimeout(_mobShowTimer); | |||
clearTimeout( | _mobShowTimer = setTimeout(function() { | ||
var sel = window.getSelection(); | var sel = window.getSelection(); | ||
if (!sel || sel.isCollapsed || !sel.toString().trim()) return; | if (!sel || sel.isCollapsed || !sel.toString().trim()) return; | ||
tryShowActions(); | tryShowActions(); | ||
}, | }, 180); | ||
}, { passive: true }); | }, { passive: true }); | ||
/* Mobile: | /* Mobile: only HIDE the fab when selection is cleared while it's visible. | ||
(Reposition isn't needed now that the bar is docked, and re-running | |||
showFab here was causing the lag/flicker.) */ | |||
document.addEventListener('selectionchange', function() { | document.addEventListener('selectionchange', function() { | ||
if (!_mobile) return; | if (!_mobile) return; | ||
if (!$fab.hasClass('gra-fab-visible')) return; | if (!$fab.hasClass('gra-fab-visible')) return; | ||
var sel = window.getSelection(); | |||
if (!sel || sel.isCollapsed || !sel.toString().trim()) { | |||
clearTimeout(_mobShowTimer); | |||
hideActions(); | |||
} | |||
} | |||
}); | }); | ||
/* selectionchange debounced (desktop) */ | /* selectionchange debounced (desktop only) */ | ||
document.addEventListener('selectionchange', function() { | document.addEventListener('selectionchange', function() { | ||
if (_mobile) return; | |||
_selVersion++; | _selVersion++; | ||
clearTimeout(_selTimer); | clearTimeout(_selTimer); | ||
| Line 582: | Line 584: | ||
if (v !== _selVersion) return; | if (v !== _selVersion) return; | ||
if (_fabSelVer === v) return; | if (_fabSelVer === v) return; | ||
tryShowActions(); | tryShowActions(); | ||
}, 600); | }, 600); | ||