mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-24 15:38:12 +02:00
v0.6.0 : refonte de l'interface web (theme unique noir et blanc, menu lateral repense)
Interface - Un seul theme, en deux variantes claire et sombre. Les themes Classique, Doux, ChatGPT et AJEAN sont retires, ainsi que le reglage de police et ses quatre variantes (plus aucun telechargement Google Fonts). - La disposition en colonne centree devient celle de l'application : reponses sans bulle, question en pastille a droite, composer en pilule. - Menu lateral refondu sur un gabarit unique repris des listes de la modale de preset : cartes, lignes de 34 px, intitule a gauche et controle a droite. Menu replie = 462 px, plus de defilement au chargement. - GPU et RAM fusionnes en une section Machine, avec un vrai bloc de statistique (nom, valeur alignee, jauge, detail). - Palette sombre plus contrastee : gris de texte a 7,6:1 (contre 5,6), bordures et surfaces enfin distinctes du fond. - Le logo affiche toujours AJEAN (le A n'apparaissait qu'en mode agent) et passe en couleur d'accent quand l'agent est actif. - Les garde-fous du serveur ([stop: ...]) s'affichent en encart discret. Corrections - Fond d'accent + texte blanc en dur : illisible en mode sombre (bouton enregistrer de l'editeur de preset, boutons accoles, bulle utilisateur). - Pave des interrupteurs invisible sur piste claire, piste trop proche du fond. - Valeurs cle/valeur inversees (« Go 24 / 18,2 ») : direction:rtl sans unicode-bidi:plaintext. - Jauge de VRAM invisible (fond de la jauge = couleur de sa carte). - Badges d'etat flottants dans les en-tetes (deux margin-left:auto). - Ombres et voiles calibres pour un fond sombre, trop lourds sur du blanc. Preferences - /api/prefs n'accepte plus que theme=light|dark et les quatre drapeaux d'affichage ; les cles obsoletes (police, anciens themes) sont purgees a la premiere ecriture, et le client normalise un theme herite.
This commit is contained in:
1 parent
15bb9358bc
commit
8fd71d6013
13 files changed
+670
-843
No files matched your search
@@ -15,6 +15,38 @@ function fixMd(s){
|
||||
return s;
|
||||
}
|
||||
function md(src){ return src ? marked.parse(fixMd(src)) : ''; }
|
||||
// Les garde-fous du serveur ("[stop: trop d'appels d'outils]") sont concaténés
|
||||
// au texte de la réponse : ils arrivent donc en clair, au milieu du markdown.
|
||||
// markNotices les sort du fil pour qu'on ne les prenne pas pour une phrase du
|
||||
// modèle. En cours de streaming, la parenthèse fermante manque encore → aucune
|
||||
// correspondance, donc pas d'encart qui clignote à chaque token.
|
||||
const NOTICE_RE=/\[stop\s*:\s*([^\]]+)\]/g;
|
||||
function markNotices(root){
|
||||
const walk=document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
|
||||
const hits=[];
|
||||
while(walk.nextNode()){
|
||||
const n=walk.currentNode;
|
||||
// Un exemple dans un bloc de code reste du code.
|
||||
if(n.parentElement && n.parentElement.closest('pre,code')) continue;
|
||||
NOTICE_RE.lastIndex=0;
|
||||
if(NOTICE_RE.test(n.nodeValue)) hits.push(n);
|
||||
}
|
||||
hits.forEach(n=>{
|
||||
const frag=document.createDocumentFragment();
|
||||
let rest=n.nodeValue, m;
|
||||
NOTICE_RE.lastIndex=0;
|
||||
while((m=NOTICE_RE.exec(rest))!==null){
|
||||
if(m.index) frag.appendChild(document.createTextNode(rest.slice(0,m.index)));
|
||||
const tag=document.createElement('span');
|
||||
tag.className='stopnote'; tag.textContent=m[1].trim();
|
||||
frag.appendChild(tag);
|
||||
rest=rest.slice(m.index+m[0].length);
|
||||
NOTICE_RE.lastIndex=0;
|
||||
}
|
||||
if(rest) frag.appendChild(document.createTextNode(rest));
|
||||
n.parentNode.replaceChild(frag, n);
|
||||
});
|
||||
}
|
||||
let msgs = [];
|
||||
let busy = false;
|
||||
function toggleSide(){ document.getElementById('side').classList.toggle('open'); document.getElementById('backdrop').classList.toggle('open'); document.body.classList.toggle('drawer-open'); }
|
||||
|
||||
Reference in new issue
Block a user