v2.2 - Small improvement Interface change
This commit is contained in:
@@ -0,0 +1 @@
|
||||
:root{color-scheme:dark;font-family:Inter,system-ui,-apple-system,'Segoe UI',sans-serif;color:#f3f7fe;background:#09121d}*{box-sizing:border-box}body{margin:0;min-height:100vh;background:linear-gradient(180deg,#06131fbf,#0a1526c7),url('/static/img/alfred-ambience.webp') center/cover fixed no-repeat}button,input{font:inherit}a{color:inherit;text-decoration:none}.dv-head{display:flex;justify-content:space-between;align-items:center;gap:15px;flex-wrap:wrap;padding:18px clamp(16px,3vw,45px);background:#07132096;border-bottom:1px solid #d3e3fd23;backdrop-filter:blur(18px)}.dv-brand{display:flex;align-items:center;gap:14px}.dv-initial{font-weight:900;font-size:53px;line-height:1;background:linear-gradient(120deg,#a3e4ff,#0875fb);background-clip:text;color:transparent}.dv-brand strong{font-size:24px;display:block}.dv-brand small{color:#aec3dc;font-size:12px}.dv-head nav{display:flex;flex-wrap:wrap;gap:5px}.dv-head nav a{padding:9px 11px;border-radius:9px;font-size:13px;color:#c8d9ed}.dv-head nav a:hover,.dv-head nav a.active{background:#1a6cb6a6;color:white}.dv-main{max-width:1550px;margin:auto;padding:27px clamp(14px,3vw,44px)}.dv-eyebrow{font-size:11px;color:#7cbeff;font-weight:800;letter-spacing:.13em}.dv-intro{display:flex;justify-content:space-between;gap:22px;align-items:end;margin-bottom:22px}.dv-intro h1{font-size:clamp(28px,3vw,43px);margin:4px 0}.dv-intro p:not(.dv-eyebrow){color:#bacbe0;font-size:14px;max-width:790px}.dv-panel{padding:20px;border:1px solid #cfebff36;border-radius:19px;background:rgba(11,24,41,.49);backdrop-filter:blur(19px);box-shadow:0 18px 55px #0003}.dv-layout{display:grid;grid-template-columns:minmax(260px,365px) minmax(0,1fr);gap:17px}.dv-section-title{display:flex;justify-content:space-between;align-items:center;gap:12px}.dv-section-title h2{margin:2px 0 15px;font-size:19px}.dv-muted,.dv-footnote{font-size:13px;color:#bad0e4;line-height:1.6}.dv-tasks{display:flex;flex-direction:column;gap:9px;margin-top:17px}.dv-task{text-align:left;width:100%;background:#061b31a8;border:1px solid #a2c5e73d;border-radius:11px;padding:13px;cursor:pointer;color:white}.dv-task:hover,.dv-task.selected{background:#1261aa60;border-color:#8cc9ff}.dv-task strong,.dv-task small{display:block}.dv-task strong{line-height:1.4}.dv-task small{margin-top:7px;color:#9fbdda}button{background:#145c9fb3;border:1px solid #92c3ec80;color:white;border-radius:11px;padding:10px 15px;cursor:pointer}button:hover{background:#2676bd}button:disabled{opacity:.45;cursor:default}.dv-primary{background:#176bc8}.dv-empty{border:1px dashed #acd4f864;border-radius:12px;padding:28px;color:#a9c5de}.dv-detail h3{font-size:20px;margin:5px 0}.dv-detail h4{font-size:13px;color:#badcfb;letter-spacing:.04em;margin-bottom:10px}.dv-checks{display:grid;gap:8px}.dv-check{font-size:13px;padding:9px 12px;border-radius:9px;background:#051627ba;border-left:3px solid #44cba2}.dv-check.fail{border-color:#f5a37d}.dv-diff{max-height:47vh;overflow:auto;white-space:pre;tab-size:2;background:#030e1be8;border:1px solid #a6cbe13e;border-radius:11px;padding:17px;color:#d9ecff;font:12px/1.6 ui-monospace,SFMono-Regular,Consolas,monospace}.dv-actions{display:flex;gap:11px;flex-wrap:wrap;margin-top:18px}.dv-next{margin-top:15px;border-radius:12px;padding:15px;background:#071f32c9;border:1px solid #40a7ee64}.dv-next code{display:block;padding:10px;margin-top:10px;overflow-x:auto;color:#a5d6ff}.dv-footnote{margin-top:19px}.dv-section-title span{font-size:12px;color:#91d0ff}.dv-panel form{display:flex;gap:10px;flex-wrap:wrap}.dv-panel input{padding:10px 12px;background:#061629;border:1px solid #a5cfed6b;border-radius:10px;color:white}#dvMessage{color:#e8c8a3}#dvMessage.ok{color:#86e6bf}:focus-visible{outline:2px solid #90d0ff;outline-offset:2px}@media(max-width:920px){.dv-layout{grid-template-columns:1fr}.dv-intro{align-items:start;flex-direction:column}.dv-head nav{width:100%}}
|
||||
@@ -0,0 +1,23 @@
|
||||
/* ALFRED_HERMES_NEW_SESSION_V1 — habillage Glass, compatible avec le menu V1/V2. */
|
||||
#avHermesNewSession {cursor:pointer;}
|
||||
.av-hermes-session-dialog {
|
||||
position:fixed; inset:0; margin:auto; width:min(520px,calc(100vw - 28px));
|
||||
max-height:calc(100dvh - 32px);overflow:auto;color:#eef6ff;
|
||||
border:1px solid rgba(174,210,246,.36);border-radius:19px;
|
||||
background:linear-gradient(145deg,rgba(18,37,58,.94),rgba(7,19,36,.96));
|
||||
box-shadow:0 22px 65px rgba(0,0,0,.55);backdrop-filter:blur(22px);
|
||||
padding:0;z-index:2147483640;
|
||||
}
|
||||
.av-hermes-session-dialog::backdrop {background:rgba(2,8,19,.67);backdrop-filter:blur(4px);}
|
||||
.av-hermes-session-content {display:flex;flex-direction:column;gap:16px;padding:27px;margin:0;}
|
||||
.av-hermes-session-content h2 {font-size:23px;color:#f4f9ff;margin:0;}
|
||||
.av-hermes-session-content p {font-size:14px;line-height:1.6;margin:0;color:#d1deed;}
|
||||
.av-hermes-session-note {font-size:12px!important;color:#a8c0d6!important;}
|
||||
.av-hermes-session-message {min-height:18px;color:#89d9af!important;}
|
||||
.av-hermes-session-message.is-error {color:#ffb7b7!important;}
|
||||
.av-hermes-session-actions {display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap;}
|
||||
.av-hermes-session-actions button,.av-hermes-session-login {border-radius:11px;padding:11px 16px;font-weight:600;font-size:13px;cursor:pointer;}
|
||||
.av-hermes-session-secondary {background:rgba(255,255,255,.10);color:white;border:1px solid rgba(255,255,255,.22);}
|
||||
.av-hermes-session-primary,.av-hermes-session-login {background:#268ce8;color:white;border:1px solid rgba(119,198,255,.45);}
|
||||
.av-hermes-session-login {align-self:flex-start;text-decoration:none;}
|
||||
.av-hermes-session-actions button:disabled {opacity:.45;cursor:wait;}
|
||||
@@ -0,0 +1,73 @@
|
||||
/* ALFRED_REPONSE_CLOSE_V1 — actions toujours au-dessus du contenu rendu par Hermes. */
|
||||
.alfred-glass-theme #stage {
|
||||
padding-top: clamp(76px, 9vh, 104px) !important;
|
||||
position: fixed;
|
||||
}
|
||||
.alfred-glass-theme #stage .av-reponse-actions {
|
||||
position: absolute;
|
||||
top: clamp(14px, 2.2vh, 25px);
|
||||
right: clamp(15px, 2vw, 31px);
|
||||
z-index: 32;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
pointer-events: auto;
|
||||
}
|
||||
/* #avBack est déplacé hors de .alfred-main-v1 pour éviter son contexte d'empilement. */
|
||||
.alfred-glass-theme #stage #avBack.av-reponse-home,
|
||||
.alfred-glass-theme #stage .av-reponse-close {
|
||||
position: static !important;
|
||||
inset: auto !important;
|
||||
transform: none !important;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 9px;
|
||||
min-height: 43px;
|
||||
padding: 10px 16px;
|
||||
border: 1px solid rgba(181, 218, 248, .47);
|
||||
border-radius: 13px;
|
||||
background: rgba(18, 42, 65, .93);
|
||||
color: #f6fbff;
|
||||
font: 600 13px/1.2 Inter, ui-sans-serif, system-ui, sans-serif;
|
||||
letter-spacing: 0;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 6px 18px rgba(0, 5, 15, .4);
|
||||
-webkit-backdrop-filter: blur(12px);
|
||||
backdrop-filter: blur(12px);
|
||||
opacity: 1 !important;
|
||||
visibility: visible !important;
|
||||
}
|
||||
.alfred-glass-theme #stage #avBack.av-reponse-home[hidden] { display: none !important; }
|
||||
.alfred-glass-theme #stage .av-reponse-close {
|
||||
width: 43px;
|
||||
min-width: 43px;
|
||||
padding: 9px;
|
||||
border-radius: 50%;
|
||||
background: rgba(37, 51, 70, .96);
|
||||
}
|
||||
.alfred-glass-theme #stage .av-reponse-close svg,
|
||||
.alfred-glass-theme #stage #avBack.av-reponse-home svg {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
.alfred-glass-theme #stage .av-reponse-close:hover,
|
||||
.alfred-glass-theme #stage #avBack.av-reponse-home:hover {
|
||||
background: rgba(21, 103, 169, .98);
|
||||
border-color: #9ed7ff;
|
||||
}
|
||||
.alfred-glass-theme #stage .av-reponse-close:focus-visible,
|
||||
.alfred-glass-theme #stage #avBack.av-reponse-home:focus-visible {
|
||||
outline: 3px solid #83d1ff;
|
||||
outline-offset: 3px;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
.alfred-glass-theme #stage { padding-top: 88px !important; }
|
||||
.alfred-glass-theme #stage .av-reponse-actions { top: 12px; right: 12px; gap: 7px; }
|
||||
.alfred-glass-theme #stage #avBack.av-reponse-home,
|
||||
.alfred-glass-theme #stage .av-reponse-close { font-size: 12px; padding: 8px 11px; min-height: 40px; }
|
||||
.alfred-glass-theme #stage .av-reponse-close { width: 40px; min-width: 40px; padding: 8px; }
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
/* ALFRED_STT_INLINE_GLASS_V1 — transcription en texte libre au-dessus de la vague.
|
||||
Charge apres alfred-main-v1.css et alfred-main-v2.css. */
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on {
|
||||
display:flex !important;
|
||||
flex-direction:column !important;
|
||||
align-items:center !important;
|
||||
justify-content:center !important;
|
||||
gap:0 !important;
|
||||
overflow:hidden;
|
||||
}
|
||||
/* Ancien aside STT : aucun cadre, aucune position flottante. */
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero .transcript-panel.av-stt-inline {
|
||||
position:relative !important;
|
||||
inset:auto !important;
|
||||
left:auto !important; right:auto !important; top:auto !important; bottom:auto !important;
|
||||
transform:none !important;
|
||||
order:0;
|
||||
z-index:3 !important;
|
||||
display:flex !important;
|
||||
flex-direction:column !important;
|
||||
align-items:center !important;
|
||||
justify-content:center !important;
|
||||
flex:0 0 auto;
|
||||
width:min(920px,96%) !important;
|
||||
max-width:96% !important;
|
||||
min-height:0 !important;
|
||||
height:auto !important;
|
||||
margin:0 auto !important;
|
||||
padding:0 8px !important;
|
||||
border:0 !important;
|
||||
border-radius:0 !important;
|
||||
outline:0 !important;
|
||||
background:transparent !important;
|
||||
box-shadow:none !important;
|
||||
backdrop-filter:none !important;
|
||||
-webkit-backdrop-filter:none !important;
|
||||
opacity:1 !important;
|
||||
text-align:center;
|
||||
pointer-events:none;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .panel-heading {
|
||||
min-height:0 !important;
|
||||
width:100%;
|
||||
display:flex;
|
||||
align-items:center;
|
||||
justify-content:center;
|
||||
flex-wrap:wrap;
|
||||
gap:8px 14px;
|
||||
margin:0 0 4px !important;
|
||||
padding:0 !important;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .panel-title {
|
||||
display:inline-flex;
|
||||
align-items:center;
|
||||
gap:7px;
|
||||
color:rgba(209,226,247,.83);
|
||||
font-size:clamp(10px,.85vw,13px) !important;
|
||||
font-weight:650;
|
||||
letter-spacing:.08em;
|
||||
text-shadow:0 2px 9px #0008;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .stt-indicator {background:#5e94df;}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline[data-active="true"] .stt-indicator {background:#61dfc4;}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .transcript-state {
|
||||
color:#87c9ff !important;
|
||||
font-size:clamp(10px,.85vw,12px);
|
||||
font-weight:650;
|
||||
white-space:nowrap;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .transcript-text {
|
||||
display:-webkit-box;
|
||||
-webkit-box-orient:vertical;
|
||||
-webkit-line-clamp:2;
|
||||
line-clamp:2;
|
||||
overflow:hidden !important;
|
||||
width:100%;
|
||||
max-height:3.1em !important;
|
||||
margin:0 !important;
|
||||
color:#f0f7ff !important;
|
||||
font-size:clamp(13px,1.18vw,18px) !important;
|
||||
font-weight:450;
|
||||
line-height:1.45 !important;
|
||||
text-align:center;
|
||||
text-shadow:0 2px 13px rgba(0,0,0,.85);
|
||||
overflow-wrap:anywhere;
|
||||
opacity:1 !important;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .transcript-text.is-placeholder {
|
||||
color:rgba(205,223,243,.62) !important;
|
||||
}
|
||||
/* Vague et messages existants sous la transcription. Le canvas reste original. */
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on .av-wave-host {
|
||||
position:relative !important;
|
||||
inset:auto !important;
|
||||
left:auto !important; top:auto !important;
|
||||
transform:none !important;
|
||||
order:1;
|
||||
z-index:1;
|
||||
flex:0 0 clamp(46px,5.3vw,72px);
|
||||
align-self:center;
|
||||
width:min(800px,90%) !important;
|
||||
height:clamp(46px,5.3vw,72px) !important;
|
||||
margin:0 auto !important;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on .av-wave-host #wave,
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on .av-wave-host canvas {
|
||||
height:100% !important;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on .av-voice-controls {
|
||||
position:relative !important;
|
||||
inset:auto !important;
|
||||
order:2;
|
||||
min-height:0 !important;
|
||||
height:auto !important;
|
||||
flex:0 0 auto;
|
||||
padding-top:0 !important;
|
||||
margin:0 !important;
|
||||
align-self:center !important;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on .av-voice-center {
|
||||
min-width:0 !important;
|
||||
}
|
||||
/* Mode et messages d'etat, volontairement inchanges. */
|
||||
@media (max-width:1100px) {
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on {
|
||||
min-height:215px !important;
|
||||
}
|
||||
}
|
||||
@media (max-width:600px) {
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on {
|
||||
min-height:200px !important;
|
||||
padding:8px 0;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero .transcript-panel.av-stt-inline {
|
||||
width:100% !important; max-width:100% !important;
|
||||
}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .panel-heading {gap:3px 8px;}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .panel-title {font-size:10px !important;letter-spacing:.03em;}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline .transcript-text {font-size:13px !important;}
|
||||
.alfred-glass-theme .alfred-main-v1 .av-voice-hero.av-stt-inline-on .av-wave-host {
|
||||
width:100% !important;
|
||||
flex-basis:50px;
|
||||
height:50px !important;
|
||||
}
|
||||
}
|
||||
@media(prefers-reduced-motion:reduce) {
|
||||
.alfred-glass-theme .alfred-main-v1 .av-stt-inline {transition:none !important;}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
/* DONA_HOLOGRAPHIC_V1
|
||||
* Thème transversal non destructif. Les contrôleurs et APIs existants restent les mêmes.
|
||||
* Chargement APRÈS les feuilles Glass, y compris les correctifs précédents.
|
||||
*/
|
||||
:root { color-scheme:dark; --dh-white:#f1f4ff;--dh-muted:#a8b8d3;--dh-border:rgba(155,183,234,.23);--dh-panel:rgba(4,10,22,.81);--dh-blue:#5796ff;--dh-teal:#74e6d4;--dh-purple:#ab78ff;--dh-orange:#ffae73;--dh-shadow:0 24px 72px rgba(0,0,0,.38); }
|
||||
html {scrollbar-color:#596b8c #060a14;}
|
||||
body.dona-holo-v1 { color:var(--dh-white); background-color:#070913!important; background-image:
|
||||
radial-gradient(ellipse 35% 39% at 3% 70%,rgba(251,101,44,.5),transparent 95%),
|
||||
radial-gradient(ellipse 36% 52% at 96% 26%,rgba(18,125,236,.42),transparent 85%),
|
||||
radial-gradient(ellipse 42% 35% at 50% 0%,rgba(119,68,173,.31),transparent 90%),
|
||||
radial-gradient(ellipse 24% 32% at 82% 94%,rgba(243,97,42,.29),transparent 92%),
|
||||
linear-gradient(125deg,#070810,#0a1020 54%,#090914) !important;
|
||||
background-attachment:fixed!important; }
|
||||
body.dona-holo-v1::before{content:"";position:fixed;z-index:0;inset:-10%;pointer-events:none;
|
||||
background:radial-gradient(ellipse at 12% 18%,rgba(56,111,251,.17),transparent 33%),radial-gradient(ellipse at 78% 65%,rgba(227,100,165,.15),transparent 32%);
|
||||
filter:blur(68px);animation:dh-ambient 19s ease-in-out infinite alternate;}
|
||||
body.dona-holo-v1::after{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
|
||||
background:linear-gradient(90deg,rgba(1,5,13,.13),rgba(1,5,13,.45) 43%,rgba(1,5,13,.18));}
|
||||
@keyframes dh-ambient {0%{transform:translate(-1.5%,0)}100%{transform:translate(2%,1.4%)}}
|
||||
/* Écrans d'administration, qui utilisent des conteneurs et feuilles CSS différents. */
|
||||
body.dona-holo-v1 :is(.admin-layout,.id-shell,.id-wrap,.id-layout,.dv-main,.lv-layout,.lg-layout,.log-layout,.logs-layout){position:relative;z-index:1;}
|
||||
body.dona-holo-v1 .alfred-main-v1{z-index:1;}
|
||||
/* Priorité au panneau noir central de la maquette. Le décor reste diffus en périphérie. */
|
||||
body.dona-holo-v1 .alfred-main-v1 .av-head {background:transparent!important;}
|
||||
body.dona-holo-v1 .alfred-main-v1 .av-logo {background:linear-gradient(145deg,#95c2ff,#5187ff 55%,#c58bff);background-clip:text;-webkit-background-clip:text;color:transparent;filter:drop-shadow(0 1px 18px #4486ff73);}
|
||||
body.dona-holo-v1 .alfred-main-v1 .av-brand small{color:#c4cde1;}
|
||||
body.dona-holo-v1 .alfred-main-v1 .av-round{background:rgba(5,9,22,.74)!important;border:1px solid rgba(155,174,224,.24)!important;box-shadow:inset 0 1px rgba(255,255,255,.04);}
|
||||
body.dona-holo-v1 .alfred-main-v1 .av-round[aria-pressed="true"]{background:rgba(108,28,58,.75)!important;border-color:rgba(255,116,151,.66)!important;}
|
||||
body.dona-holo-v1 .alfred-main-v1 .av-summary{gap:clamp(9px,1.05vw,18px);}
|
||||
body.dona-holo-v1 .alfred-main-v1 .av-stat-card{color:var(--dh-white)!important;
|
||||
background:linear-gradient(140deg,rgba(6,13,31,.79),rgba(8,16,34,.68))!important;
|
||||
border:1px solid rgba(126,157,227,.24)!important;border-radius:22px!important;
|
||||
box-shadow:0 12px 44px #01051255,inset 0 1px #ffffff0a!important;
|
||||
backdrop-filter:blur(20px) saturate(120%)!important;-webkit-backdrop-filter:blur(20px) saturate(120%)!important;
|
||||
transition:transform .2s,border-color .2s,box-shadow .2s;}
|
||||
body.dona-holo-v1 .alfred-main-v1 .av-stat-card:hover{transform:translateY(-2px);border-color:#8bb9ff83!important;box-shadow:0 14px 45px #0206128b,0 0 23px #336ce22c!important;background:rgba(10,21,42,.85)!important;}
|
||||
body.dona-holo-v1 .av-circle{background:#1e376566;color:#94c9ff;}
|
||||
body.dona-holo-v1 .av-circle.ai{background:#492b7a80;color:#d2b3ff;}
|
||||
body.dona-holo-v1 .av-weather{background:linear-gradient(140deg,rgba(12,28,44,.74),rgba(8,19,37,.8))!important;}
|
||||
body.dona-holo-v1 .av-shortcuts button{background:rgba(5,10,24,.82)!important;border:1px solid rgba(151,177,221,.27)!important;border-radius:21px!important;box-shadow:inset 0 1px rgba(255,255,255,.035);}
|
||||
body.dona-holo-v1 .av-shortcuts button:hover{background:#102344e6!important;border-color:#65a1ff82!important;}
|
||||
body.dona-holo-v1 .av-shortcuts .a-icon{color:#a9c6ff;}
|
||||
body.dona-holo-v1 .av-status-line{background:rgba(6,11,27,.65);border-color:rgba(157,186,229,.23);}
|
||||
body.dona-holo-v1 .av-wave-host canvas{filter:drop-shadow(0 0 9px rgba(91,137,255,.65))!important;}
|
||||
/* La réponse qui était une énorme div pleine page devient une scène avec cartes vivantes. */
|
||||
body.dona-holo-v1.alfred-glass-theme #stage {top:clamp(93px,11vh,128px)!important;right:clamp(12px,2vw,34px)!important;bottom:clamp(12px,2.3vh,30px)!important;left:clamp(12px,2vw,34px)!important;
|
||||
background:linear-gradient(146deg,rgba(2,5,13,.97),rgba(3,7,18,.96) 55%,rgba(6,10,26,.95))!important;
|
||||
border:1px solid rgba(154,180,231,.25)!important;border-radius:clamp(18px,2vw,31px)!important;
|
||||
padding:clamp(60px,8vh,100px) clamp(14px,3vw,46px) clamp(14px,3vh,28px)!important;
|
||||
box-shadow:0 36px 95px rgba(0,0,0,.55),inset 0 1px #d7dfff0d;
|
||||
display:flex!important;align-items:center!important;justify-content:center!important;overflow:auto!important;}
|
||||
body.dona-holo-v1.alfred-glass-theme #stage #content{width:min(1300px,100%)!important;max-width:none!important;max-height:none!important;min-height:0!important;overflow:visible!important;margin:auto;}
|
||||
body.dona-holo-v1.alfred-glass-theme #stage .av-reponse-actions {top:16px!important;right:20px!important;}
|
||||
body.dona-holo-v1.alfred-glass-theme #stage :is(#avBack.av-reponse-home,.av-reponse-close){background:rgba(17,27,51,.91)!important;border:1px solid #9bb9ec55!important;color:#f4f7ff!important;border-radius:15px!important;}
|
||||
body.dona-holo-v1.alfred-glass-theme #stage .av-reponse-close{border-radius:50%!important;}
|
||||
/* Réponse illustrée construite sur les données déjà présentes dans la réponse Hermes.
|
||||
Les éléments ne sont pas des chiffres simulés : un métrique n'apparaît que s'il est cité. */
|
||||
#content .dh-response{display:grid;grid-template-columns:minmax(250px,1.12fr) minmax(300px,.95fr);gap:clamp(12px,1.6vw,22px);align-items:stretch;min-width:0;}
|
||||
#content .dh-primary{position:relative;min-width:0;min-height:335px;display:flex;flex-direction:column;gap:20px;
|
||||
padding:clamp(22px,2.3vw,36px);border:1px solid rgba(96,142,255,.72);border-radius:24px;
|
||||
background:linear-gradient(135deg,rgba(13,30,62,.9),rgba(6,14,31,.89) 62%,rgba(15,36,42,.82));
|
||||
box-shadow:inset 0 1px #ffffff12,0 0 23px #3976fc2b,0 20px 35px #0004;}
|
||||
#content .dh-primary:before{content:"";position:absolute;inset:-1px;pointer-events:none;border-radius:24px;background:linear-gradient(120deg,#5b83ff33,transparent 44%,#72e8cd17);opacity:.7;}
|
||||
#content .dh-kicker{display:flex;align-items:center;gap:11px;font-size:11px!important;color:#a9bee6!important;letter-spacing:.16em;font-weight:700;text-transform:uppercase;}
|
||||
#content .dh-kicker:before{content:"";height:9px;width:9px;background:#61a3ff;border-radius:50%;box-shadow:0 0 12px #579cff;}
|
||||
#content .dh-headline{font-size:clamp(21px,2.1vw,33px)!important;letter-spacing:-.025em;font-weight:590;line-height:1.28;color:#f4f6ff;overflow-wrap:anywhere;}
|
||||
#content .dh-excerpt{color:#c8d2e6!important;font-size:clamp(13px,1.02vw,16px)!important;line-height:1.7;white-space:pre-wrap;overflow-wrap:anywhere;flex:1;}
|
||||
#content .dh-more{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:52px;padding:13px 16px;
|
||||
background:rgba(37,58,95,.44);border:1px solid #aac9ff42;border-radius:13px;color:#f0f5ff;font:600 13px/1.3 inherit;cursor:pointer;text-align:left;}
|
||||
#content .dh-more:hover{background:#294b748e;border-color:#95caff92;}
|
||||
#content .dh-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(145px,1fr);gap:14px;min-width:0;}
|
||||
#content .dh-fact{border:1px solid rgba(113,151,218,.35);border-radius:20px;padding:clamp(16px,1.7vw,25px);min-width:0;
|
||||
background:linear-gradient(135deg,rgba(17,34,63,.94),rgba(9,22,48,.85));box-shadow:inset 0 1px #ffffff0d;display:flex;flex-direction:column;gap:8px;}
|
||||
#content .dh-fact:nth-child(3n + 2){border-color:rgba(101,209,189,.29);background:linear-gradient(145deg,rgba(12,38,52,.94),rgba(13,26,45,.85));}
|
||||
#content .dh-fact:nth-child(3n + 3){border-color:rgba(239,150,94,.27);background:linear-gradient(135deg,rgba(45,29,40,.91),rgba(29,22,37,.86));}
|
||||
#content .dh-fact:nth-child(4n){border-color:rgba(167,124,239,.28);background:linear-gradient(135deg,rgba(31,26,60,.94),rgba(16,20,43,.86));}
|
||||
#content .dh-fact-label{font-size:clamp(11px,.85vw,14px)!important;line-height:1.35;color:#c1cee8;}
|
||||
#content .dh-fact-icon{font-size:21px;margin-bottom:6px;opacity:.9;}
|
||||
#content .dh-fact-value{font-size:clamp(19px,2.25vw,36px)!important;font-weight:570;line-height:1.15;color:#f9faff;letter-spacing:-.04em;overflow-wrap:anywhere;}
|
||||
#content .dh-fact-note{font-size:11px!important;color:#93a6c9;line-height:1.5;margin-top:auto;overflow-wrap:anywhere;}
|
||||
#content .dh-tags{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px;}
|
||||
#content .dh-tag{padding:7px 11px;background:rgba(88,111,171,.2);border:1px solid rgba(143,166,218,.24);border-radius:999px;color:#d1daf6;font-size:12px;}
|
||||
#content .dh-full{grid-column:1/-1;border:1px solid rgba(145,174,227,.27);background:rgba(11,20,39,.82);border-radius:18px;padding:20px;}
|
||||
#content .dh-full[hidden]{display:none!important;}
|
||||
#content .dh-full h3{font-size:16px;margin:0 0 12px;color:#deecff;text-align:left;}
|
||||
#content .dh-full-text{white-space:pre-wrap;color:#ced8ea;line-height:1.65;font-size:14px;overflow-wrap:anywhere;}
|
||||
#content .dh-source{font-size:11px;color:#8b9fc1;margin-top:9px;}
|
||||
#content .dh-response:after{content:"";grid-column:1/-1;justify-self:center;width:min(490px,64%);height:3px;
|
||||
background:linear-gradient(90deg,transparent,#3e92fe 30%,#c876f8 55%,#f7a569 73%,transparent);border-radius:50%;box-shadow:0 0 18px 5px #529bff5b;margin:7px 0 0;}
|
||||
/* Les anciens types de cartes émis par les renderers restent pris en charge. */
|
||||
body.dona-holo-v1 #stage #content > .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:17px;text-align:left;}
|
||||
body.dona-holo-v1 #stage #content > .cards .card{padding:24px;border-radius:21px;background:linear-gradient(145deg,#13243ddf,#0a162ce5);border:1px solid #7c9cde57;text-align:left;}
|
||||
body.dona-holo-v1 #stage #content > img.hero {max-height:calc(100dvh - 260px);width:auto;max-width:100%;object-fit:contain;border-radius:16px;}
|
||||
/* Configuration et Surveillance */
|
||||
body.dona-holo-v1.alfred-admin-glass .admin-layout{z-index:1;}
|
||||
body.dona-holo-v1.alfred-admin-glass .ag-rail{background:rgba(3,7,20,.89)!important;border-color:var(--dh-border)!important;}
|
||||
body.dona-holo-v1.alfred-admin-glass .admin-header{background:transparent!important;}
|
||||
body.dona-holo-v1.alfred-admin-glass .brand-orb{background:linear-gradient(135deg,#438bff,#9368fa)!important;border-radius:18px;}
|
||||
body.dona-holo-v1.alfred-admin-glass :is(.panel,.metric-card,.auth-box,.ag-row,.mcp-item){
|
||||
background:linear-gradient(145deg,rgba(5,13,30,.91),rgba(9,18,36,.84))!important;
|
||||
border:1px solid rgba(133,164,229,.29)!important;border-radius:21px!important;box-shadow:var(--dh-shadow);backdrop-filter:blur(18px);}
|
||||
body.dona-holo-v1.alfred-admin-glass .page-top .eyebrow{color:#9cb9ff;}
|
||||
body.dona-holo-v1.alfred-admin-glass .button.primary{background:linear-gradient(125deg,#3063d0,#556dca)!important;border-color:#98baff88!important;}
|
||||
body.dona-holo-v1.alfred-admin-glass :is(.field input:not([type=range]):not([type=checkbox]),.field select,.ag-field input,.ag-field select){background:rgba(4,11,25,.87)!important;border-color:#799acc55!important;color:#f2f6ff!important;}
|
||||
body.dona-holo-v1.alfred-admin-glass .admin-header nav :is(a,button){background:rgba(6,13,31,.78)!important;border-color:#8aace950!important;}
|
||||
body.dona-holo-v1.alfred-admin-glass .admin-header nav .selected{border-color:#76a5fd!important;background:rgba(38,73,138,.92)!important;}
|
||||
/* Pages dont les classes proviennent d'extensions installées séparément. */
|
||||
body.dona-holo-v1 :is(.id-panel,.dv-panel,.lg-panel,.lv-panel,.log-panel,.logs-panel,.glass-panel,.id-editor,.dv-task,.dv-list,.dv-detail){background:linear-gradient(135deg,rgba(6,14,31,.92),rgba(12,20,42,.87))!important;
|
||||
border:1px solid rgba(127,158,221,.3)!important;border-radius:22px!important;box-shadow:0 15px 35px rgba(0,0,0,.22);backdrop-filter:blur(15px);}
|
||||
body.dona-holo-v1 :is(.dv-head,.id-header,.id-head,.lv-head,.lg-head,.logs-header,.log-header){position:relative;z-index:2;background:rgba(5,10,23,.66)!important;border-color:#819bd046!important;backdrop-filter:blur(15px);}
|
||||
body.dona-holo-v1 :is(.dv-head,.id-header,.id-head) :is(a,button){border-radius:12px;}
|
||||
body.dona-holo-v1 :is(.dv-main,.id-main,.lg-main,.lv-main,.logs-main,.log-main) h1{color:#f5f8ff;letter-spacing:-.035em;}
|
||||
body.dona-holo-v1 :is(input,select,textarea){accent-color:#7fa7ff;}
|
||||
body.dona-holo-v1 :is(.id-panel,.dv-panel,.lg-panel,.lv-panel,.log-panel,.logs-panel) :is(input:not([type=checkbox]):not([type=range]),textarea,select){background:rgba(5,11,27,.91)!important;color:#f2f6ff!important;border:1px solid #96b9ef55!important;border-radius:12px!important;}
|
||||
body.dona-holo-v1 :is(.dv-primary,.id-button.primary){background:linear-gradient(120deg,#376cdd,#6763d5)!important;color:white!important;}
|
||||
body.dona-holo-v1 :is(a,button,input,select,textarea):focus-visible{outline:2px solid #a9c5ff;outline-offset:3px;}
|
||||
/* Page Journaux : log monospace lisible, pas de glow derrière le contenu. */
|
||||
body.dona-holo-v1 :is(.lg-list,.logs-feed,.log-feed,.logs-table,.log-list,.lg-entries,pre.dv-diff){background:rgba(2,6,15,.79)!important;border:1px solid rgba(122,149,208,.25)!important;border-radius:14px!important;color:#d2e5ff;}
|
||||
/* Les modules secondaires restent visibles au-dessus des effets de fond. */
|
||||
body.dona-holo-v1 :is(dialog,.av-image-dialog,.camera-popup,#alfredTimersDock,#alfredTimerToast,.av-more-dialog,.audio-popover){z-index:100;}
|
||||
@media(max-width:1050px){#content .dh-response{grid-template-columns:1fr;}#content .dh-primary{min-height:220px}#content .dh-facts{grid-auto-rows:minmax(125px,auto);}body.dona-holo-v1.alfred-glass-theme #stage{align-items:flex-start!important;}}
|
||||
@media(max-width:700px){body.dona-holo-v1.alfred-glass-theme #stage{top:85px!important;left:8px!important;right:8px!important;bottom:8px!important;padding:80px 12px 18px!important;}#content .dh-response{display:block;}#content .dh-primary{padding:20px;margin-bottom:13px;}#content .dh-facts{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;}#content .dh-fact{padding:14px;min-height:130px;}#content .dh-full{margin-top:12px;}.alfred-glass-theme #stage .av-reponse-actions{top:12px!important;right:12px!important;}}
|
||||
@media(prefers-reduced-motion:reduce){body.dona-holo-v1::before{animation:none}body.dona-holo-v1 .av-stat-card{transition:none}}
|
||||
/* Finitions du panneau et affichage sans métriques */
|
||||
#content .dh-response{text-align:left;}
|
||||
#content .dh-response.dh-no-facts{grid-template-columns:minmax(0,900px);justify-content:center;}
|
||||
#content .dh-more{font-family:inherit;font-size:13px;font-weight:600;line-height:1.3;}
|
||||
body.dona-holo-v1, #content .dh-response{font-family:Inter,ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif;}
|
||||
/* Fenêtres secondaires de l'accueil (listes, ComfyUI, caméra) dans la même palette. */
|
||||
body.dona-holo-v1 :is(#alfredListsGlassDialog,.av-image-dialog,.av-comfy-dialog,.av-more-dialog,.av-popup,.camera-popup,.audio-popover){
|
||||
background:linear-gradient(145deg,rgba(4,10,24,.97),rgba(9,19,41,.96))!important;
|
||||
border:1px solid rgba(142,176,242,.38)!important;border-radius:22px!important;
|
||||
box-shadow:0 32px 90px #000a,0 0 26px #4f7fff18!important;color:#f4f7ff!important;
|
||||
backdrop-filter:blur(22px)!important;}
|
||||
body.dona-holo-v1 :is(.al-list-section,.al-item){background:rgba(14,25,48,.75)!important;border-color:#8aa9e34a!important;}
|
||||
body.dona-holo-v1 :is(.al-add-form button,.al-footer button){background:linear-gradient(120deg,#254a9f,#4f56bb)!important;border-color:#8baffb77!important;}
|
||||
@@ -0,0 +1,45 @@
|
||||
(() => {
|
||||
'use strict';
|
||||
const $=id=>document.getElementById(id);
|
||||
let csrf='',selected=null,latest=null, busy=false;
|
||||
const message=(txt,ok=false,id='dvMessage')=>{let e=$(id);e.textContent=txt;e.classList.toggle('ok',ok);};
|
||||
async function fetchJson(url,options={}){
|
||||
const r=await fetch(url,{credentials:'same-origin',cache:'no-store',...options});
|
||||
const d=await r.json().catch(()=>({}));
|
||||
if(!r.ok)throw Error(d.error || 'Erreur HTTP '+r.status);
|
||||
return d;
|
||||
}
|
||||
async function auth(){
|
||||
const d=await fetchJson('/api/control/auth');csrf=d.csrf||'';
|
||||
$('dvLoginBox').hidden=!!d.authenticated;$('dvApp').hidden=!d.authenticated;
|
||||
if(d.authenticated)await refresh();
|
||||
}
|
||||
async function getName(){try{const r=await fetchJson('/api/alfred/identity/name');let n=r.name||'Assistant';$('dvName').textContent=n;$('dvInitial').textContent=Array.from(n)[0]?.toLocaleUpperCase('fr-FR')||'A';document.title='Maintenance · '+n;}catch(_){}}
|
||||
function renderTasks(tasks){$('dvCount').textContent=tasks.length+' propositions';const host=$('dvTasks');host.replaceChildren();
|
||||
if(!tasks.length){let p=document.createElement('p');p.className='dv-muted';p.textContent='Aucune proposition pour le moment.';host.append(p);return;}
|
||||
for(const t of tasks){let btn=document.createElement('button');btn.type='button';btn.className='dv-task'+(selected===t.id?' selected':'');
|
||||
let strong=document.createElement('strong');strong.textContent=t.title;let small=document.createElement('small');small.textContent=t.id+' · '+t.status+' · '+t.changed.length+' fichier(s)';btn.append(strong,small);btn.addEventListener('click',()=>select(t.id));host.append(btn);}
|
||||
}
|
||||
async function refresh(){const r=await fetchJson('/api/control/developer/tasks');renderTasks(r.tasks);if(selected)await select(selected,false);}
|
||||
async function select(id,again=true){selected=id;const d=await fetchJson('/api/control/developer/tasks/'+id);latest=d.task;
|
||||
$('dvEmpty').hidden=true;$('dvSelected').hidden=false;$('dvTitle').textContent=latest.title;
|
||||
$('dvState').textContent=latest.status;$('dvMeta').textContent='Proposition '+id+' · '+latest.changed.length+' fichier(s) · '+latest.created_at;
|
||||
$('dvDiff').textContent=latest.diff||'Aucun changement détecté.';
|
||||
const c=$('dvChecks');c.replaceChildren();for(const t of latest.checks||[]){let div=document.createElement('div');div.className='dv-check'+(t.ok?'':' fail');div.textContent=(t.ok?'✓ ':'✗ ')+t.file+' — '+t.detail;c.append(div);}
|
||||
if(!c.childNodes.length)c.textContent='Contrôles pas encore réalisés.';
|
||||
$('dvActions').hidden=latest.status!=='pending';$('dvNext').hidden=latest.status!=='approved';
|
||||
$('dvCommand').textContent='sudo python3 /opt/alfred/app/tools/alfred_deploy.py deploy '+id+' --apply';
|
||||
if(again)await refresh();
|
||||
}
|
||||
async function decide(decision){if(!latest||busy)return;const desc=decision==='approve'?'approuver':'refuser';
|
||||
if(!confirm('Confirmer : '+desc+' la proposition '+latest.id+' ?'))return;
|
||||
busy=true;try{const id=latest.id;const d=await fetchJson('/api/control/developer/tasks/'+id+'/decision',{
|
||||
method:'POST',headers:{'Content-Type':'application/json','X-Alfred-CSRF':csrf},body:JSON.stringify({decision,diff_sha256:latest.diff_sha256})
|
||||
});message('Décision enregistrée : '+d.result.status,true);await select(id);}catch(e){message(e.message);}finally{busy=false;}
|
||||
}
|
||||
$('dvLogin').addEventListener('submit',async e=>{e.preventDefault();try{await fetchJson('/api/control/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({password:$('dvPassword').value})});$('dvPassword').value='';await auth();}catch(err){message(err.message,false,'dvLoginInfo');}});
|
||||
$('dvRefresh').addEventListener('click',()=>refresh().catch(err=>message(err.message)));
|
||||
$('dvApprove').addEventListener('click',()=>decide('approve'));
|
||||
$('dvReject').addEventListener('click',()=>decide('reject'));
|
||||
getName();auth().catch(e=>{$('dvLoginBox').hidden=false;message(e.message,false,'dvLoginInfo');});
|
||||
})();
|
||||
@@ -0,0 +1,111 @@
|
||||
/* ALFRED_HERMES_NEW_SESSION_V1 — reset sûr de la seule session conversationnelle Hermes. */
|
||||
(() => {
|
||||
'use strict';
|
||||
function setup() {
|
||||
const grid = document.querySelector('#avMoreDialog .av-more-grid');
|
||||
if (!grid || document.getElementById('avHermesNewSession')) return false;
|
||||
|
||||
const button = document.createElement('button');
|
||||
button.type = 'button';
|
||||
button.id = 'avHermesNewSession';
|
||||
button.className = 'av-hermes-new-session';
|
||||
button.innerHTML = '<svg viewBox="0 0 24 24" class="a-icon" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12a9 9 0 1 0 3-6.7"/><path d="M3 3v6h6"/><path d="M12 7v5l4 2"/></svg><span>Nouvelle session Hermes</span>';
|
||||
grid.appendChild(button);
|
||||
|
||||
const dialog = document.createElement('dialog');
|
||||
dialog.id = 'avHermesSessionDialog';
|
||||
dialog.className = 'av-hermes-session-dialog';
|
||||
dialog.setAttribute('aria-labelledby', 'avHermesSessionTitle');
|
||||
dialog.innerHTML = `
|
||||
<form method="dialog" class="av-hermes-session-content">
|
||||
<h2 id="avHermesSessionTitle">Nouvelle session Hermes</h2>
|
||||
<p>Repartir sans le contexte de l’ancienne conversation. La prochaine demande utilisera une nouvelle session avec les outils Hermes disponibles. La session actuelle sera sauvegardée.</p>
|
||||
<p class="av-hermes-session-note">Les outils, les Skills et les réglages de Dona restent inchangés. Aucune tâche Hermes n'est annulée.</p>
|
||||
<p id="avHermesSessionMessage" class="av-hermes-session-message" role="status" aria-live="polite"></p>
|
||||
<div class="av-hermes-session-actions">
|
||||
<button type="button" id="avHermesSessionCancel" class="av-hermes-session-secondary">Annuler</button>
|
||||
<button type="button" id="avHermesSessionConfirm" class="av-hermes-session-primary">Créer une nouvelle session</button>
|
||||
</div>
|
||||
</form>`;
|
||||
document.body.appendChild(dialog);
|
||||
|
||||
const msg = dialog.querySelector('#avHermesSessionMessage');
|
||||
const confirm = dialog.querySelector('#avHermesSessionConfirm');
|
||||
const cancel = dialog.querySelector('#avHermesSessionCancel');
|
||||
let csrf = '';
|
||||
let busy = false;
|
||||
|
||||
function setMessage(text, error = false) {
|
||||
msg.textContent = text;
|
||||
msg.classList.toggle('is-error', error);
|
||||
}
|
||||
|
||||
button.addEventListener('click', async () => {
|
||||
document.getElementById('avMoreDialog')?.close();
|
||||
setMessage('');
|
||||
confirm.hidden = false;
|
||||
cancel.textContent = 'Annuler';
|
||||
dialog.showModal();
|
||||
confirm.disabled = true;
|
||||
try {
|
||||
const response = await fetch('/api/control/auth', {credentials:'same-origin',cache:'no-store'});
|
||||
if (!response.ok) throw new Error('Vérification administrateur impossible.');
|
||||
const auth = await response.json();
|
||||
if (!auth.authenticated || !auth.csrf) {
|
||||
setMessage('Connecte-toi d’abord en administrateur dans Configuration (/config), puis reviens ici.', true);
|
||||
confirm.hidden = true;
|
||||
cancel.textContent = 'Fermer';
|
||||
const link = document.createElement('a');
|
||||
link.href = '/config';
|
||||
link.textContent = 'Ouvrir Configuration';
|
||||
link.className = 'av-hermes-session-login';
|
||||
const old = dialog.querySelector('.av-hermes-session-login');
|
||||
old?.remove();
|
||||
msg.after(link);
|
||||
} else {
|
||||
dialog.querySelector('.av-hermes-session-login')?.remove();
|
||||
csrf = auth.csrf;
|
||||
confirm.disabled = false;
|
||||
}
|
||||
} catch (e) {
|
||||
setMessage(e.message, true);
|
||||
}
|
||||
});
|
||||
|
||||
cancel.addEventListener('click', () => { if (!busy) dialog.close(); });
|
||||
confirm.addEventListener('click', async () => {
|
||||
if (busy || !csrf) return;
|
||||
busy = true;
|
||||
confirm.disabled = true;
|
||||
cancel.disabled = true;
|
||||
setMessage('Création de la nouvelle session…');
|
||||
try {
|
||||
const response = await fetch('/api/control/hermes/new-session', {
|
||||
method:'POST', credentials:'same-origin', cache:'no-store',
|
||||
headers: {'X-Alfred-CSRF':csrf,'Content-Type':'application/json'},
|
||||
body:'{}'
|
||||
});
|
||||
const data = await response.json();
|
||||
if (!response.ok || !data.ok) throw new Error(data.error || 'Erreur HTTP '+response.status);
|
||||
setMessage(data.message || 'Nouvelle session prête.');
|
||||
confirm.hidden = true;
|
||||
cancel.textContent = 'Fermer';
|
||||
} catch (e) {
|
||||
setMessage(e.message, true);
|
||||
} finally {
|
||||
busy = false;
|
||||
cancel.disabled = false;
|
||||
confirm.disabled = false;
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
function init() {
|
||||
if (setup()) return;
|
||||
const observer = new MutationObserver(() => { if (setup()) observer.disconnect(); });
|
||||
observer.observe(document.body,{childList:true,subtree:true});
|
||||
}
|
||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init, {once:true});
|
||||
else init();
|
||||
})();
|
||||
@@ -0,0 +1,15 @@
|
||||
/* Add a maintenance link without changing any existing dashboard handler. */
|
||||
(() => {
|
||||
'use strict';
|
||||
function run(){
|
||||
const grid=document.querySelector('#avMoreDialog .av-more-grid');
|
||||
if(grid&&!grid.querySelector('a[href="/maintenance"]')){
|
||||
const link=document.createElement('a');link.href='/maintenance';link.textContent='Maintenance & développement';grid.append(link);
|
||||
}
|
||||
for(const nav of document.querySelectorAll('header nav')){
|
||||
if(nav.querySelector('a[href="/maintenance"]'))continue;
|
||||
const a=document.createElement('a');a.href='/maintenance';a.textContent='Maintenance';nav.append(a);
|
||||
}
|
||||
}
|
||||
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',run,{once:true});else run();
|
||||
})();
|
||||
@@ -0,0 +1,51 @@
|
||||
/* ALFRED_REPONSE_CLOSE_V1 — Boutons visibles dans la scène, sans modifier Hermes. */
|
||||
(() => {
|
||||
'use strict';
|
||||
const stage = document.getElementById('stage');
|
||||
const main = document.getElementById('alfredMainV1');
|
||||
const returnButton = document.getElementById('avBack');
|
||||
if (!stage || !main || !returnButton) {
|
||||
console.warn('[Dona] Fermeture réponse : éléments Glass V2 manquants.');
|
||||
return;
|
||||
}
|
||||
if (stage.dataset.alfredReplyCloseV1 === 'ready') return;
|
||||
stage.dataset.alfredReplyCloseV1 = 'ready';
|
||||
|
||||
// La V1 crée le bouton « Retour à l’accueil » DANS #alfredMainV1 (z-index 1),
|
||||
// alors que la scène #stage est un frère au-dessus (z-index 8).
|
||||
// On déplace le bouton D'ORIGINE : son écouteur de clic et son id restent intacts.
|
||||
const bar = document.createElement('div');
|
||||
bar.className = 'av-reponse-actions';
|
||||
bar.setAttribute('role', 'group');
|
||||
bar.setAttribute('aria-label', 'Navigation dans la réponse');
|
||||
|
||||
const closeButton = document.createElement('button');
|
||||
closeButton.type = 'button';
|
||||
closeButton.className = 'av-reponse-close';
|
||||
closeButton.setAttribute('aria-label', 'Fermer la réponse et revenir à l’accueil');
|
||||
closeButton.title = 'Fermer la réponse';
|
||||
closeButton.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M5 5l14 14M19 5 5 19"/></svg>';
|
||||
|
||||
returnButton.classList.add('av-reponse-home');
|
||||
returnButton.removeAttribute('style');
|
||||
returnButton.title = 'Fermer cette réponse et revenir à l’accueil';
|
||||
bar.append(returnButton, closeButton);
|
||||
stage.insertBefore(bar, stage.firstChild);
|
||||
|
||||
const goHome = () => {
|
||||
// Utilise le gestionnaire déjà attaché à #avBack par Glass V1 :
|
||||
// focusScene(false) + éventuel AlfredViews.goHome().
|
||||
returnButton.click();
|
||||
};
|
||||
closeButton.addEventListener('click', goHome);
|
||||
|
||||
document.addEventListener('keydown', event => {
|
||||
if (event.key !== 'Escape' || event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey) return;
|
||||
// Les boîtes de dialogue (caméra, ComfyUI, etc.) gardent leur propre Escape.
|
||||
if (document.querySelector('dialog[open], [role="dialog"][aria-modal="true"]')) return;
|
||||
if (main.classList.contains('is-focused')) {
|
||||
event.preventDefault();
|
||||
goHome();
|
||||
}
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,28 @@
|
||||
/* ALFRED_STT_INLINE_GLASS_V1 — deplacement de la transcription existante, sans dupliquer les elements. */
|
||||
(() => {
|
||||
'use strict';
|
||||
function mount() {
|
||||
const hero = document.querySelector('#alfredMainV1 .av-voice-hero');
|
||||
const panel = document.querySelector('.transcript-panel');
|
||||
if (!hero || !panel) return false;
|
||||
if (panel.classList.contains('av-stt-inline')) return true;
|
||||
|
||||
// alfred.js et les autres extensions gardent les memes noeuds et les memes IDs.
|
||||
// Les mises a jour Vosk/Whisper restent donc fonctionnelles sans nouveau listener.
|
||||
hero.insertBefore(panel, hero.firstChild);
|
||||
panel.classList.add('av-stt-inline');
|
||||
hero.classList.add('av-stt-inline-on');
|
||||
panel.setAttribute('aria-label', 'Transcription vocale en direct');
|
||||
|
||||
// Taille du canvas recalculee par le gestionnaire actuel en cas de resize.
|
||||
window.requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));
|
||||
return true;
|
||||
}
|
||||
if (!mount()) {
|
||||
// Les scripts Glass sont generalement synchrones, mais on gere un chargement differe.
|
||||
let count = 0;
|
||||
const interval = window.setInterval(() => {
|
||||
if (mount() || ++count >= 16) window.clearInterval(interval);
|
||||
}, 300);
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,140 @@
|
||||
/* DONA_HOLOGRAPHIC_V1
|
||||
* Cartes contextuelles issues du TEXTE réellement reçu d'Hermes.
|
||||
* Aucune donnée, état de serveur, distance ou durée n'est calculé/inventé.
|
||||
* Les autres vues (images, calendriers, cartes de renderer) restent inchangées.
|
||||
*/
|
||||
(() => {
|
||||
'use strict';
|
||||
const words = Object.freeze({zero:0,un:1,une:1,deux:2,trois:3,quatre:4,cinq:5,six:6,sept:7,huit:8,neuf:9,dix:10,onze:11,douze:12,treize:13,quatorze:14,quinze:15,seize:16,dixsept:17,dixhuit:18,dixneuf:19,vingt:20});
|
||||
function numberValue(s){
|
||||
if(!s)return null;
|
||||
const normalized=String(s).toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g,'').replace(/[\s-]/g,'');
|
||||
if(Object.prototype.hasOwnProperty.call(words,normalized))return String(words[normalized]);
|
||||
const str=String(s).trim();return /^\d{1,5}$/.test(str)?str:null;
|
||||
}
|
||||
const number='(\\d{1,5}|vingt|dix[- ]?neuf|dix[- ]?huit|dix[- ]?sept|seize|quinze|quatorze|treize|douze|onze|dix|neuf|huit|sept|six|cinq|quatre|trois|deux|une|un)';
|
||||
function getFacts(input) {
|
||||
const text=String(input||'').replace(/\u00a0/g,' ').slice(0,16000);
|
||||
const facts=[];const seen=new Set();
|
||||
function add(key,icon,label,value,note='Mentionné dans la réponse'){
|
||||
if(!value||seen.has(key)||facts.length>=4)return;
|
||||
facts.push({key,icon,label,value:String(value),note});seen.add(key);
|
||||
}
|
||||
let m;
|
||||
m=text.match(new RegExp('\\b'+number+'\\s+(?:machines?\\s+virtuelles?|VMs?\\b)','i'));
|
||||
if(m)add('vm','⬡','Machines virtuelles',numberValue(m[1]),'Chiffre annoncé par Hermes');
|
||||
m=text.match(new RegExp('\\b'+number+'\\s+(?:n[œo]uds?|nodes?)(?:\\s|\\.|,|$)','i'));
|
||||
if(m)add('nodes','▦','Nœuds mentionnés',numberValue(m[1]),'Chiffre annoncé par Hermes');
|
||||
m=text.match(/\b(\d{1,3})\s*\/\s*(\d{1,3})\s*(?:n[œo]uds|serveurs|nodes?)\b/i);
|
||||
if(m)add('online','●','Nœuds disponibles',m[1]+' / '+m[2],'Valeur citée par Hermes');
|
||||
const route=/\b(trajet|distance|route|entre\s+\S+\s+et\s+\S+|autoroute|en voiture)\b/i.test(text);
|
||||
const building=/\b(hauteur|haut(?:e|s)?|b[aâ]timent|immeuble|tour|monument|construction)\b/i.test(text);
|
||||
if(route){
|
||||
m=text.match(/\b(\d{1,5}(?:[,.]\d+)?)\s*(kilom[eè]tres?|km)\b/i);
|
||||
if(m)add('distance','↗','Distance indiquée',m[1].replace(',', '.')+' km','Distance issue de la réponse');
|
||||
m=text.match(/\b(\d{1,3})\s*(?:à|a|–|-)\s*(\d{1,3})\s*(minutes?|min|heures?|h)\b/i);
|
||||
if(m)add('duration','◷','Durée annoncée',m[1]+' à '+m[2]+' '+m[3],'Estimation communiquée par Hermes');
|
||||
else {
|
||||
m=text.match(/\b(\d{1,3})\s*(minutes?|min|heures?|h)\b/i);
|
||||
if(m)add('duration','◷','Durée annoncée',m[1]+' '+m[2],'Estimation communiquée par Hermes');
|
||||
}
|
||||
}
|
||||
if(building&&!route){
|
||||
m=text.match(/\b(\d{1,5}(?:[,.]\d+)?)\s*(?:m[eè]tres?|m)\b/i);
|
||||
if(m)add('height','♜','Hauteur indiquée',m[1]+' m','Valeur issue de la réponse');
|
||||
}
|
||||
if(/\b(temp[eé]rature|m[eé]t[eé]o|degr[eé]s)\b/i.test(text)){
|
||||
m=text.match(/(-?\d{1,3}(?:[,.]\d+)?)\s*°\s*C\b/i);
|
||||
if(m)add('temp','☀','Température citée',m[1]+' °C','Valeur issue de la réponse');
|
||||
}
|
||||
// Ne jamais induire qu'un nœud est en ligne à partir du seul nom.
|
||||
if(facts.length<4){
|
||||
m=text.match(/[«"']\s*([\wÀ-ÿ][\wÀ-ÿ_.-]{1,39})\s*[»"'][^.!?\n]{0,90}(arr[eê]t[eé]e?|[eé]teint(?:e)?)(?=[\s,.!?]|$)/i);
|
||||
if(m)add('stopped','⏻','Équipement signalé arrêté',m[1],'État décrit dans la réponse');
|
||||
}
|
||||
if(facts.length===0){
|
||||
m=text.match(/\b(?:il est(?: actuellement)?|heure(?: locale)?\s*[::])\s*(\d{1,2}[:h]\d{2})\b/i);
|
||||
if(m)add('time','◷','Heure indiquée',m[1].replace('h',':'),'Issue de la réponse, non vérifiée ici');
|
||||
}
|
||||
const names=[];
|
||||
const re=/(?:n[œo]ud|node)\s*['"«]?([\wÀ-ÿ_.-]{2,35})['"»]?\s*:/gi;
|
||||
while((m=re.exec(text))&&names.length<10){if(!names.includes(m[1])) names.push(m[1]);}
|
||||
return {facts,names};
|
||||
}
|
||||
function summaryOf(text,title){
|
||||
const clean=String(text||'').trim();const t=String(title||'').trim();
|
||||
const first=clean.split(/(?<=[.!?])\s+|\n{2,}/)[0]?.trim()||clean;
|
||||
const headline=t && !/^(r[eé]ponse|hermes|texte)$/i.test(t)?t:first;
|
||||
const truncated=headline.length>170?headline.slice(0,167).replace(/\s+\S*$/,'')+'…':headline;
|
||||
let excerpt=clean;
|
||||
if(clean.startsWith(first)&&first.length>35)excerpt=clean.slice(first.length).replace(/^\s+/,'');
|
||||
if(!excerpt)excerpt=clean;
|
||||
if(excerpt.length>290)excerpt=excerpt.slice(0,287).replace(/\s+\S*$/,'')+'…';
|
||||
return {headline:truncated,excerpt};
|
||||
}
|
||||
if(typeof module==='object'&&module.exports){module.exports={getFacts,summaryOf,numberValue};}
|
||||
if(typeof document==='undefined')return;
|
||||
const body=document.body;
|
||||
if(!body||body.dataset.donaHoloV1==='active')return;
|
||||
body.dataset.donaHoloV1='active';body.classList.add('dona-holo-v1');
|
||||
const main=document.getElementById('alfredMainV1');
|
||||
const content=document.getElementById('content');
|
||||
if(!main||!content)return; // Pages secondaires : seulement le thème transversal.
|
||||
function el(tag,className,txt){const node=document.createElement(tag);if(className)node.className=className;if(txt!==undefined)node.textContent=String(txt);return node;}
|
||||
let busy=false;let original='';
|
||||
function renderCards(){
|
||||
if(busy || content.firstElementChild?.classList.contains('dh-response'))return;
|
||||
if(content.querySelector('.cards, img.hero, video, canvas, iframe'))return;
|
||||
// N'afficher les cartes que pour une réponse réellement ouverte par Alfred.
|
||||
if(!main.classList.contains('is-focused'))return;
|
||||
const children=[...content.children];
|
||||
if(!children.length)return;
|
||||
const text=children.filter(n=>n.matches('h1,h2,p,pre')).map(n=>n.textContent.trim()).filter(Boolean).join('\n\n').trim();
|
||||
if(!text || text.length<13)return;
|
||||
if(/^(bonjour\.|à votre écoute\.|en attente|chargement)/i.test(text))return;
|
||||
if(text===original && content.dataset.holoTransformed==='done')return;
|
||||
const title=content.querySelector('h1,h2')?.textContent||'';
|
||||
const raw=(title && text.startsWith(title+'\n\n'))?text.slice(title.length+2):text;
|
||||
const {facts,names}=getFacts(text);
|
||||
const summary=summaryOf(raw,title);
|
||||
const wrap=el('section','dh-response');
|
||||
wrap.setAttribute('aria-label','Synthèse contextuelle de la réponse Hermes');
|
||||
const primary=el('article','dh-primary');
|
||||
primary.append(el('div','dh-kicker','RÉPONSE · DONA'),el('div','dh-headline',summary.headline));
|
||||
if(summary.excerpt && summary.excerpt!==summary.headline)primary.append(el('div','dh-excerpt',summary.excerpt));
|
||||
else primary.append(el('div','dh-excerpt','Réponse disponible dans son intégralité.'));
|
||||
const more=el('button','dh-more');more.type='button';more.setAttribute('aria-expanded','false');more.append(el('span','', '▤ Afficher la réponse complète'),el('span','','›'));
|
||||
primary.append(more);wrap.append(primary);
|
||||
if(facts.length||names.length){
|
||||
const grid=el('div','dh-facts');
|
||||
facts.forEach(f=>{
|
||||
const c=el('article','dh-fact');
|
||||
c.append(el('span','dh-fact-icon',f.icon),el('div','dh-fact-label',f.label),el('strong','dh-fact-value',f.value),el('div','dh-fact-note',f.note));
|
||||
grid.append(c);
|
||||
});
|
||||
if(names.length && grid.children.length<4){
|
||||
const c=el('article','dh-fact');c.append(el('span','dh-fact-icon','⬡'),el('div','dh-fact-label','Nœuds cités'));
|
||||
const tags=el('div','dh-tags');names.forEach(n=>tags.append(el('span','dh-tag',n)));c.append(tags,el('div','dh-fact-note','Noms présents dans la réponse'));grid.append(c);
|
||||
}
|
||||
wrap.append(grid);
|
||||
} else {
|
||||
wrap.classList.add('dh-no-facts');
|
||||
}
|
||||
const full=el('section','dh-full');full.hidden=true;full.id='dhFullReply';
|
||||
full.append(el('h3','', 'Réponse complète d’Hermes'),el('div','dh-full-text',text),el('p','dh-source','Affichage fidèle au texte reçu. Les faits n’ont pas été vérifiés séparément.'));
|
||||
more.setAttribute('aria-controls','dhFullReply');
|
||||
more.addEventListener('click',()=>{
|
||||
const opened=full.hidden;full.hidden=!opened;more.setAttribute('aria-expanded',String(opened));
|
||||
more.firstElementChild.textContent=opened?'▤ Masquer la réponse complète':'▤ Afficher la réponse complète';
|
||||
more.lastElementChild.textContent=opened?'⌃':'›';
|
||||
});
|
||||
wrap.append(full);
|
||||
busy=true;content.replaceChildren(wrap);content.dataset.holoTransformed='done';original=text;busy=false;
|
||||
}
|
||||
const obs=new MutationObserver(()=>{if(!busy)renderCards();});
|
||||
obs.observe(content,{childList:true});
|
||||
// Accès à l'écran de réponse après mise à jour de la classe focus, sans boucle.
|
||||
main.addEventListener('click',()=>setTimeout(renderCards,0));
|
||||
// Le renderer/socket réactualise #content : la mutation constitue l'événement canonique.
|
||||
setTimeout(renderCards,100);
|
||||
})();
|
||||
Reference in New Issue
Block a user