Files
Alfredv2/alfred/app/static/js/dona-reply-floating-v1.js
T
2026-11-01 15:01:22 +01:00

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();
})();