50 lines
2.3 KiB
JavaScript
50 lines
2.3 KiB
JavaScript
/* DONA_REPLY_FLOATING_V1: carte texte latérale sans recouvrir le moteur d'animations. */
|
|
(() => {
|
|
'use strict';
|
|
if (window.__donaReplyFloatingV1) return;
|
|
window.__donaReplyFloatingV1 = true;
|
|
|
|
function setup() {
|
|
const main = document.getElementById('alfredMainV1');
|
|
const stage = document.getElementById('stage');
|
|
const content = document.getElementById('content');
|
|
if (!main || !stage || !content) return;
|
|
|
|
let queued = false;
|
|
function isRich() {
|
|
// Les vues calendrier/météo, cartes, vidéo, images et modules spécialisés
|
|
// conservent la grande scène et tous leurs contrôles.
|
|
if (content.classList.contains('alfred-view')) return true;
|
|
if (content.querySelector('.alfred-view,.view-pane,.cards,.hero,iframe,video,canvas,img,table,.dona-dynamic-grid,.dona-dynamic-dashboard,[data-dona-rich]')) return true;
|
|
if (content.querySelector('.dh-response')) return false;
|
|
const nodes = [...content.children];
|
|
return !nodes.length || nodes.some(n => !['H1','H2','H3','P','PRE','BLOCKQUOTE'].includes(n.tagName));
|
|
}
|
|
function update() {
|
|
queued = false;
|
|
const focused = main.classList.contains('is-focused');
|
|
const compact = focused && !isRich();
|
|
const expanded = compact && content.querySelector('.dh-more[aria-expanded="true"]') !== null;
|
|
stage.classList.toggle('dona-reply-compact', compact);
|
|
stage.classList.toggle('dona-reply-expanded', expanded);
|
|
main.classList.toggle('dona-reply-background-visible', compact && !expanded);
|
|
stage.setAttribute('data-dona-reply-mode', compact ? (expanded ? 'expanded':'compact') : 'full');
|
|
}
|
|
function queue() {
|
|
if (queued) return;
|
|
queued = true;
|
|
requestAnimationFrame(update);
|
|
}
|
|
new MutationObserver(queue).observe(content, {childList:true,subtree:true,attributes:true,attributeFilter:['aria-expanded','class']});
|
|
new MutationObserver(queue).observe(main, {attributes:true,attributeFilter:['class']});
|
|
// Le renderer transforme parfois la réponse brute en carte au frame suivant.
|
|
window.alfredSocket?.on('alfred_render', queue);
|
|
stage.addEventListener('click', e => {
|
|
if (e.target.closest('.dh-more')) setTimeout(queue, 0);
|
|
});
|
|
queue();
|
|
}
|
|
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', setup, {once:true});
|
|
else setup();
|
|
})();
|