From 72900086cd8cbaa1a5b7d4509646b82b30da6897 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Mon, 12 Jan 2026 10:57:54 +0000 Subject: [PATCH] update --- .../applauncher-peripherals-view.png | Bin 0 -> 54214 bytes .playwright-mcp/applauncher-topbar-bright.png | Bin 47459 -> 47073 bytes .playwright-mcp/applauncher-topbar-dark.png | Bin 47322 -> 45689 bytes .playwright-mcp/saasshare-apps-list.png | Bin 0 -> 64007 bytes .playwright-mcp/saasshare-devices.png | Bin 0 -> 49300 bytes .playwright-mcp/saasshare-view.png | Bin 0 -> 64007 bytes .playwright-mcp/system-view-working.png | Bin 0 -> 64414 bytes html/index.ts | 23 +- npmextra.json | 36 +- readme.md | 1425 +---------------- readme.playbook.md | 784 --------- test/test.chromium.ts | 12 - test/test.contextmenu-demo.chromium.ts | 35 - .../test.contextmenu-nested-close.chromium.ts | 93 -- test/test.contextmenu-shadowdom.chromium.ts | 71 - test/test.contextmenu.chromium.ts | 77 - test/test.dashboardgrid-layout.node.ts | 28 - test/test.eco-catalog.chromium.ts | 35 + test/test.shadow-dom-containment.chromium.ts | 183 --- test/test.tabs-indicator.chromium.ts | 146 -- test/test.wysiwyg-basic.chromium.ts | 9 - test/test.wysiwyg-blockmovement.chromium.ts | 85 - test/test.wysiwyg-blocks-debug.chromium.ts | 69 - test/test.wysiwyg-blocks.chromium.ts | 240 --- .../test.wysiwyg-blocktype-change.chromium.ts | 98 -- test/test.wysiwyg-contextmenu.chromium.ts | 68 - test/test.wysiwyg-dragdrop-simple.chromium.ts | 95 -- test/test.wysiwyg-dragdrop-visual.chromium.ts | 133 -- test/test.wysiwyg-dragdrop.chromium.ts | 145 -- test/test.wysiwyg-dragissue.chromium.ts | 124 -- test/test.wysiwyg-dropindicator.chromium.ts | 108 -- test/test.wysiwyg-eventlisteners.chromium.ts | 114 -- test/test.wysiwyg-keyboard.chromium.ts | 329 ---- test/test.wysiwyg-phase3.chromium.ts | 152 -- test/test.wysiwyg-registry.both.ts | 112 -- ...st.wysiwyg-selection-highlight.chromium.ts | 158 -- .../test.wysiwyg-selection-simple.chromium.ts | 62 - test/test.wysiwyg-split.chromium.ts | 98 -- .../eco-applauncher-powermenu.demo.ts | 20 + .../eco-applauncher-powermenu.ts | 261 +++ .../eco-applauncher-powermenu/index.ts | 1 + .../eco-applauncher/eco-applauncher.demo.ts | 90 +- .../eco-applauncher/eco-applauncher.ts | 281 +++- ts_web/elements/00group-applauncher/index.ts | 3 +- .../views/eco-view-home/eco-view-home.demo.ts | 31 + ts_web/views/eco-view-home/eco-view-home.ts | 157 ++ ts_web/views/eco-view-home/index.ts | 1 + .../eco-view-login/eco-view-login.demo.ts | 48 + ts_web/views/eco-view-login/eco-view-login.ts | 749 +++++++++ ts_web/views/eco-view-login/index.ts | 1 + .../eco-view-peripherals.demo.ts | 6 +- .../eco-view-peripherals.ts | 12 +- ts_web/views/eco-view-peripherals/index.ts | 2 +- .../eco-view-saasshare.demo.ts | 20 + .../eco-view-saasshare/eco-view-saasshare.ts | 1288 +++++++++++++++ ts_web/views/eco-view-saasshare/index.ts | 1 + .../eco-view-settings.demo.ts | 6 +- .../eco-view-settings/eco-view-settings.ts | 12 +- ts_web/views/eco-view-settings/index.ts | 2 +- .../eco-view-system/eco-view-system.demo.ts | 18 + .../views/eco-view-system/eco-view-system.ts | 877 ++++++++++ ts_web/views/eco-view-system/index.ts | 1 + ts_web/views/index.ts | 6 + 63 files changed, 3963 insertions(+), 5078 deletions(-) create mode 100644 .playwright-mcp/applauncher-peripherals-view.png create mode 100644 .playwright-mcp/saasshare-apps-list.png create mode 100644 .playwright-mcp/saasshare-devices.png create mode 100644 .playwright-mcp/saasshare-view.png create mode 100644 .playwright-mcp/system-view-working.png delete mode 100644 readme.playbook.md delete mode 100644 test/test.chromium.ts delete mode 100644 test/test.contextmenu-demo.chromium.ts delete mode 100644 test/test.contextmenu-nested-close.chromium.ts delete mode 100644 test/test.contextmenu-shadowdom.chromium.ts delete mode 100644 test/test.contextmenu.chromium.ts delete mode 100644 test/test.dashboardgrid-layout.node.ts create mode 100644 test/test.eco-catalog.chromium.ts delete mode 100644 test/test.shadow-dom-containment.chromium.ts delete mode 100644 test/test.tabs-indicator.chromium.ts delete mode 100644 test/test.wysiwyg-basic.chromium.ts delete mode 100644 test/test.wysiwyg-blockmovement.chromium.ts delete mode 100644 test/test.wysiwyg-blocks-debug.chromium.ts delete mode 100644 test/test.wysiwyg-blocks.chromium.ts delete mode 100644 test/test.wysiwyg-blocktype-change.chromium.ts delete mode 100644 test/test.wysiwyg-contextmenu.chromium.ts delete mode 100644 test/test.wysiwyg-dragdrop-simple.chromium.ts delete mode 100644 test/test.wysiwyg-dragdrop-visual.chromium.ts delete mode 100644 test/test.wysiwyg-dragdrop.chromium.ts delete mode 100644 test/test.wysiwyg-dragissue.chromium.ts delete mode 100644 test/test.wysiwyg-dropindicator.chromium.ts delete mode 100644 test/test.wysiwyg-eventlisteners.chromium.ts delete mode 100644 test/test.wysiwyg-keyboard.chromium.ts delete mode 100644 test/test.wysiwyg-phase3.chromium.ts delete mode 100644 test/test.wysiwyg-registry.both.ts delete mode 100644 test/test.wysiwyg-selection-highlight.chromium.ts delete mode 100644 test/test.wysiwyg-selection-simple.chromium.ts delete mode 100644 test/test.wysiwyg-split.chromium.ts create mode 100644 ts_web/elements/00group-applauncher/eco-applauncher-powermenu/eco-applauncher-powermenu.demo.ts create mode 100644 ts_web/elements/00group-applauncher/eco-applauncher-powermenu/eco-applauncher-powermenu.ts create mode 100644 ts_web/elements/00group-applauncher/eco-applauncher-powermenu/index.ts create mode 100644 ts_web/views/eco-view-home/eco-view-home.demo.ts create mode 100644 ts_web/views/eco-view-home/eco-view-home.ts create mode 100644 ts_web/views/eco-view-home/index.ts create mode 100644 ts_web/views/eco-view-login/eco-view-login.demo.ts create mode 100644 ts_web/views/eco-view-login/eco-view-login.ts create mode 100644 ts_web/views/eco-view-login/index.ts create mode 100644 ts_web/views/eco-view-saasshare/eco-view-saasshare.demo.ts create mode 100644 ts_web/views/eco-view-saasshare/eco-view-saasshare.ts create mode 100644 ts_web/views/eco-view-saasshare/index.ts create mode 100644 ts_web/views/eco-view-system/eco-view-system.demo.ts create mode 100644 ts_web/views/eco-view-system/eco-view-system.ts create mode 100644 ts_web/views/eco-view-system/index.ts create mode 100644 ts_web/views/index.ts diff --git a/.playwright-mcp/applauncher-peripherals-view.png b/.playwright-mcp/applauncher-peripherals-view.png new file mode 100644 index 0000000000000000000000000000000000000000..84550a364a7cf48355a2a280a706eb7e529d8e2b GIT binary patch literal 54214 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 z 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

pV$;SUcFiS(X6 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 Wa2ugV^`#U5|0v0+%T`Li5B@Lbqlh5@ diff --git a/.playwright-mcp/applauncher-topbar-dark.png b/.playwright-mcp/applauncher-topbar-dark.png index ba4a342cce6b049dacf92c3a8b2de43d99b97355..951549590df3166962e3be828825a905389f31f5 100644 GIT binary patch literal 45689 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

xFKwlk>hgf{((Bx3;_hl+6NYoDNX2$I?*( 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 literal 47322 zcmb5VWmp}})-Bptkl=2?o!|?1La+o01lQp1?he7-B{&2N?iPZ(%fdCdyPd`R?Qh>B z`#ksFU#sYDN@i6}8Dq}x3UZPtNQ6iL0H8=qi7NsC3^D*f9U(wNp75txQ$T*8926zR zfQnJ#JpdpBq{T(Qx@H_Mdx&6}Gz*{74s5-FrRow#B*Ye1=#s#|iPreUG@T1yZW&!y zS8Ao&Vzqo-c5DqU2hXfHdDvZj1)H~M)M;C87tP}&=BicMvoZbfwGWTegQlX1j{#HN zJz?aBLN&pPt=&CN#ih1h81_=FwqA_#gM@{JMf&q#p}Vf48$4Q&0@1~a<^QfQ1LTmF zDeLbT$PWVf)|+6ee;VAZRIe`(n*7KSUmN`>$kGU}4Qo9q$ajJ0_5pwO3DQTdZ*FK2 z{N?)I2WjvUqlV>1NaXeCpE)x@K2Z?f2T@fm9RB!07T%*@rIsPL+o=-thJ`Rv0$p4| zAx5sKI|I_8DZ&AW>h9q|^F40*2-mNxA6=t+j?K@?jn6@s6|pfUbMDQ|kk5+y(uBav zJ(F@{d2IN|pQVa9xY8rZn)y`2A+x+|mh0HXNAB%Z@%KcI`uYJOC&z?6pekhu)r7Sd z0~shTIIP1?G^*FB2e)ab;pv$GuWRsyJ1rx1DIg6I&8rinGny!PzvJV;t6P^M%vrB+ zgo^?{Pv8sb9K{6-|MH0vTJ_F>;8-6$K*D1%`{ASQIBf4}7)tlS3HbH|C>B+)XZfT>NAg7rWx|fd zXCvGt!NHxYkHHPDcHmsvC!X$~9Eg4Y>_GP-1y}sa@%!|3;TI^H_~VnYEP+%(Bc$4N z##p&Lrp;fg9BHjz_x|abFygNxpD4N`ABykJ#!*-d9#3Y)K*T%Lkoa7>knZ)Pu;4;E z<33jO^Ic*1axFxlcdBThtn50RDl6rsN7{rp@ZxYIj zQ(iT*fVZUGra1cbSiHfQOE`uV)ngDFCyase6)l1hMVBjrj1iW5DukYe<2{!z+|d3w znUc=GQBw4X_x?0pu!WkXGCa}aPZx5vb2fMOXewza22I%n8BgquRVgg zRo04U(&fT~p`H7F81nA~#CF*rMbPhTBkuUfD{A575)A>o>(nkgheEN1yEvMR1$N@u4*ly!Iy207&<*@tyjX+<1(wzN+l6!YszNekhE8WIl zUQ+vw6Jl@5D#E)28?devG|NfP-^VSIPUiC>R$3 zDf4|~xY;nHb*G0rd7yjX$j%yZeKEf&h!1kUS@B&Tq~x1qzSIzu)eB2{JysP|Pgcyl zDJX*REpKk_9&DQr48YJ!uN$KOe7G>BMtNxG;}l568qPI-6s%*}5PeS=_xBJ3>a(`; zol`j+kY?^9RCxwN1OS41j>8G~-$NyBzRV;gB$R3p1H)@}c1n4_Z=aFRgUi--H8LZa z(u7Rd!H4*4>}x6mXu<=c*jRX!7?FBuoLAc)s}FDiy*Cl*RkpKqBtz~8z1#j98ZcRj z5~c__6Mrqa-tO8;3jWq(UURXT4% z-I9s#T_aygKAV7%bXJ66L`3Y0OZMHP{0#2O{C5h?8F|{T#vN5to14AnqpImpDFP(w z_UnOK7T;jyv#_`omEv5)U>;Kf8+pDL-r}+@2oyf&VgM^fD_dx_|82Vx7j#W@+Kn*Z=(#onIitN=cC-3$OPkl3+kVd6tXd zJ+AiC48uD~&}6jrl=91^l62dsgb6z_*ILA>0W>i0Sf{$J5e}0gY9Q{Y?B*8GrOyUR zc)Xl4O6-Bsv-qN2u1uieh?1BX+4)v~vxr{o!<+D)-oQZjNV%e#kcG?Or}g0OyVR-z zehY7N%MzDMz3J9?iFxCrV*@es9wM9crXgvf@wcM_Rcs*zCC#^=o!B@;KwLD;-3riy+~iRAI5H=IJz6n9(Um z%q013Fq^K4oHnR?&TIkBWHb&t4v!bPlQ$vMAin$&$~z_LXgd6@9*Ex^1Be|1$A5LU zdbPj=-un+2>Pzht26VaJt|#Q@!}|wF0wPLEQ)t3lSv+>tR{Qkuk=KVzPaNJ$w8yPo z<>AYF0^|D6Wj$MerN!)j-F}@u5xnQ~4RepuNfvG3@~B@Jy={tTmE5DsWb2<9ts%#@vHdEbF>^)cEOSRYgAxL zag1g%Cpu<48H%C~owLVv>@jUz;9ab}Tl|R4Wuro>ztq0um7|w6awjs^oj}Etr(g z#wRo%AiBb!FAC#(AQTkT$Vggna5}fm%3%m}?3k@AieAlnNQVdVo6SgW9W+D&xBcmo zW{Q2yp&N>nT$zI*UWjZ`jpZn=AlGnm}S-SjIQBS5?*3wLSxX7#IM7x$T-uf8cR_QXjf#Bhttsq8x^@0Up5#d8gDw=*GnE-@ z`Uo2vR*`IrJadQl^CMim+4u^BA5ojBo7Tm5A6?5!XX+2Q@dLFBbU=pTWTeqh()r!v zoQ{Wfp4pL0qocI*&gYdRCY$^Mrn_q}<&kQ;WrObZA8kou*fD15ljzj4!?^9Jp_3{4 zYNCT{oRP7yu_OO4c@le9_fW;aU2$h;=csr4TUh@CQk#>FCi1b0D-pP7w2qhMaHVA? zwhXr?pB4IR1+^%zGu;!}w$tAnE#?AKBqFv;K9!pBxTNIzexgd54F`4a@FKFz!6vNu z5jqhKIN!xfO3++F#Vh8w9QisPn5R}UNn6Td<4tHjC!M-k{&-IlP5igFadp_XBFYHY35mP5#SK3>yuKcaF+mS!ON1+u|G?_AKX;BMn zpcWMxO1X*NHTPEsfUdVMH<2N=9$emEpaH!aa~tHvV{zl9llu0nAM3+@RvwJC=wyUg z0*}y`jm$FpdrAhaED`~09t{$>36402K>qm2uSSi+;Tz0dT!+R_kHGBPm7l>5)+ zrVkF0tveBNT=Pj$Nl1|(j!1BROC*V4+KBOLYe~Du#7Me1b224%)Yno$($%BiO>M5Y zA<~-Ujmu58$#WT zhkAW#ogI}ET#a>aGjsy;s|@;X@9d&UMmjuV7c80Izt7@iTwfvo&M89?nC@ossR9fI zIHvWc&s9D(Cy)wqkjt^h^#vyx_tgD<`>}$Arni5<0V`J$9`3g4$H%-zE!+03LPTp9 zj99p20xa4PI6J4F7a`{!LJ+g}tkKIkKQ>LG_JeT&iD? zgLES`ZV0rn%696 zukIc8J`cL`(JXa0mi*3m@@oTENbzj6msX~>>&(aV#-_52+09(?W5{l}@v3mIf`jp6 z@QVkz&X&!LO2+cbURKRjK>cdz%cXvQy$IR3xs4N-gWiX3**5_g#KdJY<}Kzu*5*~L zfg4p&oOQubnW&=i@k$$IiMusE(NbY103gp#r;5%Czp64!zre%+jmd?zpLy56f*4e#rdA$5<(bLq& z?5j7K(R8s3B57Y1bfa;6HbsbK z8xSZqJAQ23l}^zD5xFAvwzH%7hYtbE)@UdwaCFzV&Y6d?f*$@Tj@W9}eC>kY=;1V; z^N^!RH}~#p1y`H)KJUK@y@?2g^mmZ_a6_j1N#n>XGY(6g>ZzUU_ z-Y^Gu$QlRr^qn2WU=`;ayaBrIb#oXsSno#hu z<44YC&$F~qB)takUA#f}p|V@ir%DUtH<>#-b(0oW+T3ZAOW}2qeA))Gq64z{^gAu| zl|v|^ANG0(1KxF77q_WR;)A|T7Bk~jJvJhjN_Z<7u%;rXrE}uUwYl+MJ%^AFFjc9Q zedXfGJkAZCS{NT++c!Vwp)I=M-Pt#KfT#_8{;*@`zxuj_Cm4s)V%={XJcsdTQ&Qe7 zd;$w=ydy>)KdPX5`5Q7*HW&CYm9DNXV0_x~WI+jej>V9K0hN%R zgo&7!!E$4X`ljc}enagGrE2Gm!3Cbc9T@INrM|Y2;;S!@(6`>(FQNh}2O-8B$#3=G zfM4m>d)6l0Nh0VXX4sL|?v{sznrYzD1x<}IWMSORxe`aPV_i;?E;nqUapw0PJlIaz z54+)8iRXC9YZMe&hjI{8Ljib||BNWO-4)x#G*Wh?RvI#RCb-+Q3I$QuF z0$ZA_R5|3)GtbfI@+$2K3)_1s%&bL~58%a=+;=`NeL?1l6TKNX4JXeHUKg_-^*<&E zp+KBh4KFIo3hL@z6hgi~lR57gil!E(R-XtXd&kD)-=iwiCAhFeMn$m`MyedNp+N(_ z%RgJxOIy@6zbFdW@5E8ZpTs9*C~^QA4AG>`wl`+qeFrW`GxUphlAAUM^83S=~WeH_YEg%)iW$OG|doIe>d3t^T3$&P}HDNsRKPgYu6%Rzv0YIbo z)VIB|Gbq0z@VJ5j2O;wN7hmw|`_HlcPH@EY=7TnBl$a)PH_c{WEX6w`<5x2(6bP&U zR^vx}74EE=mB>kZlu+*@R74U=ef7GZJoshHySvSy$jsU}V=VfMP&4n&jmCn^% zaDc-02um4Y{enS7yk|1QnSNZ?Z#}71`F`MKeZB$D+P+UB2xa@=mX*qh)naz|J62x% z{k|TaN3V6m$?D5YzBC&mB8NbWQ(8d?Z!n@LEP~_&sdleWbzm11knT06ev^39c($@% zOFOXMsTuI20(r%Ue7gr{77v#hnLl0~Em!>@D}w~6n9|!<(#_PqpWScJsXgLT%=KSm z!?3&9L|%Qo5WWJ?xfq$Ul~JNbNFg*ezOY9?b!0T+s)OJdh@i{uERtNr8%GJ=V&aOa;3w- zxNY_Z$!8MIE&Ieo*xj&1fwW71+RPGs?!=Lhi;v2khC`wGl`ivX+F%oJm^<^ONy5Yk zqI@?g1GY@UtrwjdkR#4E|7ZpM{)2$eugPHSm(Dl^0HEYg2YDuA9^MLJN-dttIMYy%p_q0_X2b^Tpntx5~ zi_UJZs<@IH>di%axlD6jPD}Lh`0E4H`Qyt>LWaN^-^~tb{PmJUnf&O^Ors#4iPh?P zi>|O4r|Ar}B>Op~%5`mXnvc!BN9Wsv*|y|C`0mIs4x5hlQd6GxA@>_E<2sFKQeg}n zPEm%oF{if-Ez1>(B@izM2@x@s-vw2ab#REW#r$_gNeOq)=M*8G!7BrfVq9$ludW-s z%D({MnA{=!Et6N!dWDkXv2#*?l9Pcs9rC!k22b*Fu2qs0zH}zPq)jU)bz#8_R%vF> z;5yaeIK9EO*#gNou9d_y&83OFWl!UbbJi=|yZZ*_Lw8-x!pF1u+nn|}Zo+oZAP z&Kj2*4?>pF7pO?Pz8N!7==(w1`4jmZ7#`FU(9`wqO6_5-CU2j*00;7&rW5 z(G&zFty!?l$a!05$3u+$(J3~@Q%TJeIb*@;el&24C5(i$fmKjwt@jM`vlPj0?SiFC zH1obt>CED~MtyZPF zCFZ5yz|TtVv^tXh6Y7%`(AjuSE<1Pj{JBkHN=skG@#^i;<}0q*I$&P6mIyAMBSsCG z*?)HSHf8+*Mj3wO)U$W+SSF!7NWt@#bU^;Q-U~r-&uNOL%<42wF*T;&qJ~WASFLqq zibh$t4-EPcS{i0+RDo)k%L+B&-FLKKk#iOYo($s}MA{}%LH!0W6E0S-MYhPC>aXgP zB2K)U^Symi^&*m7qV24TQlfN{TUm-g1$a4HwfDG(iek&_`(A&9s8+=q%pf=wIr9_T zu&khKTGRK&ONNU_B}Yx0lcoi3*8t7HaXry5&SC6qsh|DH+}$5ELBu?nau8J3+=uid z3@!N!_XoQr+^bfv$9PbokE#Xu@-i)8xRl>4!EQ~a^(_WI{@?PbynNNknLD-Bzt!#YWW+eIE}Ll4!>f zV#m=34qAeVlKwAp0p4lu&+2g31lN#6zHs7 z|Mh1mhG$NLg~$iAl@e@7e`DPQ4Y9j$@J?=$B#_Vh@zy%6AioIY|L=Uqzo!HPN~Q8R zgc%dU5QeZk#hQZ~Q<6T7KO0~GR`Hr_wKiXey91W!8MQ?fyq@9IWFB&{EgO{?+^rq0 zvI+2sB`knUO^|Ikqv4AI@*d5FFOm|2?i|$AV-v?2=H{d#p*jA z`<~(Gv^LX;fQ#)g1Jy_XS@cgn*$;$)dPV1bXFxV z>y`4_4UdbV71}L_RTm@~8$M4VEbUFA-wRpf+{nH>U(pv7O!56A+U9SaHlOq-z7ENx z(=O9qn`m(^68PJFvApVWNE)b`(0^GZqyz#;*{ncL+gmP0r4hhSj=tePACx|dMjY(R z=|H7_m`}H`E_Rd{&lI*lAk66we3fWU`@XtVu3Zoom6mcHB;W)9V?EcvajHs{)Qn~8 z05<(cSSV9w!XqH!OMEVjqj0hoTU2PKu==5{!wf=TNB?RCon@of;INv*z0}B&#&-;? zB*B*=BLLXhH_#wXpBG_9cE@(!q^ zv{LlXpTBe*w!}Xz=BAgA#GCn7S;etv!l1=Symt~qpdelz<#lDVITsfZ0pgdur%IK* zK{OjilTV6SYKQV)GJ8mzf2fIo=!q(@xwPo%b#JFP_BI0;j0ivf!@TW>>qJP~r%lgn zUn`LJAEYxa3y(PC^%fV~5xb4j>f&*Op&ludg%UyPhdx(7E2{I!&(=ed2twn7>Wn9b z-M$2FBupZ7I)i1#1L2eUh(^7#U6lL2r(t5~ss4SR67$beB-@A@k7_}T)|Ylemh1Tl zFFSFInib*(mc?JYVB#enbjv3by?sK{I9Sg7X1+tg;{SAr&U`=Dko0hnLdE)(}(E`m@=6Q(Mqbp-`I)XKlB4vT?FL1>9sf+C7ePA(>}l;wYNO#Z5bbRdJk`J>as?;VLX|2Aa5 zdyMI_E$p0|Fm)92*&-8OLVgo4M*2OZ<>Yi(FkuZiPv_ zzBE(t-gO+Quq4Or-7Yr@{^W=`ez@r9oyIMh*A}e$H46}MdZprb$oe{o%Bd|H8$=Nk zD*Pjwb7veu4k_lbvyZNgAvgj{AJC2o1K(gr~7jlMl!zwYZ^R%-WbJX>C--$;@;IwBlbphQP# z)&5P^V_ahfVv(<2;)hUrBgPPm1mSc(dEVJho!QkUD!a{Rgtt6R0jPVOAfbk?UlhKs^)kg`_{gtR?7Ae{Gj z=QmdT73Q29&t})k(>=kRsUD9Y`4hHm=62n0QeviStoTBYQ5XNA>j$_TzYlqLr~IS; z?y*(%_L2nh?E}s+-hVJEo}EigFISVF4kTSK#xMUn7a)?*>4u_;=dvJqb}XHHj>w4| zlyKJ>S%M)}LC=TBB!l|)tpU4FTUVow{Gg$5Hvdgt_xh>1Q}OE44)>5`6f#7t57%BZ z-zMUy!%aqHLPPPhlU+tX&5(mYkOlO^2L?xZUyO7-+}$m=na-94mM9s#+>O0-w;&-4 zDiwZClA_XLh6m;?abGEhBo^J-Z*{Sh9{}GT{btOt`rfRtjrf05Ry+-#424G~N0a)bxgjG}SLZ|% zUvgyUCqjmah=pas&B;kBa9gKpAx={Nt$XO~Y>Hoi$4qe;60us(p&=oeXJ?0ng*8|` z{K|%W(z$J~>+>{ow%K=8mASv4#=YuU^t21J&o3WHrP7bzUa+w=Kx7pgipA$;t(D=3 zsqFaCsy8E0K{qHk7+OSb6fN7UzTs&T0@I|LsL)ai{xXy{S5i{)YRj#`)#~7srD+w6 zw`qKNcB=^ds;gT$7Z0#{Kk}f4PGm)k$zr(DrsFzvpcWDkF<-yXD=vQDkIfI(Nsm`_|LVDgnRqa3EqV zgpv@Rs}gcKejLrrzHE-g(|vr(;QbyOi$TJKa&<9d713#1;z(RcD?MCBKg6G|`|+BS z917hpF3?Sp4NnWh%*;H$#CEk_w$gIZEBv*0MU4?3Rk%+M1t5)U2ud>@tKE!lRuqPvY}hAtc(iRsdLW95jg!+X zEwD6McW_{kA>qU2Ii6w(B|m%VNJi*3Q8sEv?L*$CeHi!lz-~M!#F<3(w1}#xkV-tf z$uRTqPfmmwCtSujLCGg2Op3eDUT(APA9!b|0G9h$95V-sk3Z;H`bUT3O6bY_^LC49 zXnVt&@>|ImDL)k+dkBelM+_KxKOEh-w)#Sjf@3{u@{rf#*$YPaha%Z{W0P#cdFWVp z&*!_9lXiZHF+I__9Acq9nCm!n#vpv;Aw~s0r_(G~Z%2*^fgPUiAxw?e;XK=z(8DF< zFj&cwqwQzMZ2gMUU_=Cnlm4u)f>lCAFgSerlDr7L9S6gv@7R)m8Ue7v5)4AsHWr0^ ztbA5IVW6qwCwA^#TY9JGW2--loN+K^rNu; z)+-If18CBJ;V2=^ABt!7zko>O7Y>#oWB=ezk5IcsLiQ=bn?q6GyWK#Nd zEc-TA4e@~sdjrMV$q1V->iUFeO|I{+IcPORy;D0!h1BTHmVX5LQFv# zno3W)C#UQw^1NT}o2!vHKYrQ&smNRR_4jT+2q}38)xs5o#=k5Y)0BJY@jn=Ro&mGo1#)oBN(jeVvV9yZ^6m(A%-UI9Vi}h?7@6kn4O|AIgQ!S~?2NH=d&Hx=9T?P*u10CJpSV`QG zG|r15mK!`=T&J_Lz(4|d!K*+KG62YwQ&o54B>xt?Y)#tvJ0z%!I1ZpoFTe6xlqs;J z@v<1hFq(|P=8gf6%;~8NvI{2~VRpsM-B@@Y}J0+AIqi`QHDAin8H3Ml0oKS2w7F;<=6l~=d^IvX4L0Lnc85k z>>g*X>Zg*&lU=oG3zzln1H#jwDG1tEr}9K!BZN6H=sOGyjI`n^T0ze9B0y9PGwza-Jlw7r7Id_Sk?RjqIlZB?cs0&!RgLE-SOeSY28x;+M8XGa?^4-d~)uC61_?i3aF#ETnh}MFVlwemvxy zekMbMm5M31lUoU)Yl1%!gbSz~kbYqnY3ILEYPD~mhvv8br z+SNIql$Qe4m_iJYAf|#^8W&H2-M5V%+sYu=>UfgHzyWko0SMnLCm;JoyyyX&!7$E? zEA@x!QY$VbOD>|1C7+D$Ii;m1ejXyl(aQSp4J6e)*uw1vJ%ynYiW3s0Q&9BkHYq+& zNWL8QOzFCtJ(Z~=j*PtHCm&x^)z-c!5^h_>4OXepVzXKC@jC5t25whhv`?COy7jAS z(d3I?ZndOxFV7W~FQ+u8?(UmE@rJM)X#nGc)%NDKKRz^4LwO4@@<$;zV8eX>%}GK@n!f3(x?fA8RE#Xl;J=1{UT z0YE{?&&d=D#-AW;g`Z)3BgC3!iNVl7jey50hLq<0V2FN&tP{P1uHT|1b3b#WPL-Vn z-(Q>p`^YQ+sHUK0VYk`~F5eItPcV5m9G^~4$CDtMU(kMfts$hO(5S2`7g99Xa4g1)u;n$UD zjerA~3-HwgSO+d{-U)f{7Qd6p?6|SHdk3Z{jXv?bay=m3|NQ}s#6K)18Ga{M>N`S}Zc^16Rtb5U<`fY`#lV7<$zhE9!je znGG+St)tiQ5CmeqxT)!`?WVq`Pu^$0gjTy@*TT~Bey-yh4+qDirS{t&Eb;*vbIbV6 zWBKn64dWG+6~Djrzaj`@I5;>j=R+)5G@k+AQq{^Y*xos)bP$&lUftvDYdJjOE6yXZox>!IWBvaAJNDPLa^Mt zT$)Dfvz@(tbg{OOljE-8zFsPFkig8$fPsE4M65!OwiYMWMuWQ-l98BDBC;qtMt1cyaOU7E*>uqHa7|bgM!#nt*zx<<+;+!+uPgo^M{=u>L*NDl^7BM z^ml@1dqt`Tj?E;3+;nvPPUk%{2!vaZkTT^puHc@xtcNgLc2&dRpdWs=*N087DnP9) z=xx0Fod1mZ$k4;Ylv9qk-^sD)+gC6Tg^w@Ox;t2yMa}kQzRI9UOD;Ogf<3iTw<9av zqp(O@0U-zV6@(qv%U9v{zK{)WC>1eP>!t_(k>vk^|GkNt+Bl11WHbNw(|^T%C#tV8ERS=`GMM@@>)&DGf5&|{j1cLd5T}pqA7Q$W z{fD3qvX^h7dN#TnzO$ywt}u7?K?2;@&{+DPZgInV_8i??!d7hgG9hiS@-2RN&qm(n zw@kUB9)In(f&q~59r2&(?Ku)gzOhlAAQIB3cj3*H%bWOn#Ngg-3IcAoZrbqHTRfy* zLsMT0>9(;a2riOIRdVBuBlMl>3N<9!i3XBqEwI!E=`N=atARS_U%?mqqOj?gMC`|0 z(EWT7jM&r2x-C936(lG>5_9j=Bl9{=_l~jUA(qJNYCvt6FzxJK=D$5AaTmadQzJLH zO$u|MwW<9`A@}#P$9k!m+_|Fbze%uQ{$wN11tO zfbUE3<$5W4%$NgTrmU>2SWZkA{-H}sA)Tg!0~V_M-rJDwg{38seLfnob$X<^x%qh$ zmP7zjdrL^l^Sk&z2*}AYeP{O%*P{5oIHgYwuyz9qzmCdkwJ^-)ugg&M_$BNsLfrYg!D~$}i_!}R8LY{?9szZ@fmkYL z*-uHq@a)P31P`b?j3a=!t>gLRbf76Y#DhWlhRoq{lYhF+~DtgtACVgsU8ek}?+x`_1$#EJn6)=yQLTWop(R_Rs#w7tW$1K3p#D=Y}L2 z7t&mnYo>`h$pa9|amG9?o#>2Xx+X(TQb}oZO<+k@HZmnf;4Ng6y7eCGi!POolr;vC zm5q>abalw*;;`xC(<$x*fVyVem!cp5mX-${LJOZa{V;veYAO@^^yNnxgEI99-bHBG z^=1N34&sGAqH?`IEJtd?jS@iSD(24)B|p52iHPk5fB9SA3_3p` zVmo;t#uH^V+gUIGDPOmf?XQgnqyP#Y3O0Ia!ciB_KVPBHm-H&6Kh#HAvBwe$;vjS) zZ(Vd7=q}#tfw{1MiZ+2`PVD(I-P`0U=c*R8goT+!S@#;Q4xAxb|K01heD5Gsjv@Pc zIpP}$@cNEzBLssTFq|}nacn$t9)#emgVtQ>wsG5jeka!1I~J?g!~?ChRNl`k(MU7c z7y=X zz^^^dwB{)S{^+5q6ND@7@E*geHIoI~Z(N(IbFBU+*1B639M(!)|C2|yGPYn;^98mG z7LY3jnFR+*0t#t-yf~?G*j+GWfmMjHo-{xTPPKigtX#wz2IQDkESx@4#&z+WW4_wk ztSt*c>4a*s7La>SZ~5L2)r3LL`;~Tx-?J+|GZk&K*gRNRQmSC~85>9`l_wsSk(Tw@ z{(zA~$D>)W)1or6lAPG;xEK7@j;vUwhT|NYXXKT70!>dmK0e+rzM*w=fBYMqtIy2= za;`ER-;|ovk)o}3CayT`+GzVkhOYJE>Ve02Tkfe342ixnRTjLb%6OjyC*lpMIqL`P zZi@aiX`0Tds@@H&kx;lwxVz^I@Ry2MZ%B-W?(AQD6;cv-^(F)cAkK*Btd4;4fnRWI z)MQdt;&&z0);Q)3|Mm(p#!XB)qVEt(h$7$4MN`s|ni!Otjce@Qg8Ygzx}{fYF9*Nc zNf6nq35B%&?`1pxrm-Ma>viB)%NoOir28}yG?x4p@U2_RbSPR4y>S-p?{*Cr?zla= zw?(V{qfx!N5i2ZrDe}p5{JR&^!A1yL)mqdT?3O4`DwSA(&SPnjurA5@!Ky65*n9rw zn`|eieC|>)K`d6gfyFCEygxx9=krO0i<7x|@C~FqdA05>%v)am+u7Oo7Oe$;N2X0s zxf_JI&Y~sT)p?_ay?OT%mquS=>1teTj1o75bDsksbx68;^b5_GE(EgWKI-Kvz5zPS zh*u&akG(!eTKXf;x8<}B;fYi%AZ9kNs|~m&6Vz$977&O|P0Hxv&t(rJt-1^b(Cewx z>QrK2YV{B(Z~8mG?niIi2r;%X^1n3Rs~l7c<9Dn2IGD;ww5(>9!+t-|ed><8wIvz) z`ChR3$wm|6(ULiKk#bk+ViFBPm)5DfIZhe8&=KCMvStKTt~6#OcbF{{T0+P!&>YS? zu!bX~7%Vrb<6(dB)-FdNDY1t!HkQwlCz|_v;R+>%$03SUQy2 zzzfd}{DGgAj_2cFbf_`K<_8v^=lV$`fK1BstgVAN8b`#z=y-)fMU%g(RQT4y-LlxX zrwPTZ_$TJoMA25{^OU(e3KecD*CvZ8koetx2q<}exa zvTtF3p1GO*SSK`^mBLfuIu#$SFLq97@w~2e?SHxO9_aGlc1Tz?{`%Y;V^lu0a(|ec zT4N$~dk8i3bYkrdnoh4nrG(sxbGXCX$W)WDOn#5!r3HrvZ}5Qa${u5KVDh2+foTC$ z=g;Bg>yJjRgK@UMG@$0mtE#X*r~|>xxr)frFz=}n;0=}HA4nfm9ni8%EbF1w67Rrh z*oYfg{KPu5{)q!+7vTCGE;Xn!r@ne)x=p2H8(C@DJNT$sb*N5_G)?iS@XUT_1nplu z^?UQzFsjl(_4(R$UR}~`VOhb#>dqWN88F)%59VO#-rUp#SJ64#kaR;S>KHNc#>mnz zXLl22RtwZ`**ZUTPiQ$Fntp*n1h!_nTdLCyunhQ(&8AsS9f`!+I~DEMQdLn~!B9)D> zB@|=$2s9vSia>W@ZX>L#KIdGkzCOTWtyQC!>pRoTwoO1H!T|s!e|)f3jLZ2wYmW~S z59W}>E*i2;gLylcH)K5>H+#3w)+;Fc-hNB2Ua)@QB}ao))IlyULptH2S7g&$>DfZ# zxc7_Ahueoy*_noW4K{)=OaLRu`>2Jq{b6o0h{eUO3;Dcu=b|U^0FNaVE5>7vfO{ow zj*F$r(#v>Zf)56;7#OWNICig(qZ(LJo#euC;W5s1q6RUhlj)#CukEvABUnd2qj-5< z?EGo&5NM%m=t4qoJ|Cj|ByfHoQv@Ow)M&Q8z+~TCxNsppoOe30PDy$A9pAxXT@U^F zaWmG7r=T0?g5HgbSX%&SU9gy>t>+rtJo7Cpv-|}O*xc`LW1Xzv zpEIBT(d>A6x?nlkM-NpO$f_%;s8~P({NYORBDyKL6@Jko=8$)5G(QCi$5&Q7oZebM z+J{p+lulSy8=3}RZ zI3oE{#dsE(nfiT1mTEyuOI>DVS=w~O=OI;=rM>=m>ST4hs%+NS$n3bHp}J*0?Hnxp z!u!}3sY_ZFM^*BkPgmbgmP^CU_P}qx<9JA8Wl1~^VAPNaX%7FZK6al`ta8qyW7XI$P5>1LLZP&P7?dSiO6qSFK&_+U~*`*6! z`-keA&c%=hz3dHORNRfyciS!ZgdtUwj43>uh!TA#Q% zSOxeL{}fzF8og66uHiNPO@%=O_`V~=!!hJinr_Q-I8f31?f)PiVQuNF=YZhhFoKde zI`4V)7+Wc?V-6{wgDeC^SMUImB0*?lN`zBEdSj8M2OZ2T^Gzvz-!NFr%s%Td3WNo(d zqOs6yW>8W>@yN0}rcoKMPj#>Gx2}XA6)@!d3dDo(+TDr2<3paE^6`5=lafwnPB}t$ z0-Z3B>A+1CKec0fLdnoyO7lO_n2jRnT-aK?#`!O zfNpBZy4$;S$E3**jk<2c8QpQ=_MPepk;R4F%X?{}sgG{XP74DLzkA-Q2;8s&`1>qR zF)V!quP9K?dN?k6|BW+>X)z+|dB^kFHM7d8=G`A4DFE`eY3`qVj*STL>yrMTGWGxD z@4lY-|FhCv6!y&wVsf7|35DM|4}#p zzfEYYkX-J+a{>NCnpMF-f4oJaNs11sLo2G3{}#hc&yNz>zT~VHSEQx zR;gGT4WU_^W_P49m6YQ3sRiQ2lH%Q{bWtbFSn|*8ok`=&Am!Mzh2iHn$BbVMlCfUT zlUabx8W#(nlX6%ipTj|tEWg~}JS8QA00`yM!N94NRriXEsQ>(X*|!^l35eL z5pka|Zqww;$S#mtEwu8J>MLRPzyg5k`$)e>LCt#4gp!#2iWC-dUv!!>S1p;H!-eX- zya*)k^PkfQr~rULx1nNW>2{Uqf|_J+G8~QgW=$$iH9z!cwX^j?HKit2{IhFrjBP_< z)5f@D%Uf)xBH_ixf~Nt{NW^A2UwfW#!t z@RsBHc&LPuSHC1d-EPA(D2-|chnIG+X%ZF@-j|(zaF7$bpq!y}vbfYxSwoSLg=q%e zlLQa&RZPt4PokGr)Q*kU9?hV@fk!YXcx=wdV5c^lRoTs^tNlnLeh&Cf&J8e3V;iZc zCJxfK2ac_W7O*K~#p~wKNEf`PmFxOd9kkRmScKA z!i)Wvk;f|}?v@de>+_*>qJB6)nD>U zoZw_Cx!9-$n7LCdCS%HXtLfr{sVEv@*Uk6;2X}83P)FBoi540H!7UI74#5fT8x0N# z?iSqLEy3O0-7OH@2@u=@1b26L=;Ay7f4Xm)KP*X#eIbJE$Q*02Z;4J%%;8meT4&B$7ar?9Azh36aKOd-m2(3eHXI zY(|}HRxR+_BJy^iQ5nqF=>3Z?R(&7bwogU`#!4?kCerxa4d-~KDgCO0F;a!dB&D$u z-zR>ReVP1s-B~<~p9YXh8z$v3g}DS^<<#0%8O`%L?Y$|A=e{f1o>PTRJZ^|J)Us0og>%6uY z$YUrcjnSEH!cp9WQwtm!pavW}vwcO>_X6sBq-B%@uiDDYSQ?IFnFnjG4JjD4nn;ug z5K1Nv!g&4hT&y?@61Fpy%G9cNFM}2}Y8uZmyLuK*bVg%lOPK2p+x{5l8@XO(m;I^5 zPE8CcDmmw3z63M8|KtQ^WVC8rqZ4;tL zk$!nayy08h+cV))9%y1Qb?k&coD7!SuRd+)L4RBMAE=cmFDsk&;J3;qRqh?x`j^cC z0U7?^(9zqbZZ9w|7g_JxjPUZ!Ee%*{2eyr7_djiN|Cf#J;(50Dx}j+A!F$CzfF%(o ztuwjvOF+Y46W@D6EJS9TkNMClk_$OGGE(&)YL54us#B*@wydUSB%M{}%WC68y!3*D zOAV6HqJ)@Vr%E#q=)Ped65Rrf8H|m*yu*msvT{0@PQ3Wt4!Dg+Hitcul5sQ7xiVjT z1QN!7!DFufR<%KT;pT&;YyV5t<_!8JR|RhHxc|DxmVXn^;r^A%V+@kw1?%c=Jop9C zzJ2@Ft%`v^o+e8*_yYu5&3@iB;rug%Tu~(mP{cl9H7!~N=%vXP&L6(N>Ka49Mngk; z`}Qps7C9OM9Zu-r=9!~tZis*Y7;0|X!9a7q7k1-R;Ye_FaQw*rjwLTp*zXxN8u25mdwh5@X4ZNvK&_|E$_LI65M`^O@w?H!so+ zs?#N`tmtNccDXuG(@|l?hlPdx9LL0&v}OYxaNfX|`G@yC-XRbnko6JA zqC^WT+d=^|n}~>Or!Jqqz8ln+#b*W6ScEOVG`;_M~A?hq#enI z#iQu4@PkM&O(BB8-bF^4IEWqET@_rZB>;%gy@zzA@-Q)drh6Yb?0E<#L{nCf{Gw2U zdh}pF=0Jq`cr)|bD!Ps($n`WUh#sa!HZlG#%%ChU=Dr4pP=JQGI6~&=wIjAl$mn*U zpWjUrA|zm#uRzy6l3C@k4_OYM<7>!%d*HLVK9mn8K{Dr8#N|~0rK$ja%3H(2V3{Ip z|Dj+Y>eH0OT^F9y@1S3)xzb{&nR!}3+RE>S{)&LPEm>TEBmcnuzZ=tt8 zkCGDbt|9%CT^*~?HfpjZyyj%Ac_492)c>w2W4)hL!(Y9YJSaOziF-7ggI`u-PPV!7`( zVt(6Vilx1k(4H~3AG7ST1RljH1jgQ$PNJGbz58mx2pLQx(+iT#fRCkh8PC$f#}g3? zV>*=Y8~3w}9A`Y>#Ov(znr$Q`AizLlDpObuhkjaE=={3?vpG5pCVafKwB#_X7hGbV zF3YGtduUa*k&mMIQV2zqZ^lTqfW4;GP|+J(9w4u+OtLN>hsYKjk`uByN~#*i8bbw+ zIx^QCwKgB5r)M1WAqO{TlNdnx2uG~X&jG|y!mTZO71XPq-Et;8eR+WUpG;E5Z?+_fNw@~ zG5c2!i6;FXW-ZcpM)e5@3UvnY2G7?5KbzlZcD#-$1zHteO^uoi1(yc)f1iH^@xXLK zul(SG?mK^-bqD|i+DxydsgPE7O!$lWA(SAuYFA(VUF0?QB0RxU!`q%`ktm^<@jv({ zn(y%S$v|c{ZRhs-!5$1~)yp84RKbjKS?{$E-}~C0q)H6(iBg#&n3CNZ~$!qJV)srUaZ5%#6yeRy9SDzJ5##}RE9CprxE*kI>_cs&%K{cyS|rJ zi`>m6?bb{WYH_JJe2eY6L_tp%G*Femt}*07qW1&Y0QH+D%~o&nY8etiLhR3HOE_EA zmD$(~)}Ayr&TfiMk>=fvVB1rU0&P@=h?>C7<$wTrUEQoosRpI%ahiDiH}FJLz7Nu>s!1SQtL8IlG^^!;LvZ=`_nMr)9K$~|tBDBsv}+Ts zI5j&o8G&n{TvcNqmW35$>QZ8fBI9xfNAx$*?XhuDJMJ;2*JH@7<0=2@Ol6V|E+p^7 z@g;wS_TRTa7YW>#?cW{T=IpnPq?4J|KIFAjpyA`=V_PAGU%Q2L8p04d;v&E;=Eh?uIkitp&8KcM>y&iS)Cr(xBZ)G?r^76>RVn&)Yk}(}}@?Y*4@~*C;QiFJv z`wO;xhuPUe35Kt~yF8p~f?V01&%0GB+;!l_|2q;L_B3@_Iy^Wy0_2_tMTvgW7DG#P zQ^15B30NaKYFKBN6S}*c(V$UTO?fi@mF0xv<36qwy7Ayd| z#8=1O%L~ig^$W~otct3d9=g3@cKfaa?vJr$B;IYsm0S#p7TcwSocjELvPZ0Bq*yE1!snh{1~4si~iCm;2_^Ei@Rx z3H0s@t5rn&nrw7z5u%Bxd<1P#j47;iJz3GTKEkkPLeM=V?B~>p!)yC?V_aCGP(Iqr zTd#$Ohnu#xwsgELkM{QVY6|8Lk8X8X&!Wk9UpK4NH;$WRFvG!fC%wL1z-|+spPSQm zw_MztVvKypVbv1?d0c*OwZAYK9#i4K(c&jZ@0`#phP{17s%q93#j0<^`3t9_dBYHAhYH6%rOu)gR{P;F(*~4CUxlLb3#m{4RD4C^H1$-Ljm3{#M{I?qu zkmp;xlr|4WEc~Luz&rr@8Aot?^%zE|`*?(Bn_lzg)o42zsX-_%1naFh7WUz#qn3$k z^6=JvMQFq2v|9V^u;M6&Z|4UrM6hT_UctNB`Iuh^mlIK|bC(?@;zHzKZPm?h0Ue_d zqUTZXD`TT425_{_TiP>`hwHN#Q;sIHq;{`1XjXtU>x;*0Y~Zufq)AjDV zGKixYT|i#84@@<>kVzh9Xb8Ch(NVt+XxxNmrKfI0r=t>dQ7%!J7K1FUX zTh-5F#2_Pci?cGYIxOr?7J|H^;{g%hf~*y(#KGZB45#MDK}Kg+oTkMiOe)zlPTQR8lnhrW z0+ea7_=tZsSX##GalMGt)!m)Q;8|uIyiG)aV!S)CpjIOf)nUPZ-}}zm?57MrJq|MT z&%4C-N6XgAQh}GkQ#AZjr{g6B#f!`>BT#_N+-mx8w#NDTh%dwM0#q_`!H6k@m>$ke zffXlLj;#pc7=L5^#&%de?`jVYmc>Lwz)fVbeeI2e7wAJD{XOlEAk4hb{=I6G;b!LQ z@!$Y(I+b1RjHlcmw?~r0F}7X^3BxRT^tSVzba*;1CF8x_c@)AcoNP26T>=^G9)I`o z!Pi5=ia4Bl-5mJdt!g`4$ktbGP|!EBdzJU`BIMVvRAA+IbO|`>ng=(zZFBUdN^rk_ z{|=H{FCD+_q~zu0T_i>U#7s;~6cl*E6HIUOqJ9OxX)|=Z*(e%JYpo%&<~hNw>Ez{n zC2Dd&A|a?e?J;VZA)EQc#xyqQ&cN%j27|hQ3P2tm4g!fH00GGXdRyCp3=JY;@4i)= z1V-7Hk>$WE<3JpL*uu*35zMN^Vzzy!z(ub?Lr7`|0 z2E!~)Le0eNvbKqV0h|;BNT=CM>$c^1c?;hCYF0+<&*-~~ILqfA-i4a#Nv) zZbRxXyy~jIG#d>!&FJWKuiLtNDMc-t{_{C?#5NfdirIcnnQPOwVt3BaVMyXztx(D~ zXrI?gnfGcr>3Yr|_qXgoD zm2>9lr;Pa&Q1`7XHVW|3dz(_=FO)6d!zb}XPfWZLO!fYJq4cKtSaR9@_%U?G)QtP_ zd=%2xC)a1K_T006TG8$$?|qF9h6shSY;zWMdX?rwr`;bVzME!q@Y95(ND3&ZEC!Z4 zV#^{>k`f`N^7D{mSqv}Zl|C&_&4S)eIzIE#_|s&f$L7$=ioR6gx+boyG_7SOWkkvj zb9`zEzXeAve9%$iaN3e1ybzTfYOOgP#FE`?&)xYH7Qt952FL%C2;5v`>cBE{20wDn zy&=oy7L2u{8X>WGri(kb!d(uB@@bvDMS$Q-!A5VhKW45E z*OK;S!s!Jbuo5-d&3uG{2SMkK$b8gG7o0&vlNRA8Pv__P5N8Zgu((-W)=GC0dYW@o za7BrVZOK%>s@SjP_PCxP(@EiCQDbO-4=7h^Yv@#7y&3j8?b(KghVJTONb;J|H@!}C z*l&&MTX!89Lv~&?IROJmI*mG3Hb+VzE+N5HM*O{UDKc;(^~W1jNgK#;k94^_AMKkd zQ{xE34*&AR4hK-hG#Taxsd#Pe-^&ty2zd7%eNZH=Dv)xCbIR!=KbA*_xlS&AWN6hM z0HFH{5z-)zY%0!9(g?vpdrNSU?>?roT8tlQmfZVOrQC|xFyRvWVWzM~l$p)`{H&op zlHMjyih0RzGWLfD#*xVEdAUnrQ)c5rG|y*V&Xa_|4w|)s|8mx|&};0(sv#Au^OWy0 z;`?R(__^7BwGxsnWaUBrAqfdc8+%=$vt+h#sjrb5Bwv6=u;RzZYU^e&GoC1W=rR8H zqYU@CELbDw@-3UR?-W<=NIm?uDP8Q~W`-=ZoY2`DuCp{NBovgRRwK(pZzutB3`65( z`uGS`RMht4HjB}dxaSAs_Q(M--z;aLxt3drY+wGLz3pb{8eLNB- zR&=T}r|$ZYRBW~Qsd+uD=CoEk!vuw?qYYXpeaVQa zXIAgIMsQ*ns=R0J?BVvIm1|B_CSi36fEBa*5r@6E`_NL0&VPoAd9@pPjPO~lO=nCO zfOJRqqWSG85*_Dni>^kIyNazyVjz-zl!}wKZu3_{UYA{m$)cj-sC{!2o5i@mz<4=5 z-P3vW3{;B9^ycUH_?aVk`S&Zx;=t$Ozdx{Vaj_(SyAXxt$UpfeAQV)W^pn}(ltF1O z6z*BAC9v;;ecx}7$322PV3Ts_l;P6{)9IimqBypJtYCFPhx^L^$P}!Q?l9y?*O;AJ z)%6jEe2w)@6J`91AnOmXro;khczCy< zS9xiWzB{?@Cqx2x+#h!G(^}7-wRP%(lFY6dr9o;5i#5j9psUPZLWrC+Wd;X~ikfBk z#U-%61KJ+z4ECoZ8JZhEi$nR$*ghg;({kjv$1rRejWj@SYQD!E$#nU_gU3U~Ne*-% z1K&vBj~>-F!%!8R%$>^}K8&qG`-q!e?TrPAhpNE<-!^`A2WifLI6KiCsW zJ6GN+Zg5}=p)(mdJCDlvFlljXEq%G0z^lQ7t)W`*;sAUw0hjHk64VX5J2_da0+`<) zzQc?RI>2#h5*jy|)w9kJ?6V;zO08(op#wl%qRLQe;z!eoJQW=+LsopSR$yEHCpgw= zXuWr8mFjmjS(+%C@Gx zAF0bW-EkS|#O*7=Jy@d14#J~4l5c|oe-r!X>Fw|7mh4_NQ%p`a4}{J}Iqar2FDfzO z;YT(aZy~&6Ge#!?^a-D8u2msYJB=$!>)+LC>*1ptj+-oSIS~5 z>FWg}wS*91nqzVaG04mcSDIyy@)9P7=xy?PA6GPOmo-)<-$_$_jiZsq`p2Z(&qYV& zHRXg4@04YNxXK|nP)oIFuAtk93=%bTo;Hv;`Z-f(4U50Ra<}owH3jwC!lrE*uPu=bU!_(doH649}*u%)A zL#(;%3#K;ju9I_7C9GW;>0Wld-NEz22M39w#`VI<#XdXE`L-I_XU{0kB>3js@&N`7 zigv@C(((n>w)~n&^p1TS$A@2kCv$NsHXI1*A1)HU7zZ46&RPvR_v*xSZ9lf3j_FzQ zTNw)hK-p$NrhG-}&%L__l!EMqfeQ#x@XxN#G%@7mX>qI{$Chla0-yJH99#}v?C_pE zw|0c}BvL6su=Rd-?8e>@)M*H{Q2{DWI=#&+r=AR$RfNW9;vD=&A8 z-z&^6HZMc^?-6%EM&QP;-EQrvu~YuguL8&Wx8s{k#v|?Ty1TkA+&nX}$uT4*du0;; z3Xl0B1(r3T)02`;%ur~?Zf$*&8{iJm1M#t$r3E39_yqRtyM3z5FwthZP=9{MlGAx> zDQ<4=3f)U7yqe*~e?s&guNP_d-`8|FZZj2&Z57a39m`w)fvV%EnQVL9a~=x-vj$F>?N}PvQIBe}?q`j_`$Fsv^4kTpRm;d}3~ASfYBk!#>|% z^X#hB`Pk0jCH@j--)OEGNt0#j{8w0jfha~(Hf;ngJ+K{hrfaoIr&FCQ?tgvVg6w>i z;`axbCw@(&)Zs{LLfxNN&KkxWgzVQz--r2V!0@j+-Lnu;7BEBAcdRqv~W??n6Q=+zey9<^_gn)8ndS*(M7dotd>h z&>1w|{wW)_kLjgeXWh7XG&164wa57bgr{AO-bPdqv^9(6)22}M8x|f?y6uDtnq1_X zO4-~#pi&iS7%rbSJ#Y#KEQ3B9hU z#Kc}5+TCuNl4aUAYI@e10u#AU=2L}n*j8s!9#~T!Dz2eMs112K~v`4N3e_m9V}z`2Uqs+H6$!A zrzg7_&?ucMnaMm2g#r3IiCItl*r@zjAu5J9xa#JlE*TAWw zR?k*B$D1|Vg7C%e=zKP|F+)t++_Qg#km503EC@@&u1+>T+qReKWzKfMU+=NY7Li`o ze-Ug=aA131teA-eJ@QS~XM}k!r#w~4LFJK3YCmL-rF- z&WO*zqJ{JHRQsa0+o(zz6cK4;7DAhED%mK$xm$})!Jr+ZTVcFGElHiL5Pv{ZVv+M& z&CDu7vvidvc0=fsMooKF(cSka2B8w^(Ue3Co^J-V`L{eFdqc!h!^6Q0^C>D~FrQD6 z>|d~({K4NHbS>frp;lIuju4ay*K zfR;plXkb7(JQR&PrS$9^Q4z;=_ zA`g3+`m+}Wxp6)%?DrzI&@E98Y)iFzE2(Jh=yVn-Q1tBc`0H_$pCxT=BjmC{*v{L6 z6`bt+LK+Qvi%o>sB4)D6EeL=QZMamH+1X6xQj`wW$nSnd1UDj9b~ZK5cKgY_sr~cR z&0V}|#dbJ5fBB->x}!~{cZex@{WTj{K>lydB$7!iE7f|pb1(Iej0)7y00VVAGd9n3 z<+5g8e#}IiJT&Z=U9Meunehb2eRkYb{Tln2d_UtvQia`Vu(}U{n`Kzk<>TXk zqQhC)2hY=lsZ#A_Wk$(NTt@w=+tj5>vuUs9(_6>?U}=1NH_j&kiobSFIu6Ii!$ zIIM)?8l$N5qqU@e=zAlxcWHutP*AOlkd|upvRs*JtUebHyi;ad5p|d(1>Z@?i^~`FS})Q0F*$`*P2Y7 zOk@C%?yl!4xu65eXPcE^09Xnb+Cglw&%aE#T7zDa)4x{&$Z;1P4uUc`m-#mJc`Eh( zob-H+3Hm_NKS9}B0YweB+M~w~v|cVt-*MDtfp%T?x6( zPcyfwa?#SWX@7zmqZ9OblE?n%pb^A3X5w~@1kyZwdCs^6^lwOTV`0-qwNX;w<)zWH zjG=t8^2nuFP@*-dr*JJ*w}Vx4Zh9K~t0yGWQG5pT^RS?daD0eGu{v3q=zzpLk!>fb z&+;T=4sw4<@+8!D#~oc$&mEMr;;4fPT#x=hAmDvXq|mgo zvhit40wgk;Hw*S$h*tLDAxe2vqOSqiFVwqspOmJg2i6Uh9b2C?7nsbI+$8a6DF8s+ zR9^ji7$B4{!wVx) zZZ0K~{Jc}snjHT}#Ww=xrL5omh76Lyi_S6%Gc^bp&r*uYhS@H&hQt#TV9|bT^vFRz zGD@ykilTlKf1jB^3WqtY{tfOsxeswsQC_V}F;z8}Dm<)ywebTMg`BLElH_Y*k&umA z1OFhLvds+`NA{Z0I&M zLa4a)ePMrTsnN#jk*PcURK&AkT-FN&Rygd*2vlab}6Z8AehWWTpG_&_BvMC?Cq&jJ)&h#zP#F zJ6LBpcIY($K)t42HMV)DdfWPItrFWXj%hmtzMNrTJ~R2}$tE18ctK+haplO6n+)Z2 z!5X3aWX+F^kuWqNbIa2a=5*}4idlDQjHEs1!w>S4$~g@pjV}FrmzrYc!mUdiyRbE8 zv{H_t_S)JM-rm9_^r3Px(;O;OY9Czf%q%>G!&A^{V-?6s_DgL@DZp)SM;}U1P|y=c zB46IOb0ya;AZ`4p2*J?Vim8SAPym zOFgw-H$ijIJ@2iX&L6orI0shJf==E39r-cF=-uotyI*fm(q?9{qS)Y)1Y|k>x0JU1 zN|EGG<0*<}^VT1w&ek5s`wG6AWKEx94p1XX6f>S_2Cv%Mjh>KON@wMU&PHh=zftfW zpvTc9Ja&Edc2-Am`y3cohG#!3U)6IZT0H$yavxYq_Ec&o+1Y#XoBe*^IXJ96yy<@p zVRw})kKEq!IgMLccvQgUqjUM~b;ghG_&`)5?yBoY3dEB%D_Wi^?(rH1$4Osni)9UE z*BhJ7Z>`6Sa=#!lo`Y7es^&FHAk;;5GV&jqc>MIY%I<3quiM(~WUp1I87aR` z-MbIcpc3&rtem&=y~Ty@NUhl-x~93YrETN2$#OY{97ntAAOiyI+sUYH+zwy|t3QO@ zA>NeZDv*!RKhVl0X>G^PavoMs-9<`$b7=cBQhoi}TO!=LMQKb?i) zIWM#y=wN#W;`Z|1jMgUxcwX;)*DxMxxV#>$Q`$KYzJ|%7?TsBC4qD%rWpnE#IbGix zv0At}v1BpgYl=*4-IJr{1y(339{N&}d&94nxxe-A!CJe#B+C2J;e& zqb*e$Vk!@YONYDlqwcotgjj>m)m{~ku~aNC7Cy-|#j#m426rmI_W(0F_>DVf-+dp# z4n#86I-3oqG7p*`Ub8e0qr}l!r3iJwG*_RBIcCaWIUCYC5Vf|o&Y8TbnhcMhx*^$< zdZ-Gk9~?l5C*-enHVnJVZMWd&s9l=A=~;#pv(07aUd8IO<$wMSxNr<-k`;SdFM6dD zcBnosEu+p^r9ifG&eV z^JykCq1?se7INLv$x$*0S*$&p+|%BUcEwP8yMuq~YoAwzhf?9bQ%+>*lu~fmdVgW^ z)tM+Oy$&W48bFBsTq`@{*`KQAJb+-!{8}Kht>a1g{ z7$dOw7RS?OvQFVvN`;(=_is&E`&M&RxeN2_p3FL4@8gLhI9{Ief~xpegkV7RiPf=F zc2Q+?#B!l73&(9V#jqagq$!Z)MCgW(>|Ged%Kft165yRZh(CU?9Jae`afDU6^)@)hk&K2%x zmQ%Y!LOH@;vE^-3XFVFtH4xRdUt{M12lclMx*Ts!o9@b+Gv}7;;i}_b;et}PCI*w( zEq5ESk^JrDr{D9P91p1_^h3H>l--|v?Ynpfg)vwr)(uDi-9pFO!<^RQc81S`?=@>U zzjVO>G+PA?Pe<;)pYZP^n^EyG6M1>WdSRl-86GDIo?iX~WkQG?BN6M8s2%Ryop#I7 z^O+ZD?##-CVt6_f=pNO+uatR3fx49H!mxKWKcJgsnnAa<@Q%>yLBF2CcGvuzkL=Mk zCMoU$3s098l^f*xnfTRkD66n**D7B3=x|Ux9cH>4zYDL;zUwnvlmUQ_LX77svrQVj z9vGfQ)yGN|jz^bOr|?YPTUP6-8gnN;hSgcqbhqoK=klKF`KM0p$LZ$^_uKsVOd>a5 zu;;ZI z;X9Py8+^6uwPbCu>3tD{eL^x``1Hbrz-RhDX9xbD6AX#rE#;v5|M>ZR&|9HUwpC9t zGmCgv?&~D|5}{_3F#nGss;mmc+~#{_Xk;W7QdkqMlti4}>7>+}A75nh-6*?7IXh|@ zjqCK;f{W+V{JheI4?8S?CSu5!fGnDd#O6!1FA^MTAMdDfUNU^p!A>p`a&b^behW)7 zqi0&dNV}kxgLf18Qb(LUh}V)q4uJL8|5J1-tKxlIOhlJUKiAYK!qGusn?Wo@y`7?J z+9H&PuiJv3UGz7s3^vDVyMP{<6)!z5K0UsGFa|3SY%|=^_gzc?9CmzKa&keMv|wpL z9#gxB3=D~UfpI=nkEEcEj4y6nO@DS8hwt=0x(OeLU9?`GFlp zislfSR1=|ulvJ`AvxWik#;Eb>14g=%wygHhD4NNdt^8lI#CVpbPZ2rXEWhRL?Q;g} zwx+-^>7i?ZTxO|`hLp=WJLY5T_!$Dpyt+bMqE7KwDA*sr!iH+WCz1881o1p{ZwLUo z{tg-94VZjP!k0ukyDBjqwcUELvXN3oR8O#aZYTr;cY9FaN0oljBPuui>;Okl-fggkmwTp7Zrvh-{Ek(fR(q;c5TtYW=B3pAPK4Ua^CL`Oig#SZZ8c zYD3d4+&~2@gW&UQ#3hf3sl1b{EM==};njoSSB2P~OCFBReG+a@J-1I~?Cout(2YXW z3O`I2**}$NM#ZvAX(v{~i*9wjF?H+=@E|Pytac| z@MO4}k_Kiy+ZIj5LYS=mYuw@#6P%raN4D2ouVbmpH#G^%8m+dcxdF7G93Q=Y1oWxn z{jDk!B{P=6@3IPoa#G=02R^|P)N~xd?xE3?PgscGPTT8=aFfJA{lyDT1tqm&6 z#?a4h%aSiQhEk-UIBk@$vo+-7q)YjM5kE2j4c2KI%ujErsU;)TkonxecP6Gfd5v@C(PK#IOmW~3503f5P zX~qHQ1m8A>SYNrSx5j8&%B9Hlc`J&pa-xMwB3c|BI~$9+9((gow3aq#GR}WQ1<01O z0>~2wJ8LJ?eH#bcOpt_s_mD$v*ChHDe8WvSQjy!5KQHj-5j)*ws_OAKN!kd z(EtL+2V!XCCJo1+OQCSg&d1TSjY z-rdIO3vJoLHn*4I`@j;ji3R0H=XyFRHx!C-aeFIRHl!Mr@gWfr;hSP|0-jtlYXJ&l zrO)(UtI#*PkM#7~l%NF|lk)NM&^|F#h50lsxc)Ees*>+j&u=HErmi)sR$akOj1faf98~IjRC1dx}vS{)6!F`4+7^x^GJT|(L8 zdS7Jwdc-^wG^o4UT85r*5*T=#jQ;NZfMYGk6pr`ZmoI!UzyhB4(w)e{?UWg0Xz}wZ z;8PVxm0;Z8xWeRd-C6K#LI41ot|PRlJp8K7HT|}hkUf8^2EBnvIS2*XiLkJ+JLB^@ z5pL@6R%IJaOV^{OySOLB7^}83W!s|5Fb< zdya(G_}=x6i|GUZ%(wT8>$+Vp755#(9N^)){WjRI`*X|7 z4^ypC7Ch{8>Z$zg-+MmP3$kfscpBIqm7ucfAtgW@$gUUcBND8qxA-&mZ%1RJe83ZP z4o0khn@I$pP%t=CJapbT4U zS1=~Bn%X&)TmtIIDVh*}kCf)^(*Ak3*IX^Dd#CTHr@plM< zEl<<9PCHA;Dga^=xznHDfHvi;q(||Bdcb#FO1L=h;boS+6_!y}n5J=vOjl*!pzga) zui8{?Kk?L)v(mj$PZU>3%#Az#}HhT?uemHM&ZGRU>M(XDgk{HKE)m3HvIJY>p_sQ{= zim_dzQ%d8ECpl5c@qWq8@UWoe`49dbuU@5U^U3)3(qrC}UbySzS)2cv&$RQQ?aSVuP7JNJ*2TcWiLKFELOL#^cVU?qlK?^b}1*ZU@pWyw)-9-w=TGxH!+*LO>y!P4{dseNw z5b>IAPtu7fcBqxHdUWI+(sORa@IVk05C#5YT=mC&QoX&m@QboMnSXYhCMN5Bd^nNS z^4%88i}>hDDkT8euoB+6fEvt8s;y3wBe@I7axEvn!v%qkX|K~SmNz*nPgj4e=aKmN z37S^)3?KXawKy2u^oDh&Th6xK*ZqXm53_{><>g~Qna`i<^b#@A(KDCzTj1Qdl~WWo zp{pUHE&eGz;G(Zb0M`*q&fsoPfOZp8#RLG&M~a@gR=UQ`25O^>!E6Vkw5RwnE|WjD zq`B*wMPBLhs;bK5FLKn#Nt!Ly-zQl-c}@cQTgEbzhj-q4dWT}5(#|K$=eFOOr7k!A z`PKB9txX5fJ&khZ^mYbqCw~Y=ck2>Tjw3TH%s$qcn1$4NC=bfqSQ0=1W7^j}0qt#f zYv$G-Hh!tem@4h-NZrGz&w_R?lji0Se!}Y=7~6$GLWh+FtNIxV-X-9+X2RSY(QhIE74i|B}l>@~}06?qL{(7nXY9;=9Lwu{{Y*eLyt*v?O((V|K`gEzb zs^ppA57_T!^MKyg1M6Owqr*K?Y4^kr`2zZ+cN*>PI_pfvw{xqGb=E8e|Y< zH$Hr2osYMy)kHVCKV=Ij&b6AN|FPD2tgBO2(kLzY%gQ00WVgJ)-~DShMhmR1!LA&N zSMsc`d^X<*K$L~@8T+lvx%lTjKA38IvQ?78#bevP`b*q>Ekg%TXGWv_$+2Rt<@vtB za@0zNvIi+T=40it>+BvVkee|j00IiGK8w1b)xwGf*dzbcno;~>UxNbFSwD}h+7NIn zUd!o9Lb#;OWqyV8+4{?Osk38k(c~C`MYAj@QQ^(4vHUwyl zl>3*%mE`Ge&btba6y$(}x-zMvrRIeBaV$>Tx#aXi5@Q|Pm3kxtbE8!E%ZhbRf1>E@Z~-^Otyoki-D6!%C}?O zaE#z-g{V0N0KRY3Jf8%<>Jsv8h`7R$SuC{naB6sbF#3`lx|VV_*OAp$amXALn zsM#MQ5*to#Iq%#ZYtlo~?^iI9ijHS27PfcAV}`x$zp_6b<(dzI^)!k@wGvn-pzzC6 zUW4hRNfqmR@bT#X_%_LI^KUM|(%i#<^t|`96;H2L7w>s8LYmsDnl%D(S*Vru zb}~Tyqy~qU6gQD_uz zT7J>UN-4+;+vYlU+1BX9f2qFoMW>>h6x) zZ+}isjpC=R?60kp^+4wy4aj5UYd&1WXsdkuU(yAZ$DOQid7M@FW%!?~S%$)KBT=JV-i%!_6mFl9R`I!Z2=Ah_1RRaC} zBzDCD5Bxv(g1-uX?eLCDG5T)4Xh};!D_o3bYWus-3!^YqDno3SAKadN9?Ra%&ht4m4ZwPO23 zQRY!+8%&lkrz;V!$0y4ajK@bYJoOTe3BM$NCLV00G5-Gu0UfKD&AK!yW-)6}C#Ox! z{K1fKRQxQaL0z22Z0^8{7yXe|tn90o~9yYZJ4fuCQyOD>O9gzS`?gouMuewt`ID7>%%>acdPXSr$&!1xq99qsUQ z>E8an^qQZlt@Hbhkgw}xwf^s>%jdrc=4~1Dgo1}$PBg%lPTT#g{4XRXI=jr z9xB&vMcmJ91RfoA)uhNXSaeW~{Q9WKciyfgeFN+fDL zd9-YK<+S(AfLieL8F_J=fwfZXteI8G&~l1SF&Qbw+G|H!e|5P@H%AFuFjb004@SnA z24PLw)@9p^tV!0;X){0r|H6k#)f5`r1LCQq`HB2g?H5PN zT@CSDebIpK7E5FVnYQ%W^eSJA5Cs}zy?PlAG* zjG@HO@uo`izM zZO9WRAgtGawB)-to5oxmb=m5cx58q97RRIQx;E}_GtURHt-Ha+>@z@^|x%+4A+q-1~)b@4? zP=K2;!HzD3LD(B}PVBm6R{R`yE@3T)kG<|2{tC_So2<2cjc!%*v7g5H*ok3yTK@uEq&; z6UD4X06@ddB|}Z>6GdT2j+T-VpluId1#&C^kSXv-F+T|wNElBI-q}#}kBjLo91b~p z4%n})lOz-WEuHY%2aWpJ^{%n!l(aH9krURK zogj3FQ=1(%egWo{l5|R_)>-nWoAfrBig&ybXi zh{bJ^Sk);_Z|_9&inGnUy`tw37oq&8W)3P98Puy8Fq5|K;9LDcoqO{uTyr~IzN-hz zu)30h*@@>r-)oybSbG~ycO~LV6DMzld~e}q*>~Ki|5@zPw{%ffR>(r;H>R%9QX_5b zA39yT$Hpy%QOeH&-Ct5^ofDhAIsi`|Ex%c&_(dXJQcQe3R-sc~p>X>XdESWr1x@@C zu6^6f10nmfGTd-T)iSase$kdegzRViAIYAIo_ynlD^QW_CGjKF{crsW+^<%(6^(B9 zskn>Z)2HGsU7LsgMY$Duq1=Ki*8hX1L|Eguc@y%6ix#XGs7M^FQ2M9w|Ee_sN-Ka; z5TX>n8CR{5!1T-bfRs3Rz9sB8n5OYfbl6oJP7f_Ouq#&b7C-XRDSRxfjZpol%-4vB zKh(=Xitx+sfdMu$Yy=8FfG1J66}`F*2elvS=PheyJ+u)1mp*_6sBlX@k zFGj4(entgFf;a8J;zy8`G;VU?$n|3A=hOEwX|l!|8mR)rE9bZ55+F4c#a++D57Zf^ z8+3AVS_@_e?>tunK!FJP%92KdKaOB%u0#@4VI&U>lw(+cQ{d28>q4o^|ZzFW=M(-OA z0KSOfZSBs$g$RU$FNE&(<$LQZU7?Sg#C1cQe0t7j^q8rfS`Id;Em zr}H#aD|sk7%ky@5&N2cWkZm-JE6)d~e7F202P6yiX3x4~JuNrjr}UiG!+aHf*aqv| zX4QzDIY703m@}<4lrU^RY1m31ohRt^4G2Q;>DxATb=0tF7150_mL8~)N8%3b0Kenp zM)ZDs9Ix%tT8%??Pkl0WLXz7PtnoD0tV}p30OW1_j{7XvN$oYDrzEQkoN*52nx6o`!jG75T3hnTI9mVfc-vsEV9l7q+g>w-X*`OucQQ?Ka;Vf<#X#t7f`XL+h-T!2Z>xxvti3K6_}l1weZ4L*U_W#m&(cA2#-o8<@5=g+y;F%#ooFVEyfn66;dRA9@;c)2 znaN5%xi5Uo&azK6K{l*Cz{MXQ@Y}oR*`q9BsIX?GtOX-l3Zbogtwaq$bgn=6@nS%t zB-CqkgBSnVHFV#Nq_&3V&~4jy+xK1h`j6y#u@V|;N+a9d;xNF{x&RiSNeR3;OyM2y2*BspYfOIo{{ZR-YJ`z$oS8fP&)g~m8cU&_N z(4)&Y_{b*lu62hM+xzv_cYK~_Z%?&9qu18(6fkV_L!_U%))&2=*;pe{#dj5nkc4bNn>sXQ;A22Hj^ANqr{COgj_~~e4qbSt(~l?Z3GIfx{cq@! z`vRcSmhw{9Z~ZuYK6)w%_21jM=s^6O_kEw$eloikv&)F5nS4T6G;O_}1@ZDU!U5~4={hcL`fH2?vib{ER}s54PqK7$y_Rp#>7ZizMF*mmVzJ zxR}ltaIUCpQWPPin|MBNZ*1lW{AFfk-$Q{4F&x(1-Yyy5N)I)T;=X2#TYU4Hb3%GGO&~08$iMD7wVcfdpC$8=y|Gl z8222B3)rs8xaJ#5j06JG4im3(@-XlM3?N(0_jM1Hq4-jBu&~RlcKQBS6nHoFq4Run z2Bts}*(b{Oi@0uigpRK_omaZQdS1L@=+yB&9XK^z7(SI-b{RaMm@o=E8{Lz;S1Vy_ zPxVh^q0{$6Fzv8DXOgQ_NlYgY5q!?ph>r8s6M0!I+qjpeHBqq#&U<>moFex>MoTNj z{puWOG79|`J61n4n1++X*e`8E&a{{`;XkJFoCGRH8$=RZ~m0Gw~AZ49` z^XZbt(#v3g1c-AmCh#!b&%7a6dfn$a zHM`HDy(23+N5IRxj$4H2VLSYGiFRyX2!M8bWT4P-EAVS5U!`SBX zcZIsd_&vm4LcXIdQ`f)7muGIlcRuW#i|B(lvgMu*p2d#T)~gOheD=6C=qT&ZKYhOG zfCOw-m%Kuk0rAoPR~a25F@=V6dnwmTEd1C)<4Qc=OZuDCsxNBt1zg4*XO;`|>Ea@o z;~bVRkShW_8&u6yATaU#Dpd~rs{6&|rI{9ayQft%PH;!tirbPMVem*Yk0t3Gj@8RYHgoVZG2Hx`A(IeJ+&n%$BDOTyM@ZnPX(ooB@=xv- zjV8x3mZudNcWvp7XN&5lt=V`}>gmqw_VofGLxq&pxdV%9cvx^KIvP5ARk+it3#aaG z*I|+rUb|7m(q57JESGDs?j=f`BDDo_t{qEwa`0F^H)L+aw;Q}jW_oEoMrtK z@!{J@N$}c=;diN)NdN*%L~M9f*+0(&ZEG!Dsny|^(8WTN!loLPR-;{~?YB>9mqVz4 zKu~D2TB-m(AKiGRIemoRZ|}xCl~;?+Xf*l+i?Y|8FG(fs*QwC1$Vbw+!?5*$mY46v zojiUQIi35C*Ey{P`8VHJa!+gDTL})-&1%T>1GVt`wu=hsY3Ts!;RCNws~JAMGzB$En5C3zvPG2@|m9x9`XUr4X`Ofx(2S44{lk|vrBwt;|v2K^6 z51zg0AC5m>Jp_0LYti7%)tC6LEQBL>=(O(m&f8SJmMC#AkZXJFZl~2FwQdDfuRkrb zWp<)+XhFRq%W-Ipn7=$59WUhn)e@!sokenb1U&j2y?LXuo5E z(qKrOpbX;6)^&hi`RfEzCB$*H#SI4sC)Lz<#~*Q|xaRB~RcM7vYchJ8W}@U&Sga5- zY2xdk(Oy@N{-S#Sr&T+B)(X*;nW=6L?5SlI_1sHOQ5pC*E2|O$HowBR^eDS#*0AgO zNHJo?>$@>sJ>0#-sit(IN-4p&x$$oZkF8^>acBP}M2?zIvEuR-~5{fwB3 z1s9@zf86(g2R(=D$dPARw5#y*-pEoRfgoQwtehjM&@xe?!{8!Yor$GzfyTKEfk1lW z(#owpKQhKSTQ~Ljc?K3ce~<)_)!l5%69^AL56oAPqD;~*U|?Q!`zrvR7?MV%Dbhkg zRZc4OrGbc|AOg<)Ed+KPxsS_&HJdscOFWbT4NcwpMpImXd<7JgH=^5qV#7vLdqInm z=R$2Vmi6f@KUaNnZ>*sq!s&oOc+Ow8*7e@xI(g`zJmC5N&d}TUK*d5+E6Ge3{UDuW z8JXVFJXD1NeP{7E+CA|@X}?i>rlaVGLRlKpfH}NC#&}%#Y0t^^57b{XOSYP#X#w5W8F1!bfL)H0gcTeG1#+#R#Wh^@^;fuJb-*=X3XFx^fjQ z4hzHZ-L^BGQ4nNUb+dtyh_kx+`NKe(H+!wYeg+p-|Uhe4Vx3IG@UWl-vmlh zRj;6G;evB;!D>i!Tw#2}nu&{AiedeSOf(v1L+p(@7zs($Q;`DD*Ey5hiFy^r_YYUJ z+UpeuiEo^nF8^)_ckS6)kj{>=&D)epRy7s~(bFccxu^atcCQRUr2KorKTV6F*A-e%|B)~| zy00(r2t{wl(z9AaUj8X?gbzzal=rp#p9m*UD#)cVFN~MZgT&0&86he4w)th5zPtucIy0Z_eI3FV~cP6PlzZpFEl&>AEA}u2F`AN<>d= zEIj{y-cUD9zmn75;U_%!h=bMZIoqot+`FN%o{8HeX4sH{N-RJ|-7u{TeO4fY#Z^2Z zC?B_D-m5SUVM|RBZ{_>V%Uunf!gg3sy9mlNPXqs)cX&M z(S+@8zO-y&gHGQvAB3q89b?qvW8{IfV{pGkB@DL4ee|0z41&cqSyK5JS#t|FtZHhF zXTr=OE737XN?=aum&OTmLvVH>zboT$yBqyGkXp&Co$;Eb`+#%q0=-yiWu-~Z^R_5h zTb`aKP=N_xc4FKVltyC0x}upxd?Ks!3-8y$dcBT$9T-jA)WZJS-l7;hW&Oj@xT*a; zA_6my&^MOOJg0NZ2AVUMPlJO+JD+DE37!sM8-i4reeEm;UXiU~KPEP?xr18T)G2$1 zOoe24xU@9D=vyM2JX&j9-L(|%AX9~nv+dgkQUfTiA0OBrt2BCc>|JYhy+@alm<@|Y z!KT3y1;bFYfxtde@_pIvg^cvFuRlu%VCsim%E!|9shD`@L`m8>yRXf zn@jIRFDM!%30D3bN6zp4l_v(DU;T#%Y^n8WcjZL-fl4+3tgEH=r5pSEk&Bym6Hx6* z!32@!y+(N+_RIK9MOPC%V+f?UMxnA8xON1+VYXv;`l5<*W;j#&_kjtP@z^>^nT1JJ z8d)+-&K_Pdh`x_0dhl_Fd{Q+27iyIEhd~u%vAinkTl5?pVPi?<&n@YhMg4@f$u~9P z8a>Ls20pDB$bkCl{H|XXpgL@*{po&AMH!`6Uor?!idZ`qQD}7)&h5)JPoloPZDH04 zwCF`FLyOk8jka@_3Dd5`rIyWr@N1T*9%*yZ_3Wubjr~~o)cM4#-pBK0CLgPPWdCk^ zLHC=&@OpbaC5H|srkvMYwMESy?aqvmKvJ*E%*IRA!)%Njf**Y6uG3x1~9EO%b88t?tOhs9*vH-l<2E?#sdIUCugULR76Xt>b7kh&QZ{& ztl$8F9ALgt-T93Ic*0`=VntK{Ad1$=V#G#JPXi`A=tg?*&ayXwnT}8s1y<31)8AOZ zo)pC?JC(^$ns#vb31Pp_OLX2ePdWYTKk3%vz-!#vWthYW7eeu=YIdq z%ju;2iN2h{$ihGFv%}suZ&tEnSu!F+@~9Jsl+p|zI7y7{)JV3|D>%Y+Z5F0449Be) zvBE-@nE=+9H{?ameEQSS5=C6Tu`HU@k8uH}96$5JD{X!E zj*$mgi)tpkzt!@P30#V;OS(7TY@DRNo;{UVuuWmMR}Jy|?)KE$)LssS1qeUSIneE& zuG~XPTqcfjq*II8zu&!(kL&B$VKnI716DmVVm}*rP2#}=z8ZaSXw2Z&r|ickqTG-D z$pYG8R63e~Ihj1Enw9(f&;d0nU=?$gy~o)$T3; zlRuu2eDw0i`vU`li4T&3h(~BSW?DV`tF&PwNP!~+&DC#v5|3c&ii!YJZs^N~DxNj3 z;-)udy}MJC9C))70*P$+Xd+8Pj6PuQu4o+NjpAjD29ONt`oV_^prC0I*B%H z{K!2+%)xxtKRpm$)svkWUX+vgZ&{T1n5gST&A!9v=i-%*QfFRWn#PqpgbK7gJTeq; zs?3Dji2w>Dg#6jwpR^&s?)0cJnlPG28(NQ;NOaLpPx}>P>%+L}E9a|d&)ctiB16HL z18kye60K@^`W#o|ee#Pik0_$f&Vy;#eN+K9y=5b(lm6*U_0#6sl^t9eIv=(5rJuvl zOqs0Y@l2RP=3uM(n^NWa52jewKE(on=x+OJ_U3~%(>hoERsXVU0q}II3@y=|!j@BY zBb(l=3g)Vt41FEnKI{z)5108gPopRz)Q^;TvPv1oP^+5}R_RM)r16$q7!~mSr9c{v z&?Ss^Zk-Gp5722*^{c;-QUVqUpKMeI;9>XcW!FB$R$nR%L6Bq_6@$zL&t8@-`f1G< zjZYrnzZHoV@OPrD-m8b#sD@v@LqjW#RytX1R^)QAyIPe%_Q9U(-`(tL@ZxU9nVVZM zggV$=_7Mo?SqAN>-rtwK?TObZ2>690eA`AYuiuMtQ2>&eGv42bE7xv}1Clhqew!8RvC!_A*Wn(|h5zvcZkle@BHU z<*gZ`+O@skKZFB+!Zs4?w*`LLVr+C=cxv)xT4?hmwTa*+dWKFdVCAohGWc-sN56K# z9d@NknMbX};0lEKKiWUh<&&rDiibl-%H*BzEJ{`##(nj+rX$ud_fom~rQK$g418a6 zJ~`KHOw$qMsjGP^ZU3RWv=kW8Pjp-TATJ&1skgT2Els3E!7*S5yW)Bqae(IX-mVy4 z$QN5P^3=}_+K9n9vV9v1UM40Ptto^FcvBG*!0xY#7F@S=Izs2De&j+(PSf#TyXW}^L{nd_T4aUS;wbe(bT^vIw z<+MP6@D!grocjH}jr{_*TOQj@*Tkne&`R@tHp#p>Za&A4KdQQNmuZUqO@wwlmMB>L zx*GWfhb+unN zaOF53e1(}*G1eme{JZwb6XuLKd3L{Y9Fq>(DsaAI+2|BtBRCm1DItf#IS43H8CTNXHee@k6_1S?bT^_FFlW0k%x*CdE}hEbA=kTgAzt=HNzKYZt%WIP z8@ZgTOo1ZwG=ps#T>(U9ZzgJfLn^RF`Y47R)ow z#k~maAt~u(6N@IOs6ZlsC>#S)O8AEbA`sb;-ANRE@5g4h^kaH4rK(@<^S9iPdG&Ud zdf?u9lv~V%R__n`p~QOt1LXl@M$SyBm04*mh(df#y_mYaLe!*(oJ8>}p(7dUw_KU$ zHBE^b)`nWMvcu=;WYkHI7tA8Wxc2+xU$#wWpRb9M5}dq3fRmji^A(i6;hr z7eomN3AbKO2R^)v@0Bb(WNSgscB-LFVE_KsR9S!aUz&Y7sN5aq{61nsohb%GJD9y?@7^^B_s z2J@c+MAoOc2wn7CKqqeQ55|Ys(h_beqi&^r)Tw_!$@2Ck0`ykQp!x<$7|w%>WO1

zh2m{vm&LMle#nvCz|9SogSvx7 zjUn|I$=(%P${9+Wwhk4u54x-$loXP$-$5FSirD&>GDxC3+$~1uwsTuje-Ua%{zq3A zM=QlTe_-~|#+R?y$bhjiFx~=ap;rA#=!}vQRl!NGHpa&8lG&P}L__J?TK6Y9YuJ#2 zQ7mVQHe|e4ocaic!uMRBL~zH~uBhjxQ?TWYzNDbLj5NJ(B$7xIJ3PG!-89a;Y!PZh z2ZVAYTNU`(8vt4RCCD2M7@5syc=)ig#*7k$SRK+?WumaI!lb0$-%|!e?`x&A7jyE= z?cGR8a**>wZxo@0(>hUxgD0pc`Gn`qtAZvxR$sCC*2t8Xk1~ELs(5%HwHw7~h=|wH z#FDYKKPibksJI|rwX`wq@?lYiYSbWF*=Jxi$NAGK&yX#tUhJomU8QQwQ1lh^o6{RJ z)4~Btwdyl{R|kQN@we+KIbUN3=#u! z{}3x04OJklH@DDzpi!I6MAgAKIU(&{r>{#&x-*=gKyFPDAVOIUSIvoTdp>rigJ;PI zLrI`jt>LDMW%>P`Hsg2D)a08@G(a8^1|q4bxXhXV?KNBW`-gNrR2#P>wda#HFWw_M zY-|o|OZa?vQ9^glvjm)K%{#rl4U?7n0Tm)!jr!jsv^px}jcp+v|5!`QYBODzj9z48 zYn|jU8bI`r`Rp_x_iNV+y-lNzCVVId`1NnI1+y1`LY}i|iv0~NqsN!#TRr6$e$7L| zgvGvNH3{r;-IjcF~gu@UPhw5!%(G6tD?*8(42OF=D>grO`2}pFf*&ymZ>+T)J=$#&jK9oc$d6nEAQ5 z#e6=9mY;v}=6_rzO5Ml zM%HJ4ebUe;bumnw&JuKwju^>_(y`hw4H@>()L3jaEN7D@dT?K6(ex|o{mD$Uo8mNP zmkZ-;Y*+M0u>p8G##0i^>Az7>i&E_d$6-B8$MvDEu+CZ9VVn-^L%{j@kuL)22KLj+ z&bFoVi#t)534b$rCmuj_4%yr1M?QzWyCU?gf|C@ihPGz0Q~!FC<`Pjo zLdL9itCAkc56b0we4KDanPJaI$Nf1B=n5`!#%0FZ?__#>-%!a&P=&OipX6 z01^F+9{KahAabYToehuB`O_!!nFp5E7{sESS8D@f(?~iDQQnBjuuuF8FUA?C{Zsvf z@+K}?l&d7N6@`Z;>7d#+m)8#NRe1H?5_b)JYZ=S1(dLdr)79Fpml?&djE<%$(WUAT%GB&=?UWLisX<44qMZ=QtbK1}wmk^y8OnaD4oRMd-fo?U6YY$+M zhhkI4PSdtFIqJ|VXR)a9DyZmTq@RXer_Gf+MJWNcPFPQGqF36Fe_vlI2B4f%2|UYOAH^>M z)BR0CE+_vXnK|*U057#TuYq0_pCh+^-{o<}=vQ+k-lvUYG5+$w3kI<^VhO#_N z2aGvj-WM@qtS~1xF_;$`E~f#gH(W%Ya(1^?^^L&*r3jqi=#G0vTI|D$y}^9mb5wAr z63Xg$Qd4EQ$y~i`MP-Q2^pz>GoSOEYqb0I-TZfJ?K8*VMA`^MhrxG|sfjZd#1OhM# z$-sQQU?g0*T`5C8oLtnE`mr(?MFJ-NO2>fI&(5miN)l{a5&|icWYu?DgvRE|-bF?R zrG$`iq<36^imaljjvMrR$R36eohQAj5F@muQ1beMU^9hRLukF~DgxZ;K9hrdl0)LZ zIq4{-%DP+C*O}pAkrDH7&{R)=hO|0`qKDd>04Fv}jeWEHtRCme(RV=j)yr-$`(9Ql zA+qP_o;I4eNMUj0B5@^unN*f>)c{sWQaAhWv#<2eX*^ zuag%<5ni49{2aoJ{_`1)j+;Ks%w5(s^FuC!*;7G<5YnT6l= zV@4FO(lgyn_BE*vVh9i}5c{orqmRUUr~W#ic!1A0!(7wo_(>||{5-tHz_u!4nl>}?b9|px^r3H9 zX=#X~tFL`9{}k$xTsHLLLqj5AlQQMZumuf{I{7(-S+nqXUwH#b-)O-5F3)9Jh`lF1 zl8_lDSzUy|mORe0c{4onL8|PVwSn$EwLO!Q!LrEOgZvB;6Ys!7%XwG#P{7v%x?6l( zk;~U?f+9SyG5zbp1qEjiP^BT@t{|!T|@J76|z=1VY}-^$;M#xcXPHZ#fml* zR2ByGgvqF6?8K6ndsh?+5F;k$Fd;bvE2{TWS!j91&Us;$#mt|290a5U;*axt=v>{2 zYrGWbIC;7L-L&4X{F?F(7XL*p%zn(PwA80e;_DkBBUxX=61QW?o;Ip?KKH?^zM0tg z;FBVNhmsc-;qpIzU`4QC{-@_tCWbA7e-(`X$Ad<}H-U$-EJZ1;f3#d|6XY^)Ffs+> z5Ptr5dhayNQpgrDOhzNG1w4)}^fK%G(laou#sRsmCss~!!Z&3fswWxUiCd|+?@#!)vF-(bK4eIdoX+Ae7dNFnJOVE!lByeQD4xc8#w`uVW`VzSfs>9R~6l0JAPPN=3NgwO>dt?vS}7O$3)}(-2YF>kf)I7 zL~XA_e9N6Qsa$g#IOg^@o*-}%$>%aINqIX|uh;-J&xWQ0i*-E~5QU;djK&*4pyZ^k#|Vk9#hi z9KGPvUk#~u>t~U?nN&tU(hZv(C%*0e(?_JDH>4lR$>*guF}^cjx>^WtI2!wa=3TY*y94GQVOS2S-(Dr8pzV37%IC0DxB3j1SMZ40 zPO=-H{B^X!z|WzClIpnY@VcMu2ApQH zTG`Qb>gb_v!!lcrf0_PYx4d05-FR07zQfbY@KD(2^6|_!BkE4k{3F)r!%h_?o;yKS zsL)3YpF21u_8~`Il9e#J-!niNt8Xw~1PxsR!GxYk!PC13O#f8lN(Jk4Z2`-(ipB$0@POfDwP8Rm{Y7*LmNvxv zoB8J%7G%Gxm^8Y&^aLF2QTHe!on0b3_tqk1i69`HqLc%pnsIJz`|?KVs+t&fTW96+ z$s=cbCM*mo>pbzPWYT4ZroVn{07$13NJS0YZH6wX&3|FvqDLpkT#~4oBf-Hu3b=X9o$7o`McfONCwZ-w-%QA#*?mlL8!%l~>3BG{>gk z9~6Ho0B|hq$#QddUaho7yt^(ED*1cjm|#6Ho|*wtXI@zL0@8OAT%%wkR8YGn7i{!t zv#^{au`pgYJ?L6sI~ z_acdV{Q#0eH&DNdVmdMcu9puI~XKBU9KRL@0XhQej;)2;_ zxE<|Q6N&RuiijAbn85@9^tWBkC1%yz#2pL~YjQyBk*s*BJPoCH)oA4mA&F_-q-M(=F|%N~U&9GT_CyOS|C;tt);+sMv~ diff --git a/.playwright-mcp/saasshare-apps-list.png b/.playwright-mcp/saasshare-apps-list.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab65344fdedb9234bfddbb11c72537e6418175a GIT binary patch literal 64007 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 literal 0 HcmV?d00001 diff --git a/.playwright-mcp/saasshare-devices.png b/.playwright-mcp/saasshare-devices.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb47fe31bf36126a596311a02d14a38ee9b40c0 GIT binary patch literal 49300 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

  • 6(a@Zzfh&*fb|`sqd3iivwR?X}xU;pj zQsO_CtjX(rW$7`ps&f^Keo&s9Gu1DgLVM`4$ z1|1;<)>%QW{cw);ZbG{jJ;tNRCv9^N#gT<^|Hr}{F}}A=!;le@2XZFvmJer&C; z)5pIK2|@MVPDmQf5P;w9>N|0!^}MFn`4SPHivH=7MaCfj6w1SR+kJnq^pxSBQrxhs zawbjK${~_cXLvqjuD7Ix)_mLPp66MkFjQh~^oMz8x(H!!F(G5$4I zl|{sLVnvBso+r0i%%pgPr?7tLbXwc%p?KVab@|cx5)!W>l{8rPaepAZRMJ~I)FWVW zx9{g73_E#YqGR#?YX7nw@wDY;VHN7@W~ilgA42FiRC#nnv05%c27eW{XD3(}HbWY6y9e;$UiU9hp zd>eu&edsjlWRKEjSyhR2rI(p$Co1a4aMb^BSH;<0QfY^=;>*YDe$0cY6&sX-!AmEn z=CmeZ`SrrR!4AXhJ;su6nKYrzJYq<103PTl#w1j8m}?8Bg!$ z_*w4}JnO`-x({ZHqjJi-AC&BP6a-vGtWTS-NAMVAQDdvEt(BFONJyXtpL2_gWysL4 zj~DYA;+#A^V4=X=Glm~9H5>`3#@HjG`PPUrd;&%bRsDfv1*ZA zwV_=M5vyH<|A~7)rsy;!ib-gexhT7&WFhJ5wwG)&n$#8tIeoPe{Nx1>jFeBR)ApFD zb;j|w{Zdbxw(0RY)nAvO z69hWLQ#c=9%^lTo?GO~*f(;_0b$M_y|S0h^~d%fMl1e(Bzx z64aS+V-Ys3C@KtXO>u` zl>DfH=1gxdU`7M1%7;=wmy>^Hou1y>*`Xk+bfb8;oGsjZ`d}1uB@LSF3P4CfrCWssergmMTYiB|pFCPz(WdMVq6p!6XK}NO#$w4le*r z77dLXdNKUnP%-m6hUOa*bW}Vn+TywRMHh+TnC6>gbN)8hhenSMyo`}?_^v#mkGhgk z)`(gC*WM3VL#XiT^^yCR&;B}av87LKeA;*n1lh813fVT#!rQK*{%O%0!byuVXg12& zdANnTnp&K;h_;=Bv%7m)adEY4u0gN(yUQI}@6FEcD3jvZPfyLBo6o?F)%$n6%3OfX z)oBZ_Oqc%Nwbxr8?sGgc=tD95j%u}G05_FY;DnRgVjb^Pj?(xJ%HU_GEdk(zJg%o_ zmzH$M(fd1s{BO=2?3XG#_!766Fr>0yxn>FScA?6~yF6R?V2)U6rVX9BXDWSLU} ztX&3-`9EJzzhO4By?g8u6^6%*DbP(P0Hu7)yKIJDoTerB6g03A$L)ZK zB>psJHjhKyWyRoP)k$OanA%1<5%1wDZ3(O9D_}5;FVq}reev;D%&FC>*zBGC6gITV zKxuj-!xg_&+CbS7&297&97hdxSE8nA+*q~E?=q*|y-501Tr4`nL{P_B z7Xi!-@Pg#$=I$h@Cn6%kteGh#DUkV{wh)6zChd{{{JGo?ChX+Kv@$h%b%{GT-(YYn z8BZ$o{cAiuAK9}WWd8@Bq#vvUSEKqqyQxUlLID|Vv>K$g6-L(WhT#Ga79GRh;X6L} z)A)tbdh9#h7?G#a$WW%Qxud!XKI&&oCSb`)xnxG;xxAtit*V9JCAG5?v9QYBS~5c4 zYUtp0t&=u-)%;@z^58-xon(Bv7%xZC zwd9t(OEXKxfb~j0Vn^KH*lw$$lC9zeC)3o_Ool=opC5y2bxQjk7GLtc2CPVnWImC9 zV8Xwoo8y{*F9Upv`uHEC-$wBNPOSh5lz*jfevkogAiV!m8`ph}EgTuMWwta-yZe2H*cLdD`_W literal 0 HcmV?d00001 diff --git a/.playwright-mcp/saasshare-view.png b/.playwright-mcp/saasshare-view.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab65344fdedb9234bfddbb11c72537e6418175a GIT binary patch literal 64007 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 literal 0 HcmV?d00001 diff --git a/.playwright-mcp/system-view-working.png b/.playwright-mcp/system-view-working.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa678341ba8d47d0df2e25317fcdb0b87ab9005 GIT binary patch literal 64414 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 alert('Hello!')}> - Click me! - - `; - } -} -``` - -## 📖 Development Guide - -For developers working on this library, please refer to the [UI Components Playbook](readme.playbook.md) for comprehensive patterns, best practices, and architectural guidelines. - -## 📚 Components Overview - -| Category | Components | -|----------|------------| -| **Core UI** | [`DeesButton`](#deesbutton), [`DeesButtonExit`](#deesbuttonexit), [`DeesButtonGroup`](#deesbuttongroup), [`DeesBadge`](#deesbadge), [`DeesChips`](#deeschips), [`DeesHeading`](#deesheading), [`DeesHint`](#deeshint), [`DeesIcon`](#deesicon), [`DeesLabel`](#deeslabel), [`DeesPanel`](#deespanel), [`DeesSearchbar`](#deessearchbar), [`DeesSpinner`](#deesspinner), [`DeesToast`](#deestoast), [`DeesWindowcontrols`](#deeswindowcontrols) | -| **Forms** | [`DeesForm`](#deesform), [`DeesInputText`](#deesinputtext), [`DeesInputCheckbox`](#deesinputcheckbox), [`DeesInputDropdown`](#deesinputdropdown), [`DeesInputRadiogroup`](#deesinputradiogroup), [`DeesInputFileupload`](#deesinputfileupload), [`DeesInputIban`](#deesinputiban), [`DeesInputPhone`](#deesinputphone), [`DeesInputQuantitySelector`](#deesinputquantityselector), [`DeesInputMultitoggle`](#deesinputmultitoggle), [`DeesInputTags`](#deesinputtags), [`DeesInputTypelist`](#deesinputtypelist), [`DeesInputList`](#deesinputlist), [`DeesInputProfilepicture`](#deesinputprofilepicture), [`DeesInputRichtext`](#deesinputrichtext), [`DeesInputWysiwyg`](#deesinputwysiwyg), [`DeesInputDatepicker`](#deesinputdatepicker), [`DeesInputSearchselect`](#deesinputsearchselect), [`DeesFormSubmit`](#deesformsubmit) | -| **Layout** | [`DeesAppui`](#deesappui), [`DeesAppuiMainmenu`](#deesappuimainmenu), [`DeesAppuiSecondarymenu`](#deesappuisecondarymenu), [`DeesAppuiMaincontent`](#deesappuimaincontent), [`DeesAppuiAppbar`](#deesappuiappbar), [`DeesAppuiActivitylog`](#deesappuiactivitylog), [`DeesAppuiProfiledropdown`](#deesappuiprofiledropdown), [`DeesAppuiTabs`](#deesappuitabs), [`DeesMobileNavigation`](#deesmobilenavigation), [`DeesDashboardGrid`](#deesdashboardgrid) | -| **Data Display** | [`DeesTable`](#deestable), [`DeesDataviewCodebox`](#deesdataviewcodebox), [`DeesDataviewStatusobject`](#deesdataviewstatusobject), [`DeesPdf`](#deespdf), [`DeesStatsGrid`](#deesstatsgrid), [`DeesPagination`](#deespagination) | -| **Visualization** | [`DeesChartArea`](#deeschartarea), [`DeesChartLog`](#deeschartlog) | -| **Dialogs & Overlays** | [`DeesModal`](#deesmodal), [`DeesContextmenu`](#deescontextmenu), [`DeesSpeechbubble`](#deesspeechbubble), [`DeesWindowlayer`](#deeswindowlayer) | -| **Navigation** | [`DeesStepper`](#deesstepper), [`DeesProgressbar`](#deesprogressbar) | -| **Development** | [`DeesEditor`](#deeseditor), [`DeesEditorMarkdown`](#deeseditormarkdown), [`DeesEditorMarkdownoutlet`](#deeseditormarkdownoutlet), [`DeesTerminal`](#deesterminal), [`DeesUpdater`](#deesupdater) | -| **Theming** | [`DeesTheme`](#deestheme) | -| **Auth & Utilities** | [`DeesSimpleAppdash`](#deessimpleappdash), [`DeesSimpleLogin`](#deessimplelogin) | -| **Shopping** | [`DeesShoppingProductcard`](#deesshoppingproductcard) | - ---- - -## 🎯 Detailed Component Documentation - -### Core UI Components - -#### `DeesButton` -A versatile button component supporting multiple styles and states. - -```typescript -// Basic usage -const button = document.createElement('dees-button'); -button.text = 'Click me'; - -// With options -Click me -``` - -#### `DeesBadge` -Display status indicators or counts with customizable styles. - -```typescript - -``` - -#### `DeesChips` -Interactive chips/tags with selection capabilities. - -```typescript - -``` - -#### `DeesIcon` -Display icons from FontAwesome and Lucide icon libraries with library prefixes. - -```typescript -// FontAwesome icons - use 'fa:' prefix - - -// Lucide icons - use 'lucide:' prefix - - -// Legacy API (deprecated but still supported) - -``` - -#### `DeesLabel` -Text label component with optional icon and status indicators. - -```typescript - -``` - -#### `DeesSpinner` -Loading indicator with customizable appearance. - -```typescript - -``` - -#### `DeesToast` -Notification toast messages with various styles, positions, and auto-dismiss functionality. - -```typescript -// Programmatic usage -DeesToast.show({ - message: 'Operation successful', - type: 'success', // Options: info, success, warning, error - duration: 3000, // Time in milliseconds before auto-dismiss - position: 'top-right' // Options: top-right, top-left, bottom-right, bottom-left, top-center, bottom-center -}); - -// Convenience methods -DeesToast.info('Information message'); -DeesToast.success('Success message'); -DeesToast.warning('Warning message'); -DeesToast.error('Error message'); - -// Advanced control -const toast = await DeesToast.show({ - message: 'Processing...', - type: 'info', - duration: 0 // No auto-dismiss -}); - -// Later dismiss programmatically -toast.dismiss(); -``` - -**Key Features:** -- Multiple toast types with distinct icons and colors -- 6 position options for flexible placement -- Auto-dismiss with visual progress indicator -- Manual dismiss by clicking -- Smooth animations and transitions -- Automatic stacking of multiple toasts -- Theme-aware styling -- Programmatic control - -#### `DeesButtonExit` -Exit/close button component with consistent styling. - -```typescript - -``` - -#### `DeesButtonGroup` -Container for grouping related buttons together. - -```typescript - -``` - -#### `DeesHeading` -Consistent heading component with level and styling options. - -```typescript - -``` - -#### `DeesHint` -Hint/tooltip component for providing contextual help. - -```typescript - -``` - -#### `DeesPanel` -Container component for grouping related content with optional title and actions. - -```typescript - - - -``` - -#### `DeesSearchbar` -Search input component with suggestions and search handling. - -```typescript - -``` - -#### `DeesWindowcontrols` -Window control buttons (minimize, maximize, close) for desktop-like applications. - -```typescript - -``` - ---- - -### Form Components - -#### `DeesForm` -Container component for form elements with built-in validation and data handling. - -```typescript - handleFormData(e.detail)} // Emitted when form is submitted - @formValidation=${(e) => handleValidation(e.detail)} // Emitted during validation -> - - Submit - -``` - -#### `DeesInputText` -Text input field with validation and formatting options. - -```typescript - -``` - -#### `DeesInputCheckbox` -Checkbox input component for boolean values. - -```typescript - -``` - -#### `DeesInputDropdown` -Dropdown selection component with search and filtering capabilities. - -```typescript - -``` - -#### `DeesInputFileupload` -File upload component with drag-and-drop support. - -```typescript - -``` - -#### `DeesInputIban` -Specialized input for IBAN (International Bank Account Number) with validation. - -```typescript - -``` - -#### `DeesInputPhone` -Phone number input with country code selection and formatting. - -```typescript - -``` - -#### `DeesInputQuantitySelector` -Numeric input with increment/decrement controls. - -```typescript - -``` - -#### `DeesInputMultitoggle` -Multi-state toggle button group. - -```typescript - -``` - -#### `DeesInputRadiogroup` -Radio button group for single-choice selections with internal state management. - -```typescript - - -// With custom option objects - -``` - -#### `DeesInputTags` -Tag input component for managing lists of tags with auto-complete and validation. - -```typescript - -``` - -**Key Features:** -- Add tags by pressing Enter or typing comma/semicolon -- Remove tags with click or backspace -- Auto-complete suggestions with keyboard navigation -- Maximum tag limit support -- Full theme support -- Form validation integration - -#### `DeesInputTypelist` -Dynamic list input for managing arrays of typed values. - -```typescript - -``` - -#### `DeesInputList` -Advanced list input with drag-and-drop reordering, inline editing, and validation. - -```typescript - -``` - -**Key Features:** -- Add, edit, and remove items inline -- Drag-and-drop reordering with visual feedback -- Optional duplicate prevention -- Min/max item constraints -- Delete confirmation dialog -- Full keyboard support -- Form validation integration - -#### `DeesInputProfilepicture` -Profile picture input with cropping, zoom, and image processing. - -```typescript - -``` - -**Key Features:** -- Interactive cropping modal with zoom and pan -- Drag-and-drop file upload -- Round or square output shapes -- Configurable output size and quality -- File size and format validation -- Delete functionality -- Preview on hover - -#### `DeesInputDatepicker` -Date and time picker component with calendar interface and manual typing support. - -```typescript - -``` - -**Key Features:** -- Interactive calendar popup -- Manual date typing with multiple formats -- Optional time selection -- Configurable date format -- Min/max date constraints -- Disable specific dates -- Keyboard navigation -- Today button -- Clear functionality -- 12/24 hour time formats -- Theme-aware styling -- Live parsing and validation - -**Manual Input Formats:** -```typescript -// Date formats supported -"2023-12-20" // ISO format (YYYY-MM-DD) -"20.12.2023" // European format (DD.MM.YYYY) -"12/20/2023" // US format (MM/DD/YYYY) - -// Date with time (add space and time after any date format) -"2023-12-20 14:30" -"20.12.2023 9:45" -"12/20/2023 16:00" -``` - -#### `DeesInputSearchselect` -Search-enabled dropdown selection component. - -```typescript - -``` - -#### `DeesInputRichtext` -Rich text editor with formatting toolbar powered by TipTap. - -```typescript - -``` - -**Key Features:** -- Full formatting toolbar (bold, italic, underline, strike, etc.) -- Heading levels (H1-H6) -- Lists (bullet, ordered) -- Links with URL editing -- Code blocks and inline code -- Blockquotes -- Horizontal rules -- Undo/redo support -- Word and character count -- HTML output - -#### `DeesInputWysiwyg` -Advanced block-based editor with slash commands and rich content blocks. - -```typescript - -``` - -**Key Features:** -- Slash commands for quick formatting -- Block-based editing (paragraphs, headings, lists, etc.) -- Drag and drop block reordering -- Multiple output formats -- Keyboard shortcuts -- Collaborative editing ready -- Extensible block types - -#### `DeesFormSubmit` -Submit button component specifically designed for `DeesForm`. - -```typescript -Submit Form -``` - ---- - -### Layout Components - -#### `DeesAppui` -A comprehensive application shell component providing a complete UI framework with navigation, menus, activity logging, and view management. - -> **Full API Documentation**: See [ts_web/elements/00group-appui/dees-appui/readme.md](./ts_web/elements/00group-appui/dees-appui/readme.md) for complete documentation including all programmatic APIs, view lifecycle hooks, and TypeScript interfaces. - -**Quick Start:** - -```typescript -import { html, DeesElement, customElement } from '@design.estate/dees-element'; -import { DeesAppui } from '@design.estate/dees-catalog'; - -@customElement('my-app') -class MyApp extends DeesElement { - private appui: DeesAppui; - - async firstUpdated() { - this.appui = this.shadowRoot.querySelector('dees-appui'); - - // Configure with views and menu - this.appui.configure({ - branding: { logoIcon: 'lucide:box', logoText: 'My App' }, - views: [ - { id: 'dashboard', name: 'Dashboard', iconName: 'lucide:home', content: 'my-dashboard' }, - { id: 'settings', name: 'Settings', iconName: 'lucide:settings', content: 'my-settings' }, - ], - mainMenu: { - sections: [{ name: 'Main', views: ['dashboard', 'settings'] }] - }, - defaultView: 'dashboard' - }); - } - - render() { - return html``; - } -} -``` - -**Key Features:** -- **Configure API**: Single `configure()` method for complete app setup -- **View Management**: Automatic view caching, lazy loading, and lifecycle hooks -- **Programmatic APIs**: Full control over AppBar, Main Menu, Secondary Menu, Content Tabs, and Activity Log -- **View Lifecycle Hooks**: `onActivate()`, `onDeactivate()`, and `canDeactivate()` for view components -- **Hash-based Routing**: Automatic URL synchronization with view navigation -- **RxJS Observables**: `viewChanged$` and `viewLifecycle$` for reactive programming -- **TypeScript-first**: Typed `IViewActivationContext` passed to views on activation -- **Activity Log Toggle**: Built-in appbar button to show/hide activity panel with entry count badge - -**Programmatic APIs include:** -- `navigateToView(viewId, params?)` - Navigate between views -- `setAppBarMenus()`, `setBreadcrumbs()`, `setUser()` - Control the app bar -- `setMainMenu()`, `setMainMenuSelection()`, `setMainMenuBadge()` - Control main navigation -- `setMainMenuCollapsed()`, `setMainMenuVisible()` - Control main menu visibility -- `setSecondaryMenu()`, `setSecondaryMenuCollapsed()`, `setSecondaryMenuVisible()` - Control secondary menu -- `setContentTabs()`, `setContentTabsVisible()` - Control view-specific UI -- `activityLog.add()`, `activityLog.addMany()`, `activityLog.clear()` - Manage activity entries -- `setActivityLogVisible()`, `toggleActivityLog()`, `getActivityLogVisible()` - Control activity panel - -**View Visibility Control:** -```typescript -// In your view's onActivate hook -onActivate(context: IViewActivationContext) { - // Hide secondary menu for a fullscreen view - context.appui.setSecondaryMenuVisible(false); - - // Hide content tabs - context.appui.setContentTabsVisible(false); - - // Collapse main menu to give more space - context.appui.setMainMenuCollapsed(true); -} -``` - -#### `DeesAppuiMainmenu` -Main navigation menu component for application-wide navigation. - -```typescript - navigate('dashboard') }, - { key: 'settings', iconName: 'lucide:settings', action: () => navigate('settings') } - ] - } - ]} - collapsed // Optional: show collapsed version -> -``` - -#### `DeesAppuiSecondarymenu` -Secondary navigation component for sub-section selection with collapsible groups and badges. - -```typescript - select('frontend'), badge: 3, badgeVariant: 'warning' }, - { key: 'API Server', iconName: 'lucide:server', action: () => select('api') } - ] - } - ]} - @item-select=${handleSectionChange} -> -``` - -#### `DeesAppuiMaincontent` -Main content area with tab management support. - -```typescript - selectTab('overview') }, - { key: 'Details', iconName: 'lucide:info', action: () => selectTab('details') } - ]} - @tab-select=${handleTabChange} -> - - -``` - -#### `DeesAppuiAppbar` -Professional application bar component with hierarchical menus, breadcrumb navigation, user account management, and activity log toggle. +### EcoApplauncher -```typescript - {}, // No-op for parent menu items - submenu: [ - { - name: 'New File', - shortcut: 'Cmd+N', - iconName: 'file-plus', - action: async () => handleNewFile() - }, - { - name: 'Open...', - shortcut: 'Cmd+O', - iconName: 'folder-open', - action: async () => handleOpen() - }, - { divider: true }, // Menu separator - { - name: 'Save', - shortcut: 'Cmd+S', - iconName: 'save', - action: async () => handleSave(), - disabled: true // Disabled state - } - ] - } - ]} - .breadcrumbs=${'Project > src > components'} - .showWindowControls=${true} - .showSearch=${true} - .showActivityLogToggle=${true} - .activityLogCount=${5} - .activityLogActive=${false} - .user=${{ - name: 'John Doe', - avatar: '/path/to/avatar.jpg', - status: 'online' // Options: 'online' | 'offline' | 'busy' | 'away' - }} - @menu-select=${(e) => handleMenuSelect(e.detail.item)} - @breadcrumb-navigate=${(e) => handleBreadcrumbClick(e.detail)} - @activity-toggle=${() => handleActivityToggle()} -> -``` - -**Key Features:** -- **Hierarchical Menu System** - Top-level menus with dropdown submenus, icons, and keyboard shortcuts -- **Keyboard Navigation** - Full keyboard support (Tab, Arrow keys, Enter, Escape) -- **Breadcrumb Navigation** - Customizable breadcrumb trail with click events -- **User Account Section** - Avatar with status indicator and profile dropdown -- **Activity Log Toggle** - Button with badge count to show/hide activity panel -- **Accessibility** - Full ARIA support with menubar roles +The main application launcher component providing a complete desktop-like interface with: -#### `DeesAppuiActivitylog` -Real-time activity log panel for displaying user actions and system events. +- Login view with customizable authentication +- Home view with app grid +- Top bar with date, search, notifications, and user info +- Status bar with network, battery, sound, and keyboard indicators +- Power menu with shutdown, restart, sleep, and lock options ```typescript - +import { EcoApplauncher } from '@ecobridge.xyz/catalog'; -// Programmatic API -activityLog.add({ - type: 'update', // Options: login, logout, view, create, update, delete, custom - user: 'John Doe', - message: 'Updated project settings', - iconName: 'lucide:settings' // Optional: custom icon -}); - -activityLog.addMany(entries); // Add multiple entries -activityLog.clear(); // Clear all entries -activityLog.getEntries(); // Get all entries -activityLog.filter({ user: 'John' }); // Filter by user/type -activityLog.search('settings'); // Search by message +const launcher = document.createElement('eco-applauncher'); +launcher.mode = 'login'; // or 'home' +launcher.apps = [ + { name: 'Settings', icon: 'lucide:settings', action: () => openSettings() }, + { name: 'Files', icon: 'lucide:folder', action: () => openFiles() }, +]; +document.body.appendChild(launcher); ``` -**Key Features:** -- Stacked entry layout with icon, user, timestamp, and message -- Date grouping (Today, Yesterday, etc.) -- Search and filter functionality -- Context menu for entry actions -- Live streaming indicator -- Animated slide-in/out panel -- Theme-aware styling - -#### `DeesAppuiTabs` -Reusable tab component with horizontal/vertical layout support. +### Sub-Components -```typescript - console.log('Home') }, - { key: 'Settings', iconName: 'lucide:settings', action: () => console.log('Settings') } - ]} - tabStyle="horizontal" // Options: horizontal, vertical - showTabIndicator={true} - @tab-select=${handleTabSelect} -> -``` - ---- +| Component | Description | +|-----------|-------------| +| `EcoApplauncherWifimenu` | WiFi network selection menu | +| `EcoApplauncherBatterymenu` | Battery status and power mode menu | +| `EcoApplauncherSoundmenu` | Audio device and volume control menu | +| `EcoApplauncherKeyboard` | Virtual on-screen keyboard | +| `EcoApplauncherPowermenu` | Power actions menu (shutdown, restart, etc.) | -### Data Display Components +### EcoScreensaver -#### `DeesTable` -Advanced table component with sorting, filtering, and action support. +A subtle animated screensaver component with flowing geometric patterns. ```typescript - ({ - name: item.name, - date: item.date, - amount: item.amount, - description: item.description - })} - .dataActions=${[ - { - name: 'Edit', - icon: 'edit', - action: (item) => handleEdit(item) - }, - { - name: 'Delete', - icon: 'trash', - action: (item) => handleDelete(item) - } - ]} - heading1="Transactions" - heading2="Recent Activity" - searchable // Enable search functionality - dataName="transaction" // Name for single data item - @selection-change=${handleSelectionChange} -> -``` - -**Advanced Features:** -- Schema-first columns or `displayFunction` rendering -- Sorting via header clicks with `aria-sort` + `sortChange` -- Global search with Lucene-like syntax; modes: `table`, `data`, `server` -- Per-column quick filters row; `showColumnFilters` and `column.filterable=false` -- Selection: `none` | `single` | `multi`, with select-all and `selectionChange` -- Sticky header + internal scroll (`stickyHeader`, `--table-max-height`) -- Rich actions: header/in-row/contextmenu/footer/doubleClick; pinned Actions column -- Editable cells via `editableFields` -- Drag & drop files onto rows +import { EcoScreensaver } from '@ecobridge.xyz/catalog'; -#### `DeesDataviewCodebox` -Code display component with syntax highlighting and line numbers. +// Show screensaver +await EcoScreensaver.show(); -```typescript - { - return html\`
    Hello World
    \`; - }; - `} ->
    +// Hide screensaver +EcoScreensaver.hide(); ``` -#### `DeesDataviewStatusobject` -Status display component for complex objects with nested status indicators. - -```typescript - -``` +## Development -#### `DeesPdf` -PDF viewer component with navigation and zoom controls. +```bash +# Install dependencies +pnpm install -```typescript - -``` +# Watch mode for development +pnpm run watch -#### `DeesStatsGrid` -A responsive grid component for displaying statistical data with various visualization types. +# Build +pnpm run build -```typescript - +# Run tests +pnpm test ``` -#### `DeesPagination` -Pagination component for navigating through large datasets. - -```typescript - -``` - ---- - -### Visualization Components - -#### `DeesChartArea` -Area chart component built on ApexCharts for visualizing time-series data. - -```typescript - -``` - -#### `DeesChartLog` -Specialized chart component for visualizing log data and events. - -```typescript - -``` - ---- - -### Dialogs & Overlays Components - -#### `DeesModal` -Modal dialog component with customizable content and actions. - -```typescript -// Programmatic usage -DeesModal.createAndShow({ - heading: 'Confirm Action', - content: html` - - - - `, - menuOptions: [ - { name: 'Cancel', action: async (modal) => { modal.destroy(); return null; } }, - { name: 'Confirm', action: async (modal) => { /* handle */ modal.destroy(); return null; } } - ] -}); -``` - -#### `DeesContextmenu` -Context menu component for right-click actions. - -```typescript - handleEdit() }, - { label: 'Delete', icon: 'trash', action: () => handleDelete() } - ]} - position="right" -> -``` - -#### `DeesSpeechbubble` -Tooltip-style speech bubble component for contextual information. - -```typescript -// Programmatic usage -const bubble = await DeesSpeechbubble.createAndShow( - referenceElement, - 'Helpful information about this feature' -); -``` - -#### `DeesWindowlayer` -Base overlay component used by modal dialogs and other overlay components. - -```typescript -const layer = await DeesWindowLayer.createAndShow({ - blur: true, -}); -``` - ---- - -### Navigation Components - -#### `DeesStepper` -Multi-step navigation component for guided user flows. - -```typescript -Form 1` }, - { key: 'address', label: 'Address', content: html`
    Form 2
    ` }, - { key: 'confirm', label: 'Confirmation', content: html`
    Review
    ` } - ]} - currentStep="personal" - @step-change=${handleStepChange} - @complete=${handleComplete} ->
    -``` - -#### `DeesProgressbar` -Progress indicator component for tracking completion status. - -```typescript - -``` - ---- - -### Theming Components - -#### `DeesTheme` -Theme provider component that wraps children and provides CSS custom properties for consistent theming. - -```typescript -// Basic usage - wrap your app - - - - -// With custom overrides - - - -``` - -**Key Features:** -- Provides CSS custom properties for colors, spacing, radius, shadows, and transitions -- Can be nested for section-specific theming -- Works with dark/light mode -- Overrides cascade to all child components - ---- - -### Development Components - -#### `DeesEditor` -Code editor component with syntax highlighting and code completion, powered by Monaco Editor. - -```typescript - -``` - -#### `DeesEditorMarkdown` -Markdown editor component with live preview. - -```typescript - -``` - -#### `DeesEditorMarkdownoutlet` -Markdown preview component for rendering markdown content. - -```typescript - -``` - -#### `DeesTerminal` -Terminal emulator component for command-line interface. - -```typescript - `Echo: ${args.join(' ')}`, - 'help': () => 'Available commands: echo, help' - }} - .prompt=${'$'} - .welcomeMessage=${'Welcome! Type "help" for available commands.'} -> -``` - -#### `DeesUpdater` -Component for managing application updates and version control. - -```typescript - -``` - ---- - -### Auth & Utilities Components - -#### `DeesSimpleAppdash` -Simple application dashboard component for quick prototyping. - -```typescript - - - -``` - -#### `DeesSimpleLogin` -Simple login form component with validation and customization. - -```typescript - -``` - ---- - -### Shopping Components - -#### `DeesShoppingProductcard` -Product card component for e-commerce applications. - -```typescript - -``` - ---- - -## 🔧 TypeScript Interfaces - -The library exports unified interfaces for consistent API patterns: - -```typescript -// Base menu item interface (used by tabs, menus, etc.) -interface IMenuItem { - key: string; - iconName?: string; - action: () => void; - badge?: string | number; - badgeVariant?: 'default' | 'success' | 'warning' | 'error'; -} - -// Menu group interface for organized menus -interface IMenuGroup { - name: string; - items: IMenuItem[]; - collapsed?: boolean; - iconName?: string; -} - -// View definition for app navigation -interface IViewDefinition { - id: string; - name: string; - iconName?: string; - content: string | HTMLElement | (() => TemplateResult); - secondaryMenu?: ISecondaryMenuGroup[]; - contentTabs?: IMenuItem[]; - route?: string; - badge?: string | number; -} - -// Activity log entry -interface IActivityEntry { - id?: string; - timestamp?: Date; - type: 'login' | 'logout' | 'view' | 'create' | 'update' | 'delete' | 'custom'; - user: string; - message: string; - iconName?: string; - data?: Record; -} -``` - ---- - ## License and Legal Information This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file. @@ -1404,15 +80,12 @@ This repository contains open-source code licensed under the MIT License. A copy ### Trademarks -This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein. - -Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar. +This project is owned and maintained by Lossless GmbH. The names and logos associated with Lossless GmbH and any related products or services are trademarks of Lossless GmbH or third parties, and are not included within the scope of the MIT license granted herein. ### Company Information -Task Venture Capital GmbH -Registered at District Court Bremen HRB 35230 HB, Germany +Lossless GmbH -For any legal inquiries or further information, please contact us via email at hello@task.vc. +For any legal inquiries or further information, please contact us via the official channels. -By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works. +By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Lossless GmbH of any derivative works. diff --git a/readme.playbook.md b/readme.playbook.md deleted file mode 100644 index 0d4cd47..0000000 --- a/readme.playbook.md +++ /dev/null @@ -1,784 +0,0 @@ -# UI Components Playbook - -This playbook provides comprehensive guidance for creating and maintaining UI components in the @design.estate/dees-catalog library. Follow these patterns and best practices to ensure consistency, maintainability, and quality. - -## Table of Contents - -1. [Component Creation Checklist](#component-creation-checklist) -2. [Architectural Patterns](#architectural-patterns) -3. [Component Types and Base Classes](#component-types-and-base-classes) -4. [Theming System](#theming-system) -5. [Event Handling](#event-handling) -6. [State Management](#state-management) -7. [Form Components](#form-components) -8. [Overlay Components](#overlay-components) -9. [Complex Components](#complex-components) -10. [Performance Optimization](#performance-optimization) -11. [Focus Management](#focus-management) -12. [Demo System](#demo-system) -13. [Common Pitfalls and Anti-patterns](#common-pitfalls-and-anti-patterns) -14. [Code Examples](#code-examples) - -## Component Creation Checklist - -When creating a new component, follow this checklist: - -- [ ] Choose the appropriate base class (`DeesElement` or `DeesInputBase`) -- [ ] Use `@customElement('dees-componentname')` decorator -- [ ] Implement consistent theming with `cssManager.bdTheme()` -- [ ] Create demo function in separate `.demo.ts` file -- [ ] Export component from `ts_web/elements/index.ts` -- [ ] Use proper TypeScript types and interfaces (prefix with `I` for interfaces, `T` for types) -- [ ] Implement proper event handling with bubbling and composition -- [ ] Consider mobile responsiveness -- [ ] Add focus states for accessibility -- [ ] Clean up resources in `destroy()` method -- [ ] Follow lowercase naming convention for files -- [ ] Add z-index registry support if it's an overlay component - -## Architectural Patterns - -### Base Component Structure - -```typescript -import { customElement, property, state, css, TemplateResult, html } from '@design.estate/dees-element'; -import { DeesElement } from '@design.estate/dees-element'; -import * as cssManager from './00colors.js'; -import * as demoFunc from './dees-componentname.demo.js'; - -@customElement('dees-componentname') -export class DeesComponentName extends DeesElement { - // Static demo reference - public static demo = demoFunc.demoFunc; - - // Public properties (reactive, can be set via attributes) - @property({ type: String }) - public label: string = ''; - - @property({ type: Boolean, reflect: true }) - public disabled: boolean = false; - - // Internal state (reactive, but not exposed as attributes) - @state() - private internalState: string = ''; - - // Static styles with theme support - public static styles = [ - cssManager.defaultStyles, - css` - :host { - display: block; - background: ${cssManager.bdTheme('#ffffff', '#09090b')}; - } - ` - ]; - - // Render method - public render(): TemplateResult { - return html` -
    - -
    - `; - } - - // Lifecycle methods - public connectedCallback() { - super.connectedCallback(); - // Setup that needs DOM access - } - - public async firstUpdated() { - // One-time initialization after first render - } - - // Cleanup - public destroy() { - // Clean up listeners, observers, registrations - super.destroy(); - } -} -``` - -### Advanced Patterns - -#### 1. Separation of Concerns (Complex Components) - -For complex components like WYSIWYG editors, separate concerns into handler classes: - -```typescript -export class DeesComplexComponent extends DeesElement { - // Orchestrator pattern - main component coordinates handlers - private inputHandler: InputHandler; - private stateHandler: StateHandler; - private renderHandler: RenderHandler; - - constructor() { - super(); - this.inputHandler = new InputHandler(this); - this.stateHandler = new StateHandler(this); - this.renderHandler = new RenderHandler(this); - } -} -``` - -#### 2. Singleton Pattern (Global Components) - -For global UI elements like menus: - -```typescript -export class DeesGlobalMenu extends DeesElement { - private static instance: DeesGlobalMenu; - - public static getInstance(): DeesGlobalMenu { - if (!DeesGlobalMenu.instance) { - DeesGlobalMenu.instance = new DeesGlobalMenu(); - document.body.appendChild(DeesGlobalMenu.instance); - } - return DeesGlobalMenu.instance; - } -} -``` - -#### 3. Registry Pattern (Z-Index Management) - -Use centralized registries for global state: - -```typescript -class ComponentRegistry { - private static instance: ComponentRegistry; - private registry = new WeakMap(); - - public register(element: HTMLElement, value: number) { - this.registry.set(element, value); - } - - public unregister(element: HTMLElement) { - this.registry.delete(element); - } -} -``` - -## Component Types and Base Classes - -### Standard Component (extends DeesElement) - -Use for most UI components: -- Buttons, badges, icons -- Layout components -- Data display components -- Overlay components - -### Form Input Component (extends DeesInputBase) - -Use for all form inputs: -- Text inputs, dropdowns, checkboxes -- Date pickers, file uploads -- Rich text editors - -**Required implementations:** -```typescript -export class DeesInputCustom extends DeesInputBase { - // Required: Get current value - public getValue(): ValueType { - return this.value; - } - - // Required: Set value programmatically - public setValue(value: ValueType): void { - this.value = value; - this.changeSubject.next(this); // Notify form - } - - // Optional: Custom validation - public async validate(): Promise { - // Custom validation logic - return true; - } -} -``` - -## Theming System - -### DO: Use Theme Functions - -Always use `cssManager.bdTheme()` for colors that change between themes: - -```typescript -// ✅ CORRECT -background: ${cssManager.bdTheme('#ffffff', '#09090b')}; -color: ${cssManager.bdTheme('#000000', '#ffffff')}; -border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#333333')}; - -// ❌ INCORRECT -background: #ffffff; // Hard-coded color -color: var(--custom-color); // Custom CSS variable -``` - -### DO: Use Consistent Color Values - -Reference shared color constants when possible: - -```typescript -// From 00colors.ts -background: ${cssManager.bdTheme(colors.bright.background, colors.dark.background)}; -``` - -## Event Handling - -### DO: Dispatch Custom Events Properly - -```typescript -// ✅ CORRECT - Events bubble and cross shadow DOM -this.dispatchEvent(new CustomEvent('dees-componentname-change', { - detail: { value: this.value }, - bubbles: true, - composed: true -})); - -// ❌ INCORRECT - Event won't propagate properly -this.dispatchEvent(new CustomEvent('change', { - detail: { value: this.value } - // Missing bubbles and composed -})); -``` - -### DO: Use Event Delegation - -For dynamic content, use event delegation: - -```typescript -// ✅ CORRECT - Single listener for all items -this.addEventListener('click', (e: MouseEvent) => { - const item = (e.target as HTMLElement).closest('.item'); - if (item) { - this.handleItemClick(item); - } -}); - -// ❌ INCORRECT - Multiple listeners -this.items.forEach(item => { - item.addEventListener('click', () => this.handleItemClick(item)); -}); -``` - -## State Management - -### DO: Use Appropriate Property Decorators - -```typescript -// Public API - use @property -@property({ type: String }) -public label: string; - -// Internal state - use @state -@state() -private isLoading: boolean = false; - -// Reflect to attribute when needed -@property({ type: Boolean, reflect: true }) -public disabled: boolean = false; -``` - -### DON'T: Manipulate State in Render - -```typescript -// ❌ INCORRECT - Side effects in render -public render() { - this.counter++; // Don't modify state - return html`
    ${this.counter}
    `; -} - -// ✅ CORRECT - Pure render function -public render() { - return html`
    ${this.counter}
    `; -} -``` - -## Form Components - -### DO: Extend DeesInputBase - -All form inputs must extend the base class: - -```typescript -export class DeesInputNew extends DeesInputBase { - // Inherits: key, label, value, required, disabled, validationState -} -``` - -### DO: Emit Changes Consistently - -```typescript -private handleInput(e: Event) { - this.value = (e.target as HTMLInputElement).value; - this.changeSubject.next(this); // Notify form system -} -``` - -### DO: Support Standard Form Properties - -```typescript -// All form inputs should support: -@property() public key: string; -@property() public label: string; -@property() public required: boolean = false; -@property() public disabled: boolean = false; -@property() public validationState: 'valid' | 'warn' | 'invalid'; -``` - -## Overlay Components - -### DO: Use Z-Index Registry - -Never hardcode z-index values: - -```typescript -// ✅ CORRECT -import { zIndexRegistry } from './00zindex.js'; - -public async show() { - this.modalZIndex = zIndexRegistry.getNextZIndex(); - zIndexRegistry.register(this, this.modalZIndex); - this.style.zIndex = `${this.modalZIndex}`; -} - -public async hide() { - zIndexRegistry.unregister(this); -} - -// ❌ INCORRECT -public async show() { - this.style.zIndex = '9999'; // Hardcoded z-index -} -``` - -### DO: Use Window Layers - -For modal backdrops: - -```typescript -import { DeesWindowLayer } from './dees-windowlayer.js'; - -private windowLayer: DeesWindowLayer; - -public async show() { - this.windowLayer = new DeesWindowLayer(); - this.windowLayer.zIndex = zIndexRegistry.getNextZIndex(); - document.body.append(this.windowLayer); -} -``` - -## Complex Components - -### DO: Use Handler Classes - -For complex logic, separate into specialized handlers: - -```typescript -// wysiwyg/handlers/input.handler.ts -export class InputHandler { - constructor(private component: DeesInputWysiwyg) {} - - public handleInput(event: InputEvent) { - // Specialized input handling - } -} - -// Main component orchestrates -export class DeesInputWysiwyg extends DeesInputBase { - private inputHandler = new InputHandler(this); -} -``` - -### DO: Use Programmatic Rendering - -For performance-critical updates that shouldn't trigger re-renders: - -```typescript -// ✅ CORRECT - Direct DOM manipulation when needed -private updateBlockContent(blockId: string, content: string) { - const blockElement = this.shadowRoot.querySelector(`#${blockId}`); - if (blockElement) { - blockElement.textContent = content; // Direct update - } -} - -// ❌ INCORRECT - Triggering full re-render -private updateBlockContent(blockId: string, content: string) { - this.blocks.find(b => b.id === blockId).content = content; - this.requestUpdate(); // Unnecessary re-render -} -``` - -## Performance Optimization - -### DO: Debounce Expensive Operations - -```typescript -private resizeTimeout: number; - -private handleResize = () => { - clearTimeout(this.resizeTimeout); - this.resizeTimeout = window.setTimeout(() => { - this.updateLayout(); - }, 250); -}; -``` - -### DO: Use Observers Efficiently - -```typescript -// Clean up observers -public disconnectedCallback() { - super.disconnectedCallback(); - this.resizeObserver?.disconnect(); - this.mutationObserver?.disconnect(); -} -``` - -### DO: Implement Virtual Scrolling - -For large lists: - -```typescript -// Only render visible items -private getVisibleItems() { - const scrollTop = this.scrollContainer.scrollTop; - const containerHeight = this.scrollContainer.clientHeight; - const itemHeight = 50; - - const startIndex = Math.floor(scrollTop / itemHeight); - const endIndex = Math.ceil((scrollTop + containerHeight) / itemHeight); - - return this.items.slice(startIndex, endIndex); -} -``` - -## Focus Management - -### DO: Handle Focus Timing - -```typescript -// ✅ CORRECT - Wait for render -async focusInput() { - await this.updateComplete; - await new Promise(resolve => requestAnimationFrame(resolve)); - this.inputElement?.focus(); -} - -// ❌ INCORRECT - Focus too early -focusInput() { - this.inputElement?.focus(); // Element might not exist -} -``` - -### DO: Prevent Focus Loss - -```typescript -// For global menus -constructor() { - super(); - // Prevent focus loss when clicking menu - this.addEventListener('mousedown', (e) => { - e.preventDefault(); - }); -} -``` - -### DO: Implement Blur Debouncing - -```typescript -private blurTimeout: number; - -private handleBlur = () => { - clearTimeout(this.blurTimeout); - this.blurTimeout = window.setTimeout(() => { - // Check if truly blurred - if (!this.contains(document.activeElement)) { - this.handleTrueBlur(); - } - }, 100); -}; -``` - -## Demo System - -### DO: Create Comprehensive Demos - -Every component needs a demo: - -```typescript -// dees-button.demo.ts -import { html } from '@design.estate/dees-element'; - -export const demoFunc = () => html` - Default Button - Primary Button - Disabled Danger -`; - -// In component file -import * as demoFunc from './dees-button.demo.js'; - -export class DeesButton extends DeesElement { - public static demo = demoFunc.demoFunc; -} -``` - -### DO: Include All Variants - -Show all component states and variations in demos: -- Default state -- Different types/variants -- Disabled state -- Loading state -- Error states -- Edge cases (long text, empty content) - -## Common Pitfalls and Anti-patterns - -### ❌ DON'T: Hardcode Z-Index Values - -```typescript -// ❌ WRONG -this.style.zIndex = '9999'; - -// ✅ CORRECT -this.style.zIndex = `${zIndexRegistry.getNextZIndex()}`; -``` - -### ❌ DON'T: Skip Base Classes - -```typescript -// ❌ WRONG - Form input without base class -export class DeesInputCustom extends DeesElement { - // Missing standard form functionality -} - -// ✅ CORRECT -export class DeesInputCustom extends DeesInputBase { - // Inherits all form functionality -} -``` - -### ❌ DON'T: Forget Theme Support - -```typescript -// ❌ WRONG -background-color: #ffffff; -color: #000000; - -// ✅ CORRECT -background-color: ${cssManager.bdTheme('#ffffff', '#09090b')}; -color: ${cssManager.bdTheme('#000000', '#ffffff')}; -``` - -### ❌ DON'T: Create Components Without Demos - -```typescript -// ❌ WRONG -export class DeesComponent extends DeesElement { - // No demo property -} - -// ✅ CORRECT -export class DeesComponent extends DeesElement { - public static demo = demoFunc.demoFunc; -} -``` - -### ❌ DON'T: Emit Non-Bubbling Events - -```typescript -// ❌ WRONG -this.dispatchEvent(new CustomEvent('change', { - detail: this.value -})); - -// ✅ CORRECT -this.dispatchEvent(new CustomEvent('change', { - detail: this.value, - bubbles: true, - composed: true -})); -``` - -### ❌ DON'T: Skip Cleanup - -```typescript -// ❌ WRONG -public connectedCallback() { - window.addEventListener('resize', this.handleResize); -} - -// ✅ CORRECT -public connectedCallback() { - super.connectedCallback(); - window.addEventListener('resize', this.handleResize); -} - -public disconnectedCallback() { - super.disconnectedCallback(); - window.removeEventListener('resize', this.handleResize); -} -``` - -### ❌ DON'T: Use Inline Styles for Theming - -```typescript -// ❌ WRONG -
    - -// ✅ CORRECT -
    -// In styles: -.themed-container { - background-color: ${cssManager.bdTheme('#ffffff', '#000000')}; -} -``` - -### ❌ DON'T: Forget Mobile Responsiveness - -```typescript -// ❌ WRONG -:host { - width: 800px; // Fixed width -} - -// ✅ CORRECT -:host { - width: 100%; - max-width: 800px; -} - -@media (max-width: 768px) { - :host { - /* Mobile adjustments */ - } -} -``` - -## Code Examples - -### Example: Creating a New Button Variant - -```typescript -// dees-special-button.ts -import { customElement, property, css, html } from '@design.estate/dees-element'; -import { DeesElement } from '@design.estate/dees-element'; -import * as cssManager from './00colors.js'; -import * as demoFunc from './dees-special-button.demo.js'; - -@customElement('dees-special-button') -export class DeesSpecialButton extends DeesElement { - public static demo = demoFunc.demoFunc; - - @property({ type: String }) - public text: string = 'Click me'; - - @property({ type: Boolean, reflect: true }) - public loading: boolean = false; - - public static styles = [ - cssManager.defaultStyles, - css` - :host { - display: inline-block; - } - - .button { - padding: 8px 16px; - background: ${cssManager.bdTheme('#0066ff', '#0044cc')}; - color: white; - border: none; - border-radius: 4px; - cursor: pointer; - transition: all 0.2s; - } - - .button:hover { - transform: translateY(-2px); - box-shadow: 0 4px 8px ${cssManager.bdTheme('rgba(0,0,0,0.1)', 'rgba(0,0,0,0.3)')}; - } - - :host([loading]) .button { - opacity: 0.7; - cursor: not-allowed; - } - ` - ]; - - public render() { - return html` - - `; - } - - private handleClick() { - this.dispatchEvent(new CustomEvent('special-click', { - bubbles: true, - composed: true - })); - } -} -``` - -### Example: Creating a Form Input - -```typescript -// dees-input-special.ts -export class DeesInputSpecial extends DeesInputBase { - public static demo = demoFunc.demoFunc; - - public render() { - return html` - - - - `; - } - - private handleInput(e: Event) { - this.value = (e.target as HTMLInputElement).value; - this.changeSubject.next(this); - } - - private handleBlur() { - this.dispatchEvent(new CustomEvent('blur', { - bubbles: true, - composed: true - })); - } - - public getValue(): string { - return this.value; - } - - public setValue(value: string): void { - this.value = value; - this.changeSubject.next(this); - } -} -``` - -## Summary - -This playbook represents the collective wisdom and patterns found in the @design.estate/dees-catalog component library. Following these guidelines will help you create components that are: - -- **Consistent**: Following established patterns -- **Maintainable**: Easy to understand and modify -- **Performant**: Optimized for real-world use -- **Accessible**: Usable by everyone -- **Theme-aware**: Supporting light and dark modes -- **Well-integrated**: Working seamlessly with the component ecosystem - -Remember: When in doubt, look at existing components for examples. The codebase itself is the best documentation of these patterns in action. \ No newline at end of file diff --git a/test/test.chromium.ts b/test/test.chromium.ts deleted file mode 100644 index 082cf4d..0000000 --- a/test/test.chromium.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; - -import * as deesCatalog from '../ts_web/index.js'; - -tap.test('should create a working button', async () => { - const button: deesCatalog.DeesButton = await webhelpers.fixture( - webhelpers.html`` - ); - expect(button).toBeInstanceOf(deesCatalog.DeesButton); -}); - -export default tap.start(); diff --git a/test/test.contextmenu-demo.chromium.ts b/test/test.contextmenu-demo.chromium.ts deleted file mode 100644 index 7a362aa..0000000 --- a/test/test.contextmenu-demo.chromium.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; -import { demoFunc } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.demo.js'; - -tap.test('should render context menu demo', async () => { - // Create demo container - const demoContainer = document.createElement('div'); - document.body.appendChild(demoContainer); - - // Render the demo - const demoContent = demoFunc(); - - // Create a temporary element to hold the rendered template - const tempDiv = document.createElement('div'); - tempDiv.innerHTML = demoContent.strings.join(''); - - // Check that panels are rendered - const panels = tempDiv.querySelectorAll('dees-panel'); - expect(panels.length).toEqual(4); - - // Check panel headings - expect(panels[0].getAttribute('heading')).toEqual('Basic Context Menu with Nested Submenus'); - expect(panels[1].getAttribute('heading')).toEqual('Component-Specific Context Menu'); - expect(panels[2].getAttribute('heading')).toEqual('Advanced Context Menu Example'); - expect(panels[3].getAttribute('heading')).toEqual('Static Context Menu (Always Visible)'); - - // Check that static context menu exists - const staticMenu = tempDiv.querySelector('dees-contextmenu'); - expect(staticMenu).toBeTruthy(); - - // Clean up - demoContainer.remove(); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.contextmenu-nested-close.chromium.ts b/test/test.contextmenu-nested-close.chromium.ts deleted file mode 100644 index d93ab6c..0000000 --- a/test/test.contextmenu-nested-close.chromium.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; - -tap.test('should close all parent menus when clicking action in nested submenu', async () => { - let actionCalled = false; - - // Create a test element - const testDiv = document.createElement('div'); - testDiv.style.width = '300px'; - testDiv.style.height = '300px'; - testDiv.style.background = '#f0f0f0'; - testDiv.innerHTML = 'Right-click for nested menu test'; - document.body.appendChild(testDiv); - - // Simulate right-click to open context menu - const contextMenuEvent = new MouseEvent('contextmenu', { - clientX: 150, - clientY: 150, - bubbles: true, - cancelable: true - }); - - // Open context menu with nested structure - DeesContextmenu.openContextMenuWithOptions(contextMenuEvent, [ - { - name: 'Parent Item', - iconName: 'folder', - action: async () => {}, // Parent items with submenus need an action - submenu: [ - { - name: 'Child Item', - iconName: 'file', - action: async () => { - actionCalled = true; - console.log('Child action called'); - } - }, - { - name: 'Another Child', - iconName: 'fileText', - action: async () => console.log('Another child') - } - ] - }, - { - name: 'Regular Item', - iconName: 'box', - action: async () => console.log('Regular item') - } - ]); - - // Wait for main menu to appear - await new Promise(resolve => setTimeout(resolve, 150)); - - // Check main menu exists - const mainMenu = document.querySelector('dees-contextmenu'); - expect(mainMenu).toBeInstanceOf(DeesContextmenu); - - // Hover over "Parent Item" to trigger submenu - const parentItem = mainMenu!.shadowRoot!.querySelector('.menuitem'); - expect(parentItem).toBeTruthy(); - parentItem!.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true })); - - // Wait for submenu to appear - await new Promise(resolve => setTimeout(resolve, 300)); - - // Check submenu exists - const allMenus = document.querySelectorAll('dees-contextmenu'); - expect(allMenus.length).toEqual(2); // Main menu and submenu - - const submenu = allMenus[1]; - expect(submenu).toBeTruthy(); - - // Click on "Child Item" in submenu - const childItem = submenu.shadowRoot!.querySelector('.menuitem'); - expect(childItem).toBeTruthy(); - childItem!.click(); - - // Wait for menus to close (windowLayer destruction takes 300ms + context menu 100ms) - await new Promise(resolve => setTimeout(resolve, 600)); - - // Verify action was called - expect(actionCalled).toEqual(true); - - // Verify all menus are closed - const remainingMenus = document.querySelectorAll('dees-contextmenu'); - expect(remainingMenus.length).toEqual(0); - - // Clean up - testDiv.remove(); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.contextmenu-shadowdom.chromium.ts b/test/test.contextmenu-shadowdom.chromium.ts deleted file mode 100644 index 0c18630..0000000 --- a/test/test.contextmenu-shadowdom.chromium.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; -import { DeesElement, customElement, html } from '@design.estate/dees-element'; - -// Create a test element with shadow DOM -@customElement('test-shadow-element') -class TestShadowElement extends DeesElement { - public getContextMenuItems() { - return [ - { name: 'Shadow Item 1', iconName: 'box', action: async () => console.log('Shadow 1') }, - { name: 'Shadow Item 2', iconName: 'package', action: async () => console.log('Shadow 2') } - ]; - } - - render() { - return html` -
    -

    Shadow DOM Content

    -

    Right-click anywhere inside this shadow DOM

    -
    - `; - } -} - -tap.test('should show context menu when right-clicking inside shadow DOM', async () => { - // Create the shadow DOM element - const shadowElement = document.createElement('test-shadow-element'); - document.body.appendChild(shadowElement); - - // Wait for element to be ready - await shadowElement.updateComplete; - - // Get the content inside shadow DOM - const shadowContent = shadowElement.shadowRoot!.querySelector('div'); - expect(shadowContent).toBeTruthy(); - - // Simulate right-click on content inside shadow DOM - const contextMenuEvent = new MouseEvent('contextmenu', { - clientX: 100, - clientY: 100, - bubbles: true, - cancelable: true, - composed: true // Important for shadow DOM - }); - - shadowContent!.dispatchEvent(contextMenuEvent); - - // Wait for context menu to appear - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if context menu is created - const contextMenu = document.querySelector('dees-contextmenu'); - expect(contextMenu).toBeInstanceOf(DeesContextmenu); - - // Check if menu items from shadow element are rendered - const menuItems = contextMenu!.shadowRoot!.querySelectorAll('.menuitem'); - expect(menuItems.length).toBeGreaterThanOrEqual(2); - - // Check menu item text - const menuTexts = Array.from(menuItems).map(item => - item.querySelector('.menuitem-text')?.textContent - ); - expect(menuTexts).toContain('Shadow Item 1'); - expect(menuTexts).toContain('Shadow Item 2'); - - // Clean up - contextMenu!.remove(); - shadowElement.remove(); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.contextmenu.chromium.ts b/test/test.contextmenu.chromium.ts deleted file mode 100644 index 0e4e151..0000000 --- a/test/test.contextmenu.chromium.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; - -tap.test('should show context menu with nested submenu', async () => { - // Create a test element with context menu items - const testDiv = document.createElement('div'); - testDiv.style.width = '200px'; - testDiv.style.height = '200px'; - testDiv.style.background = '#eee'; - testDiv.innerHTML = 'Right-click me'; - - // Add getContextMenuItems method - (testDiv as any).getContextMenuItems = () => { - return [ - { - name: 'Change Type', - iconName: 'type', - submenu: [ - { name: 'Paragraph', iconName: 'text', action: () => console.log('Paragraph') }, - { name: 'Heading 1', iconName: 'heading1', action: () => console.log('Heading 1') }, - { name: 'Heading 2', iconName: 'heading2', action: () => console.log('Heading 2') }, - { divider: true }, - { name: 'Code Block', iconName: 'fileCode', action: () => console.log('Code') }, - { name: 'Quote', iconName: 'quote', action: () => console.log('Quote') } - ] - }, - { divider: true }, - { - name: 'Delete', - iconName: 'trash2', - action: () => console.log('Delete') - } - ]; - }; - - document.body.appendChild(testDiv); - - // Simulate right-click - const contextMenuEvent = new MouseEvent('contextmenu', { - clientX: 100, - clientY: 100, - bubbles: true, - cancelable: true - }); - - testDiv.dispatchEvent(contextMenuEvent); - - // Wait for context menu to appear - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if context menu is created - const contextMenu = document.querySelector('dees-contextmenu'); - expect(contextMenu).toBeInstanceOf(DeesContextmenu); - - // Check if menu items are rendered - const menuItems = contextMenu!.shadowRoot!.querySelectorAll('.menuitem'); - expect(menuItems.length).toEqual(2); // "Change Type" and "Delete" - - // Hover over "Change Type" to trigger submenu - const changeTypeItem = menuItems[0] as HTMLElement; - changeTypeItem.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true })); - - // Wait for submenu to appear - await new Promise(resolve => setTimeout(resolve, 300)); - - // Check if submenu is created - const submenus = document.querySelectorAll('dees-contextmenu'); - expect(submenus.length).toEqual(2); // Main menu and submenu - - // Clean up - contextMenu!.remove(); - const submenu = submenus[1]; - if (submenu) submenu.remove(); - testDiv.remove(); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.dashboardgrid-layout.node.ts b/test/test.dashboardgrid-layout.node.ts deleted file mode 100644 index fe4ac5a..0000000 --- a/test/test.dashboardgrid-layout.node.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { tap, expect } from '@git.zone/tstest/tapbundle'; - -import { - resolveWidgetPlacement, - collectCollisions, -} from '../ts_web/elements/dees-dashboardgrid/layout.ts'; -import type { DashboardWidget } from '../ts_web/elements/dees-dashboardgrid/types.ts'; - -tap.test('dashboardgrid does not overlap widgets after swap attempt', async () => { - const widgets: DashboardWidget[] = [ - { id: 'w0', x: 6, y: 5, w: 1, h: 3 }, - { id: 'w1', x: 6, y: 1, w: 1, h: 3 }, - { id: 'w2', x: 3, y: 0, w: 2, h: 2 }, - { id: 'w3', x: 9, y: 0, w: 1, h: 2 }, - { id: 'w4', x: 4, y: 3, w: 1, h: 2 }, - ]; - - const placement = resolveWidgetPlacement(widgets, 'w0', { x: 6, y: 3 }, 12); - expect(placement).toBeTruthy(); - - const layout = placement!.widgets; - for (const widget of layout) { - const collisions = collectCollisions(layout, widget, widget.x, widget.y, widget.w, widget.h); - expect(collisions).toBeEmptyArray(); - } -}); - -export default tap.start(); diff --git a/test/test.eco-catalog.chromium.ts b/test/test.eco-catalog.chromium.ts new file mode 100644 index 0000000..49c2988 --- /dev/null +++ b/test/test.eco-catalog.chromium.ts @@ -0,0 +1,35 @@ +import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; + +import * as ecoCatalog from '../ts_web/index.js'; + +tap.test('should export EcoApplauncher component', async () => { + expect(ecoCatalog.EcoApplauncher).toBeTypeOf('function'); +}); + +tap.test('should export EcoScreensaver component', async () => { + expect(ecoCatalog.EcoScreensaver).toBeTypeOf('function'); +}); + +tap.test('should export applauncher sub-components', async () => { + expect(ecoCatalog.EcoApplauncherWifimenu).toBeTypeOf('function'); + expect(ecoCatalog.EcoApplauncherBatterymenu).toBeTypeOf('function'); + expect(ecoCatalog.EcoApplauncherSoundmenu).toBeTypeOf('function'); + expect(ecoCatalog.EcoApplauncherKeyboard).toBeTypeOf('function'); + expect(ecoCatalog.EcoApplauncherPowermenu).toBeTypeOf('function'); +}); + +tap.test('should create a working EcoApplauncher instance', async () => { + const applauncher: ecoCatalog.EcoApplauncher = await webhelpers.fixture( + webhelpers.html`` + ); + expect(applauncher).toBeInstanceOf(ecoCatalog.EcoApplauncher); +}); + +tap.test('should create a working EcoScreensaver instance', async () => { + const screensaver: ecoCatalog.EcoScreensaver = await webhelpers.fixture( + webhelpers.html`` + ); + expect(screensaver).toBeInstanceOf(ecoCatalog.EcoScreensaver); +}); + +export default tap.start(); diff --git a/test/test.shadow-dom-containment.chromium.ts b/test/test.shadow-dom-containment.chromium.ts deleted file mode 100644 index 5c4904d..0000000 --- a/test/test.shadow-dom-containment.chromium.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; -import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; -import { WysiwygSelection } from '../ts_web/elements/00group-input/dees-input-wysiwyg/wysiwyg.selection.js'; - -tap.test('Shadow DOM containment should work correctly', async () => { - console.log('=== Testing Shadow DOM Containment ==='); - - // Wait for custom element to be defined - await customElements.whenDefined('dees-wysiwyg-block'); - - // Create a WYSIWYG block component - set properties BEFORE attaching to DOM - const block = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; - - // Set the block data before attaching to DOM so firstUpdated() sees them - block.block = { - id: 'test-1', - type: 'paragraph', - content: 'Hello world test content' - }; - - block.handlers = { - onInput: () => {}, - onKeyDown: () => {}, - onFocus: () => {}, - onBlur: () => {}, - onCompositionStart: () => {}, - onCompositionEnd: () => {} - }; - - // Now attach to DOM and wait for render - document.body.appendChild(block); - await block.updateComplete; - // Wait for firstUpdated to populate the container - await new Promise(resolve => setTimeout(resolve, 50)); - - // Get the paragraph element inside Shadow DOM - const container = block.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const paragraphBlock = container?.querySelector('.block.paragraph') as HTMLElement; - - expect(paragraphBlock).toBeTruthy(); - console.log('Found paragraph block:', paragraphBlock); - console.log('Paragraph text content:', paragraphBlock.textContent); - - // Focus the paragraph - paragraphBlock.focus(); - - // Manually set cursor position - const textNode = paragraphBlock.firstChild; - if (textNode && textNode.nodeType === Node.TEXT_NODE) { - const range = document.createRange(); - const selection = window.getSelection(); - - // Set cursor at position 11 (after "Hello world") - range.setStart(textNode, 11); - range.setEnd(textNode, 11); - - selection?.removeAllRanges(); - selection?.addRange(range); - - console.log('Set cursor at position 11'); - - // Test the containment check - console.log('\n--- Testing containment ---'); - const currentSelection = window.getSelection(); - if (currentSelection && currentSelection.rangeCount > 0) { - const selRange = currentSelection.getRangeAt(0); - console.log('Selection range:', { - startContainer: selRange.startContainer, - startOffset: selRange.startOffset, - containerText: selRange.startContainer.textContent - }); - - // Test regular contains (should fail across Shadow DOM) - const regularContains = paragraphBlock.contains(selRange.startContainer); - console.log('Regular contains:', regularContains); - - // Test Shadow DOM-aware contains - const shadowDOMContains = WysiwygSelection.containsAcrossShadowDOM(paragraphBlock, selRange.startContainer); - console.log('Shadow DOM contains:', shadowDOMContains); - - // Since we're setting selection within the same shadow DOM, both should be true - expect(regularContains).toBeTrue(); - expect(shadowDOMContains).toBeTrue(); - } - - // Test getSplitContent - console.log('\n--- Testing getSplitContent ---'); - const splitResult = block.getSplitContent(); - console.log('Split result:', splitResult); - - expect(splitResult).toBeTruthy(); - if (splitResult) { - console.log('Before:', JSON.stringify(splitResult.before)); - console.log('After:', JSON.stringify(splitResult.after)); - - // Expected split at position 11 - expect(splitResult.before).toEqual('Hello world'); - expect(splitResult.after).toEqual(' test content'); - } - } - - // Clean up - document.body.removeChild(block); -}); - -tap.test('Shadow DOM containment across different shadow roots', async () => { - console.log('=== Testing Cross Shadow Root Containment ==='); - - // Create parent component with WYSIWYG editor - const parentDiv = document.createElement('div'); - parentDiv.innerHTML = ` - - - - `; - document.body.appendChild(parentDiv); - - // Wait for components to be ready - await new Promise(resolve => setTimeout(resolve, 100)); - - const wysiwygInput = parentDiv.querySelector('dees-input-wysiwyg') as any; - const blockElement = wysiwygInput?.shadowRoot?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - - if (blockElement) { - // Set block data - blockElement.block = { - id: 'test-2', - type: 'paragraph', - content: 'Cross shadow DOM test' - }; - - blockElement.handlers = { - onInput: () => {}, - onKeyDown: () => {}, - onFocus: () => {}, - onBlur: () => {}, - onCompositionStart: () => {}, - onCompositionEnd: () => {} - }; - - await blockElement.updateComplete; - - // Get the paragraph inside the nested shadow DOM - const container = blockElement.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const paragraphBlock = container?.querySelector('.block.paragraph') as HTMLElement; - - if (paragraphBlock) { - console.log('Found nested paragraph block'); - - // Focus and set selection - paragraphBlock.focus(); - const textNode = paragraphBlock.firstChild; - if (textNode && textNode.nodeType === Node.TEXT_NODE) { - const range = document.createRange(); - range.setStart(textNode, 5); - range.setEnd(textNode, 5); - - const selection = window.getSelection(); - selection?.removeAllRanges(); - selection?.addRange(range); - - // Test containment from parent's perspective - const selRange = selection?.getRangeAt(0); - if (selRange) { - // This should fail because it crosses shadow DOM boundary - const regularContains = wysiwygInput.contains(selRange.startContainer); - console.log('Parent regular contains:', regularContains); - expect(regularContains).toBeFalse(); - - // This should work with our Shadow DOM-aware method - const shadowDOMContains = WysiwygSelection.containsAcrossShadowDOM(wysiwygInput, selRange.startContainer); - console.log('Parent shadow DOM contains:', shadowDOMContains); - expect(shadowDOMContains).toBeTrue(); - } - } - } - } - - // Clean up - document.body.removeChild(parentDiv); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.tabs-indicator.chromium.ts b/test/test.tabs-indicator.chromium.ts deleted file mode 100644 index f9d1251..0000000 --- a/test/test.tabs-indicator.chromium.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as deesCatalog from '../ts_web/index.js'; - -tap.test('tabs indicator positioning - detailed measurements', async () => { - // Create tabs element with different length labels - const tabsElement = new deesCatalog.DeesAppuiTabs(); - tabsElement.tabs = [ - { key: 'Home', iconName: 'lucide:home', action: () => {} }, - { key: 'Analytics Dashboard', iconName: 'lucide:lineChart', action: () => {} }, - { key: 'User Settings', iconName: 'lucide:settings', action: () => {} }, - ]; - - document.body.appendChild(tabsElement); - await tabsElement.updateComplete; - - // Wait for fonts and indicator initialization - await new Promise(resolve => setTimeout(resolve, 200)); - - // Get all elements - const shadowRoot = tabsElement.shadowRoot; - const wrapper = shadowRoot.querySelector('.tabs-wrapper') as HTMLElement; - const container = shadowRoot.querySelector('.tabsContainer') as HTMLElement; - const tabs = shadowRoot.querySelectorAll('.tab'); - const firstTab = tabs[0] as HTMLElement; - const firstContent = firstTab.querySelector('.tab-content') as HTMLElement; - const indicator = shadowRoot.querySelector('.tabIndicator') as HTMLElement; - - // Verify all elements exist - expect(wrapper).toBeInstanceOf(HTMLElement); - expect(container).toBeInstanceOf(HTMLElement); - expect(firstTab).toBeInstanceOf(HTMLElement); - expect(firstContent).toBeInstanceOf(HTMLElement); - expect(indicator).toBeInstanceOf(HTMLElement); - - // Get all measurements - const wrapperRect = wrapper.getBoundingClientRect(); - const containerRect = container.getBoundingClientRect(); - const tabRect = firstTab.getBoundingClientRect(); - const contentRect = firstContent.getBoundingClientRect(); - const indicatorRect = indicator.getBoundingClientRect(); - - console.log('\n=== DETAILED MEASUREMENTS ==='); - console.log('Document body left:', document.body.getBoundingClientRect().left); - console.log('Wrapper left:', wrapperRect.left); - console.log('Container left:', containerRect.left); - console.log('Tab left:', tabRect.left); - console.log('Content left:', contentRect.left); - console.log('Indicator left (actual):', indicatorRect.left); - - console.log('\n=== RELATIVE POSITIONS ==='); - console.log('Container padding (container - wrapper):', containerRect.left - wrapperRect.left); - console.log('Tab position in container:', tabRect.left - containerRect.left); - console.log('Content position in tab:', contentRect.left - tabRect.left); - console.log('Content relative to wrapper:', contentRect.left - wrapperRect.left); - console.log('Indicator relative to wrapper (actual):', indicatorRect.left - wrapperRect.left); - - console.log('\n=== WIDTHS ==='); - console.log('Tab width:', tabRect.width); - console.log('Content width:', contentRect.width); - console.log('Indicator width:', indicatorRect.width); - - console.log('\n=== STYLES (what we set) ==='); - console.log('Indicator style.left:', indicator.style.left); - console.log('Indicator style.width:', indicator.style.width); - - console.log('\n=== CALCULATIONS ==='); - const expectedIndicatorLeft = contentRect.left - wrapperRect.left - 4; // We subtract 4 to center - const expectedIndicatorWidth = contentRect.width + 8; // We add 8 in the code - console.log('Expected indicator left:', expectedIndicatorLeft); - console.log('Expected indicator width:', expectedIndicatorWidth); - console.log('Actual indicator left (from style):', parseFloat(indicator.style.left)); - console.log('Actual indicator width (from style):', parseFloat(indicator.style.width)); - - console.log('\n=== VISUAL ALIGNMENT CHECK ==='); - const tabCenter = tabRect.left + (tabRect.width / 2); - const contentCenter = contentRect.left + (contentRect.width / 2); - const indicatorCenter = indicatorRect.left + (indicatorRect.width / 2); - - console.log('Tab center:', tabCenter); - console.log('Content center:', contentCenter); - console.log('Indicator center:', indicatorCenter); - console.log('Content offset from tab center:', contentCenter - tabCenter); - console.log('Indicator offset from content center:', indicatorCenter - contentCenter); - console.log('Indicator offset from tab center:', indicatorCenter - tabCenter); - console.log('---'); - console.log('Indicator extends left of content by:', contentRect.left - indicatorRect.left); - console.log('Indicator extends right of content by:', (indicatorRect.left + indicatorRect.width) - (contentRect.left + contentRect.width)); - - // Check if icons are rendering - const icon = firstContent.querySelector('dees-icon'); - console.log('\n=== ICON CHECK ==='); - console.log('Icon element found:', icon ? 'YES' : 'NO'); - if (icon) { - const iconRect = icon.getBoundingClientRect(); - console.log('Icon width:', iconRect.width); - console.log('Icon height:', iconRect.height); - console.log('Icon visible:', iconRect.width > 0 && iconRect.height > 0 ? 'YES' : 'NO'); - } - - // Verify indicator is visible - expect(indicator.style.opacity).toEqual('1'); - - // Verify positioning calculations - expect(parseFloat(indicator.style.left)).toBeCloseTo(expectedIndicatorLeft, 1); - expect(parseFloat(indicator.style.width)).toBeCloseTo(expectedIndicatorWidth, 1); - - // Verify visual centering on content (should be perfectly centered) - expect(Math.abs(indicatorCenter - contentCenter)).toBeLessThan(1); - - document.body.removeChild(tabsElement); -}); - -tap.test('tabs indicator should move when tab is clicked', async () => { - // Create tabs element - const tabsElement = new deesCatalog.DeesAppuiTabs(); - tabsElement.tabs = [ - { key: 'Home', iconName: 'lucide:home', action: () => {} }, - { key: 'Analytics', iconName: 'lucide:barChart', action: () => {} }, - { key: 'Settings', iconName: 'lucide:settings', action: () => {} }, - ]; - - document.body.appendChild(tabsElement); - await tabsElement.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - const shadowRoot = tabsElement.shadowRoot; - const tabs = shadowRoot.querySelectorAll('.tab'); - const indicator = shadowRoot.querySelector('.tabIndicator') as HTMLElement; - - // Get initial position - const initialLeft = parseFloat(indicator.style.left); - - // Click second tab - (tabs[1] as HTMLElement).click(); - await tabsElement.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Position should have changed - const newLeft = parseFloat(indicator.style.left); - expect(newLeft).not.toEqual(initialLeft); - expect(newLeft).toBeGreaterThan(initialLeft); - - document.body.removeChild(tabsElement); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-basic.chromium.ts b/test/test.wysiwyg-basic.chromium.ts deleted file mode 100644 index 4df522c..0000000 --- a/test/test.wysiwyg-basic.chromium.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; - -tap.test('should create wysiwyg editor', async () => { - const editor = new DeesInputWysiwyg(); - expect(editor).toBeInstanceOf(DeesInputWysiwyg); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-blockmovement.chromium.ts b/test/test.wysiwyg-blockmovement.chromium.ts deleted file mode 100644 index b2a552a..0000000 --- a/test/test.wysiwyg-blockmovement.chromium.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; - -// Initialize the element -DeesInputWysiwyg; - -tap.test('wysiwyg block movement during drag', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Block 1' }, - { id: 'block2', type: 'paragraph', content: 'Block 2' }, - { id: 'block3', type: 'paragraph', content: 'Block 3' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; - const block1 = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement; - - // Start dragging block 1 - const mockDragEvent = { - dataTransfer: { - effectAllowed: '', - setData: () => {}, - setDragImage: () => {} - }, - clientY: 50, - preventDefault: () => {}, - } as any; - - element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); - - // Wait for dragging class - await new Promise(resolve => setTimeout(resolve, 20)); - - // Verify drag state - expect(element.dragDropHandler.dragState.draggedBlockId).toEqual('block1'); - - // Check that drag height was calculated - console.log('Checking drag height...'); - const dragHandler = element.dragDropHandler as any; - console.log('draggedBlockHeight:', dragHandler.draggedBlockHeight); - console.log('draggedBlockContentHeight:', dragHandler.draggedBlockContentHeight); - - // Manually call updateBlockPositions to simulate drag movement - console.log('Simulating drag movement...'); - const updateBlockPositions = dragHandler.updateBlockPositions.bind(dragHandler); - - // Simulate dragging down past block 2 - const block2 = editorContent.querySelector('[data-block-id="block2"]') as HTMLElement; - const block2Rect = block2.getBoundingClientRect(); - const dragToY = block2Rect.bottom + 10; - - console.log('Dragging to Y position:', dragToY); - updateBlockPositions(dragToY); - - // Check if blocks have moved - await new Promise(resolve => setTimeout(resolve, 50)); - - const blocks = Array.from(editorContent.querySelectorAll('.block-wrapper')); - console.log('Block states after drag:'); - blocks.forEach((block, i) => { - const classes = block.className; - const offset = (block as HTMLElement).style.getPropertyValue('--drag-offset'); - console.log(`Block ${i}: classes="${classes}", offset="${offset}"`); - }); - - // Check that at least one block has move class - const movedUpBlocks = editorContent.querySelectorAll('.block-wrapper.move-up'); - const movedDownBlocks = editorContent.querySelectorAll('.block-wrapper.move-down'); - console.log('Moved up blocks:', movedUpBlocks.length); - console.log('Moved down blocks:', movedDownBlocks.length); - - // Clean up - element.dragDropHandler.handleDragEnd(); - document.body.removeChild(element); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-blocks-debug.chromium.ts b/test/test.wysiwyg-blocks-debug.chromium.ts deleted file mode 100644 index 5cdd083..0000000 --- a/test/test.wysiwyg-blocks-debug.chromium.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; - -import * as deesCatalog from '../ts_web/index.js'; -import { BlockRegistry } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/block.registry.js'; -import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; - -// Import block registration to ensure handlers are registered -import '../ts_web/elements/00group-input/dees-input-wysiwyg/wysiwyg.blockregistration.js'; - -tap.test('Debug: should create empty wysiwyg block component', async () => { - try { - console.log('Creating DeesWysiwygBlock...'); - const block: DeesWysiwygBlock = await webhelpers.fixture( - webhelpers.html`` - ); - console.log('Block created:', block); - expect(block).toBeDefined(); - expect(block).toBeInstanceOf(DeesWysiwygBlock); - console.log('Initial block property:', block.block); - console.log('Initial handlers property:', block.handlers); - } catch (error) { - console.error('Error creating block:', error); - throw error; - } -}); - -tap.test('Debug: should set properties step by step', async () => { - try { - console.log('Step 1: Creating component...'); - const block: DeesWysiwygBlock = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; - expect(block).toBeDefined(); - - console.log('Step 2: Setting handlers...'); - block.handlers = { - onInput: () => console.log('onInput'), - onKeyDown: () => console.log('onKeyDown'), - onFocus: () => console.log('onFocus'), - onBlur: () => console.log('onBlur'), - onCompositionStart: () => console.log('onCompositionStart'), - onCompositionEnd: () => console.log('onCompositionEnd') - }; - console.log('Handlers set:', block.handlers); - - console.log('Step 3: Setting block data...'); - block.block = { - id: 'test-block', - type: 'divider', - content: ' ' - }; - console.log('Block set:', block.block); - - console.log('Step 4: Appending to body...'); - document.body.appendChild(block); - - console.log('Step 5: Waiting for update...'); - await block.updateComplete; - console.log('Update complete'); - - console.log('Step 6: Checking shadowRoot...'); - expect(block.shadowRoot).toBeDefined(); - console.log('ShadowRoot exists'); - - } catch (error) { - console.error('Error in step-by-step test:', error); - throw error; - } -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-blocks.chromium.ts b/test/test.wysiwyg-blocks.chromium.ts deleted file mode 100644 index 0a38f62..0000000 --- a/test/test.wysiwyg-blocks.chromium.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; - -import * as deesCatalog from '../ts_web/index.js'; -import { BlockRegistry } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/block.registry.js'; -import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; - -// Import block registration to ensure handlers are registered -import '../ts_web/elements/00group-input/dees-input-wysiwyg/wysiwyg.blockregistration.js'; - -tap.test('BlockRegistry should have registered handlers', async () => { - // Test divider handler - const dividerHandler = BlockRegistry.getHandler('divider'); - expect(dividerHandler).toBeDefined(); - expect(dividerHandler?.type).toEqual('divider'); - - // Test paragraph handler - const paragraphHandler = BlockRegistry.getHandler('paragraph'); - expect(paragraphHandler).toBeDefined(); - expect(paragraphHandler?.type).toEqual('paragraph'); - - // Test heading handlers - const heading1Handler = BlockRegistry.getHandler('heading-1'); - expect(heading1Handler).toBeDefined(); - expect(heading1Handler?.type).toEqual('heading-1'); - - const heading2Handler = BlockRegistry.getHandler('heading-2'); - expect(heading2Handler).toBeDefined(); - expect(heading2Handler?.type).toEqual('heading-2'); - - const heading3Handler = BlockRegistry.getHandler('heading-3'); - expect(heading3Handler).toBeDefined(); - expect(heading3Handler?.type).toEqual('heading-3'); - - // Test that getAllTypes returns all registered types - const allTypes = BlockRegistry.getAllTypes(); - expect(allTypes).toContain('divider'); - expect(allTypes).toContain('paragraph'); - expect(allTypes).toContain('heading-1'); - expect(allTypes).toContain('heading-2'); - expect(allTypes).toContain('heading-3'); -}); - -tap.test('should render divider block using handler', async () => { - // Wait for custom element to be defined - await customElements.whenDefined('dees-wysiwyg-block'); - - // Create element and set properties BEFORE attaching to DOM - const dividerBlock = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; - - // Set required handlers - dividerBlock.handlers = { - onInput: () => {}, - onKeyDown: () => {}, - onFocus: () => {}, - onBlur: () => {}, - onCompositionStart: () => {}, - onCompositionEnd: () => {} - }; - - // Set a divider block - dividerBlock.block = { - id: 'test-divider', - type: 'divider', - content: ' ' - }; - - // Attach to DOM and wait for render - document.body.appendChild(dividerBlock); - await dividerBlock.updateComplete; - // Wait for firstUpdated to populate the container - await new Promise(resolve => setTimeout(resolve, 50)); - - // Check that the divider is rendered - const dividerElement = dividerBlock.shadowRoot?.querySelector('.block.divider'); - expect(dividerElement).toBeTruthy(); - expect(dividerElement?.getAttribute('tabindex')).toEqual('0'); - - // Check for the hr element (divider uses
    not .divider-icon) - const hr = dividerBlock.shadowRoot?.querySelector('hr'); - expect(hr).toBeTruthy(); - - // Clean up - document.body.removeChild(dividerBlock); -}); - -tap.test('should render paragraph block using handler', async () => { - // Wait for custom element to be defined - await customElements.whenDefined('dees-wysiwyg-block'); - - // Create element and set properties BEFORE attaching to DOM - const paragraphBlock = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; - - // Set required handlers - paragraphBlock.handlers = { - onInput: () => {}, - onKeyDown: () => {}, - onFocus: () => {}, - onBlur: () => {}, - onCompositionStart: () => {}, - onCompositionEnd: () => {}, - onMouseUp: () => {} - }; - - // Set a paragraph block - paragraphBlock.block = { - id: 'test-paragraph', - type: 'paragraph', - content: 'Test paragraph content' - }; - - // Attach to DOM and wait for render - document.body.appendChild(paragraphBlock); - await paragraphBlock.updateComplete; - // Wait for firstUpdated to populate the container - await new Promise(resolve => setTimeout(resolve, 50)); - - // Check that the paragraph is rendered - const paragraphElement = paragraphBlock.shadowRoot?.querySelector('.block.paragraph'); - expect(paragraphElement).toBeTruthy(); - expect(paragraphElement?.getAttribute('contenteditable')).toEqual('true'); - expect(paragraphElement?.textContent).toEqual('Test paragraph content'); - - // Clean up - document.body.removeChild(paragraphBlock); -}); - -tap.test('should render heading blocks using handler', async () => { - // Wait for custom element to be defined - await customElements.whenDefined('dees-wysiwyg-block'); - - // Test heading-1 - set properties BEFORE attaching to DOM - const heading1Block = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; - - heading1Block.handlers = { - onInput: () => {}, - onKeyDown: () => {}, - onFocus: () => {}, - onBlur: () => {}, - onCompositionStart: () => {}, - onCompositionEnd: () => {}, - onMouseUp: () => {} - }; - - heading1Block.block = { - id: 'test-h1', - type: 'heading-1', - content: 'Heading 1 Test' - }; - - document.body.appendChild(heading1Block); - await heading1Block.updateComplete; - // Wait for firstUpdated to populate the container - await new Promise(resolve => setTimeout(resolve, 50)); - - const h1Element = heading1Block.shadowRoot?.querySelector('.block.heading-1'); - expect(h1Element).toBeTruthy(); - expect(h1Element?.textContent).toEqual('Heading 1 Test'); - - // Clean up heading-1 - document.body.removeChild(heading1Block); - - // Test heading-2 - set properties BEFORE attaching to DOM - const heading2Block = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; - - heading2Block.handlers = { - onInput: () => {}, - onKeyDown: () => {}, - onFocus: () => {}, - onBlur: () => {}, - onCompositionStart: () => {}, - onCompositionEnd: () => {}, - onMouseUp: () => {} - }; - - heading2Block.block = { - id: 'test-h2', - type: 'heading-2', - content: 'Heading 2 Test' - }; - - document.body.appendChild(heading2Block); - await heading2Block.updateComplete; - // Wait for firstUpdated to populate the container - await new Promise(resolve => setTimeout(resolve, 50)); - - const h2Element = heading2Block.shadowRoot?.querySelector('.block.heading-2'); - expect(h2Element).toBeTruthy(); - expect(h2Element?.textContent).toEqual('Heading 2 Test'); - - // Clean up heading-2 - document.body.removeChild(heading2Block); -}); - -tap.test('paragraph block handler methods should work', async () => { - // Wait for custom element to be defined - await customElements.whenDefined('dees-wysiwyg-block'); - - // Create element and set properties BEFORE attaching to DOM - const paragraphBlock = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; - - // Set required handlers - paragraphBlock.handlers = { - onInput: () => {}, - onKeyDown: () => {}, - onFocus: () => {}, - onBlur: () => {}, - onCompositionStart: () => {}, - onCompositionEnd: () => {}, - onMouseUp: () => {} - }; - - paragraphBlock.block = { - id: 'test-methods', - type: 'paragraph', - content: 'Initial content' - }; - - document.body.appendChild(paragraphBlock); - await paragraphBlock.updateComplete; - // Wait for firstUpdated to populate the container - await new Promise(resolve => setTimeout(resolve, 50)); - - // Test getContent - const content = paragraphBlock.getContent(); - expect(content).toEqual('Initial content'); - - // Test setContent - paragraphBlock.setContent('Updated content'); - await paragraphBlock.updateComplete; - expect(paragraphBlock.getContent()).toEqual('Updated content'); - - // Test that the DOM is updated - const paragraphElement = paragraphBlock.shadowRoot?.querySelector('.block.paragraph'); - expect(paragraphElement?.textContent).toEqual('Updated content'); - - // Clean up - document.body.removeChild(paragraphBlock); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-blocktype-change.chromium.ts b/test/test.wysiwyg-blocktype-change.chromium.ts deleted file mode 100644 index b5f4a5d..0000000 --- a/test/test.wysiwyg-blocktype-change.chromium.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; -import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; - -tap.test('should change block type via context menu', async () => { - // Create WYSIWYG editor with a paragraph - const wysiwygEditor = new DeesInputWysiwyg(); - wysiwygEditor.value = '

    This is a test paragraph

    '; - document.body.appendChild(wysiwygEditor); - - // Wait for editor to be ready - await wysiwygEditor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Get the first block - const firstBlock = wysiwygEditor.blocks[0]; - expect(firstBlock.type).toEqual('paragraph'); - - // Get the block element - const firstBlockWrapper = wysiwygEditor.shadowRoot!.querySelector('.block-wrapper'); - expect(firstBlockWrapper).toBeTruthy(); - - const blockComponent = firstBlockWrapper!.querySelector('dees-wysiwyg-block') as any; - expect(blockComponent).toBeTruthy(); - await blockComponent.updateComplete; - - // Get the editable content inside the block's shadow DOM - const editableBlock = blockComponent.shadowRoot!.querySelector('.block'); - expect(editableBlock).toBeTruthy(); - - // Simulate right-click on the editable block - const contextMenuEvent = new MouseEvent('contextmenu', { - clientX: 200, - clientY: 200, - bubbles: true, - cancelable: true, - composed: true - }); - - editableBlock!.dispatchEvent(contextMenuEvent); - - // Wait for context menu to appear - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if context menu is created - const contextMenu = document.querySelector('dees-contextmenu'); - expect(contextMenu).toBeInstanceOf(DeesContextmenu); - - // Find "Change Type" menu item - const menuItems = Array.from(contextMenu!.shadowRoot!.querySelectorAll('.menuitem')); - const changeTypeItem = menuItems.find(item => - item.querySelector('.menuitem-text')?.textContent?.trim() === 'Change Type' - ); - expect(changeTypeItem).toBeTruthy(); - - // Hover over "Change Type" to trigger submenu - changeTypeItem!.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true })); - - // Wait for submenu to appear - await new Promise(resolve => setTimeout(resolve, 300)); - - // Check if submenu is created - const allMenus = document.querySelectorAll('dees-contextmenu'); - expect(allMenus.length).toEqual(2); - - const submenu = allMenus[1]; - const submenuItems = Array.from(submenu.shadowRoot!.querySelectorAll('.menuitem')); - - // Find "Heading 1" option - const heading1Item = submenuItems.find(item => - item.querySelector('.menuitem-text')?.textContent?.trim() === 'Heading 1' - ); - expect(heading1Item).toBeTruthy(); - - // Click on "Heading 1" - (heading1Item as HTMLElement).click(); - - // Wait for menu to close and block to update - await new Promise(resolve => setTimeout(resolve, 300)); - - // Verify block type has changed - expect(wysiwygEditor.blocks[0].type).toEqual('heading-1'); - - // Verify DOM has been updated - const updatedBlockComponent = wysiwygEditor.shadowRoot! - .querySelector('.block-wrapper')! - .querySelector('dees-wysiwyg-block') as any; - - await updatedBlockComponent.updateComplete; - - const updatedBlock = updatedBlockComponent.shadowRoot!.querySelector('.block'); - expect(updatedBlock?.classList.contains('heading-1')).toEqual(true); - - // Clean up - wysiwygEditor.remove(); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-contextmenu.chromium.ts b/test/test.wysiwyg-contextmenu.chromium.ts deleted file mode 100644 index 5a71a5a..0000000 --- a/test/test.wysiwyg-contextmenu.chromium.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; -import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; - -tap.test('should show context menu on WYSIWYG blocks', async () => { - // Create WYSIWYG editor - const wysiwygEditor = new DeesInputWysiwyg(); - wysiwygEditor.value = '

    Test paragraph

    Test heading

    '; - document.body.appendChild(wysiwygEditor); - - // Wait for editor to be ready - await wysiwygEditor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Get the first block element - const firstBlockWrapper = wysiwygEditor.shadowRoot!.querySelector('.block-wrapper'); - expect(firstBlockWrapper).toBeTruthy(); - - const blockComponent = firstBlockWrapper!.querySelector('dees-wysiwyg-block') as any; - expect(blockComponent).toBeTruthy(); - - // Wait for block to be ready - await blockComponent.updateComplete; - - // Get the editable content inside the block's shadow DOM - const editableBlock = blockComponent.shadowRoot!.querySelector('.block'); - expect(editableBlock).toBeTruthy(); - - // Simulate right-click on the editable block - const contextMenuEvent = new MouseEvent('contextmenu', { - clientX: 200, - clientY: 200, - bubbles: true, - cancelable: true, - composed: true // Important for shadow DOM - }); - - editableBlock!.dispatchEvent(contextMenuEvent); - - // Wait for context menu to appear - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if context menu is created - const contextMenu = document.querySelector('dees-contextmenu'); - expect(contextMenu).toBeInstanceOf(DeesContextmenu); - - // Check if menu items from WYSIWYG block are rendered - const menuItems = contextMenu!.shadowRoot!.querySelectorAll('.menuitem'); - const menuTexts = Array.from(menuItems).map(item => - item.querySelector('.menuitem-text')?.textContent?.trim() - ); - - // Should have "Change Type" and "Delete Block" items - expect(menuTexts).toContain('Change Type'); - expect(menuTexts).toContain('Delete Block'); - - // Check if "Change Type" has submenu indicator - const changeTypeItem = Array.from(menuItems).find(item => - item.querySelector('.menuitem-text')?.textContent?.trim() === 'Change Type' - ); - expect(changeTypeItem?.classList.contains('has-submenu')).toEqual(true); - - // Clean up - contextMenu!.remove(); - wysiwygEditor.remove(); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dragdrop-simple.chromium.ts b/test/test.wysiwyg-dragdrop-simple.chromium.ts deleted file mode 100644 index 89e7dc7..0000000 --- a/test/test.wysiwyg-dragdrop-simple.chromium.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; - -// Initialize the element -DeesInputWysiwyg; - -tap.test('wysiwyg drag handler initialization', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - // Wait for element to be ready - await element.updateComplete; - - // Check that drag handler is initialized - expect(element.dragDropHandler).toBeTruthy(); - - // Set initial content with multiple blocks - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'First paragraph' }, - { id: 'block2', type: 'paragraph', content: 'Second paragraph' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - // Check that editor content ref exists - console.log('editorContentRef:', element.editorContentRef); - expect(element.editorContentRef).toBeTruthy(); - - // Check that blocks are rendered - const blockWrappers = element.shadowRoot!.querySelectorAll('.block-wrapper'); - console.log('Number of block wrappers:', blockWrappers.length); - expect(blockWrappers.length).toEqual(2); - - // Check drag handles - const dragHandles = element.shadowRoot!.querySelectorAll('.drag-handle'); - console.log('Number of drag handles:', dragHandles.length); - expect(dragHandles.length).toEqual(2); - - // Clean up - document.body.removeChild(element); -}); - -tap.test('wysiwyg drag start behavior', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Test block' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - const dragHandle = element.shadowRoot!.querySelector('.drag-handle') as HTMLElement; - expect(dragHandle).toBeTruthy(); - - // Check that drag handle has draggable attribute - console.log('Drag handle draggable:', dragHandle.draggable); - expect(dragHandle.draggable).toBeTrue(); - - // Test drag handler state before drag - console.log('Initial drag state:', element.dragDropHandler.dragState); - expect(element.dragDropHandler.dragState.draggedBlockId).toBeNull(); - - // Try to manually call handleDragStart - const mockDragEvent = { - dataTransfer: { - effectAllowed: '', - setData: (type: string, data: string) => { - console.log('setData called with:', type, data); - }, - setDragImage: (img: any, x: number, y: number) => { - console.log('setDragImage called'); - } - }, - clientY: 100, - preventDefault: () => {}, - } as any; - - element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); - - // Check drag state after drag start - console.log('Drag state after start:', element.dragDropHandler.dragState); - expect(element.dragDropHandler.dragState.draggedBlockId).toEqual('block1'); - - // Clean up - element.dragDropHandler.handleDragEnd(); - document.body.removeChild(element); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dragdrop-visual.chromium.ts b/test/test.wysiwyg-dragdrop-visual.chromium.ts deleted file mode 100644 index b8bfcc5..0000000 --- a/test/test.wysiwyg-dragdrop-visual.chromium.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; - -// Initialize the element -DeesInputWysiwyg; - -tap.test('wysiwyg drag visual feedback - block movement', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Block 1' }, - { id: 'block2', type: 'paragraph', content: 'Block 2' }, - { id: 'block3', type: 'paragraph', content: 'Block 3' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; - const block1 = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement; - - // Manually start drag - const mockDragEvent = { - dataTransfer: { - effectAllowed: '', - setData: (type: string, data: string) => {}, - setDragImage: (img: any, x: number, y: number) => {} - }, - clientY: 50, - preventDefault: () => {}, - } as any; - - element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); - - // Wait for dragging class - await new Promise(resolve => setTimeout(resolve, 20)); - - // Check dragging state - console.log('Block 1 classes:', block1.className); - console.log('Editor content classes:', editorContent.className); - expect(block1.classList.contains('dragging')).toBeTrue(); - expect(editorContent.classList.contains('dragging')).toBeTrue(); - - // Check drop indicator exists - const dropIndicator = editorContent.querySelector('.drop-indicator') as HTMLElement; - console.log('Drop indicator:', dropIndicator); - expect(dropIndicator).toBeTruthy(); - - // Test block movement calculation - console.log('Testing updateBlockPositions...'); - - // Access private method for testing - const updateBlockPositions = element.dragDropHandler['updateBlockPositions'].bind(element.dragDropHandler); - - // Simulate dragging to different position - updateBlockPositions(150); // Move down - - // Check if blocks have move classes - const blocks = Array.from(editorContent.querySelectorAll('.block-wrapper')); - console.log('Block classes after move:'); - blocks.forEach((block, i) => { - console.log(`Block ${i}:`, block.className, 'transform:', (block as HTMLElement).style.getPropertyValue('--drag-offset')); - }); - - // Clean up - element.dragDropHandler.handleDragEnd(); - document.body.removeChild(element); -}); - -tap.test('wysiwyg drop indicator positioning', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Paragraph 1' }, - { id: 'block2', type: 'heading-2', content: 'Heading 2' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; - - // Start dragging first block - const mockDragEvent = { - dataTransfer: { - effectAllowed: '', - setData: (type: string, data: string) => {}, - setDragImage: (img: any, x: number, y: number) => {} - }, - clientY: 50, - preventDefault: () => {}, - } as any; - - element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); - - // Wait for initialization - await new Promise(resolve => setTimeout(resolve, 20)); - - // Get drop indicator - const dropIndicator = editorContent.querySelector('.drop-indicator') as HTMLElement; - expect(dropIndicator).toBeTruthy(); - - // Check initial display state - console.log('Drop indicator initial display:', dropIndicator.style.display); - - // Trigger updateBlockPositions to see drop indicator - const updateBlockPositions = element.dragDropHandler['updateBlockPositions'].bind(element.dragDropHandler); - updateBlockPositions(100); - - // Check drop indicator position - console.log('Drop indicator after update:'); - console.log('- display:', dropIndicator.style.display); - console.log('- top:', dropIndicator.style.top); - console.log('- height:', dropIndicator.style.height); - - expect(dropIndicator.style.display).toEqual('block'); - expect(dropIndicator.style.top).toBeTruthy(); - expect(dropIndicator.style.height).toBeTruthy(); - - // Clean up - element.dragDropHandler.handleDragEnd(); - document.body.removeChild(element); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dragdrop.chromium.ts b/test/test.wysiwyg-dragdrop.chromium.ts deleted file mode 100644 index 9c29375..0000000 --- a/test/test.wysiwyg-dragdrop.chromium.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; - -// Initialize the element -DeesInputWysiwyg; - -tap.test('wysiwyg drag and drop should work correctly', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - // Wait for element to be ready - await element.updateComplete; - - // Set initial content with multiple blocks - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'First paragraph' }, - { id: 'block2', type: 'heading-2', content: 'Test Heading' }, - { id: 'block3', type: 'paragraph', content: 'Second paragraph' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - // Wait for nested block components to also complete their updates - await new Promise(resolve => setTimeout(resolve, 50)); - - // Check that blocks are rendered - const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; - expect(editorContent).toBeTruthy(); - - const blockWrappers = editorContent.querySelectorAll('.block-wrapper'); - expect(blockWrappers.length).toEqual(3); - - // Test drag handles exist for non-divider blocks - const dragHandles = editorContent.querySelectorAll('.drag-handle'); - expect(dragHandles.length).toEqual(3); - - // Get references to specific blocks - const firstBlock = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement; - const secondBlock = editorContent.querySelector('[data-block-id="block2"]') as HTMLElement; - const firstDragHandle = firstBlock.querySelector('.drag-handle') as HTMLElement; - - expect(firstBlock).toBeTruthy(); - expect(secondBlock).toBeTruthy(); - expect(firstDragHandle).toBeTruthy(); - - // Verify drag drop handler exists - expect(element.dragDropHandler).toBeTruthy(); - expect(element.dragDropHandler.dragState).toBeTruthy(); - - // Test drag initialization - synthetic DragEvents may not fully work in all browsers - console.log('Testing drag initialization...'); - - // Create drag event - const dragStartEvent = new DragEvent('dragstart', { - dataTransfer: new DataTransfer(), - clientY: 100, - bubbles: true - }); - - // Simulate drag start - firstDragHandle.dispatchEvent(dragStartEvent); - - // Wait for setTimeout in drag start - await new Promise(resolve => setTimeout(resolve, 50)); - - // Note: Synthetic DragEvents may not fully initialize drag state in all test environments - // The test verifies the structure and that events can be dispatched - console.log('Drag state after start:', element.dragDropHandler.dragState.draggedBlockId); - - // Test drag end cleanup - const dragEndEvent = new DragEvent('dragend', { - bubbles: true - }); - - document.dispatchEvent(dragEndEvent); - - // Wait for cleanup - await new Promise(resolve => setTimeout(resolve, 150)); - - // Clean up - document.body.removeChild(element); -}); - -tap.test('wysiwyg drag and drop visual feedback', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Block 1' }, - { id: 'block2', type: 'paragraph', content: 'Block 2' }, - { id: 'block3', type: 'paragraph', content: 'Block 3' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - // Wait for nested block components to also complete their updates - await new Promise(resolve => setTimeout(resolve, 50)); - - const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; - const block1 = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement; - const dragHandle1 = block1.querySelector('.drag-handle') as HTMLElement; - - // Start dragging block 1 - const dragStartEvent = new DragEvent('dragstart', { - dataTransfer: new DataTransfer(), - clientY: 50, - bubbles: true - }); - - dragHandle1.dispatchEvent(dragStartEvent); - - // Wait for dragging class - await new Promise(resolve => setTimeout(resolve, 20)); - - // Simulate dragging down - const dragOverEvent = new DragEvent('dragover', { - dataTransfer: new DataTransfer(), - clientY: 150, // Move down past block 2 - bubbles: true, - cancelable: true - }); - - // Trigger the global drag over handler - element.dragDropHandler['handleGlobalDragOver'](dragOverEvent); - - // Check that transform is applied to dragged block - const transform = block1.style.transform; - console.log('Dragged block transform:', transform); - expect(transform).toContain('translateY'); - - // Check drop indicator position - const dropIndicator = editorContent.querySelector('.drop-indicator') as HTMLElement; - if (dropIndicator) { - const indicatorStyle = dropIndicator.style; - console.log('Drop indicator position:', indicatorStyle.top, 'display:', indicatorStyle.display); - } - - // Clean up - document.body.removeChild(element); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dragissue.chromium.ts b/test/test.wysiwyg-dragissue.chromium.ts deleted file mode 100644 index 6c4cff4..0000000 --- a/test/test.wysiwyg-dragissue.chromium.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; - -// Initialize the element -DeesInputWysiwyg; - -tap.test('wysiwyg drag full flow without await', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Test block' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - // Mock drag event - const mockDragEvent = { - dataTransfer: { - effectAllowed: '', - setData: (type: string, data: string) => { - console.log('setData:', type, data); - }, - setDragImage: (img: any, x: number, y: number) => { - console.log('setDragImage'); - } - }, - clientY: 100, - preventDefault: () => {}, - } as any; - - console.log('Starting drag...'); - element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); - console.log('Drag started'); - - // Check immediate state - expect(element.dragDropHandler.dragState.draggedBlockId).toEqual('block1'); - - // Instead of await with setTimeout, use a done callback - return new Promise((resolve) => { - console.log('Setting up delayed check...'); - - // Use regular setTimeout - setTimeout(() => { - console.log('In setTimeout callback'); - - try { - const block1 = element.shadowRoot!.querySelector('[data-block-id="block1"]') as HTMLElement; - const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; - - console.log('Block has dragging class:', block1?.classList.contains('dragging')); - console.log('Editor has dragging class:', editorContent?.classList.contains('dragging')); - - // Clean up - element.dragDropHandler.handleDragEnd(); - document.body.removeChild(element); - - resolve(); - } catch (error) { - console.error('Error in setTimeout:', error); - throw error; - } - }, 50); - }); -}); - -tap.test('identify the crash point', async () => { - console.log('Test started'); - - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - console.log('Element created'); - await element.updateComplete; - - console.log('Setting blocks'); - element.blocks = [{ id: 'block1', type: 'paragraph', content: 'Test' }]; - element.renderBlocksProgrammatically(); - - console.log('Waiting for update'); - await element.updateComplete; - - console.log('Creating mock event'); - const mockDragEvent = { - dataTransfer: { - effectAllowed: '', - setData: () => {}, - setDragImage: () => {} - }, - clientY: 100, - preventDefault: () => {}, - } as any; - - console.log('Calling handleDragStart'); - element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); - - console.log('handleDragStart completed'); - - // Try different wait methods - console.log('About to wait...'); - - // Method 1: Direct promise - await Promise.resolve(); - console.log('Promise.resolve completed'); - - // Method 2: setTimeout 0 - await new Promise(resolve => setTimeout(resolve, 0)); - console.log('setTimeout 0 completed'); - - // Method 3: requestAnimationFrame - await new Promise(resolve => requestAnimationFrame(() => resolve(undefined))); - console.log('requestAnimationFrame completed'); - - // Clean up - element.dragDropHandler.handleDragEnd(); - document.body.removeChild(element); - console.log('Cleanup completed'); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dropindicator.chromium.ts b/test/test.wysiwyg-dropindicator.chromium.ts deleted file mode 100644 index 9ad6715..0000000 --- a/test/test.wysiwyg-dropindicator.chromium.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; - -// Initialize the element -DeesInputWysiwyg; - -tap.test('wysiwyg drop indicator creation', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Test block' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - // Check editorContentRef - console.log('editorContentRef exists:', !!element.editorContentRef); - console.log('editorContentRef tagName:', element.editorContentRef?.tagName); - expect(element.editorContentRef).toBeTruthy(); - - // Check initial state - no drop indicator - let dropIndicator = element.shadowRoot!.querySelector('.drop-indicator'); - console.log('Drop indicator before drag:', dropIndicator); - expect(dropIndicator).toBeFalsy(); - - // Manually call createDropIndicator - try { - console.log('Calling createDropIndicator...'); - element.dragDropHandler['createDropIndicator'](); - console.log('createDropIndicator succeeded'); - } catch (error) { - console.error('Error creating drop indicator:', error); - throw error; - } - - // Check drop indicator was created - dropIndicator = element.shadowRoot!.querySelector('.drop-indicator'); - console.log('Drop indicator after creation:', dropIndicator); - console.log('Drop indicator parent:', dropIndicator?.parentElement?.className); - expect(dropIndicator).toBeTruthy(); - expect(dropIndicator!.style.display).toEqual('none'); - - // Clean up - document.body.removeChild(element); -}); - -tap.test('wysiwyg drag initialization with drop indicator', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Test block' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - // Mock drag event - const mockDragEvent = { - dataTransfer: { - effectAllowed: '', - setData: (type: string, data: string) => { - console.log('setData:', type, data); - }, - setDragImage: (img: any, x: number, y: number) => { - console.log('setDragImage'); - } - }, - clientY: 100, - preventDefault: () => {}, - } as any; - - console.log('Starting drag...'); - - try { - element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); - console.log('Drag start succeeded'); - } catch (error) { - console.error('Error during drag start:', error); - throw error; - } - - // Wait for async operations - await new Promise(resolve => setTimeout(resolve, 20)); - - // Check drop indicator exists - const dropIndicator = element.shadowRoot!.querySelector('.drop-indicator'); - console.log('Drop indicator after drag start:', dropIndicator); - expect(dropIndicator).toBeTruthy(); - - // Check drag state - console.log('Drag state:', element.dragDropHandler.dragState); - expect(element.dragDropHandler.dragState.draggedBlockId).toEqual('block1'); - - // Clean up - element.dragDropHandler.handleDragEnd(); - document.body.removeChild(element); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-eventlisteners.chromium.ts b/test/test.wysiwyg-eventlisteners.chromium.ts deleted file mode 100644 index 4657968..0000000 --- a/test/test.wysiwyg-eventlisteners.chromium.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; - -// Initialize the element -DeesInputWysiwyg; - -tap.test('wysiwyg global event listeners', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Test block' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - const block1 = element.shadowRoot!.querySelector('[data-block-id="block1"]') as HTMLElement; - console.log('Block 1 found:', !!block1); - - // Set up drag state manually without using handleDragStart - element.dragDropHandler['draggedBlockId'] = 'block1'; - element.dragDropHandler['draggedBlockElement'] = block1; - element.dragDropHandler['initialMouseY'] = 100; - - // Create drop indicator manually - element.dragDropHandler['createDropIndicator'](); - - // Test adding global event listeners - console.log('Adding event listeners...'); - const handleGlobalDragOver = element.dragDropHandler['handleGlobalDragOver']; - const handleGlobalDragEnd = element.dragDropHandler['handleGlobalDragEnd']; - - try { - document.addEventListener('dragover', handleGlobalDragOver); - console.log('dragover listener added'); - - document.addEventListener('dragend', handleGlobalDragEnd); - console.log('dragend listener added'); - } catch (error) { - console.error('Error adding event listeners:', error); - throw error; - } - - // Test firing a dragover event - console.log('Creating dragover event...'); - const dragOverEvent = new Event('dragover', { - bubbles: true, - cancelable: true - }); - Object.defineProperty(dragOverEvent, 'clientY', { value: 150 }); - - console.log('Dispatching dragover event...'); - document.dispatchEvent(dragOverEvent); - console.log('dragover event dispatched'); - - // Clean up - document.removeEventListener('dragover', handleGlobalDragOver); - document.removeEventListener('dragend', handleGlobalDragEnd); - - document.body.removeChild(element); -}); - -tap.test('wysiwyg setTimeout in drag start', async () => { - const element = document.createElement('dees-input-wysiwyg'); - document.body.appendChild(element); - - await element.updateComplete; - - // Set initial content - element.blocks = [ - { id: 'block1', type: 'paragraph', content: 'Test block' }, - ]; - element.renderBlocksProgrammatically(); - - await element.updateComplete; - - const block1 = element.shadowRoot!.querySelector('[data-block-id="block1"]') as HTMLElement; - const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; - - // Set drag state - element.dragDropHandler['draggedBlockId'] = 'block1'; - element.dragDropHandler['draggedBlockElement'] = block1; - - console.log('Testing setTimeout callback...'); - - // Test the setTimeout callback directly - try { - if (block1) { - console.log('Adding dragging class to block...'); - block1.classList.add('dragging'); - console.log('Block classes:', block1.className); - } - if (editorContent) { - console.log('Adding dragging class to editor...'); - editorContent.classList.add('dragging'); - console.log('Editor classes:', editorContent.className); - } - } catch (error) { - console.error('Error in setTimeout callback:', error); - throw error; - } - - expect(block1.classList.contains('dragging')).toBeTrue(); - expect(editorContent.classList.contains('dragging')).toBeTrue(); - - // Clean up - document.body.removeChild(element); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-keyboard.chromium.ts b/test/test.wysiwyg-keyboard.chromium.ts deleted file mode 100644 index ec8181b..0000000 --- a/test/test.wysiwyg-keyboard.chromium.ts +++ /dev/null @@ -1,329 +0,0 @@ -import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; -import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; - -tap.test('Keyboard: Arrow navigation between blocks', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import multiple blocks - editor.importBlocks([ - { id: 'block-1', type: 'paragraph', content: 'First paragraph' }, - { id: 'block-2', type: 'paragraph', content: 'Second paragraph' }, - { id: 'block-3', type: 'paragraph', content: 'Third paragraph' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Focus first block at end - const firstBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="block-1"]'); - const firstBlockComponent = firstBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const firstBlockContainer = firstBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const firstParagraph = firstBlockContainer?.querySelector('.block.paragraph') as HTMLElement; - - // Focus and set cursor at end of first block - firstParagraph.focus(); - const textNode = firstParagraph.firstChild; - if (textNode && textNode.nodeType === Node.TEXT_NODE) { - const range = document.createRange(); - const selection = window.getSelection(); - range.setStart(textNode, textNode.textContent?.length || 0); - range.setEnd(textNode, textNode.textContent?.length || 0); - selection?.removeAllRanges(); - selection?.addRange(range); - } - - await new Promise(resolve => setTimeout(resolve, 100)); - - // Press ArrowRight to move to second block - const arrowRightEvent = new KeyboardEvent('keydown', { - key: 'ArrowRight', - code: 'ArrowRight', - bubbles: true, - cancelable: true, - composed: true - }); - - firstParagraph.dispatchEvent(arrowRightEvent); - await new Promise(resolve => setTimeout(resolve, 200)); - - // Check if second block is focused - const secondBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="block-2"]'); - const secondBlockComponent = secondBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const secondBlockContainer = secondBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const secondParagraph = secondBlockContainer?.querySelector('.block.paragraph') as HTMLElement; - - // Check if the second paragraph has focus - const activeElement = secondBlockComponent.shadowRoot?.activeElement; - expect(activeElement).toEqual(secondParagraph); - - console.log('Arrow navigation test complete'); -}); - -tap.test('Keyboard: Backspace merges blocks', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import two blocks - editor.importBlocks([ - { id: 'merge-1', type: 'paragraph', content: 'First' }, - { id: 'merge-2', type: 'paragraph', content: 'Second' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Focus second block at beginning - const secondBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="merge-2"]'); - const secondBlockComponent = secondBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const secondBlockContainer = secondBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const secondParagraph = secondBlockContainer?.querySelector('.block.paragraph') as HTMLElement; - - // Focus and set cursor at beginning - secondParagraph.focus(); - const textNode = secondParagraph.firstChild; - if (textNode && textNode.nodeType === Node.TEXT_NODE) { - const range = document.createRange(); - const selection = window.getSelection(); - range.setStart(textNode, 0); - range.setEnd(textNode, 0); - selection?.removeAllRanges(); - selection?.addRange(range); - } - - await new Promise(resolve => setTimeout(resolve, 100)); - - // Press Backspace to merge with previous block - const backspaceEvent = new KeyboardEvent('keydown', { - key: 'Backspace', - code: 'Backspace', - bubbles: true, - cancelable: true, - composed: true - }); - - secondParagraph.dispatchEvent(backspaceEvent); - await new Promise(resolve => setTimeout(resolve, 200)); - - // Check if blocks were merged - expect(editor.blocks.length).toEqual(1); - expect(editor.blocks[0].content).toContain('First'); - expect(editor.blocks[0].content).toContain('Second'); - - console.log('Backspace merge test complete'); -}); - -tap.test('Keyboard: Delete key on non-editable blocks', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import blocks including a divider - editor.importBlocks([ - { id: 'para-1', type: 'paragraph', content: 'Before divider' }, - { id: 'div-1', type: 'divider', content: '' }, - { id: 'para-2', type: 'paragraph', content: 'After divider' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Focus the divider block - const dividerBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="div-1"]'); - const dividerBlockComponent = dividerBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const dividerBlockContainer = dividerBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const dividerElement = dividerBlockContainer?.querySelector('.block.divider') as HTMLElement; - - // Non-editable blocks need to be focused differently - dividerElement?.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Press Delete to remove the divider - const deleteEvent = new KeyboardEvent('keydown', { - key: 'Delete', - code: 'Delete', - bubbles: true, - cancelable: true, - composed: true - }); - - dividerElement.dispatchEvent(deleteEvent); - await new Promise(resolve => setTimeout(resolve, 200)); - - // Check if divider was removed - expect(editor.blocks.length).toEqual(2); - expect(editor.blocks.find(b => b.type === 'divider')).toBeUndefined(); - - console.log('Delete key on non-editable block test complete'); -}); - -tap.test('Keyboard: Tab key in code block', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import a code block - editor.importBlocks([ - { id: 'code-1', type: 'code', content: 'function test() {', metadata: { language: 'javascript' } } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Focus code block - code blocks use .code-editor instead of .block.code - const codeBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="code-1"]'); - const codeBlockComponent = codeBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const codeBlockContainer = codeBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const codeElement = codeBlockContainer?.querySelector('.code-editor') as HTMLElement; - - expect(codeElement).toBeTruthy(); - - // Focus and set cursor at end - codeElement.focus(); - const textNode = codeElement.firstChild; - if (textNode && textNode.nodeType === Node.TEXT_NODE) { - const range = document.createRange(); - const selection = window.getSelection(); - range.setStart(textNode, textNode.textContent?.length || 0); - range.setEnd(textNode, textNode.textContent?.length || 0); - selection?.removeAllRanges(); - selection?.addRange(range); - } - - await new Promise(resolve => setTimeout(resolve, 100)); - - // Press Tab to insert spaces - const tabEvent = new KeyboardEvent('keydown', { - key: 'Tab', - code: 'Tab', - bubbles: true, - cancelable: true, - composed: true - }); - - codeElement.dispatchEvent(tabEvent); - await new Promise(resolve => setTimeout(resolve, 200)); - - // Check if spaces were inserted - const updatedContent = codeElement.textContent || ''; - expect(updatedContent).toContain(' '); // Tab should insert 2 spaces - - console.log('Tab in code block test complete'); -}); - -tap.test('Keyboard: ArrowUp/Down navigation', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import multiple blocks - editor.importBlocks([ - { id: 'nav-1', type: 'paragraph', content: 'First line' }, - { id: 'nav-2', type: 'paragraph', content: 'Second line' }, - { id: 'nav-3', type: 'paragraph', content: 'Third line' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Verify blocks were created - expect(editor.blocks.length).toEqual(3); - - // Focus second block - const secondBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="nav-2"]'); - const secondBlockComponent = secondBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const secondBlockContainer = secondBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const secondParagraph = secondBlockContainer?.querySelector('.block.paragraph') as HTMLElement; - - expect(secondParagraph).toBeTruthy(); - secondParagraph.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Verify keyboard handler exists - expect(editor.keyboardHandler).toBeTruthy(); - - // Press ArrowUp - event is dispatched (focus change may not occur in synthetic events) - const arrowUpEvent = new KeyboardEvent('keydown', { - key: 'ArrowUp', - code: 'ArrowUp', - bubbles: true, - cancelable: true, - composed: true - }); - - secondParagraph.dispatchEvent(arrowUpEvent); - await new Promise(resolve => setTimeout(resolve, 200)); - - // Get first block references - const firstBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="nav-1"]'); - const firstBlockComponent = firstBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const firstBlockContainer = firstBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const firstParagraph = firstBlockContainer?.querySelector('.block.paragraph') as HTMLElement; - - expect(firstParagraph).toBeTruthy(); - - // Note: Synthetic keyboard events don't reliably trigger native browser focus changes - // in automated tests. The handler is invoked but focus may not actually move. - // This test verifies the structure exists and events can be dispatched. - - console.log('ArrowUp/Down navigation test complete'); -}); - -tap.test('Keyboard: Formatting shortcuts', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import a paragraph - editor.importBlocks([ - { id: 'format-1', type: 'paragraph', content: 'Test formatting' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Focus and select text - const blockWrapper = editor.shadowRoot?.querySelector('[data-block-id="format-1"]'); - const blockComponent = blockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const blockContainer = blockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const paragraph = blockContainer?.querySelector('.block.paragraph') as HTMLElement; - - paragraph.focus(); - - // Select "formatting" - const textNode = paragraph.firstChild; - if (textNode && textNode.nodeType === Node.TEXT_NODE) { - const range = document.createRange(); - const selection = window.getSelection(); - range.setStart(textNode, 5); // After "Test " - range.setEnd(textNode, 15); // After "formatting" - selection?.removeAllRanges(); - selection?.addRange(range); - } - - await new Promise(resolve => setTimeout(resolve, 100)); - - // Press Cmd/Ctrl+B for bold - const boldEvent = new KeyboardEvent('keydown', { - key: 'b', - code: 'KeyB', - metaKey: true, // Use metaKey for Mac, ctrlKey for Windows/Linux - bubbles: true, - cancelable: true, - composed: true - }); - - paragraph.dispatchEvent(boldEvent); - await new Promise(resolve => setTimeout(resolve, 200)); - - // Check if bold was applied - const content = paragraph.innerHTML; - expect(content).toContain('') || expect(content).toContain(''); - - console.log('Formatting shortcuts test complete'); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-phase3.chromium.ts b/test/test.wysiwyg-phase3.chromium.ts deleted file mode 100644 index 3d6303d..0000000 --- a/test/test.wysiwyg-phase3.chromium.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; -import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; - -tap.test('Phase 3: Quote block should render and work correctly', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import a quote block - editor.importBlocks([ - { id: 'quote-1', type: 'quote', content: 'This is a famous quote' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if quote block was rendered - const quoteBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="quote-1"]'); - const quoteBlockComponent = quoteBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - expect(quoteBlockComponent).toBeTruthy(); - - const quoteContainer = quoteBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const quoteElement = quoteContainer?.querySelector('.block.quote') as HTMLElement; - expect(quoteElement).toBeTruthy(); - expect(quoteElement?.textContent).toEqual('This is a famous quote'); - - // Check if styles are applied (border-left for quote) - const computedStyle = window.getComputedStyle(quoteElement); - expect(computedStyle.borderLeftStyle).toEqual('solid'); - expect(computedStyle.fontStyle).toEqual('italic'); -}); - -tap.test('Phase 3: Code block should render and handle tab correctly', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import a code block - editor.importBlocks([ - { id: 'code-1', type: 'code', content: 'const x = 42;', metadata: { language: 'javascript' } } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if code block was rendered - code blocks use .code-editor instead of .block.code - const codeBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="code-1"]'); - const codeBlockComponent = codeBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const codeContainer = codeBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const codeElement = codeContainer?.querySelector('.code-editor') as HTMLElement; - - expect(codeElement).toBeTruthy(); - expect(codeElement?.textContent).toEqual('const x = 42;'); - - // Check if language selector is shown - const languageSelector = codeContainer?.querySelector('.language-selector') as HTMLSelectElement; - expect(languageSelector).toBeTruthy(); - expect(languageSelector?.value).toEqual('javascript'); - - // Check if monospace font is applied - code-editor is a element - const computedStyle = window.getComputedStyle(codeElement); - // Font family may vary by platform, so just check it contains something - expect(computedStyle.fontFamily).toBeTruthy(); -}); - -tap.test('Phase 3: List block should render correctly', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import a list block - editor.importBlocks([ - { id: 'list-1', type: 'list', content: 'First item\nSecond item\nThird item' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if list block was rendered - const listBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="list-1"]'); - const listBlockComponent = listBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const listContainer = listBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const listElement = listContainer?.querySelector('.block.list') as HTMLElement; - - expect(listElement).toBeTruthy(); - - // Check if list items were created - const listItems = listElement?.querySelectorAll('li'); - expect(listItems?.length).toEqual(3); - expect(listItems?.[0].textContent).toEqual('First item'); - expect(listItems?.[1].textContent).toEqual('Second item'); - expect(listItems?.[2].textContent).toEqual('Third item'); - - // Check if it's an unordered list by default - const ulElement = listElement?.querySelector('ul'); - expect(ulElement).toBeTruthy(); -}); - -tap.test('Phase 3: Quote block split should work', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import a quote block - editor.importBlocks([ - { id: 'quote-split', type: 'quote', content: 'To be or not to be' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Get the quote block - const quoteBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="quote-split"]'); - const quoteBlockComponent = quoteBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const quoteContainer = quoteBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const quoteElement = quoteContainer?.querySelector('.block.quote') as HTMLElement; - - // Focus and set cursor after "To be" - quoteElement.focus(); - const textNode = quoteElement.firstChild; - if (textNode && textNode.nodeType === Node.TEXT_NODE) { - const range = document.createRange(); - const selection = window.getSelection(); - range.setStart(textNode, 5); // After "To be" - range.setEnd(textNode, 5); - selection?.removeAllRanges(); - selection?.addRange(range); - - await new Promise(resolve => setTimeout(resolve, 100)); - - // Press Enter to split - const enterEvent = new KeyboardEvent('keydown', { - key: 'Enter', - code: 'Enter', - bubbles: true, - cancelable: true, - composed: true - }); - - quoteElement.dispatchEvent(enterEvent); - await new Promise(resolve => setTimeout(resolve, 200)); - - // Check if split happened correctly - expect(editor.blocks.length).toEqual(2); - expect(editor.blocks[0].content).toEqual('To be'); - expect(editor.blocks[1].content).toEqual(' or not to be'); - expect(editor.blocks[1].type).toEqual('paragraph'); // New block should be paragraph - } -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-registry.both.ts b/test/test.wysiwyg-registry.both.ts deleted file mode 100644 index 8937f8f..0000000 --- a/test/test.wysiwyg-registry.both.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; - -import { BlockRegistry } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/block.registry.js'; -import { DividerBlockHandler } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/content/divider.block.js'; -import { ParagraphBlockHandler } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/paragraph.block.js'; -import { HeadingBlockHandler } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/heading.block.js'; - -// Import block registration to ensure handlers are registered -import '../ts_web/elements/00group-input/dees-input-wysiwyg/wysiwyg.blockregistration.js'; - -tap.test('BlockRegistry should register and retrieve handlers', async () => { - // Test divider handler - const dividerHandler = BlockRegistry.getHandler('divider'); - expect(dividerHandler).toBeDefined(); - expect(dividerHandler).toBeInstanceOf(DividerBlockHandler); - expect(dividerHandler?.type).toEqual('divider'); - - // Test paragraph handler - const paragraphHandler = BlockRegistry.getHandler('paragraph'); - expect(paragraphHandler).toBeDefined(); - expect(paragraphHandler).toBeInstanceOf(ParagraphBlockHandler); - expect(paragraphHandler?.type).toEqual('paragraph'); - - // Test heading handlers - const heading1Handler = BlockRegistry.getHandler('heading-1'); - expect(heading1Handler).toBeDefined(); - expect(heading1Handler).toBeInstanceOf(HeadingBlockHandler); - expect(heading1Handler?.type).toEqual('heading-1'); - - const heading2Handler = BlockRegistry.getHandler('heading-2'); - expect(heading2Handler).toBeDefined(); - expect(heading2Handler).toBeInstanceOf(HeadingBlockHandler); - expect(heading2Handler?.type).toEqual('heading-2'); - - const heading3Handler = BlockRegistry.getHandler('heading-3'); - expect(heading3Handler).toBeDefined(); - expect(heading3Handler).toBeInstanceOf(HeadingBlockHandler); - expect(heading3Handler?.type).toEqual('heading-3'); -}); - -tap.test('Block handlers should render content correctly', async () => { - const testBlock = { - id: 'test-1', - type: 'paragraph' as const, - content: 'Test paragraph content' - }; - - const handler = BlockRegistry.getHandler('paragraph'); - expect(handler).toBeDefined(); - - if (handler) { - const rendered = handler.render(testBlock, false); - // The render() method returns the HTML template structure - // Content is set later in setup() - expect(rendered).toContain('contenteditable="true"'); - expect(rendered).toContain('data-block-type="paragraph"'); - expect(rendered).toContain('data-block-id="test-1"'); - expect(rendered).toContain('class="block paragraph"'); - } -}); - -tap.test('Divider handler should render correctly', async () => { - const dividerBlock = { - id: 'test-divider', - type: 'divider' as const, - content: ' ' - }; - - const handler = BlockRegistry.getHandler('divider'); - expect(handler).toBeDefined(); - - if (handler) { - const rendered = handler.render(dividerBlock, false); - expect(rendered).toContain('class="block divider"'); - expect(rendered).toContain('tabindex="0"'); - expect(rendered).toContain('
    '); - expect(rendered).toContain('data-block-id="test-divider"'); - } -}); - -tap.test('Heading handlers should render with correct levels', async () => { - const headingBlock = { - id: 'test-h1', - type: 'heading-1' as const, - content: 'Test Heading' - }; - - const handler = BlockRegistry.getHandler('heading-1'); - expect(handler).toBeDefined(); - - if (handler) { - const rendered = handler.render(headingBlock, false); - // The render() method returns the HTML template structure - // Content is set later in setup() - expect(rendered).toContain('class="block heading-1"'); - expect(rendered).toContain('contenteditable="true"'); - expect(rendered).toContain('data-block-id="test-h1"'); - expect(rendered).toContain('data-block-type="heading-1"'); - } -}); - -tap.test('getAllTypes should return all registered types', async () => { - const allTypes = BlockRegistry.getAllTypes(); - expect(allTypes).toContain('divider'); - expect(allTypes).toContain('paragraph'); - expect(allTypes).toContain('heading-1'); - expect(allTypes).toContain('heading-2'); - expect(allTypes).toContain('heading-3'); - expect(allTypes.length).toBeGreaterThanOrEqual(5); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-selection-highlight.chromium.ts b/test/test.wysiwyg-selection-highlight.chromium.ts deleted file mode 100644 index f212251..0000000 --- a/test/test.wysiwyg-selection-highlight.chromium.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; -import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; - -tap.test('Selection highlighting should work consistently for all block types', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import various block types - editor.importBlocks([ - { id: 'para-1', type: 'paragraph', content: 'This is a paragraph' }, - { id: 'heading-1', type: 'heading-1', content: 'This is a heading' }, - { id: 'quote-1', type: 'quote', content: 'This is a quote' }, - { id: 'code-1', type: 'code', content: 'const x = 42;' }, - { id: 'list-1', type: 'list', content: 'Item 1\nItem 2' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Test paragraph highlighting - console.log('Testing paragraph highlighting...'); - const paraWrapper = editor.shadowRoot?.querySelector('[data-block-id="para-1"]'); - const paraComponent = paraWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const paraContainer = paraComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const paraElement = paraContainer?.querySelector('.block.paragraph') as HTMLElement; - - // Focus paragraph to select it - paraElement.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if paragraph has selected class - const paraHasSelected = paraElement.classList.contains('selected'); - console.log('Paragraph has selected class:', paraHasSelected); - - // Check computed styles - const paraStyle = window.getComputedStyle(paraElement); - console.log('Paragraph background:', paraStyle.background); - console.log('Paragraph box-shadow:', paraStyle.boxShadow); - - // Test heading highlighting - console.log('\nTesting heading highlighting...'); - const headingWrapper = editor.shadowRoot?.querySelector('[data-block-id="heading-1"]'); - const headingComponent = headingWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const headingContainer = headingComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const headingElement = headingContainer?.querySelector('.block.heading-1') as HTMLElement; - - // Focus heading to select it - headingElement.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if heading has selected class - const headingHasSelected = headingElement.classList.contains('selected'); - console.log('Heading has selected class:', headingHasSelected); - - // Check computed styles - const headingStyle = window.getComputedStyle(headingElement); - console.log('Heading background:', headingStyle.background); - console.log('Heading box-shadow:', headingStyle.boxShadow); - - // Test quote highlighting - console.log('\nTesting quote highlighting...'); - const quoteWrapper = editor.shadowRoot?.querySelector('[data-block-id="quote-1"]'); - const quoteComponent = quoteWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const quoteContainer = quoteComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const quoteElement = quoteContainer?.querySelector('.block.quote') as HTMLElement; - - // Focus quote to select it - quoteElement.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check if quote has selected class - const quoteHasSelected = quoteElement.classList.contains('selected'); - console.log('Quote has selected class:', quoteHasSelected); - - // Test code highlighting - code blocks use .code-editor instead of .block.code - console.log('\nTesting code highlighting...'); - const codeWrapper = editor.shadowRoot?.querySelector('[data-block-id="code-1"]'); - const codeComponent = codeWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const codeContainer = codeComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const codeElement = codeContainer?.querySelector('.code-editor') as HTMLElement; - const codeBlockContainer = codeContainer?.querySelector('.code-block-container') as HTMLElement; - - // Focus code to select it - codeElement.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // For code blocks, the selection is on the container, not the editor - const codeHasSelected = codeBlockContainer?.classList.contains('selected'); - console.log('Code container has selected class:', codeHasSelected); - - // Focus back on paragraph and check if others are deselected - console.log('\nFocusing back on paragraph...'); - paraElement.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check that only paragraph is selected - expect(paraElement.classList.contains('selected')).toBeTrue(); - expect(headingElement.classList.contains('selected')).toBeFalse(); - expect(quoteElement.classList.contains('selected')).toBeFalse(); - // Code blocks use different selection structure - expect(codeBlockContainer?.classList.contains('selected') || false).toBeFalse(); - - console.log('Selection highlighting test complete'); -}); - -tap.test('Selected class should toggle correctly when clicking between blocks', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import two blocks - editor.importBlocks([ - { id: 'block-1', type: 'paragraph', content: 'First block' }, - { id: 'block-2', type: 'paragraph', content: 'Second block' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Get both blocks - const block1Wrapper = editor.shadowRoot?.querySelector('[data-block-id="block-1"]'); - const block1Component = block1Wrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const block1Container = block1Component?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const block1Element = block1Container?.querySelector('.block.paragraph') as HTMLElement; - - const block2Wrapper = editor.shadowRoot?.querySelector('[data-block-id="block-2"]'); - const block2Component = block2Wrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const block2Container = block2Component?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; - const block2Element = block2Container?.querySelector('.block.paragraph') as HTMLElement; - - // Initially neither should be selected - expect(block1Element.classList.contains('selected')).toBeFalse(); - expect(block2Element.classList.contains('selected')).toBeFalse(); - - // Click on first block - block1Element.click(); - block1Element.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // First block should be selected - expect(block1Element.classList.contains('selected')).toBeTrue(); - expect(block2Element.classList.contains('selected')).toBeFalse(); - - // Click on second block - block2Element.click(); - block2Element.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Second block should be selected, first should not - expect(block1Element.classList.contains('selected')).toBeFalse(); - expect(block2Element.classList.contains('selected')).toBeTrue(); - - console.log('Toggle test complete'); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-selection-simple.chromium.ts b/test/test.wysiwyg-selection-simple.chromium.ts deleted file mode 100644 index 84dcfe3..0000000 --- a/test/test.wysiwyg-selection-simple.chromium.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; -import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; - -tap.test('Selection highlighting basic test', async () => { - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import two blocks - editor.importBlocks([ - { id: 'para-1', type: 'paragraph', content: 'First paragraph' }, - { id: 'head-1', type: 'heading-1', content: 'First heading' } - ]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 500)); - - // Get paragraph element - const paraWrapper = editor.shadowRoot?.querySelector('[data-block-id="para-1"]'); - const paraComponent = paraWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const paraBlock = paraComponent?.shadowRoot?.querySelector('.block.paragraph') as HTMLElement; - - // Get heading element - const headWrapper = editor.shadowRoot?.querySelector('[data-block-id="head-1"]'); - const headComponent = headWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const headBlock = headComponent?.shadowRoot?.querySelector('.block.heading-1') as HTMLElement; - - console.log('Found elements:', { - paraBlock: !!paraBlock, - headBlock: !!headBlock - }); - - // Focus paragraph - paraBlock.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check classes - console.log('Paragraph classes:', paraBlock.className); - console.log('Heading classes:', headBlock.className); - - // Check isSelected property - console.log('Paragraph component isSelected:', paraComponent.isSelected); - console.log('Heading component isSelected:', headComponent.isSelected); - - // Focus heading - headBlock.focus(); - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check classes again - console.log('\nAfter focusing heading:'); - console.log('Paragraph classes:', paraBlock.className); - console.log('Heading classes:', headBlock.className); - console.log('Paragraph component isSelected:', paraComponent.isSelected); - console.log('Heading component isSelected:', headComponent.isSelected); - - // Check that heading is selected - expect(headBlock.classList.contains('selected')).toBeTrue(); - expect(paraBlock.classList.contains('selected')).toBeFalse(); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-split.chromium.ts b/test/test.wysiwyg-split.chromium.ts deleted file mode 100644 index 2247347..0000000 --- a/test/test.wysiwyg-split.chromium.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; - -import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; -import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; - -tap.test('should split paragraph content on Enter key', async () => { - // Create the wysiwyg editor - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import a test paragraph - editor.importBlocks([{ - id: 'test-para-1', - type: 'paragraph', - content: 'Hello World' - }]); - - await editor.updateComplete; - - // Wait for blocks to render - await new Promise(resolve => setTimeout(resolve, 100)); - - // Get the block wrapper and component - const blockWrapper = editor.shadowRoot?.querySelector('[data-block-id="test-para-1"]'); - expect(blockWrapper).toBeDefined(); - - const blockComponent = blockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - expect(blockComponent).toBeDefined(); - expect(blockComponent.block.type).toEqual('paragraph'); - - // Wait for block to render - await blockComponent.updateComplete; - - // Test getSplitContent - console.log('Testing getSplitContent...'); - const splitResult = blockComponent.getSplitContent(); - console.log('Split result:', splitResult); - - // Since we haven't set cursor position, it might return null or split at start - // This is just to test if the method is callable - expect(typeof blockComponent.getSplitContent).toEqual('function'); -}); - -tap.test('should handle Enter key press in paragraph', async () => { - // Create the wysiwyg editor - const editor: DeesInputWysiwyg = await webhelpers.fixture( - webhelpers.html`` - ); - - // Import a test paragraph - editor.importBlocks([{ - id: 'test-enter-1', - type: 'paragraph', - content: 'First part|Second part' // | marks where we'll simulate cursor - }]); - - await editor.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); - - // Check initial state - expect(editor.blocks.length).toEqual(1); - expect(editor.blocks[0].content).toEqual('First part|Second part'); - - // Get the block element - const blockWrapper = editor.shadowRoot?.querySelector('[data-block-id="test-enter-1"]'); - const blockComponent = blockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; - const blockElement = blockComponent.shadowRoot?.querySelector('.block.paragraph') as HTMLDivElement; - - expect(blockElement).toBeDefined(); - - // Set content without the | marker - blockElement.textContent = 'First partSecond part'; - - // Focus the block - blockElement.focus(); - - // Create and dispatch Enter key event - const enterEvent = new KeyboardEvent('keydown', { - key: 'Enter', - code: 'Enter', - bubbles: true, - cancelable: true, - composed: true - }); - - // Dispatch the event - blockElement.dispatchEvent(enterEvent); - - // Wait for processing - await new Promise(resolve => setTimeout(resolve, 200)); - - // Check if block was split (this might not work perfectly in test environment) - console.log('Blocks after Enter:', editor.blocks.length); - console.log('Block contents:', editor.blocks.map(b => b.content)); -}); - -export default tap.start(); \ No newline at end of file diff --git a/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/eco-applauncher-powermenu.demo.ts b/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/eco-applauncher-powermenu.demo.ts new file mode 100644 index 0000000..8471c80 --- /dev/null +++ b/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/eco-applauncher-powermenu.demo.ts @@ -0,0 +1,20 @@ +import { html } from '@design.estate/dees-element'; + +export const demo = () => html` + +
    + console.log('Power action:', e.detail.action)} + @menu-close=${() => console.log('Menu closed')} + > +
    +`; diff --git a/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/eco-applauncher-powermenu.ts b/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/eco-applauncher-powermenu.ts new file mode 100644 index 0000000..84388f8 --- /dev/null +++ b/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/eco-applauncher-powermenu.ts @@ -0,0 +1,261 @@ +import { + customElement, + DeesElement, + type TemplateResult, + html, + property, + css, + cssManager, +} from '@design.estate/dees-element'; +import { DeesIcon } from '@design.estate/dees-catalog'; +import { demo } from './eco-applauncher-powermenu.demo.js'; + +// Ensure dees-icon is registered +DeesIcon; + +declare global { + interface HTMLElementTagNameMap { + 'eco-applauncher-powermenu': EcoApplauncherPowermenu; + } +} + +export type TPowerAction = 'lock' | 'lock-sleep' | 'reboot'; + +@customElement('eco-applauncher-powermenu') +export class EcoApplauncherPowermenu extends DeesElement { + public static demo = demo; + public static demoGroup = 'App Launcher'; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + position: relative; + pointer-events: none; + } + + :host([open]) { + pointer-events: auto; + } + + .menu-container { + background: ${cssManager.bdTheme('#ffffff', 'hsl(240 6% 10%)')}; + border: 1px solid ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 20%)')}; + border-radius: 12px; + box-shadow: ${cssManager.bdTheme( + '0 8px 32px rgba(0, 0, 0, 0.15)', + '0 8px 32px rgba(0, 0, 0, 0.4)' + )}; + min-width: 200px; + overflow: hidden; + opacity: 0; + transform: scale(0.95) translateY(-8px); + transition: all 0.2s ease-out; + pointer-events: none; + } + + :host([open]) .menu-container { + opacity: 1; + transform: scale(1) translateY(0); + pointer-events: auto; + } + + .menu-header { + padding: 12px 16px; + border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 92%)', 'hsl(240 5% 15%)')}; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 60%)')}; + } + + .menu-options { + padding: 8px 0; + } + + .menu-option { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 16px; + cursor: pointer; + transition: background 0.15s ease; + color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 90%)')}; + } + + .menu-option:hover { + background: ${cssManager.bdTheme('hsl(0 0% 96%)', 'hsl(240 5% 15%)')}; + } + + .menu-option:active { + background: ${cssManager.bdTheme('hsl(0 0% 92%)', 'hsl(240 5% 18%)')}; + } + + .menu-option.danger { + color: ${cssManager.bdTheme('hsl(0 72% 45%)', 'hsl(0 72% 60%)')}; + } + + .menu-option.danger:hover { + background: ${cssManager.bdTheme('hsl(0 72% 97%)', 'hsl(0 50% 15%)')}; + } + + .option-icon { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 6px; + background: ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 18%)')}; + } + + .menu-option.danger .option-icon { + background: ${cssManager.bdTheme('hsl(0 72% 94%)', 'hsl(0 50% 18%)')}; + } + + .option-text { + display: flex; + flex-direction: column; + gap: 2px; + } + + .option-label { + font-size: 14px; + font-weight: 500; + } + + .option-description { + font-size: 11px; + color: ${cssManager.bdTheme('hsl(0 0% 55%)', 'hsl(0 0% 50%)')}; + } + + .menu-divider { + height: 1px; + background: ${cssManager.bdTheme('hsl(0 0% 92%)', 'hsl(240 5% 15%)')}; + margin: 4px 0; + } + `, + ]; + + @property({ type: Boolean, reflect: true }) + accessor open = false; + + private boundHandleClickOutside = this.handleClickOutside.bind(this); + private inactivityTimeout: ReturnType | null = null; + private readonly INACTIVITY_TIMEOUT = 60000; // 1 minute + private lastActivityTime = 0; + + public render(): TemplateResult { + return html` + + `; + } + + private handleAction(action: TPowerAction): void { + this.dispatchEvent(new CustomEvent('power-action', { + detail: { action }, + bubbles: true, + composed: true, + })); + this.closeMenu(); + } + + private handleClickOutside(e: MouseEvent): void { + if (this.open && !this.contains(e.target as Node)) { + this.closeMenu(); + } + } + + private resetInactivityTimer(): void { + const now = Date.now(); + // Throttle: only reset if 5+ seconds since last reset + if (now - this.lastActivityTime < 5000) { + return; + } + this.lastActivityTime = now; + this.clearInactivityTimer(); + if (this.open) { + this.inactivityTimeout = setTimeout(() => { + this.closeMenu(); + }, this.INACTIVITY_TIMEOUT); + } + } + + private clearInactivityTimer(): void { + if (this.inactivityTimeout) { + clearTimeout(this.inactivityTimeout); + this.inactivityTimeout = null; + } + } + + private closeMenu(): void { + this.open = false; + this.dispatchEvent(new CustomEvent('menu-close', { + bubbles: true, + composed: true, + })); + } + + protected updated(changedProperties: Map): void { + if (changedProperties.has('open')) { + if (this.open) { + this.resetInactivityTimer(); + } else { + this.clearInactivityTimer(); + } + } + } + + async connectedCallback(): Promise { + await super.connectedCallback(); + setTimeout(() => { + document.addEventListener('click', this.boundHandleClickOutside); + }, 0); + } + + async disconnectedCallback(): Promise { + await super.disconnectedCallback(); + document.removeEventListener('click', this.boundHandleClickOutside); + this.clearInactivityTimer(); + } +} diff --git a/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/index.ts b/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/index.ts new file mode 100644 index 0000000..8b36cfc --- /dev/null +++ b/ts_web/elements/00group-applauncher/eco-applauncher-powermenu/index.ts @@ -0,0 +1 @@ +export * from './eco-applauncher-powermenu.js'; diff --git a/ts_web/elements/00group-applauncher/eco-applauncher/eco-applauncher.demo.ts b/ts_web/elements/00group-applauncher/eco-applauncher/eco-applauncher.demo.ts index 9ccd9b5..6eb40ea 100644 --- a/ts_web/elements/00group-applauncher/eco-applauncher/eco-applauncher.demo.ts +++ b/ts_web/elements/00group-applauncher/eco-applauncher/eco-applauncher.demo.ts @@ -1,21 +1,18 @@ import { html } from '@design.estate/dees-element'; -import type { IAppIcon } from './eco-applauncher.js'; +import type { IAppIcon, ILoginConfig, ILoginCredentials, TApplauncherMode } from './eco-applauncher.js'; import type { IWifiNetwork } from '../eco-applauncher-wifimenu/index.js'; import type { IAudioDevice } from '../eco-applauncher-soundmenu/index.js'; +import '../../../views/eco-view-settings/eco-view-settings.js'; +import '../../../views/eco-view-peripherals/eco-view-peripherals.js'; +import '../../../views/eco-view-saasshare/eco-view-saasshare.js'; +import '../../../views/eco-view-system/eco-view-system.js'; +import type { EcoApplauncher } from './eco-applauncher.js'; const mockApps: IAppIcon[] = [ - { name: 'Settings', icon: 'lucide:settings', action: () => console.log('Settings clicked') }, - { name: 'Browser', icon: 'lucide:globe', action: () => console.log('Browser clicked') }, - { name: 'Terminal', icon: 'lucide:terminal', action: () => console.log('Terminal clicked') }, - { name: 'Files', icon: 'lucide:folder', action: () => console.log('Files clicked') }, - { name: 'Calendar', icon: 'lucide:calendar', action: () => console.log('Calendar clicked') }, - { name: 'Mail', icon: 'lucide:mail', action: () => console.log('Mail clicked') }, - { name: 'Music', icon: 'lucide:music', action: () => console.log('Music clicked') }, - { name: 'Photos', icon: 'lucide:image', action: () => console.log('Photos clicked') }, - { name: 'Notes', icon: 'lucide:fileText', action: () => console.log('Notes clicked') }, - { name: 'Calculator', icon: 'lucide:calculator', action: () => console.log('Calculator clicked') }, - { name: 'Weather', icon: 'lucide:cloudSun', action: () => console.log('Weather clicked') }, - { name: 'Maps', icon: 'lucide:map', action: () => console.log('Maps clicked') }, + { name: 'SaaS Share', icon: 'lucide:share2', view: html`` }, + { name: 'System', icon: 'lucide:activity', view: html`` }, + { name: 'Peripherals', icon: 'lucide:monitor', view: html`` }, + { name: 'Settings', icon: 'lucide:settings', view: html`` }, ]; const mockNetworks: IWifiNetwork[] = [ @@ -32,7 +29,33 @@ const mockAudioDevices: IAudioDevice[] = [ { id: 'hdmi', name: 'LG Monitor', type: 'hdmi' }, ]; -export const demo = () => html` +const loginConfig: ILoginConfig = { + allowedMethods: ['pin', 'password', 'qr'], + pinLength: 4, + welcomeMessage: 'Welcome to EcoBridge', +}; + +const handleLoginAttempt = (e: CustomEvent) => { + const credentials = e.detail as ILoginCredentials; + const applauncher = e.target as EcoApplauncher; + + console.log('Login attempt:', credentials); + + // Demo validation: PIN "1234" or password "demo" + if ( + (credentials.method === 'pin' && credentials.value === '1234') || + (credentials.method === 'password' && credentials.value === 'demo') + ) { + console.log('Login successful!'); + applauncher.setLoginResult(true); + } else { + console.log('Login failed'); + applauncher.setLoginResult(false, 'Invalid credentials. Try PIN: 1234 or Password: demo'); + } +}; + +// Home mode demo +const demoHome = () => html`
    html` .muted=${false} .userName=${'John Doe'} .notificationCount=${3} + @login-attempt=${handleLoginAttempt} + @login-success=${() => console.log('Login success event received')} + @login-failure=${(e: CustomEvent) => console.log('Login failure:', e.detail)} @wifi-toggle=${(e: CustomEvent) => console.log('WiFi toggle:', e.detail)} @network-select=${(e: CustomEvent) => console.log('Network selected:', e.detail)} @wifi-settings-click=${() => console.log('WiFi settings clicked')} @@ -69,3 +97,37 @@ export const demo = () => html` >
    `; +demoHome.demoTitle = 'Home Mode'; + +// Login mode demo +const demoLogin = () => html` + +
    + console.log('Login success event received')} + @login-failure=${(e: CustomEvent) => console.log('Login failure:', e.detail)} + > +
    +`; +demoLogin.demoTitle = 'Login Mode'; + +// Export array of demo functions +export const demo = [demoHome, demoLogin]; diff --git a/ts_web/elements/00group-applauncher/eco-applauncher/eco-applauncher.ts b/ts_web/elements/00group-applauncher/eco-applauncher/eco-applauncher.ts index 37e2cf8..e7c8ada 100644 --- a/ts_web/elements/00group-applauncher/eco-applauncher/eco-applauncher.ts +++ b/ts_web/elements/00group-applauncher/eco-applauncher/eco-applauncher.ts @@ -14,6 +14,9 @@ import { EcoApplauncherWifimenu, type IWifiNetwork } from '../eco-applauncher-wi import { EcoApplauncherBatterymenu } from '../eco-applauncher-batterymenu/index.js'; import { EcoApplauncherSoundmenu, type IAudioDevice } from '../eco-applauncher-soundmenu/index.js'; import { EcoApplauncherKeyboard } from '../eco-applauncher-keyboard/index.js'; +import { EcoApplauncherPowermenu, type TPowerAction } from '../eco-applauncher-powermenu/index.js'; +import { EcoViewHome } from '../../../views/eco-view-home/index.js'; +import { EcoViewLogin, type ILoginConfig, type ILoginCredentials } from '../../../views/eco-view-login/index.js'; // Ensure components are registered DeesIcon; @@ -21,6 +24,9 @@ EcoApplauncherWifimenu; EcoApplauncherBatterymenu; EcoApplauncherSoundmenu; EcoApplauncherKeyboard; +EcoApplauncherPowermenu; +EcoViewHome; +EcoViewLogin; declare global { interface HTMLElementTagNameMap { @@ -28,12 +34,18 @@ declare global { } } +export type TApplauncherMode = 'login' | 'home'; + export interface IAppIcon { name: string; icon: string; action?: () => void; + view?: TemplateResult; } +export type { ILoginConfig, ILoginCredentials } from '../../../views/eco-view-login/index.js'; +export type { TPowerAction } from '../eco-applauncher-powermenu/index.js'; + export interface IStatusBarConfig { showTime?: boolean; showNetwork?: boolean; @@ -153,6 +165,10 @@ export class EcoApplauncher extends DeesElement { background: ${cssManager.bdTheme('hsl(220 15% 88%)', 'hsl(240 5% 15%)')}; } + .top-icon-button.active { + background: ${cssManager.bdTheme('hsl(220 15% 85%)', 'hsl(240 5% 18%)')}; + } + .user-avatar { width: 32px; height: 32px; @@ -195,9 +211,6 @@ export class EcoApplauncher extends DeesElement { .apps-area { flex: 1; - display: flex; - align-items: center; - justify-content: center; padding: 48px; overflow-y: auto; } @@ -206,7 +219,6 @@ export class EcoApplauncher extends DeesElement { display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 32px; - max-width: 800px; width: 100%; } @@ -415,6 +427,18 @@ export class EcoApplauncher extends DeesElement { pointer-events: none; } + .topbar-menu-wrapper { + position: relative; + } + + .topbar-menu-popup { + position: absolute; + top: calc(100% + 8px); + right: 0; + z-index: 100; + pointer-events: none; + } + .keyboard-area { flex-shrink: 0; height: 0; @@ -430,6 +454,53 @@ export class EcoApplauncher extends DeesElement { overflow: visible; } + .view-area { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + } + + .view-header { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 24px; + background: ${cssManager.bdTheme('hsl(220 15% 94%)', 'hsl(240 6% 8%)')}; + border-bottom: 1px solid ${cssManager.bdTheme('hsl(220 15% 88%)', 'hsl(240 5% 15%)')}; + flex-shrink: 0; + } + + .back-button { + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + padding: 8px 14px; + background: ${cssManager.bdTheme('hsl(220 15% 88%)', 'hsl(240 5% 14%)')}; + border-radius: 8px; + cursor: pointer; + transition: background 0.15s ease; + color: ${cssManager.bdTheme('hsl(0 0% 30%)', 'hsl(0 0% 80%)')}; + font-size: 13px; + font-weight: 500; + } + + .back-button:hover { + background: ${cssManager.bdTheme('hsl(220 15% 82%)', 'hsl(240 5% 18%)')}; + } + + .view-title { + font-size: 16px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 90%)')}; + } + + .view-content { + flex: 1; + overflow: auto; + } + @media (max-width: 600px) { .apps-area { padding: 24px; @@ -462,6 +533,16 @@ export class EcoApplauncher extends DeesElement { `, ]; + @property({ type: String }) + accessor mode: TApplauncherMode = 'home'; + + @property({ type: Object }) + accessor loginConfig: ILoginConfig = { + allowedMethods: ['pin', 'password', 'qr'], + pinLength: 4, + welcomeMessage: 'Welcome', + }; + @property({ type: Array }) accessor apps: IAppIcon[] = []; @@ -512,9 +593,18 @@ export class EcoApplauncher extends DeesElement { @state() accessor soundMenuOpen = false; + @state() + accessor powerMenuOpen = false; + @state() accessor keyboardVisible = false; + @state() + accessor activeView: TemplateResult | null = null; + + @state() + accessor activeViewName: string | null = null; + @property({ type: Array }) accessor networks: IWifiNetwork[] = []; @@ -552,12 +642,8 @@ export class EcoApplauncher extends DeesElement { public render(): TemplateResult { return html`
    - ${this.renderTopBar()} -
    -
    - ${this.apps.map((app) => this.renderAppIcon(app))} -
    -
    + ${this.mode === 'login' ? '' : this.renderTopBar()} + ${this.renderMainContent()}
    + `; + } + + private renderHomeView(): TemplateResult { + return html` + + `; + } + + private renderAppsArea(): TemplateResult { + return html` +
    +
    + ${this.apps.map((app) => this.renderAppIcon(app))} +
    +
    + `; + } + + private renderActiveView(): TemplateResult { + return html` +
    +
    + ${this.activeView} +
    +
    + `; + } + private renderAppIcon(app: IAppIcon): TemplateResult { return html`
    this.handleAppClick(app)}> @@ -607,7 +745,13 @@ export class EcoApplauncher extends DeesElement { return html`
    - ${this.topBarConfig.showDate ? html` + ${this.activeView ? html` +
    + + Back +
    + ${this.activeViewName} + ` : this.topBarConfig.showDate ? html` ${this.currentDate} ` : ''}
    @@ -636,6 +780,21 @@ export class EcoApplauncher extends DeesElement { ${userInitials}
    ` : ''} +
    +
    + +
    +
    + +
    +
    `; @@ -831,15 +990,91 @@ export class EcoApplauncher extends DeesElement { composed: true, }) ); + + // If app has a view, open it inside the applauncher + if (app.view) { + this.activeView = app.view; + this.activeViewName = app.name; + return; + } + + // Otherwise execute the action if (app.action) { app.action(); } } + private handleHomeAppClick(e: CustomEvent): void { + const app = e.detail.app as IAppIcon; + this.handleAppClick(app); + } + + private handleLoginAttempt(e: CustomEvent): void { + const credentials = e.detail as ILoginCredentials; + // Dispatch event for parent to handle validation + this.dispatchEvent(new CustomEvent('login-attempt', { + detail: credentials, + bubbles: true, + composed: true, + })); + } + + /** + * Set the login result after validation + * @param success Whether login was successful + * @param errorMessage Optional error message to display + */ + public setLoginResult(success: boolean, errorMessage?: string): void { + const loginView = this.shadowRoot?.querySelector('eco-view-login') as EcoViewLogin | null; + + if (success) { + this.mode = 'home'; + this.dispatchEvent(new CustomEvent('login-success', { + bubbles: true, + composed: true, + })); + } else { + if (loginView && errorMessage) { + loginView.showErrorMessage(errorMessage); + } + this.dispatchEvent(new CustomEvent('login-failure', { + detail: { error: errorMessage }, + bubbles: true, + composed: true, + })); + } + } + + /** + * Switch to login mode + */ + public showLogin(): void { + this.mode = 'login'; + this.activeView = null; + this.activeViewName = null; + } + + /** + * Switch to home mode + */ + public showHome(): void { + this.mode = 'home'; + } + + private handleBackClick(): void { + this.activeView = null; + this.activeViewName = null; + this.dispatchEvent(new CustomEvent('view-close', { + bubbles: true, + composed: true, + })); + } + private handleNetworkClick(e: MouseEvent): void { e.stopPropagation(); this.batteryMenuOpen = false; this.soundMenuOpen = false; + this.powerMenuOpen = false; this.wifiMenuOpen = !this.wifiMenuOpen; } @@ -847,6 +1082,7 @@ export class EcoApplauncher extends DeesElement { e.stopPropagation(); this.wifiMenuOpen = false; this.soundMenuOpen = false; + this.powerMenuOpen = false; this.batteryMenuOpen = !this.batteryMenuOpen; } @@ -854,9 +1090,18 @@ export class EcoApplauncher extends DeesElement { e.stopPropagation(); this.wifiMenuOpen = false; this.batteryMenuOpen = false; + this.powerMenuOpen = false; this.soundMenuOpen = !this.soundMenuOpen; } + private handlePowerClick(e: MouseEvent): void { + e.stopPropagation(); + this.wifiMenuOpen = false; + this.batteryMenuOpen = false; + this.soundMenuOpen = false; + this.powerMenuOpen = !this.powerMenuOpen; + } + private handleWifiMenuClose(): void { this.wifiMenuOpen = false; } @@ -869,6 +1114,19 @@ export class EcoApplauncher extends DeesElement { this.soundMenuOpen = false; } + private handlePowerMenuClose(): void { + this.powerMenuOpen = false; + } + + private handlePowerAction(e: CustomEvent): void { + const action = e.detail.action as TPowerAction; + this.dispatchEvent(new CustomEvent('power-action', { + detail: { action }, + bubbles: true, + composed: true, + })); + } + private handleVolumeChange(e: CustomEvent): void { this.soundLevel = e.detail.volume; this.dispatchEvent(new CustomEvent('volume-change', { @@ -953,6 +1211,7 @@ export class EcoApplauncher extends DeesElement { this.wifiMenuOpen = false; this.batteryMenuOpen = false; this.soundMenuOpen = false; + this.powerMenuOpen = false; } this.dispatchEvent(new CustomEvent('keyboard-toggle', { detail: { visible: this.keyboardVisible }, diff --git a/ts_web/elements/00group-applauncher/index.ts b/ts_web/elements/00group-applauncher/index.ts index 1ce25b4..958b416 100644 --- a/ts_web/elements/00group-applauncher/index.ts +++ b/ts_web/elements/00group-applauncher/index.ts @@ -4,5 +4,4 @@ export * from './eco-applauncher-wifimenu/index.js'; export * from './eco-applauncher-batterymenu/index.js'; export * from './eco-applauncher-soundmenu/index.js'; export * from './eco-applauncher-keyboard/index.js'; -export * from './eco-settings/index.js'; -export * from './eco-peripherals/index.js'; +export * from './eco-applauncher-powermenu/index.js'; diff --git a/ts_web/views/eco-view-home/eco-view-home.demo.ts b/ts_web/views/eco-view-home/eco-view-home.demo.ts new file mode 100644 index 0000000..1295645 --- /dev/null +++ b/ts_web/views/eco-view-home/eco-view-home.demo.ts @@ -0,0 +1,31 @@ +import { html } from '@design.estate/dees-element'; +import type { IAppIcon } from './eco-view-home.js'; + +const mockApps: IAppIcon[] = [ + { name: 'SaaS Share', icon: 'lucide:share2' }, + { name: 'System', icon: 'lucide:activity' }, + { name: 'Peripherals', icon: 'lucide:monitor' }, + { name: 'Settings', icon: 'lucide:settings' }, + { name: 'Files', icon: 'lucide:folder' }, + { name: 'Terminal', icon: 'lucide:terminal' }, + { name: 'Browser', icon: 'lucide:globe' }, + { name: 'Camera', icon: 'lucide:camera' }, +]; + +export const demo = () => html` + +
    + console.log('App clicked:', e.detail.app)} + > +
    +`; diff --git a/ts_web/views/eco-view-home/eco-view-home.ts b/ts_web/views/eco-view-home/eco-view-home.ts new file mode 100644 index 0000000..c03b44d --- /dev/null +++ b/ts_web/views/eco-view-home/eco-view-home.ts @@ -0,0 +1,157 @@ +import { + customElement, + DeesElement, + type TemplateResult, + html, + property, + css, + cssManager, +} from '@design.estate/dees-element'; +import { DeesIcon } from '@design.estate/dees-catalog'; + +// Ensure icon component is registered +DeesIcon; + +declare global { + interface HTMLElementTagNameMap { + 'eco-view-home': EcoViewHome; + } +} + +export interface IAppIcon { + name: string; + icon: string; + action?: () => void; + view?: TemplateResult; +} + +@customElement('eco-view-home') +export class EcoViewHome extends DeesElement { + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + overflow-y: auto; + } + + .apps-area { + padding: 48px; + min-height: 100%; + box-sizing: border-box; + } + + .apps-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); + gap: 32px; + width: 100%; + } + + .app-icon { + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + padding: 16px; + border-radius: 16px; + cursor: pointer; + transition: background 0.2s ease, transform 0.15s ease; + user-select: none; + -webkit-tap-highlight-color: transparent; + } + + .app-icon:hover { + background: ${cssManager.bdTheme('hsl(220 15% 92%)', 'hsl(240 5% 12%)')}; + } + + .app-icon:active { + transform: scale(0.95); + background: ${cssManager.bdTheme('hsl(220 15% 88%)', 'hsl(240 5% 16%)')}; + } + + .app-icon-circle { + width: 64px; + height: 64px; + border-radius: 16px; + background: ${cssManager.bdTheme('hsl(220 15% 90%)', 'hsl(240 5% 15%)')}; + display: flex; + align-items: center; + justify-content: center; + color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 80%)')}; + } + + .app-icon-circle dees-icon { + --dees-icon-size: 28px; + } + + .app-icon-name { + font-size: 13px; + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 25%)', 'hsl(0 0% 85%)')}; + text-align: center; + max-width: 90px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + @media (max-width: 600px) { + .apps-area { + padding: 24px; + } + + .apps-grid { + grid-template-columns: repeat(auto-fill, minmax(80px, 1fr)); + gap: 16px; + } + + .app-icon-circle { + width: 56px; + height: 56px; + font-size: 24px; + } + + .app-icon-name { + font-size: 12px; + } + } + `, + ]; + + @property({ type: Array }) + accessor apps: IAppIcon[] = []; + + public render(): TemplateResult { + return html` +
    +
    + ${this.apps.map((app) => this.renderAppIcon(app))} +
    +
    + `; + } + + private renderAppIcon(app: IAppIcon): TemplateResult { + return html` +
    this.handleAppClick(app)}> +
    + +
    + ${app.name} +
    + `; + } + + private handleAppClick(app: IAppIcon): void { + this.dispatchEvent( + new CustomEvent('app-click', { + detail: { app }, + bubbles: true, + composed: true, + }) + ); + } +} diff --git a/ts_web/views/eco-view-home/index.ts b/ts_web/views/eco-view-home/index.ts new file mode 100644 index 0000000..453039d --- /dev/null +++ b/ts_web/views/eco-view-home/index.ts @@ -0,0 +1 @@ +export * from './eco-view-home.js'; diff --git a/ts_web/views/eco-view-login/eco-view-login.demo.ts b/ts_web/views/eco-view-login/eco-view-login.demo.ts new file mode 100644 index 0000000..28d4149 --- /dev/null +++ b/ts_web/views/eco-view-login/eco-view-login.demo.ts @@ -0,0 +1,48 @@ +import { html } from '@design.estate/dees-element'; +import type { ILoginConfig, ILoginCredentials } from './eco-view-login.js'; + +const handleLoginAttempt = (e: CustomEvent) => { + const { method, value } = e.detail; + console.log(`Login attempt via ${method}:`, value); + + // Demo: Show success for PIN "1234" or password "demo" + const loginView = e.target as HTMLElement & { showErrorMessage: (msg: string) => void; clearInput: () => void }; + + if ((method === 'pin' && value === '1234') || (method === 'password' && value === 'demo')) { + console.log('Login successful!'); + alert('Login successful! (Demo)'); + loginView.clearInput(); + } else { + loginView.showErrorMessage('Invalid credentials. Try PIN: 1234 or Password: demo'); + } +}; + +const pinOnlyConfig: ILoginConfig = { + allowedMethods: ['pin'], + pinLength: 4, + welcomeMessage: 'Enter PIN', +}; + +const allMethodsConfig: ILoginConfig = { + allowedMethods: ['pin', 'password', 'qr'], + pinLength: 6, + welcomeMessage: 'Sign In', +}; + +export const demo = () => html` + +
    + +
    +`; diff --git a/ts_web/views/eco-view-login/eco-view-login.ts b/ts_web/views/eco-view-login/eco-view-login.ts new file mode 100644 index 0000000..140ccc4 --- /dev/null +++ b/ts_web/views/eco-view-login/eco-view-login.ts @@ -0,0 +1,749 @@ +import { + customElement, + DeesElement, + type TemplateResult, + html, + property, + css, + cssManager, + state, +} from '@design.estate/dees-element'; +import { DeesIcon } from '@design.estate/dees-catalog'; + +// Ensure icon component is registered +DeesIcon; + +declare global { + interface HTMLElementTagNameMap { + 'eco-view-login': EcoViewLogin; + } +} + +export type TAuthMethod = 'pin' | 'password' | 'qr'; + +export interface ILoginConfig { + allowedMethods: TAuthMethod[]; + pinLength?: number; + qrCodeData?: string; + logoUrl?: string; + welcomeMessage?: string; + subtitle?: string; +} + +export interface ILoginCredentials { + method: TAuthMethod; + value: string; +} + +@customElement('eco-view-login') +export class EcoViewLogin extends DeesElement { + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: flex; + width: 100%; + height: 100%; + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + } + + .login-container { + display: flex; + width: 100%; + height: 100%; + } + + /* Left Panel - Branding & Method Selection */ + .left-panel { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + padding: 64px; + background: ${cssManager.bdTheme('hsl(220 15% 96%)', 'hsl(240 6% 10%)')}; + border-right: 1px solid ${cssManager.bdTheme('hsl(220 15% 90%)', 'hsl(240 5% 16%)')}; + } + + .branding { + margin-bottom: 48px; + } + + .logo { + width: 72px; + height: 72px; + border-radius: 18px; + background: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + display: flex; + align-items: center; + justify-content: center; + color: white; + margin-bottom: 24px; + } + + .logo img { + width: 100%; + height: 100%; + object-fit: contain; + border-radius: 18px; + } + + .welcome-message { + font-size: 32px; + font-weight: 700; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 95%)')}; + margin-bottom: 8px; + line-height: 1.2; + } + + .subtitle { + font-size: 16px; + color: ${cssManager.bdTheme('hsl(0 0% 45%)', 'hsl(0 0% 55%)')}; + line-height: 1.5; + } + + .method-selector { + display: flex; + flex-direction: column; + gap: 12px; + } + + .method-selector-label { + font-size: 13px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 60%)')}; + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 4px; + } + + .method-option { + display: flex; + align-items: center; + gap: 16px; + padding: 16px 20px; + background: ${cssManager.bdTheme('white', 'hsl(240 5% 14%)')}; + border: 2px solid ${cssManager.bdTheme('hsl(220 15% 90%)', 'hsl(240 5% 20%)')}; + border-radius: 12px; + cursor: pointer; + transition: all 0.2s ease; + } + + .method-option:hover { + border-color: ${cssManager.bdTheme('hsl(220 15% 80%)', 'hsl(240 5% 28%)')}; + background: ${cssManager.bdTheme('hsl(220 15% 98%)', 'hsl(240 5% 16%)')}; + } + + .method-option.active { + border-color: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + background: ${cssManager.bdTheme('hsl(217 91% 97%)', 'hsl(217 91% 15%)')}; + } + + .method-icon { + width: 44px; + height: 44px; + border-radius: 10px; + background: ${cssManager.bdTheme('hsl(220 15% 94%)', 'hsl(240 5% 20%)')}; + display: flex; + align-items: center; + justify-content: center; + color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 70%)')}; + transition: all 0.2s ease; + } + + .method-option.active .method-icon { + background: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + color: white; + } + + .method-info { + flex: 1; + } + + .method-name { + font-size: 15px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 90%)')}; + margin-bottom: 2px; + } + + .method-description { + font-size: 13px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + } + + .method-check { + width: 24px; + height: 24px; + border-radius: 50%; + border: 2px solid ${cssManager.bdTheme('hsl(220 15% 85%)', 'hsl(240 5% 25%)')}; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + } + + .method-option.active .method-check { + background: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + border-color: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + color: white; + } + + /* Right Panel - Auth Input */ + .right-panel { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 64px; + background: ${cssManager.bdTheme('white', 'hsl(240 6% 6%)')}; + } + + .auth-content { + width: 100%; + max-width: 320px; + display: flex; + flex-direction: column; + align-items: center; + gap: 32px; + } + + .auth-title { + font-size: 20px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 90%)')}; + text-align: center; + } + + /* Error message */ + .error-message { + color: hsl(0 72% 51%); + font-size: 14px; + text-align: center; + padding: 12px 16px; + background: hsla(0, 72%, 51%, 0.1); + border-radius: 8px; + width: 100%; + box-sizing: border-box; + } + + /* PIN Input */ + .pin-display { + display: flex; + gap: 16px; + } + + .pin-dot { + width: 18px; + height: 18px; + border-radius: 50%; + background: ${cssManager.bdTheme('hsl(220 15% 85%)', 'hsl(240 5% 20%)')}; + transition: all 0.15s ease; + } + + .pin-dot.filled { + background: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + transform: scale(1.15); + } + + .pin-dot.error { + background: hsl(0 72% 51%); + animation: shake 0.3s ease; + } + + @keyframes shake { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-4px); } + 75% { transform: translateX(4px); } + } + + .numpad { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; + } + + .numpad-button { + width: 76px; + height: 76px; + border-radius: 50%; + background: ${cssManager.bdTheme('hsl(220 15% 95%)', 'hsl(240 5% 14%)')}; + border: none; + font-size: 28px; + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 85%)')}; + cursor: pointer; + transition: all 0.15s ease; + display: flex; + align-items: center; + justify-content: center; + } + + .numpad-button:hover { + background: ${cssManager.bdTheme('hsl(220 15% 90%)', 'hsl(240 5% 20%)')}; + } + + .numpad-button:active { + transform: scale(0.95); + background: ${cssManager.bdTheme('hsl(220 15% 85%)', 'hsl(240 5% 24%)')}; + } + + .numpad-button.action { + background: transparent; + font-size: 18px; + } + + .numpad-button.action:hover { + background: ${cssManager.bdTheme('hsl(220 15% 95%)', 'hsl(240 5% 14%)')}; + } + + .numpad-button.submit { + background: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + color: white; + } + + .numpad-button.submit:hover { + background: ${cssManager.bdTheme('hsl(217 91% 55%)', 'hsl(217 91% 45%)')}; + } + + /* Password Input */ + .password-form { + width: 100%; + display: flex; + flex-direction: column; + gap: 20px; + } + + .password-input-wrapper { + width: 100%; + position: relative; + } + + .password-input { + width: 100%; + padding: 18px 52px 18px 18px; + font-size: 16px; + background: ${cssManager.bdTheme('hsl(220 15% 96%)', 'hsl(240 5% 12%)')}; + border: 2px solid ${cssManager.bdTheme('hsl(220 15% 88%)', 'hsl(240 5% 20%)')}; + border-radius: 12px; + color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 90%)')}; + outline: none; + box-sizing: border-box; + transition: border-color 0.2s ease; + } + + .password-input:focus { + border-color: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + } + + .password-input.error { + border-color: hsl(0 72% 51%); + animation: shake 0.3s ease; + } + + .password-toggle { + position: absolute; + right: 14px; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + cursor: pointer; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + padding: 6px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 6px; + transition: all 0.15s ease; + } + + .password-toggle:hover { + background: ${cssManager.bdTheme('hsl(220 15% 90%)', 'hsl(240 5% 18%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 30%)', 'hsl(0 0% 80%)')}; + } + + .submit-button { + width: 100%; + padding: 18px; + font-size: 16px; + font-weight: 600; + background: ${cssManager.bdTheme('hsl(217 91% 60%)', 'hsl(217 91% 50%)')}; + color: white; + border: none; + border-radius: 12px; + cursor: pointer; + transition: all 0.2s ease; + } + + .submit-button:hover { + background: ${cssManager.bdTheme('hsl(217 91% 55%)', 'hsl(217 91% 45%)')}; + } + + .submit-button:active { + transform: scale(0.98); + } + + /* QR Code */ + .qr-container { + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; + } + + .qr-code { + width: 220px; + height: 220px; + background: white; + border-radius: 16px; + padding: 20px; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1); + } + + .qr-code img { + width: 100%; + height: 100%; + object-fit: contain; + } + + .qr-placeholder { + width: 100%; + height: 100%; + background: repeating-linear-gradient( + 45deg, + hsl(0 0% 92%), + hsl(0 0% 92%) 10px, + hsl(0 0% 88%) 10px, + hsl(0 0% 88%) 20px + ); + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + color: hsl(0 0% 50%); + font-size: 14px; + } + + .qr-instruction { + font-size: 14px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + text-align: center; + line-height: 1.6; + max-width: 280px; + } + + /* Responsive */ + @media (max-width: 800px) { + .login-container { + flex-direction: column; + } + + .left-panel { + padding: 32px; + border-right: none; + border-bottom: 1px solid ${cssManager.bdTheme('hsl(220 15% 90%)', 'hsl(240 5% 16%)')}; + } + + .right-panel { + padding: 32px; + } + + .branding { + margin-bottom: 32px; + } + + .welcome-message { + font-size: 24px; + } + + .method-selector { + flex-direction: row; + flex-wrap: wrap; + } + + .method-option { + flex: 1; + min-width: 140px; + flex-direction: column; + text-align: center; + padding: 12px; + } + + .method-info { + text-align: center; + } + + .method-check { + display: none; + } + } + `, + ]; + + @property({ type: Object }) + accessor config: ILoginConfig = { + allowedMethods: ['pin', 'password', 'qr'], + pinLength: 4, + welcomeMessage: 'Welcome', + subtitle: 'Sign in to continue', + }; + + @state() + accessor selectedMethod: TAuthMethod = 'pin'; + + @state() + accessor pinValue = ''; + + @state() + accessor passwordValue = ''; + + @state() + accessor showPassword = false; + + @state() + accessor error = ''; + + @state() + accessor showError = false; + + public render(): TemplateResult { + const effectivePinLength = this.config.pinLength || 4; + + return html` + + `; + } + + private getAuthTitle(): string { + switch (this.selectedMethod) { + case 'pin': + return 'Enter your PIN'; + case 'password': + return 'Enter your password'; + case 'qr': + return 'Scan to sign in'; + default: + return 'Sign in'; + } + } + + private renderMethodSelector(): TemplateResult { + const methods: Array<{ id: TAuthMethod; icon: string; name: string; description: string }> = [ + { id: 'pin', icon: 'lucide:keySquare', name: 'PIN Code', description: 'Quick numeric access' }, + { id: 'password', icon: 'lucide:key', name: 'Password', description: 'Traditional password' }, + { id: 'qr', icon: 'lucide:qrCode', name: 'QR Code', description: 'Scan with mobile app' }, + ]; + + const availableMethods = methods.filter((m) => this.config.allowedMethods.includes(m.id)); + + return html` +
    + Sign in method + ${availableMethods.map((method) => html` +
    this.selectMethod(method.id)} + > +
    + +
    +
    +
    ${method.name}
    +
    ${method.description}
    +
    +
    + ${this.selectedMethod === method.id + ? html`` + : '' + } +
    +
    + `)} +
    + `; + } + + private renderPinInput(length: number): TemplateResult { + return html` +
    + ${Array.from({ length }, (_, i) => html` +
    + `)} +
    + +
    + ${[1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => html` + + `)} + + + +
    + `; + } + + private renderPasswordInput(): TemplateResult { + return html` +
    +
    + + +
    + +
    + `; + } + + private renderQrCode(): TemplateResult { + return html` +
    +
    + ${this.config.qrCodeData + ? html`Login QR Code` + : html`
    QR Code
    ` + } +
    +

    + Open your authenticator app and scan this code to sign in securely without typing a password. +

    +
    + `; + } + + private selectMethod(method: TAuthMethod): void { + this.selectedMethod = method; + this.clearError(); + this.pinValue = ''; + this.passwordValue = ''; + } + + private handlePinInput(digit: string): void { + this.clearError(); + const maxLength = this.config.pinLength || 4; + if (this.pinValue.length < maxLength) { + this.pinValue += digit; + this.dispatchKeyPress(digit); + } + } + + private handleBackspace(): void { + this.clearError(); + if (this.pinValue.length > 0) { + this.pinValue = this.pinValue.slice(0, -1); + this.dispatchEvent(new CustomEvent('backspace', { + bubbles: true, + composed: true, + })); + } + } + + private handlePinSubmit(): void { + if (this.pinValue.length === 0) { + this.showErrorMessage('Please enter your PIN'); + return; + } + + this.dispatchLoginAttempt('pin', this.pinValue); + } + + private handlePasswordInput(e: InputEvent): void { + this.clearError(); + const input = e.target as HTMLInputElement; + this.passwordValue = input.value; + } + + private handlePasswordKeydown(e: KeyboardEvent): void { + if (e.key === 'Enter') { + this.handlePasswordSubmit(); + } + } + + private handlePasswordSubmit(): void { + if (this.passwordValue.length === 0) { + this.showErrorMessage('Please enter your password'); + return; + } + + this.dispatchLoginAttempt('password', this.passwordValue); + } + + private togglePasswordVisibility(): void { + this.showPassword = !this.showPassword; + } + + private dispatchKeyPress(key: string): void { + this.dispatchEvent(new CustomEvent('key-press', { + detail: { key }, + bubbles: true, + composed: true, + })); + } + + private dispatchLoginAttempt(method: TAuthMethod, value: string): void { + this.dispatchEvent(new CustomEvent('login-attempt', { + detail: { method, value } as ILoginCredentials, + bubbles: true, + composed: true, + })); + } + + public showErrorMessage(message: string): void { + this.error = message; + this.showError = true; + } + + public clearError(): void { + this.error = ''; + this.showError = false; + } + + public clearInput(): void { + this.pinValue = ''; + this.passwordValue = ''; + } +} diff --git a/ts_web/views/eco-view-login/index.ts b/ts_web/views/eco-view-login/index.ts new file mode 100644 index 0000000..e078d7a --- /dev/null +++ b/ts_web/views/eco-view-login/index.ts @@ -0,0 +1 @@ +export * from './eco-view-login.js'; diff --git a/ts_web/views/eco-view-peripherals/eco-view-peripherals.demo.ts b/ts_web/views/eco-view-peripherals/eco-view-peripherals.demo.ts index 26ae86d..9bd18ed 100644 --- a/ts_web/views/eco-view-peripherals/eco-view-peripherals.demo.ts +++ b/ts_web/views/eco-view-peripherals/eco-view-peripherals.demo.ts @@ -4,18 +4,18 @@ export const demo = () => html`
    - console.log('Device selected:', e.detail)} @scan-start=${() => console.log('Scanning started')} @scan-complete=${() => console.log('Scanning complete')} - > + >
    `; diff --git a/ts_web/views/eco-view-peripherals/eco-view-peripherals.ts b/ts_web/views/eco-view-peripherals/eco-view-peripherals.ts index f70df0c..c5e2884 100644 --- a/ts_web/views/eco-view-peripherals/eco-view-peripherals.ts +++ b/ts_web/views/eco-view-peripherals/eco-view-peripherals.ts @@ -9,8 +9,8 @@ import { state, } from '@design.estate/dees-element'; import { DeesAppuiSecondarymenu, DeesIcon } from '@design.estate/dees-catalog'; -import type { ISecondaryMenuGroup, ISecondaryMenuItem } from '../../interfaces/secondarymenu.js'; -import { demo } from './eco-peripherals.demo.js'; +import type { ISecondaryMenuGroup, ISecondaryMenuItem } from '../../elements/interfaces/secondarymenu.js'; +import { demo } from './eco-view-peripherals.demo.js'; // Ensure components are registered DeesAppuiSecondarymenu; @@ -18,7 +18,7 @@ DeesIcon; declare global { interface HTMLElementTagNameMap { - 'eco-peripherals': EcoPeripherals; + 'eco-view-peripherals': EcoViewPeripherals; } } @@ -47,10 +47,10 @@ export interface IPeripheralDevice { isDefault?: boolean; } -@customElement('eco-peripherals') -export class EcoPeripherals extends DeesElement { +@customElement('eco-view-peripherals') +export class EcoViewPeripherals extends DeesElement { public static demo = demo; - public static demoGroup = 'App Launcher'; + public static demoGroup = 'Views'; public static styles = [ cssManager.defaultStyles, diff --git a/ts_web/views/eco-view-peripherals/index.ts b/ts_web/views/eco-view-peripherals/index.ts index 030b4cb..3c6d074 100644 --- a/ts_web/views/eco-view-peripherals/index.ts +++ b/ts_web/views/eco-view-peripherals/index.ts @@ -1 +1 @@ -export * from './eco-peripherals.js'; +export * from './eco-view-peripherals.js'; diff --git a/ts_web/views/eco-view-saasshare/eco-view-saasshare.demo.ts b/ts_web/views/eco-view-saasshare/eco-view-saasshare.demo.ts new file mode 100644 index 0000000..2f7e663 --- /dev/null +++ b/ts_web/views/eco-view-saasshare/eco-view-saasshare.demo.ts @@ -0,0 +1,20 @@ +import { html } from '@design.estate/dees-element'; + +export const demo = () => html` + +
    + console.log('Request approved:', e.detail)} + @request-denied=${(e: CustomEvent) => console.log('Request denied:', e.detail)} + > +
    +`; diff --git a/ts_web/views/eco-view-saasshare/eco-view-saasshare.ts b/ts_web/views/eco-view-saasshare/eco-view-saasshare.ts new file mode 100644 index 0000000..5b289d3 --- /dev/null +++ b/ts_web/views/eco-view-saasshare/eco-view-saasshare.ts @@ -0,0 +1,1288 @@ +import { + customElement, + DeesElement, + type TemplateResult, + html, + property, + css, + cssManager, + state, +} from '@design.estate/dees-element'; +import { DeesAppuiSecondarymenu, DeesIcon } from '@design.estate/dees-catalog'; +import type { ISecondaryMenuGroup, ISecondaryMenuItem } from '../../elements/interfaces/secondarymenu.js'; +import { demo } from './eco-view-saasshare.demo.js'; + +// Ensure components are registered +DeesAppuiSecondarymenu; +DeesIcon; + +declare global { + interface HTMLElementTagNameMap { + 'eco-view-saasshare': EcoViewSaasshare; + } +} + +export type TSharePanel = + | 'apps' + | 'devices' + | 'permissions' + | 'requests' + | 'activity' + | 'security'; + +export type TPermissionType = + | 'print' + | 'scan' + | 'storage' + | 'camera' + | 'audio' + | 'display' + | 'network'; + +export interface ISaasApp { + id: string; + name: string; + domain: string; + icon?: string; + color?: string; + verified: boolean; + lastAccess?: Date; + permissions: ISaasPermission[]; +} + +export interface ISaasPermission { + type: TPermissionType; + deviceId?: string; + deviceName?: string; + granted: boolean; + grantedAt?: Date; + expiresAt?: Date; +} + +export interface IAccessRequest { + id: string; + appId: string; + appName: string; + appDomain: string; + permissionType: TPermissionType; + deviceId?: string; + deviceName?: string; + requestedAt: Date; + status: 'pending' | 'approved' | 'denied'; +} + +export interface IAccessActivity { + id: string; + appId: string; + appName: string; + permissionType: TPermissionType; + deviceName?: string; + action: string; + timestamp: Date; +} + +@customElement('eco-view-saasshare') +export class EcoViewSaasshare extends DeesElement { + public static demo = demo; + public static demoGroup = 'Views'; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + background: ${cssManager.bdTheme('#f5f5f7', 'hsl(240 6% 10%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + } + + .share-container { + display: flex; + height: 100%; + } + + dees-appui-secondarymenu { + flex-shrink: 0; + background: ${cssManager.bdTheme('#ffffff', 'hsl(240 6% 8%)')}; + border-right: 1px solid ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 15%)')}; + } + + .content { + flex: 1; + overflow-y: auto; + padding: 32px 48px; + } + + .panel-header { + margin-bottom: 32px; + display: flex; + align-items: flex-start; + justify-content: space-between; + } + + .panel-header-left { + flex: 1; + } + + .panel-title { + font-size: 28px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + margin-bottom: 8px; + } + + .panel-description { + font-size: 14px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 60%)')}; + } + + .header-action { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 20px; + background: hsl(217 91% 60%); + color: white; + border: none; + border-radius: 10px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: background 0.15s ease; + } + + .header-action:hover { + background: hsl(217 91% 55%); + } + + .section { + background: ${cssManager.bdTheme('#ffffff', 'hsl(240 6% 12%)')}; + border: 1px solid ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 18%)')}; + border-radius: 12px; + margin-bottom: 24px; + overflow: hidden; + } + + .section-title { + padding: 16px 20px 12px; + font-size: 13px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 50%)')}; + text-transform: uppercase; + letter-spacing: 0.5px; + display: flex; + align-items: center; + justify-content: space-between; + } + + .section-count { + background: ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 20%)')}; + padding: 2px 8px; + border-radius: 10px; + font-size: 12px; + font-weight: 600; + } + + .app-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 15%)')}; + transition: background 0.15s ease; + cursor: pointer; + } + + .app-item:first-child { + border-top: none; + } + + .app-item:hover { + background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(240 5% 14%)')}; + } + + .app-left { + display: flex; + align-items: center; + gap: 14px; + } + + .app-icon { + width: 44px; + height: 44px; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + color: white; + font-size: 20px; + font-weight: 600; + } + + .app-info { + display: flex; + flex-direction: column; + gap: 4px; + } + + .app-name { + display: flex; + align-items: center; + gap: 8px; + font-size: 15px; + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + } + + .verified-badge { + display: flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + background: hsl(142 71% 45% / 0.15); + color: hsl(142 71% 40%); + border-radius: 4px; + font-size: 11px; + font-weight: 600; + } + + .app-domain { + font-size: 13px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + } + + .app-right { + display: flex; + align-items: center; + gap: 16px; + } + + .permission-badges { + display: flex; + gap: 6px; + } + + .permission-badge { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 6px; + background: ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 18%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 60%)')}; + } + + .permission-badge.active { + background: hsl(217 91% 60% / 0.15); + color: hsl(217 91% 55%); + } + + .last-access { + font-size: 12px; + color: ${cssManager.bdTheme('hsl(0 0% 60%)', 'hsl(0 0% 50%)')}; + min-width: 100px; + text-align: right; + } + + .request-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 15%)')}; + background: ${cssManager.bdTheme('hsl(45 100% 97%)', 'hsl(45 30% 12%)')}; + } + + .request-item:first-child { + border-top: none; + } + + .request-info { + display: flex; + flex-direction: column; + gap: 4px; + } + + .request-title { + font-size: 14px; + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + } + + .request-detail { + font-size: 13px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + } + + .request-actions { + display: flex; + gap: 8px; + } + + .btn { + display: flex; + align-items: center; + gap: 6px; + padding: 8px 16px; + border: none; + border-radius: 8px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + transition: all 0.15s ease; + } + + .btn-approve { + background: hsl(142 71% 45%); + color: white; + } + + .btn-approve:hover { + background: hsl(142 71% 40%); + } + + .btn-deny { + background: ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 20%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 70%)')}; + } + + .btn-deny:hover { + background: hsl(0 72% 51%); + color: white; + } + + .device-group { + margin-bottom: 24px; + } + + .device-header { + display: flex; + align-items: center; + gap: 12px; + padding: 16px 20px; + background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(240 5% 14%)')}; + border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 18%)')}; + } + + .device-icon { + width: 36px; + height: 36px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + background: ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 20%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 70%)')}; + } + + .device-info h4 { + margin: 0; + font-size: 15px; + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + } + + .device-info span { + font-size: 13px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + } + + .device-apps { + padding: 0; + } + + .device-app { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 20px 12px 68px; + border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 15%)')}; + } + + .device-app:first-child { + border-top: none; + } + + .device-app-name { + font-size: 14px; + color: ${cssManager.bdTheme('hsl(0 0% 30%)', 'hsl(0 0% 80%)')}; + } + + .toggle-switch { + position: relative; + width: 44px; + height: 24px; + background: ${cssManager.bdTheme('hsl(0 0% 85%)', 'hsl(240 5% 25%)')}; + border-radius: 12px; + cursor: pointer; + transition: background 0.2s ease; + } + + .toggle-switch.active { + background: hsl(217 91% 60%); + } + + .toggle-switch::after { + content: ''; + position: absolute; + top: 2px; + left: 2px; + width: 20px; + height: 20px; + background: white; + border-radius: 50%; + transition: transform 0.2s ease; + box-shadow: ${cssManager.bdTheme('0 1px 3px rgba(0,0,0,0.2)', 'none')}; + } + + .toggle-switch.active::after { + transform: translateX(20px); + } + + .activity-item { + display: flex; + align-items: flex-start; + gap: 14px; + padding: 14px 20px; + border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 15%)')}; + } + + .activity-item:first-child { + border-top: none; + } + + .activity-icon { + width: 32px; + height: 32px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + background: ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 18%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 60%)')}; + flex-shrink: 0; + } + + .activity-content { + flex: 1; + } + + .activity-title { + font-size: 14px; + color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 90%)')}; + margin-bottom: 2px; + } + + .activity-title strong { + font-weight: 600; + } + + .activity-time { + font-size: 12px; + color: ${cssManager.bdTheme('hsl(0 0% 55%)', 'hsl(0 0% 50%)')}; + } + + .settings-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 14px 20px; + border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 15%)')}; + } + + .settings-item:first-child { + border-top: none; + } + + .item-left { + display: flex; + align-items: center; + gap: 14px; + } + + .item-icon { + width: 32px; + height: 32px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + color: white; + } + + .item-icon.blue { background: hsl(217 91% 60%); } + .item-icon.green { background: hsl(142 71% 45%); } + .item-icon.orange { background: hsl(25 95% 53%); } + .item-icon.red { background: hsl(0 72% 51%); } + .item-icon.purple { background: hsl(262 83% 58%); } + .item-icon.gray { background: hsl(220 9% 46%); } + + .item-info { + display: flex; + flex-direction: column; + gap: 2px; + } + + .item-label { + font-size: 15px; + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + } + + .item-sublabel { + font-size: 13px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + } + + .empty-state { + text-align: center; + padding: 48px 20px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + } + + .empty-state dees-icon { + margin-bottom: 16px; + opacity: 0.5; + } + + .empty-state h3 { + margin: 0 0 8px; + font-size: 16px; + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 30%)', 'hsl(0 0% 70%)')}; + } + + .empty-state p { + margin: 0; + font-size: 14px; + } + + .permission-type-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: 14px 20px; + border-top: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 15%)')}; + } + + .permission-type-row:first-child { + border-top: none; + } + + .permission-type-info { + display: flex; + align-items: center; + gap: 14px; + } + + .permission-type-details h4 { + margin: 0; + font-size: 15px; + font-weight: 500; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + } + + .permission-type-details span { + font-size: 13px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + } + + .permission-apps-count { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 12px; + background: ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 18%)')}; + border-radius: 6px; + font-size: 13px; + color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 65%)')}; + cursor: pointer; + transition: background 0.15s ease; + } + + .permission-apps-count:hover { + background: ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 22%)')}; + } + `, + ]; + + @property({ type: String }) + accessor activePanel: TSharePanel = 'apps'; + + @state() + accessor saasApps: ISaasApp[] = [ + { + id: 'google-docs', + name: 'Google Docs', + domain: 'docs.google.com', + color: '#4285F4', + verified: true, + lastAccess: new Date(Date.now() - 1000 * 60 * 5), + permissions: [ + { type: 'print', deviceName: 'HP LaserJet Pro', granted: true }, + { type: 'storage', deviceName: 'Synology NAS', granted: true }, + ], + }, + { + id: 'figma', + name: 'Figma', + domain: 'figma.com', + color: '#F24E1E', + verified: true, + lastAccess: new Date(Date.now() - 1000 * 60 * 30), + permissions: [ + { type: 'display', granted: true }, + ], + }, + { + id: 'zoom', + name: 'Zoom', + domain: 'zoom.us', + color: '#2D8CFF', + verified: true, + lastAccess: new Date(Date.now() - 1000 * 60 * 60 * 2), + permissions: [ + { type: 'camera', deviceName: 'Logitech C920', granted: true }, + { type: 'audio', deviceName: 'Built-in Microphone', granted: true }, + { type: 'display', granted: true }, + ], + }, + { + id: 'notion', + name: 'Notion', + domain: 'notion.so', + color: '#000000', + verified: true, + lastAccess: new Date(Date.now() - 1000 * 60 * 60 * 24), + permissions: [ + { type: 'print', deviceName: 'HP LaserJet Pro', granted: true }, + ], + }, + { + id: 'dropbox', + name: 'Dropbox', + domain: 'dropbox.com', + color: '#0061FF', + verified: true, + lastAccess: new Date(Date.now() - 1000 * 60 * 60 * 48), + permissions: [ + { type: 'storage', deviceName: 'Synology NAS', granted: true }, + { type: 'scan', deviceName: 'Epson Scanner', granted: true }, + ], + }, + ]; + + @state() + accessor accessRequests: IAccessRequest[] = [ + { + id: 'req-1', + appId: 'slack', + appName: 'Slack', + appDomain: 'slack.com', + permissionType: 'camera', + deviceName: 'Logitech C920', + requestedAt: new Date(Date.now() - 1000 * 60 * 10), + status: 'pending', + }, + { + id: 'req-2', + appId: 'canva', + appName: 'Canva', + appDomain: 'canva.com', + permissionType: 'print', + deviceName: 'HP LaserJet Pro', + requestedAt: new Date(Date.now() - 1000 * 60 * 25), + status: 'pending', + }, + ]; + + @state() + accessor activities: IAccessActivity[] = [ + { + id: 'act-1', + appId: 'google-docs', + appName: 'Google Docs', + permissionType: 'print', + deviceName: 'HP LaserJet Pro', + action: 'printed document "Q4 Report.pdf"', + timestamp: new Date(Date.now() - 1000 * 60 * 5), + }, + { + id: 'act-2', + appId: 'zoom', + appName: 'Zoom', + permissionType: 'camera', + deviceName: 'Logitech C920', + action: 'accessed camera for video call', + timestamp: new Date(Date.now() - 1000 * 60 * 60 * 2), + }, + { + id: 'act-3', + appId: 'dropbox', + appName: 'Dropbox', + permissionType: 'scan', + deviceName: 'Epson Scanner', + action: 'scanned 3 pages', + timestamp: new Date(Date.now() - 1000 * 60 * 60 * 5), + }, + { + id: 'act-4', + appId: 'figma', + appName: 'Figma', + permissionType: 'display', + action: 'shared screen to external display', + timestamp: new Date(Date.now() - 1000 * 60 * 60 * 24), + }, + ]; + + @state() + accessor requireApproval = true; + + @state() + accessor autoRevokeInactive = true; + + @state() + accessor activityLogging = true; + + private getMenuGroups(): ISecondaryMenuGroup[] { + const pendingCount = this.accessRequests.filter(r => r.status === 'pending').length; + + return [ + { + name: 'Overview', + iconName: 'lucide:share2', + items: [ + { + key: 'apps', + iconName: 'lucide:layoutGrid', + action: () => this.activePanel = 'apps', + badge: this.saasApps.length.toString(), + }, + { + key: 'requests', + iconName: 'lucide:inbox', + action: () => this.activePanel = 'requests', + badge: pendingCount > 0 ? pendingCount.toString() : undefined, + }, + ], + }, + { + name: 'Browse', + iconName: 'lucide:folder', + items: [ + { + key: 'devices', + iconName: 'lucide:hardDrive', + action: () => this.activePanel = 'devices', + }, + { + key: 'permissions', + iconName: 'lucide:key', + action: () => this.activePanel = 'permissions', + }, + ], + }, + { + name: 'Monitor', + iconName: 'lucide:activity', + items: [ + { + key: 'activity', + iconName: 'lucide:clock', + action: () => this.activePanel = 'activity', + }, + { + key: 'security', + iconName: 'lucide:shield', + action: () => this.activePanel = 'security', + }, + ], + }, + ]; + } + + private getSelectedItem(): ISecondaryMenuItem | null { + for (const group of this.getMenuGroups()) { + for (const item of group.items) { + if ('key' in item && item.key === this.activePanel) { + return item; + } + } + } + return null; + } + + public render(): TemplateResult { + return html` + + `; + } + + private renderActivePanel(): TemplateResult { + switch (this.activePanel) { + case 'apps': + return this.renderAppsPanel(); + case 'devices': + return this.renderDevicesPanel(); + case 'permissions': + return this.renderPermissionsPanel(); + case 'requests': + return this.renderRequestsPanel(); + case 'activity': + return this.renderActivityPanel(); + case 'security': + return this.renderSecurityPanel(); + default: + return this.renderAppsPanel(); + } + } + + private renderAppsPanel(): TemplateResult { + return html` +
    +
    +
    Connected Apps
    +
    Manage SaaS applications with access to your peripherals
    +
    + +
    + + ${this.accessRequests.filter(r => r.status === 'pending').length > 0 ? html` +
    +
    + Pending Requests + ${this.accessRequests.filter(r => r.status === 'pending').length} +
    + ${this.accessRequests.filter(r => r.status === 'pending').map(request => html` +
    +
    +
    + ${request.appName} wants access to ${this.getPermissionLabel(request.permissionType)} +
    +
    + ${request.deviceName ? `Device: ${request.deviceName} • ` : ''} + Requested ${this.formatTimeAgo(request.requestedAt)} +
    +
    +
    + + +
    +
    + `)} +
    + ` : ''} + +
    +
    + All Apps + ${this.saasApps.length} +
    + ${this.saasApps.map(app => html` +
    +
    +
    + ${app.name.charAt(0)} +
    +
    +
    + ${app.name} + ${app.verified ? html` + + + Verified + + ` : ''} +
    +
    ${app.domain}
    +
    +
    +
    +
    + ${this.renderPermissionBadges(app.permissions)} +
    +
    + ${app.lastAccess ? this.formatTimeAgo(app.lastAccess) : 'Never'} +
    + +
    +
    + `)} +
    + `; + } + + private renderDevicesPanel(): TemplateResult { + const devices = [ + { + name: 'HP LaserJet Pro', + type: 'print', + icon: 'lucide:printer', + apps: ['Google Docs', 'Notion'], + }, + { + name: 'Epson Scanner', + type: 'scan', + icon: 'lucide:scan', + apps: ['Dropbox'], + }, + { + name: 'Logitech C920', + type: 'camera', + icon: 'lucide:camera', + apps: ['Zoom'], + }, + { + name: 'Built-in Microphone', + type: 'audio', + icon: 'lucide:mic', + apps: ['Zoom'], + }, + { + name: 'Synology NAS', + type: 'storage', + icon: 'lucide:hardDrive', + apps: ['Google Docs', 'Dropbox'], + }, + { + name: 'External Display', + type: 'display', + icon: 'lucide:monitor', + apps: ['Zoom', 'Figma'], + }, + ]; + + return html` +
    +
    +
    Devices
    +
    View which apps have access to each peripheral
    +
    +
    + + ${devices.map(device => html` +
    +
    +
    + +
    +
    +

    ${device.name}

    + ${device.apps.length} app${device.apps.length !== 1 ? 's' : ''} with access +
    +
    +
    + ${device.apps.map(appName => html` +
    + ${appName} +
    +
    + `)} +
    +
    + `)} + `; + } + + private renderPermissionsPanel(): TemplateResult { + const permissionTypes: { type: TPermissionType; icon: string; label: string; color: string; count: number }[] = [ + { type: 'print', icon: 'lucide:printer', label: 'Printing', color: 'blue', count: 2 }, + { type: 'scan', icon: 'lucide:scan', label: 'Scanning', color: 'purple', count: 1 }, + { type: 'camera', icon: 'lucide:camera', label: 'Camera', color: 'green', count: 1 }, + { type: 'audio', icon: 'lucide:mic', label: 'Microphone', color: 'red', count: 1 }, + { type: 'storage', icon: 'lucide:hardDrive', label: 'Network Storage', color: 'orange', count: 2 }, + { type: 'display', icon: 'lucide:monitor', label: 'Screen Sharing', color: 'gray', count: 2 }, + ]; + + return html` +
    +
    +
    Permissions
    +
    Manage access by permission type
    +
    +
    + +
    + ${permissionTypes.map(perm => html` +
    +
    +
    + +
    +
    +

    ${perm.label}

    + ${perm.count} app${perm.count !== 1 ? 's' : ''} with access +
    +
    +
    + Manage + +
    +
    + `)} +
    + `; + } + + private renderRequestsPanel(): TemplateResult { + const pendingRequests = this.accessRequests.filter(r => r.status === 'pending'); + + return html` +
    +
    +
    Access Requests
    +
    Review and manage permission requests from SaaS applications
    +
    +
    + + ${pendingRequests.length > 0 ? html` +
    +
    + Pending + ${pendingRequests.length} +
    + ${pendingRequests.map(request => html` +
    +
    +
    + ${request.appName} wants access to ${this.getPermissionLabel(request.permissionType)} +
    +
    + ${request.deviceName ? `Device: ${request.deviceName} • ` : ''} + ${request.appDomain} • Requested ${this.formatTimeAgo(request.requestedAt)} +
    +
    +
    + + +
    +
    + `)} +
    + ` : html` +
    +
    + +

    No pending requests

    +

    When SaaS apps request access to your peripherals, they'll appear here

    +
    +
    + `} + `; + } + + private renderActivityPanel(): TemplateResult { + return html` +
    +
    +
    Activity Log
    +
    Recent peripheral access by SaaS applications
    +
    +
    + +
    +
    Recent Activity
    + ${this.activities.map(activity => html` +
    +
    + +
    +
    +
    + ${activity.appName} ${activity.action} +
    +
    ${this.formatTimeAgo(activity.timestamp)}
    +
    +
    + `)} +
    + `; + } + + private renderSecurityPanel(): TemplateResult { + return html` +
    +
    +
    Security Settings
    +
    Configure how SaaS apps can access your peripherals
    +
    +
    + +
    +
    Access Control
    +
    +
    +
    + +
    +
    +
    Require Approval
    +
    Ask before granting new app access
    +
    +
    +
    this.requireApproval = !this.requireApproval} + >
    +
    +
    +
    +
    + +
    +
    +
    Auto-revoke Inactive Apps
    +
    Remove access after 30 days of inactivity
    +
    +
    +
    this.autoRevokeInactive = !this.autoRevokeInactive} + >
    +
    +
    + +
    +
    Logging
    +
    +
    +
    + +
    +
    +
    Activity Logging
    +
    Record all peripheral access events
    +
    +
    +
    this.activityLogging = !this.activityLogging} + >
    +
    +
    + +
    +
    Danger Zone
    +
    +
    +
    + +
    +
    +
    Revoke All Access
    +
    Remove all SaaS app permissions
    +
    +
    + +
    +
    + `; + } + + private renderPermissionBadges(permissions: ISaasPermission[]): TemplateResult[] { + const permissionIcons: Record = { + print: 'lucide:printer', + scan: 'lucide:scan', + storage: 'lucide:hardDrive', + camera: 'lucide:camera', + audio: 'lucide:mic', + display: 'lucide:monitor', + network: 'lucide:wifi', + }; + + return permissions.map(perm => html` +
    + +
    + `); + } + + private getPermissionLabel(type: TPermissionType): string { + const labels: Record = { + print: 'Printing', + scan: 'Scanning', + storage: 'Storage', + camera: 'Camera', + audio: 'Microphone', + display: 'Display', + network: 'Network', + }; + return labels[type]; + } + + private getPermissionIcon(type: TPermissionType): string { + const icons: Record = { + print: 'lucide:printer', + scan: 'lucide:scan', + storage: 'lucide:hardDrive', + camera: 'lucide:camera', + audio: 'lucide:mic', + display: 'lucide:monitor', + network: 'lucide:wifi', + }; + return icons[type]; + } + + private formatTimeAgo(date: Date): string { + const now = new Date(); + const diff = now.getTime() - date.getTime(); + const minutes = Math.floor(diff / 60000); + const hours = Math.floor(diff / 3600000); + const days = Math.floor(diff / 86400000); + + if (minutes < 1) return 'Just now'; + if (minutes < 60) return `${minutes}m ago`; + if (hours < 24) return `${hours}h ago`; + if (days < 7) return `${days}d ago`; + return date.toLocaleDateString(); + } + + private approveRequest(requestId: string): void { + this.accessRequests = this.accessRequests.map(r => + r.id === requestId ? { ...r, status: 'approved' as const } : r + ); + this.dispatchEvent(new CustomEvent('request-approved', { + detail: { requestId }, + bubbles: true, + composed: true, + })); + } + + private denyRequest(requestId: string): void { + this.accessRequests = this.accessRequests.map(r => + r.id === requestId ? { ...r, status: 'denied' as const } : r + ); + this.dispatchEvent(new CustomEvent('request-denied', { + detail: { requestId }, + bubbles: true, + composed: true, + })); + } +} diff --git a/ts_web/views/eco-view-saasshare/index.ts b/ts_web/views/eco-view-saasshare/index.ts new file mode 100644 index 0000000..421a95e --- /dev/null +++ b/ts_web/views/eco-view-saasshare/index.ts @@ -0,0 +1 @@ +export * from './eco-view-saasshare.js'; diff --git a/ts_web/views/eco-view-settings/eco-view-settings.demo.ts b/ts_web/views/eco-view-settings/eco-view-settings.demo.ts index 5acdb55..66f1a11 100644 --- a/ts_web/views/eco-view-settings/eco-view-settings.demo.ts +++ b/ts_web/views/eco-view-settings/eco-view-settings.demo.ts @@ -4,15 +4,15 @@ export const demo = () => html`
    - + >
    `; diff --git a/ts_web/views/eco-view-settings/eco-view-settings.ts b/ts_web/views/eco-view-settings/eco-view-settings.ts index 4cbf7ae..b55bf3f 100644 --- a/ts_web/views/eco-view-settings/eco-view-settings.ts +++ b/ts_web/views/eco-view-settings/eco-view-settings.ts @@ -9,8 +9,8 @@ import { state, } from '@design.estate/dees-element'; import { DeesAppuiSecondarymenu, DeesIcon } from '@design.estate/dees-catalog'; -import type { ISecondaryMenuGroup, ISecondaryMenuItem } from '../../interfaces/secondarymenu.js'; -import { demo } from './eco-settings.demo.js'; +import type { ISecondaryMenuGroup, ISecondaryMenuItem } from '../../elements/interfaces/secondarymenu.js'; +import { demo } from './eco-view-settings.demo.js'; // Ensure components are registered DeesAppuiSecondarymenu; @@ -18,7 +18,7 @@ DeesIcon; declare global { interface HTMLElementTagNameMap { - 'eco-settings': EcoSettings; + 'eco-view-settings': EcoViewSettings; } } @@ -35,10 +35,10 @@ export type TSettingsPanel = | 'updates' | 'about'; -@customElement('eco-settings') -export class EcoSettings extends DeesElement { +@customElement('eco-view-settings') +export class EcoViewSettings extends DeesElement { public static demo = demo; - public static demoGroup = 'App Launcher'; + public static demoGroup = 'Views'; public static styles = [ cssManager.defaultStyles, diff --git a/ts_web/views/eco-view-settings/index.ts b/ts_web/views/eco-view-settings/index.ts index 1b6599f..68b38de 100644 --- a/ts_web/views/eco-view-settings/index.ts +++ b/ts_web/views/eco-view-settings/index.ts @@ -1 +1 @@ -export * from './eco-settings.js'; +export * from './eco-view-settings.js'; diff --git a/ts_web/views/eco-view-system/eco-view-system.demo.ts b/ts_web/views/eco-view-system/eco-view-system.demo.ts new file mode 100644 index 0000000..f93ae36 --- /dev/null +++ b/ts_web/views/eco-view-system/eco-view-system.demo.ts @@ -0,0 +1,18 @@ +import { html } from '@design.estate/dees-element'; + +export const demo = () => html` + +
    + +
    +`; diff --git a/ts_web/views/eco-view-system/eco-view-system.ts b/ts_web/views/eco-view-system/eco-view-system.ts new file mode 100644 index 0000000..ec826f0 --- /dev/null +++ b/ts_web/views/eco-view-system/eco-view-system.ts @@ -0,0 +1,877 @@ +import { + customElement, + DeesElement, + type TemplateResult, + html, + property, + css, + cssManager, + state, +} from '@design.estate/dees-element'; +import { DeesAppuiSecondarymenu, DeesIcon, DeesStatsGrid } from '@design.estate/dees-catalog'; +import type { ISecondaryMenuGroup, ISecondaryMenuItem } from '../../elements/interfaces/secondarymenu.js'; +import { demo } from './eco-view-system.demo.js'; + +// Ensure components are registered +DeesAppuiSecondarymenu; +DeesIcon; +DeesStatsGrid; + +declare global { + interface HTMLElementTagNameMap { + 'eco-view-system': EcoViewSystem; + } +} + +export type TSystemPanel = + | 'overview' + | 'cpu' + | 'memory' + | 'storage' + | 'network' + | 'processes'; + +@customElement('eco-view-system') +export class EcoViewSystem extends DeesElement { + public static demo = demo; + public static demoGroup = 'Views'; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + background: ${cssManager.bdTheme('#f5f5f7', 'hsl(240 6% 10%)')}; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + } + + .system-container { + display: flex; + height: 100%; + } + + dees-appui-secondarymenu { + flex-shrink: 0; + background: ${cssManager.bdTheme('#ffffff', 'hsl(240 6% 8%)')}; + border-right: 1px solid ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 15%)')}; + } + + .content { + flex: 1; + overflow-y: auto; + padding: 32px 48px; + } + + .panel-header { + margin-bottom: 32px; + } + + .panel-title { + font-size: 28px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 10%)', 'hsl(0 0% 98%)')}; + margin-bottom: 8px; + } + + .panel-description { + font-size: 14px; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 60%)')}; + } + + .stats-section { + margin-bottom: 32px; + } + + .section-title { + font-size: 13px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 50%)')}; + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 16px; + } + + dees-statsgrid { + --dees-statsgrid-gap: 16px; + } + + .process-list { + background: ${cssManager.bdTheme('#ffffff', 'hsl(240 6% 12%)')}; + border: 1px solid ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 18%)')}; + border-radius: 12px; + overflow: hidden; + } + + .process-header { + display: grid; + grid-template-columns: 2fr 1fr 1fr 1fr; + padding: 12px 16px; + background: ${cssManager.bdTheme('hsl(0 0% 97%)', 'hsl(240 5% 14%)')}; + border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 90%)', 'hsl(240 5% 18%)')}; + font-size: 12px; + font-weight: 600; + color: ${cssManager.bdTheme('hsl(0 0% 50%)', 'hsl(0 0% 55%)')}; + text-transform: uppercase; + letter-spacing: 0.5px; + } + + .process-row { + display: grid; + grid-template-columns: 2fr 1fr 1fr 1fr; + padding: 12px 16px; + border-bottom: 1px solid ${cssManager.bdTheme('hsl(0 0% 94%)', 'hsl(240 5% 15%)')}; + font-size: 14px; + color: ${cssManager.bdTheme('hsl(0 0% 20%)', 'hsl(0 0% 85%)')}; + } + + .process-row:last-child { + border-bottom: none; + } + + .process-name { + font-weight: 500; + } + + .process-value { + color: ${cssManager.bdTheme('hsl(0 0% 40%)', 'hsl(0 0% 65%)')}; + } + + .process-value.high { + color: hsl(0 84% 60%); + font-weight: 500; + } + `, + ]; + + @property({ type: String }) + accessor activePanel: TSystemPanel = 'overview'; + + // Mock system data + @state() + accessor cpuUsage = 42; + + @state() + accessor memoryUsage = 67; + + @state() + accessor diskUsage = 54; + + @state() + accessor cpuTemp = 58; + + @state() + accessor uptime = '14d 7h 32m'; + + @state() + accessor networkIn = [45, 52, 38, 65, 72, 68, 75, 82, 79, 85, 88, 72]; + + @state() + accessor networkOut = [32, 28, 35, 42, 38, 45, 52, 48, 55, 62, 58, 65]; + + private getMenuGroups(): ISecondaryMenuGroup[] { + return [ + { + name: 'Monitor', + iconName: 'lucide:activity', + items: [ + { + key: 'overview', + iconName: 'lucide:layoutDashboard', + action: () => this.activePanel = 'overview', + }, + ], + }, + { + name: 'Hardware', + iconName: 'lucide:cpu', + items: [ + { + key: 'cpu', + iconName: 'lucide:cpu', + action: () => this.activePanel = 'cpu', + }, + { + key: 'memory', + iconName: 'lucide:memoryStick', + action: () => this.activePanel = 'memory', + }, + { + key: 'storage', + iconName: 'lucide:hardDrive', + action: () => this.activePanel = 'storage', + }, + ], + }, + { + name: 'Network', + iconName: 'lucide:network', + items: [ + { + key: 'network', + iconName: 'lucide:wifi', + action: () => this.activePanel = 'network', + }, + ], + }, + { + name: 'Software', + iconName: 'lucide:layers', + items: [ + { + key: 'processes', + iconName: 'lucide:listTree', + action: () => this.activePanel = 'processes', + }, + ], + }, + ]; + } + + private getSelectedItem(): ISecondaryMenuItem | null { + for (const group of this.getMenuGroups()) { + for (const item of group.items) { + if ('key' in item && item.key === this.activePanel) { + return item; + } + } + } + return null; + } + + public render(): TemplateResult { + return html` +
    + +
    + ${this.renderActivePanel()} +
    +
    + `; + } + + private renderActivePanel(): TemplateResult { + switch (this.activePanel) { + case 'overview': + return this.renderOverviewPanel(); + case 'cpu': + return this.renderCpuPanel(); + case 'memory': + return this.renderMemoryPanel(); + case 'storage': + return this.renderStoragePanel(); + case 'network': + return this.renderNetworkPanel(); + case 'processes': + return this.renderProcessesPanel(); + default: + return this.renderOverviewPanel(); + } + } + + private renderOverviewPanel(): TemplateResult { + const overviewTiles = [ + { + id: 'cpu', + title: 'CPU Usage', + value: this.cpuUsage, + type: 'gauge' as const, + icon: 'lucide:cpu', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 60, color: 'hsl(45 93% 47%)' }, + { value: 80, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'memory', + title: 'Memory Usage', + value: this.memoryUsage, + type: 'gauge' as const, + icon: 'lucide:memoryStick', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 70, color: 'hsl(45 93% 47%)' }, + { value: 85, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'disk', + title: 'Disk Usage', + value: this.diskUsage, + type: 'gauge' as const, + icon: 'lucide:hardDrive', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 75, color: 'hsl(45 93% 47%)' }, + { value: 90, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'temp', + title: 'CPU Temp', + value: this.cpuTemp, + unit: '°C', + type: 'gauge' as const, + icon: 'lucide:thermometer', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(217 91% 60%)' }, + { value: 50, color: 'hsl(142 71% 45%)' }, + { value: 70, color: 'hsl(45 93% 47%)' }, + { value: 85, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'network-in', + title: 'Network In', + value: '85', + unit: 'Mbps', + type: 'trend' as const, + icon: 'lucide:download', + trendData: this.networkIn, + color: 'hsl(142 71% 45%)', + }, + { + id: 'network-out', + title: 'Network Out', + value: '65', + unit: 'Mbps', + type: 'trend' as const, + icon: 'lucide:upload', + trendData: this.networkOut, + color: 'hsl(217 91% 60%)', + }, + { + id: 'uptime', + title: 'System Uptime', + value: this.uptime, + type: 'text' as const, + icon: 'lucide:clock', + color: 'hsl(142 71% 45%)', + description: 'Since last reboot', + }, + { + id: 'processes', + title: 'Processes', + value: 247, + type: 'number' as const, + icon: 'lucide:layers', + description: '12 running, 235 sleeping', + }, + ]; + + return html` +
    +
    System Overview
    +
    Real-time system performance metrics
    +
    + +
    + +
    + `; + } + + private renderCpuPanel(): TemplateResult { + const cpuTiles = [ + { + id: 'cpu-total', + title: 'Total CPU Usage', + value: this.cpuUsage, + type: 'gauge' as const, + icon: 'lucide:cpu', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 60, color: 'hsl(45 93% 47%)' }, + { value: 80, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'core-0', + title: 'Core 0', + value: 38, + type: 'gauge' as const, + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 60, color: 'hsl(45 93% 47%)' }, + { value: 80, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'core-1', + title: 'Core 1', + value: 52, + type: 'gauge' as const, + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 60, color: 'hsl(45 93% 47%)' }, + { value: 80, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'core-2', + title: 'Core 2', + value: 45, + type: 'gauge' as const, + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 60, color: 'hsl(45 93% 47%)' }, + { value: 80, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'core-3', + title: 'Core 3', + value: 33, + type: 'gauge' as const, + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 60, color: 'hsl(45 93% 47%)' }, + { value: 80, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'load-avg', + title: 'Load Average', + value: '2.45', + type: 'trend' as const, + icon: 'lucide:activity', + trendData: [1.8, 2.1, 2.4, 2.2, 2.5, 2.3, 2.6, 2.4, 2.45], + description: '1m: 2.45, 5m: 2.32, 15m: 2.18', + }, + { + id: 'cpu-temp', + title: 'Temperature', + value: this.cpuTemp, + unit: '°C', + type: 'gauge' as const, + icon: 'lucide:thermometer', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(217 91% 60%)' }, + { value: 50, color: 'hsl(142 71% 45%)' }, + { value: 70, color: 'hsl(45 93% 47%)' }, + { value: 85, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'freq', + title: 'Clock Speed', + value: '3.2', + unit: 'GHz', + type: 'number' as const, + icon: 'lucide:gauge', + description: 'Max: 4.2 GHz', + }, + ]; + + return html` +
    +
    CPU
    +
    Processor usage and performance
    +
    + +
    + +
    + `; + } + + private renderMemoryPanel(): TemplateResult { + const memoryTiles = [ + { + id: 'ram-usage', + title: 'RAM Usage', + value: this.memoryUsage, + type: 'gauge' as const, + icon: 'lucide:memoryStick', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 70, color: 'hsl(45 93% 47%)' }, + { value: 85, color: 'hsl(0 84% 60%)' }, + ], + }, + description: '10.7 GB of 16 GB', + }, + { + id: 'swap-usage', + title: 'Swap Usage', + value: 12, + type: 'gauge' as const, + icon: 'lucide:hardDrive', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 50, color: 'hsl(45 93% 47%)' }, + { value: 75, color: 'hsl(0 84% 60%)' }, + ], + }, + description: '0.5 GB of 4 GB', + }, + { + id: 'mem-trend', + title: 'Memory History', + value: '67%', + type: 'trend' as const, + icon: 'lucide:trendingUp', + trendData: [58, 62, 65, 63, 68, 72, 70, 65, 67], + description: 'Last hour', + }, + { + id: 'cached', + title: 'Cached', + value: '3.2', + unit: 'GB', + type: 'number' as const, + icon: 'lucide:database', + color: 'hsl(217 91% 60%)', + }, + { + id: 'buffers', + title: 'Buffers', + value: '512', + unit: 'MB', + type: 'number' as const, + icon: 'lucide:layers', + color: 'hsl(262 83% 58%)', + }, + { + id: 'available', + title: 'Available', + value: '5.3', + unit: 'GB', + type: 'number' as const, + icon: 'lucide:checkCircle', + color: 'hsl(142 71% 45%)', + }, + ]; + + return html` +
    +
    Memory
    +
    RAM and swap usage details
    +
    + +
    + +
    + `; + } + + private renderStoragePanel(): TemplateResult { + const storageTiles = [ + { + id: 'disk-main', + title: 'System Drive', + value: this.diskUsage, + type: 'percentage' as const, + icon: 'lucide:hardDrive', + description: '275 GB of 512 GB used', + color: 'hsl(217 91% 60%)', + }, + { + id: 'disk-data', + title: 'Data Drive', + value: 38, + type: 'percentage' as const, + icon: 'lucide:hardDrive', + description: '380 GB of 1 TB used', + color: 'hsl(142 71% 45%)', + }, + { + id: 'read-speed', + title: 'Read Speed', + value: '245', + unit: 'MB/s', + type: 'trend' as const, + icon: 'lucide:download', + trendData: [180, 220, 195, 280, 245, 210, 265, 230, 245], + color: 'hsl(142 71% 45%)', + }, + { + id: 'write-speed', + title: 'Write Speed', + value: '128', + unit: 'MB/s', + type: 'trend' as const, + icon: 'lucide:upload', + trendData: [95, 110, 85, 145, 120, 105, 138, 115, 128], + color: 'hsl(217 91% 60%)', + }, + { + id: 'iops-read', + title: 'Read IOPS', + value: '12.4k', + type: 'number' as const, + icon: 'lucide:gauge', + description: 'Operations/sec', + }, + { + id: 'iops-write', + title: 'Write IOPS', + value: '8.2k', + type: 'number' as const, + icon: 'lucide:gauge', + description: 'Operations/sec', + }, + ]; + + return html` +
    +
    Storage
    +
    Disk usage and I/O performance
    +
    + +
    + +
    + `; + } + + private renderNetworkPanel(): TemplateResult { + const networkTiles = [ + { + id: 'download', + title: 'Download', + value: '85.2', + unit: 'Mbps', + type: 'trend' as const, + icon: 'lucide:download', + trendData: this.networkIn, + color: 'hsl(142 71% 45%)', + }, + { + id: 'upload', + title: 'Upload', + value: '64.8', + unit: 'Mbps', + type: 'trend' as const, + icon: 'lucide:upload', + trendData: this.networkOut, + color: 'hsl(217 91% 60%)', + }, + { + id: 'latency', + title: 'Latency', + value: 12, + unit: 'ms', + type: 'gauge' as const, + icon: 'lucide:activity', + gaugeOptions: { + min: 0, + max: 100, + thresholds: [ + { value: 0, color: 'hsl(142 71% 45%)' }, + { value: 30, color: 'hsl(45 93% 47%)' }, + { value: 60, color: 'hsl(0 84% 60%)' }, + ], + }, + }, + { + id: 'packets-in', + title: 'Packets In', + value: '1.2M', + type: 'number' as const, + icon: 'lucide:arrowDownCircle', + description: 'Per second', + }, + { + id: 'packets-out', + title: 'Packets Out', + value: '892k', + type: 'number' as const, + icon: 'lucide:arrowUpCircle', + description: 'Per second', + }, + { + id: 'connections', + title: 'Active Connections', + value: 48, + type: 'number' as const, + icon: 'lucide:link', + description: '12 established, 36 waiting', + }, + { + id: 'total-down', + title: 'Total Downloaded', + value: '24.5', + unit: 'GB', + type: 'number' as const, + icon: 'lucide:database', + description: 'This session', + color: 'hsl(142 71% 45%)', + }, + { + id: 'total-up', + title: 'Total Uploaded', + value: '8.2', + unit: 'GB', + type: 'number' as const, + icon: 'lucide:database', + description: 'This session', + color: 'hsl(217 91% 60%)', + }, + ]; + + return html` +
    +
    Network
    +
    Network traffic and connectivity
    +
    + +
    + +
    + `; + } + + private renderProcessesPanel(): TemplateResult { + const processTiles = [ + { + id: 'total-processes', + title: 'Total Processes', + value: 247, + type: 'number' as const, + icon: 'lucide:layers', + }, + { + id: 'running', + title: 'Running', + value: 12, + type: 'number' as const, + icon: 'lucide:play', + color: 'hsl(142 71% 45%)', + }, + { + id: 'sleeping', + title: 'Sleeping', + value: 235, + type: 'number' as const, + icon: 'lucide:moon', + color: 'hsl(217 91% 60%)', + }, + { + id: 'threads', + title: 'Threads', + value: 1842, + type: 'number' as const, + icon: 'lucide:gitBranch', + }, + ]; + + const topProcesses = [ + { name: 'node', pid: 1234, cpu: 12.5, memory: 8.2 }, + { name: 'chrome', pid: 2345, cpu: 8.3, memory: 15.4 }, + { name: 'code', pid: 3456, cpu: 5.2, memory: 12.1 }, + { name: 'docker', pid: 4567, cpu: 4.8, memory: 6.8 }, + { name: 'postgres', pid: 5678, cpu: 3.2, memory: 4.5 }, + { name: 'nginx', pid: 6789, cpu: 1.5, memory: 2.1 }, + { name: 'redis', pid: 7890, cpu: 0.8, memory: 1.8 }, + ]; + + return html` +
    +
    Processes
    +
    Running processes and resource usage
    +
    + +
    + +
    + +
    +
    Top Processes by CPU
    +
    +
    + Process + PID + CPU % + Memory % +
    + ${topProcesses.map(proc => html` +
    + ${proc.name} + ${proc.pid} + ${proc.cpu}% + ${proc.memory}% +
    + `)} +
    +
    + `; + } +} diff --git a/ts_web/views/eco-view-system/index.ts b/ts_web/views/eco-view-system/index.ts new file mode 100644 index 0000000..99a6c25 --- /dev/null +++ b/ts_web/views/eco-view-system/index.ts @@ -0,0 +1 @@ +export * from './eco-view-system.js'; diff --git a/ts_web/views/index.ts b/ts_web/views/index.ts new file mode 100644 index 0000000..ddbb266 --- /dev/null +++ b/ts_web/views/index.ts @@ -0,0 +1,6 @@ +export * from './eco-view-settings/index.js'; +export * from './eco-view-peripherals/index.js'; +export * from './eco-view-saasshare/index.js'; +export * from './eco-view-system/index.js'; +export * from './eco-view-home/index.js'; +export * from './eco-view-login/index.js';