upgraded ui

This commit is contained in:
Saifeddine ALOUI 2025-04-07 11:43:40 +02:00
parent 9da90e683f
commit 3d3452ec51
12 changed files with 664 additions and 1618 deletions

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{b as O,d as b,L as r,f as s,g as a,s as t,j as P,l as n,t as e}from"./index-D8eUH6YH.js";const S={__proto__:null,anyref:34,dataref:34,eqref:34,externref:34,i31ref:34,funcref:34,i8:34,i16:34,i32:34,i64:34,f32:34,f64:34},Q=r.deserialize({version:14,states:"!^Q]QPOOOqQPO'#CbOOQO'#Cd'#CdOOQO'#Cl'#ClOOQO'#Ch'#ChQ]QPOOOOQO,58|,58|OxQPO,58|OOQO-E6f-E6fOOQO1G.h1G.h",stateData:"!P~O_OSPOSQOS~OTPOVROXROYROZROaQO~OSUO~P]OSXO~P]O",goto:"xaPPPPPPbPbPPPhPPPrXROPTVQTOQVPTWTVXSOPTV",nodeNames:"⚠ LineComment BlockComment Module ) ( App Identifier Type Keyword Number String",maxTerm:17,nodeProps:[["isolate",-3,1,2,11,""],["openedBy",4,"("],["closedBy",5,")"],["group",-6,6,7,8,9,10,11,"Expression"]],skippedNodes:[0,1,2],repeatNodeCount:1,tokenData:"0o~R^XY}YZ}]^}pq}rs!Stu#pxy'Uyz(e{|(j}!O(j!Q!R(s!R![*p!]!^.^#T#o.{~!SO_~~!VVOr!Srs!ls#O!S#O#P!q#P;'S!S;'S;=`#j<%lO!S~!qOZ~~!tRO;'S!S;'S;=`!};=`O!S~#QWOr!Srs!ls#O!S#O#P!q#P;'S!S;'S;=`#j;=`<%l!S<%lO!S~#mP;=`<%l!S~#siqr%bst%btu%buv%bvw%bwx%bz{%b{|%b}!O%b!O!P%b!P!Q%b!Q![%b![!]%b!^!_%b!_!`%b!`!a%b!a!b%b!b!c%b!c!}%b#Q#R%b#R#S%b#S#T%b#T#o%b#p#q%b#r#s%b~%giV~qr%bst%btu%buv%bvw%bwx%bz{%b{|%b}!O%b!O!P%b!P!Q%b!Q![%b![!]%b!^!_%b!_!`%b!`!a%b!a!b%b!b!c%b!c!}%b#Q#R%b#R#S%b#S#T%b#T#o%b#p#q%b#r#s%b~'ZPT~!]!^'^~'aTO!]'^!]!^'p!^;'S'^;'S;=`(_<%lO'^~'sVOy'^yz(Yz!]'^!]!^'p!^;'S'^;'S;=`(_<%lO'^~(_OQ~~(bP;=`<%l'^~(jOS~~(mQ!Q!R(s!R![*p~(xUY~!O!P)[!Q![*p!g!h){#R#S+U#X#Y){#l#m+[~)aRY~!Q![)j!g!h){#X#Y){~)oSY~!Q![)j!g!h){#R#S*j#X#Y){~*OR{|*X}!O*X!Q![*_~*[P!Q![*_~*dQY~!Q![*_#R#S*X~*mP!Q![)j~*uTY~!O!P)[!Q![*p!g!h){#R#S+U#X#Y){~+XP!Q![*p~+_R!Q![+h!c!i+h#T#Z+h~+mVY~!O!P,S!Q![+h!c!i+h!r!s-P#R#S+[#T#Z+h#d#e-P~,XTY~!Q![,h!c!i,h!r!s-P#T#Z,h#d#e-P~,mUY~!Q![,h!c!i,h!r!s-P#R#S.Q#T#Z,h#d#e-P~-ST{|-c}!O-c!Q![-o!c!i-o#T#Z-o~-fR!Q![-o!c!i-o#T#Z-o~-tSY~!Q![-o!c!i-o#R#S-c#T#Z-o~.TR!Q![,h!c!i,h#T#Z,h~.aP!]!^.d~.iSP~OY.dZ;'S.d;'S;=`.u<%lO.d~.xP;=`<%l.d~/QiX~qr.{st.{tu.{uv.{vw.{wx.{z{.{{|.{}!O.{!O!P.{!P!Q.{!Q![.{![!].{!^!_.{!_!`.{!`!a.{!a!b.{!b!c.{!c!}.{#Q#R.{#R#S.{#S#T.{#T#o.{#p#q.{#r#s.{",tokenizers:[0],topRules:{Module:[0,3]},specialized:[{term:9,get:o=>S[o]||-1}],tokenPrec:0}),i=O.define({name:"wast",parser:Q.configure({props:[s.add({App:P({closing:")",align:!1})}),a.add({App:n,BlockComment(o){return{from:o.from+2,to:o.to-2}}}),t({Keyword:e.keyword,Type:e.typeName,Number:e.number,String:e.string,Identifier:e.variableName,LineComment:e.lineComment,BlockComment:e.blockComment,"( )":e.paren})]}),languageData:{commentTokens:{line:";;",block:{open:"(;",close:";)"}},closeBrackets:{brackets:["(",'"']}}});function p(){return new b(i)}export{p as wast,i as wastLanguage};
import{b as O,d as b,L as r,f as s,g as a,s as t,j as P,l as n,t as e}from"./index-CTkhORQ_.js";const S={__proto__:null,anyref:34,dataref:34,eqref:34,externref:34,i31ref:34,funcref:34,i8:34,i16:34,i32:34,i64:34,f32:34,f64:34},Q=r.deserialize({version:14,states:"!^Q]QPOOOqQPO'#CbOOQO'#Cd'#CdOOQO'#Cl'#ClOOQO'#Ch'#ChQ]QPOOOOQO,58|,58|OxQPO,58|OOQO-E6f-E6fOOQO1G.h1G.h",stateData:"!P~O_OSPOSQOS~OTPOVROXROYROZROaQO~OSUO~P]OSXO~P]O",goto:"xaPPPPPPbPbPPPhPPPrXROPTVQTOQVPTWTVXSOPTV",nodeNames:"⚠ LineComment BlockComment Module ) ( App Identifier Type Keyword Number String",maxTerm:17,nodeProps:[["isolate",-3,1,2,11,""],["openedBy",4,"("],["closedBy",5,")"],["group",-6,6,7,8,9,10,11,"Expression"]],skippedNodes:[0,1,2],repeatNodeCount:1,tokenData:"0o~R^XY}YZ}]^}pq}rs!Stu#pxy'Uyz(e{|(j}!O(j!Q!R(s!R![*p!]!^.^#T#o.{~!SO_~~!VVOr!Srs!ls#O!S#O#P!q#P;'S!S;'S;=`#j<%lO!S~!qOZ~~!tRO;'S!S;'S;=`!};=`O!S~#QWOr!Srs!ls#O!S#O#P!q#P;'S!S;'S;=`#j;=`<%l!S<%lO!S~#mP;=`<%l!S~#siqr%bst%btu%buv%bvw%bwx%bz{%b{|%b}!O%b!O!P%b!P!Q%b!Q![%b![!]%b!^!_%b!_!`%b!`!a%b!a!b%b!b!c%b!c!}%b#Q#R%b#R#S%b#S#T%b#T#o%b#p#q%b#r#s%b~%giV~qr%bst%btu%buv%bvw%bwx%bz{%b{|%b}!O%b!O!P%b!P!Q%b!Q![%b![!]%b!^!_%b!_!`%b!`!a%b!a!b%b!b!c%b!c!}%b#Q#R%b#R#S%b#S#T%b#T#o%b#p#q%b#r#s%b~'ZPT~!]!^'^~'aTO!]'^!]!^'p!^;'S'^;'S;=`(_<%lO'^~'sVOy'^yz(Yz!]'^!]!^'p!^;'S'^;'S;=`(_<%lO'^~(_OQ~~(bP;=`<%l'^~(jOS~~(mQ!Q!R(s!R![*p~(xUY~!O!P)[!Q![*p!g!h){#R#S+U#X#Y){#l#m+[~)aRY~!Q![)j!g!h){#X#Y){~)oSY~!Q![)j!g!h){#R#S*j#X#Y){~*OR{|*X}!O*X!Q![*_~*[P!Q![*_~*dQY~!Q![*_#R#S*X~*mP!Q![)j~*uTY~!O!P)[!Q![*p!g!h){#R#S+U#X#Y){~+XP!Q![*p~+_R!Q![+h!c!i+h#T#Z+h~+mVY~!O!P,S!Q![+h!c!i+h!r!s-P#R#S+[#T#Z+h#d#e-P~,XTY~!Q![,h!c!i,h!r!s-P#T#Z,h#d#e-P~,mUY~!Q![,h!c!i,h!r!s-P#R#S.Q#T#Z,h#d#e-P~-ST{|-c}!O-c!Q![-o!c!i-o#T#Z-o~-fR!Q![-o!c!i-o#T#Z-o~-tSY~!Q![-o!c!i-o#R#S-c#T#Z-o~.TR!Q![,h!c!i,h#T#Z,h~.aP!]!^.d~.iSP~OY.dZ;'S.d;'S;=`.u<%lO.d~.xP;=`<%l.d~/QiX~qr.{st.{tu.{uv.{vw.{wx.{z{.{{|.{}!O.{!O!P.{!P!Q.{!Q![.{![!].{!^!_.{!_!`.{!`!a.{!a!b.{!b!c.{!c!}.{#Q#R.{#R#S.{#S#T.{#T#o.{#p#q.{#r#s.{",tokenizers:[0],topRules:{Module:[0,3]},specialized:[{term:9,get:o=>S[o]||-1}],tokenPrec:0}),i=O.define({name:"wast",parser:Q.configure({props:[s.add({App:P({closing:")",align:!1})}),a.add({App:n,BlockComment(o){return{from:o.from+2,to:o.to-2}}}),t({Keyword:e.keyword,Type:e.typeName,Number:e.number,String:e.string,Identifier:e.variableName,LineComment:e.lineComment,BlockComment:e.blockComment,"( )":e.paren})]}),languageData:{commentTokens:{line:";;",block:{open:"(;",close:";)"}},closeBrackets:{brackets:["(",'"']}}});function p(){return new b(i)}export{p as wast,i as wastLanguage};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{b as q,d as P,q as g,r as l,L as c,u as i,s as R,t as r,E as p}from"./index-D8eUH6YH.js";const b=1,$=33,m=34,v=35,x=36,d=new p(O=>{let e=O.pos;for(;;){if(O.next==10){O.advance();break}else if(O.next==123&&O.peek(1)==123||O.next<0)break;O.advance()}O.pos>e&&O.acceptToken(b)});function n(O,e,a){return new p(t=>{let u=t.pos;for(;t.next!=O&&t.next>=0&&(a||t.next!=38&&(t.next!=123||t.peek(1)!=123));)t.advance();t.pos>u&&t.acceptToken(e)})}const W=n(39,$,!1),C=n(34,m,!1),T=n(39,v,!0),f=n(34,x,!0),A=c.deserialize({version:14,states:"(jOVOqOOOeQpOOOvO!bO'#CaOOOP'#Cx'#CxQVOqOOO!OQpO'#CfO!WQpO'#ClO!]QpO'#CrO!bQpO'#CsOOQO'#Cv'#CvQ!gQpOOQ!lQpOOQ!qQpOOOOOV,58{,58{O!vOpO,58{OOOP-E6v-E6vO!{QpO,59QO#TQpO,59QOOQO,59W,59WO#YQpO,59^OOQO,59_,59_O#_QpOOO#_QpOOO#gQpOOOOOV1G.g1G.gO#oQpO'#CyO#tQpO1G.lOOQO1G.l1G.lO#|QpO1G.lOOQO1G.x1G.xO$UO`O'#DUO$ZOWO'#DUOOQO'#Co'#CoQOQpOOOOQO'#Cu'#CuO$`OtO'#CwO$qOrO'#CwOOQO,59e,59eOOQO-E6w-E6wOOQO7+$W7+$WO%SQpO7+$WO%[QpO7+$WOOOO'#Cp'#CpO%aOpO,59pOOOO'#Cq'#CqO%fOpO,59pOOOS'#Cz'#CzO%kOtO,59cOOQO,59c,59cOOOQ'#C{'#C{O%|OrO,59cO&_QpO<<GrOOQO<<Gr<<GrOOQO1G/[1G/[OOOS-E6x-E6xOOQO1G.}1G.}OOOQ-E6y-E6yOOQOAN=^AN=^",stateData:"&d~OvOS~OPROSQOVROWRO~OZTO[XO^VOaUOhWO~OR]OU^O~O[`O^aO~O[bO~O[cO~O[dO~ObeO~ObfO~ObgO~ORhO~O]kOwiO~O[lO~O_mO~OynOzoO~OysOztO~O[uO~O]wOwiO~O_yOwiO~OtzO~Os|O~OSQOV!OOW!OOr!OOy!QO~OSQOV!ROW!ROq!ROz!QO~O_!TOwiO~O]!UO~Oy!VO~Oz!VO~OSQOV!OOW!OOr!OOy!XO~OSQOV!ROW!ROq!ROz!XO~O]!ZO~O",goto:"#dyPPPPPzPPPP!WPPPPP!WPP!Z!^!a!d!dP!g!j!m!p!v#Q#WPPPPPPPP#^SROSS!Os!PT!Rt!SRYPRqeR{nR}oRZPRqfR[PRqgQSOR_SQj`SvjxRxlQ!PsR!W!PQ!StR!Y!SQpeRrf",nodeNames:"⚠ Text Content }} {{ Interpolation InterpolationContent Entity InvalidEntity Attribute BoundAttributeName [ Identifier ] ( ) ReferenceName # Is ExpressionAttributeValue AttributeInterpolation AttributeInterpolation EventName DirectiveName * StatementAttributeValue AttributeName AttributeValue",maxTerm:42,nodeProps:[["openedBy",3,"{{",15,"("],["closedBy",4,"}}",14,")"],["isolate",-4,5,19,25,27,""]],skippedNodes:[0],repeatNodeCount:4,tokenData:"0r~RyOX#rXY$mYZ$mZ]#r]^$m^p#rpq$mqr#rrs%jst&Qtv#rvw&hwx)zxy*byz*xz{+`{}#r}!O+v!O!P-]!P!Q#r!Q![+v![!]+v!]!_#r!_!`-s!`!c#r!c!}+v!}#O.Z#O#P#r#P#Q.q#Q#R#r#R#S+v#S#T#r#T#o+v#o#p/X#p#q#r#q#r0Z#r%W#r%W;'S+v;'S;:j-V;:j;=`$g<%lO+vQ#wTUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rQ$ZSO#q#r#r;'S#r;'S;=`$g<%lO#rQ$jP;=`<%l#rR$t[UQvPOX#rXY$mYZ$mZ]#r]^$m^p#rpq$mq#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR%qTyPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR&XTaPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR&oXUQWPOp'[pq#rq!]'[!]!^#r!^#q'[#q#r(d#r;'S'[;'S;=`)t<%lO'[R'aXUQOp'[pq#rq!]'[!]!^'|!^#q'[#q#r(d#r;'S'[;'S;=`)t<%lO'[R(TTVPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR(gXOp'[pq#rq!]'[!]!^'|!^#q'[#q#r)S#r;'S'[;'S;=`)t<%lO'[P)VUOp)Sq!])S!]!^)i!^;'S)S;'S;=`)n<%lO)SP)nOVPP)qP;=`<%l)SR)wP;=`<%l'[R*RTzPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR*iT^PUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR+PT_PUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR+gThPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR+}b[PUQO}#r}!O+v!O!Q#r!Q![+v![!]+v!]!c#r!c!}+v!}#R#r#R#S+v#S#T#r#T#o+v#o#q#r#q#r$W#r%W#r%W;'S+v;'S;:j-V;:j;=`$g<%lO+vR-YP;=`<%l+vR-dTwPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR-zTUQbPO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR.bTZPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR.xT]PUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR/^VUQO#o#r#o#p/s#p#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR/zTSPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#r~0^TO#q#r#q#r0m#r;'S#r;'S;=`$g<%lO#r~0rOR~",tokenizers:[d,W,C,T,f,0,1],topRules:{Content:[0,2],Attribute:[1,9]},tokenPrec:0}),V=i.parser.configure({top:"SingleExpression"}),Q=A.configure({props:[R({Text:r.content,Is:r.definitionOperator,AttributeName:r.attributeName,"AttributeValue ExpressionAttributeValue StatementAttributeValue":r.attributeValue,Entity:r.character,InvalidEntity:r.invalid,"BoundAttributeName/Identifier":r.attributeName,"EventName/Identifier":r.special(r.attributeName),"ReferenceName/Identifier":r.variableName,"DirectiveName/Identifier":r.keyword,"{{ }}":r.brace,"( )":r.paren,"[ ]":r.bracket,"# '*'":r.punctuation})]}),o={parser:V},w={parser:i.parser},U=Q.configure({wrap:l((O,e)=>O.name=="InterpolationContent"?o:null)}),y=Q.configure({wrap:l((O,e)=>{var a;return O.name=="InterpolationContent"?o:O.name!="AttributeInterpolation"?null:((a=O.node.parent)===null||a===void 0?void 0:a.name)=="StatementAttributeValue"?w:o}),top:"Attribute"}),E={parser:U},N={parser:y},s=g();function S(O){return O.configure({wrap:l(z)},"angular")}const k=S(s.language);function z(O,e){switch(O.name){case"Attribute":return/^[*#(\[]|\{\{/.test(e.read(O.from,O.to))?N:null;case"Text":return E}return null}function G(O={}){let e=s;if(O.base){if(O.base.language.name!="html"||!(O.base.language instanceof q))throw new RangeError("The base option must be the result of calling html(...)");e=O.base}return new P(e.language==s.language?k:S(e.language),[e.support,e.language.data.of({closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/})])}export{G as angular,k as angularLanguage};
import{b as q,d as P,q as g,r as l,L as c,u as i,s as R,t as r,E as p}from"./index-CTkhORQ_.js";const b=1,$=33,m=34,v=35,x=36,d=new p(O=>{let e=O.pos;for(;;){if(O.next==10){O.advance();break}else if(O.next==123&&O.peek(1)==123||O.next<0)break;O.advance()}O.pos>e&&O.acceptToken(b)});function n(O,e,a){return new p(t=>{let u=t.pos;for(;t.next!=O&&t.next>=0&&(a||t.next!=38&&(t.next!=123||t.peek(1)!=123));)t.advance();t.pos>u&&t.acceptToken(e)})}const W=n(39,$,!1),C=n(34,m,!1),T=n(39,v,!0),f=n(34,x,!0),A=c.deserialize({version:14,states:"(jOVOqOOOeQpOOOvO!bO'#CaOOOP'#Cx'#CxQVOqOOO!OQpO'#CfO!WQpO'#ClO!]QpO'#CrO!bQpO'#CsOOQO'#Cv'#CvQ!gQpOOQ!lQpOOQ!qQpOOOOOV,58{,58{O!vOpO,58{OOOP-E6v-E6vO!{QpO,59QO#TQpO,59QOOQO,59W,59WO#YQpO,59^OOQO,59_,59_O#_QpOOO#_QpOOO#gQpOOOOOV1G.g1G.gO#oQpO'#CyO#tQpO1G.lOOQO1G.l1G.lO#|QpO1G.lOOQO1G.x1G.xO$UO`O'#DUO$ZOWO'#DUOOQO'#Co'#CoQOQpOOOOQO'#Cu'#CuO$`OtO'#CwO$qOrO'#CwOOQO,59e,59eOOQO-E6w-E6wOOQO7+$W7+$WO%SQpO7+$WO%[QpO7+$WOOOO'#Cp'#CpO%aOpO,59pOOOO'#Cq'#CqO%fOpO,59pOOOS'#Cz'#CzO%kOtO,59cOOQO,59c,59cOOOQ'#C{'#C{O%|OrO,59cO&_QpO<<GrOOQO<<Gr<<GrOOQO1G/[1G/[OOOS-E6x-E6xOOQO1G.}1G.}OOOQ-E6y-E6yOOQOAN=^AN=^",stateData:"&d~OvOS~OPROSQOVROWRO~OZTO[XO^VOaUOhWO~OR]OU^O~O[`O^aO~O[bO~O[cO~O[dO~ObeO~ObfO~ObgO~ORhO~O]kOwiO~O[lO~O_mO~OynOzoO~OysOztO~O[uO~O]wOwiO~O_yOwiO~OtzO~Os|O~OSQOV!OOW!OOr!OOy!QO~OSQOV!ROW!ROq!ROz!QO~O_!TOwiO~O]!UO~Oy!VO~Oz!VO~OSQOV!OOW!OOr!OOy!XO~OSQOV!ROW!ROq!ROz!XO~O]!ZO~O",goto:"#dyPPPPPzPPPP!WPPPPP!WPP!Z!^!a!d!dP!g!j!m!p!v#Q#WPPPPPPPP#^SROSS!Os!PT!Rt!SRYPRqeR{nR}oRZPRqfR[PRqgQSOR_SQj`SvjxRxlQ!PsR!W!PQ!StR!Y!SQpeRrf",nodeNames:"⚠ Text Content }} {{ Interpolation InterpolationContent Entity InvalidEntity Attribute BoundAttributeName [ Identifier ] ( ) ReferenceName # Is ExpressionAttributeValue AttributeInterpolation AttributeInterpolation EventName DirectiveName * StatementAttributeValue AttributeName AttributeValue",maxTerm:42,nodeProps:[["openedBy",3,"{{",15,"("],["closedBy",4,"}}",14,")"],["isolate",-4,5,19,25,27,""]],skippedNodes:[0],repeatNodeCount:4,tokenData:"0r~RyOX#rXY$mYZ$mZ]#r]^$m^p#rpq$mqr#rrs%jst&Qtv#rvw&hwx)zxy*byz*xz{+`{}#r}!O+v!O!P-]!P!Q#r!Q![+v![!]+v!]!_#r!_!`-s!`!c#r!c!}+v!}#O.Z#O#P#r#P#Q.q#Q#R#r#R#S+v#S#T#r#T#o+v#o#p/X#p#q#r#q#r0Z#r%W#r%W;'S+v;'S;:j-V;:j;=`$g<%lO+vQ#wTUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rQ$ZSO#q#r#r;'S#r;'S;=`$g<%lO#rQ$jP;=`<%l#rR$t[UQvPOX#rXY$mYZ$mZ]#r]^$m^p#rpq$mq#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR%qTyPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR&XTaPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR&oXUQWPOp'[pq#rq!]'[!]!^#r!^#q'[#q#r(d#r;'S'[;'S;=`)t<%lO'[R'aXUQOp'[pq#rq!]'[!]!^'|!^#q'[#q#r(d#r;'S'[;'S;=`)t<%lO'[R(TTVPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR(gXOp'[pq#rq!]'[!]!^'|!^#q'[#q#r)S#r;'S'[;'S;=`)t<%lO'[P)VUOp)Sq!])S!]!^)i!^;'S)S;'S;=`)n<%lO)SP)nOVPP)qP;=`<%l)SR)wP;=`<%l'[R*RTzPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR*iT^PUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR+PT_PUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR+gThPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR+}b[PUQO}#r}!O+v!O!Q#r!Q![+v![!]+v!]!c#r!c!}+v!}#R#r#R#S+v#S#T#r#T#o+v#o#q#r#q#r$W#r%W#r%W;'S+v;'S;:j-V;:j;=`$g<%lO+vR-YP;=`<%l+vR-dTwPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR-zTUQbPO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR.bTZPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR.xT]PUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR/^VUQO#o#r#o#p/s#p#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#rR/zTSPUQO#q#r#q#r$W#r;'S#r;'S;=`$g<%lO#r~0^TO#q#r#q#r0m#r;'S#r;'S;=`$g<%lO#r~0rOR~",tokenizers:[d,W,C,T,f,0,1],topRules:{Content:[0,2],Attribute:[1,9]},tokenPrec:0}),V=i.parser.configure({top:"SingleExpression"}),Q=A.configure({props:[R({Text:r.content,Is:r.definitionOperator,AttributeName:r.attributeName,"AttributeValue ExpressionAttributeValue StatementAttributeValue":r.attributeValue,Entity:r.character,InvalidEntity:r.invalid,"BoundAttributeName/Identifier":r.attributeName,"EventName/Identifier":r.special(r.attributeName),"ReferenceName/Identifier":r.variableName,"DirectiveName/Identifier":r.keyword,"{{ }}":r.brace,"( )":r.paren,"[ ]":r.bracket,"# '*'":r.punctuation})]}),o={parser:V},w={parser:i.parser},U=Q.configure({wrap:l((O,e)=>O.name=="InterpolationContent"?o:null)}),y=Q.configure({wrap:l((O,e)=>{var a;return O.name=="InterpolationContent"?o:O.name!="AttributeInterpolation"?null:((a=O.node.parent)===null||a===void 0?void 0:a.name)=="StatementAttributeValue"?w:o}),top:"Attribute"}),E={parser:U},N={parser:y},s=g();function S(O){return O.configure({wrap:l(z)},"angular")}const k=S(s.language);function z(O,e){switch(O.name){case"Attribute":return/^[*#(\[]|\{\{/.test(e.read(O.from,O.to))?N:null;case"Text":return E}return null}function G(O={}){let e=s;if(O.base){if(O.base.language.name!="html"||!(O.base.language instanceof q))throw new RangeError("The base option must be the result of calling html(...)");e=O.base}return new P(e.language==s.language?k:S(e.language),[e.support,e.language.data.of({closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/})])}export{G as angular,k as angularLanguage};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

26
web/dist/assets/index-DmcjkfZo.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
web/dist/index.html vendored
View File

@ -6,8 +6,8 @@
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LoLLMS WebUI</title>
<script type="module" crossorigin src="/assets/index-D8eUH6YH.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-voCSfR0x.css">
<script type="module" crossorigin src="/assets/index-CTkhORQ_.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DmcjkfZo.css">
</head>
<body>
<div id="app"></div>

View File

@ -1,49 +1,31 @@
<template>
<div v-if="loading" title="Loading.." class="flex flex-row flex-grow justify-end">
<!-- Spinner remains the same -->
<svg class="animate-spin h-5 w-5 text-blue-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
</div>
<div v-else class="relative" ref="menuContainer">
<button
<button
@click="toggleMenu"
class="flex items-center gap-2 px-4 py-2 text-white rounded-lg transition-all duration-300 shadow-md"
class="flex items-center gap-2 px-4 py-2 text-white rounded-lg transition-all duration-300 shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-400 dark:focus:ring-offset-gray-900"
:title="help"
:class="{
'bg-blue-600 hover:bg-blue-700': !isAnyCommandChecked,
'bg-yellow-400 hover:bg-yellow-500': isAnyCommandChecked
'bg-yellow-400 hover:bg-yellow-500 text-gray-800': isAnyCommandChecked
}"
>
<template v-if="icon">
<svg
v-if="iconParts.type === 'feather'"
class="w-4 h-4"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
:data-feather="iconParts.value"
></svg>
<img
v-else-if="iconParts.type === 'img'"
:src="iconParts.value"
class="w-4 h-4"
/>
<img
v-else-if="iconParts.type === 'b64'"
:src="'data:image/png;base64,' + iconParts.value"
class="w-4 h-4"
/>
<i v-if="iconParts.type === 'feather'" :data-feather="iconParts.value" class="w-4 h-4"></i>
<img v-else-if="iconParts.type === 'img'" :src="iconParts.value" class="w-4 h-4" alt="Icon" />
<img v-else-if="iconParts.type === 'b64'" :src="'data:image/png;base64,' + iconParts.value" class="w-4 h-4" alt="Icon" />
</template>
<svg
class="w-4 h-4 transform transition-transform"
<span>{{ buttonLabel }}</span>
<svg
class="w-4 h-4 transform transition-transform duration-200"
:class="{ 'rotate-180': showMenu }"
fill="none"
stroke="currentColor"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
@ -56,31 +38,49 @@
enter-from-class="opacity-0"
leave-to-class="opacity-0"
>
<div
<div
v-if="showMenu"
ref="menu"
class="absolute z-50 mt-2 w-72 origin-top-right rounded-lg bg-white dark:bg-gray-800 shadow-xl ring-1 ring-black ring-opacity-5 focus:outline-none"
class="absolute z-50 mt-2 w-80 origin-top-right rounded-lg bg-white dark:bg-gray-800 shadow-xl ring-1 ring-black ring-opacity-5 focus:outline-none flex flex-col overflow-hidden"
:class="menuPosition === 'above' ? 'bottom-full mb-2' : 'top-full'"
style="max-height: calc(28rem + 3rem);"
>
<div class="p-2 space-y-1 custom-scrollbar max-h-96 overflow-y-auto">
<template v-for="(cmd, index) in commandsList" :key="index">
<div class="flex items-center justify-between w-full px-2 py-1 hover:bg-blue-100 dark:hover:bg-gray-700 transition-colors duration-200 rounded-md">
<div v-if="commandsList.length > 10" class="p-2 sticky top-0 bg-white dark:bg-gray-800 z-10 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
<input
ref="searchInput"
type="search"
v-model="searchTerm"
placeholder="Search commands..."
class="w-full px-3 py-1.5 text-sm border border-gray-300 dark:border-gray-600 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 dark:bg-gray-700 dark:text-gray-200"
@click.stop
/>
</div>
<div class="custom-scrollbar overflow-y-auto flex-grow">
<ul class="divide-y divide-gray-100 dark:divide-gray-700 px-1 py-1">
<li
v-for="(cmd) in filteredCommandsList"
:key="cmd.value || cmd.name"
class="group flex items-center justify-between w-full text-sm rounded-md hover:bg-blue-50 dark:hover:bg-gray-700 transition-colors duration-150"
:class="{'bg-blue-50 dark:bg-gray-700': cmd.value === recentlyClicked}"
>
<button
:title="cmd.help"
@click="selected(cmd)"
class="flex items-center flex-1 min-w-0 text-sm text-gray-700 dark:text-gray-200"
@click="handleSelect(cmd)"
class="flex items-center flex-1 min-w-0 px-3 py-2 text-gray-700 dark:text-gray-200 group-hover:text-blue-700 dark:group-hover:text-blue-300"
>
<span v-if="cmd.is_checked !== undefined" class="mr-2 flex-shrink-0">
<span v-if="cmd.is_checked !== undefined" class="mr-3 flex-shrink-0 relative h-4 w-4">
<input
type="checkbox"
:checked="cmd.is_checked"
class="opacity-0 absolute h-4 w-4"
:id="`checkbox-${index}`"
class="opacity-0 absolute h-full w-full cursor-pointer"
:id="`checkbox-${cmd.value || cmd.name}`"
tabindex="-1"
/>
<label
:for="`checkbox-${index}`"
class="flex items-center justify-center h-4 w-4 border-2 border-blue-500 rounded-sm cursor-pointer transition-colors duration-200"
:class="{ 'bg-blue-500 border-blue-500': cmd.is_checked }"
:for="`checkbox-${cmd.value || cmd.name}`"
class="flex items-center justify-center h-4 w-4 border-2 border-gray-400 dark:border-gray-500 rounded-sm cursor-pointer transition-all duration-200 group-hover:border-blue-500"
:class="{ 'bg-blue-500 border-blue-500 dark:border-blue-400 dark:bg-blue-400': cmd.is_checked }"
>
<svg
v-if="cmd.is_checked"
@ -89,42 +89,31 @@
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M5 13l4 4L19 7"
/>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"/>
</svg>
</label>
</span>
<span v-if="cmd.icon" class="mr-2 flex-shrink-0">
<template v-if="cmd.icon.startsWith('feather:')">
<i :data-feather="cmd.icon.replace('feather:', '')" class="w-4 h-4"></i>
</template>
<template v-else-if="cmd.icon.startsWith('img:')">
<img :src="cmd.icon.replace('img:', '')" class="w-4 h-4" />
</template>
<template v-else-if="cmd.icon.startsWith('b64:')">
<img :src="`data:image/png;base64,${cmd.icon.replace('b64:', '')}`" class="w-4 h-4" />
</template>
<span v-if="cmd.icon" class="mr-2 flex-shrink-0 w-4 h-4">
<i v-if="cmdIconType(cmd.icon) === 'feather'" :data-feather="cmdIconValue(cmd.icon)" class="w-full h-full"></i>
<img v-else-if="cmdIconType(cmd.icon) === 'img'" :src="cmdIconValue(cmd.icon)" class="w-full h-full object-contain" alt="" />
<img v-else-if="cmdIconType(cmd.icon) === 'b64'" :src="`data:image/png;base64,${cmdIconValue(cmd.icon)}`" class="w-full h-full object-contain" alt="" />
</span>
<span v-html="cmd.name" class="truncate flex-1 text-left"></span>
<span v-html="highlightMatch(cmd.name)" class="truncate flex-1 text-left"></span>
</button>
<button
v-if="showSettings !== undefined"
@click="showSettings(cmd)"
class="text-green-500 hover:text-green-600 transition duration-300 ease-in-out flex-shrink-0 p-1"
<button
v-if="showSettings && typeof showSettings === 'function'"
@click.stop="handleShowSettings(cmd)"
class="text-gray-400 hover:text-green-600 dark:hover:text-green-400 transition duration-150 flex-shrink-0 p-2 mr-1 focus:outline-none opacity-0 group-hover:opacity-100"
title="Settings"
tabindex="-1"
>
<i data-feather="settings" class="h-4 w-4"></i>
</button>
</div>
<div v-if="index < commandsList.length - 1" class="border-t border-gray-200 dark:border-gray-700"></div>
</template>
</li>
</ul>
</div>
</div>
</transition>
@ -132,31 +121,45 @@
</template>
<script>
import feather from 'feather-icons'
import feather from 'feather-icons';
export default {
name: 'CommandMenu',
props: {
commandsList: {
type: Array,
required: true,
default: () => []
},
sendCommand: {
type: Function,
required: true
},
showSettings: {
type: Function,
default: undefined
},
help: {
type: String,
default: 'Select Command'
},
icon: {
type: String,
default: 'feather:tool'
},
buttonLabel: {
type: String,
default: ''
}
},
data() {
return {
loading: false,
showMenu: false,
menuPosition: 'below'
}
},
props: {
commandsList: Array,
sendCommand: Function,
showSettings: Function,
help: {
type: String,
default: ''
},
icon: {
type: String,
default: ''
},
highlighted: {
type: Boolean,
default: false
menuPosition: 'below',
searchTerm: '',
recentlyClicked: null,
clickTimeout: null
}
},
computed: {
@ -164,68 +167,183 @@ export default {
return this.commandsList.some((cmd) => cmd.is_checked);
},
iconParts() {
if (!this.icon) return { type: null, value: null };
const [type, ...valueParts] = this.icon.split(':');
return {
type,
value: valueParts.join(':')
return this.parseIconString(this.icon);
},
filteredCommandsList() {
if (!this.searchTerm) {
return this.commandsList;
}
const lowerSearchTerm = this.searchTerm.toLowerCase();
const stripHtml = (html) => {
const tmp = document.createElement("DIV");
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || "";
};
return this.commandsList.filter(cmd =>
stripHtml(cmd.name).toLowerCase().includes(lowerSearchTerm)
);
}
},
methods: {
selected(cmd) {
if (cmd.is_checked !== undefined)
cmd.is_checked = !cmd.is_checked
this.sendCommand(cmd.value)
parseIconString(iconString) {
if (!iconString) return { type: null, value: null };
const parts = iconString.split(':');
const type = parts[0];
const value = parts.slice(1).join(':');
if (['feather', 'img', 'b64'].includes(type)) {
return { type, value };
}
return { type: 'feather', value: iconString };
},
cmdIconType(iconString) {
return this.parseIconString(iconString).type;
},
cmdIconValue(iconString) {
return this.parseIconString(iconString).value;
},
handleSelect(cmd) {
if (cmd.is_checked !== undefined) {
// Avoid direct prop mutation if possible, emit event instead if commandsList is a prop
// Assuming direct modification is intended based on original code
cmd.is_checked = !cmd.is_checked;
}
this.sendCommand(cmd.value);
this.recentlyClicked = cmd.value;
this.closeMenu();
if(this.clickTimeout) clearTimeout(this.clickTimeout);
this.clickTimeout = setTimeout(() => {
this.recentlyClicked = null;
}, 300);
},
handleShowSettings(cmd) {
if(this.showSettings && typeof this.showSettings === 'function') {
this.showSettings(cmd);
this.closeMenu();
}
},
toggleMenu() {
this.showMenu = !this.showMenu
this.showMenu = !this.showMenu;
if (this.showMenu) {
this.$nextTick(() => {
feather.replace();
this.calculatePosition()
})
this.searchTerm = '';
this.$nextTick(() => {
this.calculatePosition();
this.replaceFeatherIcons();
this.$refs.searchInput?.focus();
});
}
},
closeMenu() {
this.showMenu = false;
this.searchTerm = '';
},
calculatePosition() {
const menuButton = this.$refs.menuContainer.getBoundingClientRect()
const menuHeight = this.$refs.menu?.offsetHeight || 300
const spaceBelow = window.innerHeight - menuButton.bottom
const spaceAbove = menuButton.top
if (!this.$refs.menuContainer || !this.showMenu) return; // Check showMenu here
this.menuPosition = spaceBelow > menuHeight || spaceBelow > spaceAbove ? 'below' : 'above'
this.$nextTick(() => { // Ensure menu is rendered for measurement
if (!this.$refs.menu) return;
const menuButtonRect = this.$refs.menuContainer.getBoundingClientRect();
const menuHeightEst = Math.min(this.$refs.menu.scrollHeight, 480); // Use scrollHeight up to max-height approx
const spaceBelow = window.innerHeight - menuButtonRect.bottom;
const spaceAbove = menuButtonRect.top;
const safetyMargin = 10;
this.menuPosition = (spaceBelow < menuHeightEst + safetyMargin) && (spaceAbove > spaceBelow) ? 'above' : 'below';
});
},
handleClickOutside(event) {
if (!this.$refs.menuContainer.contains(event.target)) {
this.showMenu = false
if (this.$refs.menuContainer && !this.$refs.menuContainer.contains(event.target)) {
this.closeMenu();
}
},
replaceFeatherIcons() {
this.$nextTick(() => {
feather.replace({
width: '1em',
height: '1em',
'stroke-width': 2
});
});
},
highlightMatch(text) {
if (!this.searchTerm) return text;
// Strip potential existing HTML before searching
const strippedText = (() => {
const tempDiv = document.createElement('div');
tempDiv.innerHTML = text;
return tempDiv.textContent || tempDiv.innerText || '';
})();
const lowerText = strippedText.toLowerCase();
const lowerSearch = this.searchTerm.toLowerCase();
const index = lowerText.indexOf(lowerSearch);
if (index === -1) return text; // Return original HTML if no match in text content
const before = strippedText.substring(0, index);
const match = strippedText.substring(index, index + this.searchTerm.length);
const after = strippedText.substring(index + this.searchTerm.length);
// Escape HTML entities for parts before/after match, wrap match in strong
const escapeHtml = (unsafe) => unsafe.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, "\"").replace(/'/g, "'");
return `${escapeHtml(before)}<strong class="font-semibold bg-yellow-200 dark:bg-yellow-600 rounded-sm">${escapeHtml(match)}</strong>${escapeHtml(after)}`;
}
},
watch: {
filteredCommandsList() {
if (this.showMenu) {
this.$nextTick(() => {
this.calculatePosition(); // Recalculate potentially changed height
this.replaceFeatherIcons();
});
}
},
searchTerm() {
if (this.showMenu) {
this.replaceFeatherIcons();
this.$nextTick(() => this.calculatePosition()); // Recalculate as list size changes
}
},
showMenu(newVal) {
// Ensure position is calculated *after* menu is rendered
if (newVal) {
this.$nextTick(() => this.calculatePosition());
}
}
},
mounted() {
document.addEventListener('click', this.handleClickOutside)
window.addEventListener('resize', this.calculatePosition)
document.addEventListener('click', this.handleClickOutside, true);
window.addEventListener('resize', this.calculatePosition);
this.replaceFeatherIcons();
},
beforeUnmount() {
document.removeEventListener('click', this.handleClickOutside)
window.removeEventListener('resize', this.calculatePosition)
document.removeEventListener('click', this.handleClickOutside, true);
window.removeEventListener('resize', this.calculatePosition);
if(this.clickTimeout) clearTimeout(this.clickTimeout);
}
}
</script>
<style scoped>
.custom-scrollbar::-webkit-scrollbar {
@apply w-2;
@apply w-1.5;
}
.custom-scrollbar::-webkit-scrollbar-track {
@apply bg-gray-100 dark:bg-gray-700 rounded-full;
@apply bg-gray-100 dark:bg-gray-700; /* Removed rounded-full for edge */
}
.custom-scrollbar::-webkit-scrollbar-thumb {
@apply bg-gray-400 dark:bg-gray-600 rounded-full;
@apply bg-gray-400 dark:bg-gray-500 rounded-full; /* Keep thumb rounded */
}
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
@apply bg-gray-500 dark:bg-gray-400;
}
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
@apply bg-gray-500 dark:bg-gray-500;
/* Ensure consistent icon sizing */
li svg[data-feather], li img,
button > svg[data-feather], button > img {
width: 1rem;
height: 1rem;
flex-shrink: 0;
}
</style>

File diff suppressed because it is too large Load Diff