From d112cefa24fb3a39a30bda279085c8e6b3f8db83 Mon Sep 17 00:00:00 2001 From: Ziad Saab Date: Mon, 9 Sep 2024 11:05:35 -0500 Subject: [PATCH 01/16] Document color and alignment props of --- snaps/features/custom-ui/with-jsx.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/snaps/features/custom-ui/with-jsx.md b/snaps/features/custom-ui/with-jsx.md index 432f84313a..3ed289980a 100644 --- a/snaps/features/custom-ui/with-jsx.md +++ b/snaps/features/custom-ui/with-jsx.md @@ -689,7 +689,13 @@ await snap.request({ ### `Text` -Outputs text. +Outputs text. + +#### Props + +- `color`: `'default' | 'alternative' | 'muted' | 'error' | 'success' | 'warning'` - (Optional) The color of the text. +- `alignment`: `'start' | 'center' | 'end'` - (Optional) The alignment of the text. + #### Example From 053070fb19fdc5eed4a8eac251c921afdb63b3dc Mon Sep 17 00:00:00 2001 From: Ziad Saab Date: Mon, 9 Sep 2024 11:27:27 -0500 Subject: [PATCH 02/16] Document Selector component --- snaps/assets/custom-ui-selector.png | Bin 0 -> 32240 bytes snaps/features/custom-ui/with-jsx.md | 37 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 snaps/assets/custom-ui-selector.png diff --git a/snaps/assets/custom-ui-selector.png b/snaps/assets/custom-ui-selector.png new file mode 100644 index 0000000000000000000000000000000000000000..dc6d9a445718380c18c9c87f8f4158cd420d38a9 GIT binary patch literal 32240 zcmdqIgF-5}lY9qzr} z%lq^D4}SBSGv~0+-h1u6*4k^w^AMt>Ao&#I1qK2F!c%D}@wW&F02l%SA{Y$?p0a_% zc#eSZM95N1Oi5Zy45$RQGqlG>1zm784blW-r(^A3Gm7)Xiu9om6XOh{q)>o0d;!}^C_MjN9!3J zcf1aJGwcYt84IDEytya{wOO9ha;3s1x^LP2e?5i$4gy#i4y~?+Xelc%A|$ll?yt^1 z^@Uv)V6qqaMBa^O^$@NcAb_%f3d`#U;8#Lu2>PA4vWJMkUe}|%3uB@{{CBd3zSt~r zi%*b?V-{Z{&oNYogc*s=U?6D4_r;qcWI7Wah6D6bekpDHPe^wVh9W3gfOcY2_>-~h z={vZ7NIWT%%Sb-;SLm95Jrel3b|(B)p=MYE^wCGRC6c}4I}Xyj`js^)R4>ie{7-b~ zA<;!dYrE>FE38E70W}(N1kcdR2s&PV^sE)^pygC~fm2c{`P9wLI*B9maT#s~F*Zus zs}7N@)Zhw&hC=)`v6ce-8d@~J4p8^3Jpam4DWunCPIuv;8!}VU zKmN$lSwJ@Lj!&gUdCTN|K(c)Zw#ut2T5M`@P$5d0iN3RS(y+Ol5jDT@4+-*!=uSIC z`*0B6PRWmMjA1GfHkqs8nTFOA;}rIQR5Yr&j0_^eEEv{U?{e>QkX0-5WAVas5mJ%4 zn%}M8e&=f%nM7f5$1$CWW}ARa3n-#sP7XX0;Y`l z2Z=0CainQYCA8a*QV55EYZrZz$e9R-20@x{wh@L`vyl&pCKu>BYJpEyTJGLnF#d#A zBmG8VZ}V|oZ|n6xSZkptzB{`HUZoj{Q0w+cp$fA9LS+hpbRZa`u?4>iBVG`yAtb}p z5!Otzr`}_$iQGT^nDY^{jiSv-lxFdi(kOZ*hql{KA@}8%{x?%mwJk-N-x&6yJj9%G z!?%}ES`b|z-kLQm$2%BWRqVD}>d%EO?`)8Tb)SAE?F{jI8>oCu%OyOdTA|`V`Zjv? zviq9WSf03-+vDAe#of-!@}VHFiJ^oE(H#V50{)P+?nvXOz7S562u)&VxxgUjaomf& z7smt?Q8dI`Xm^Wtzk7Sxlh;+Ze=Q%sVM}01qV|w@bZUCw7{W@yk53{ufhH>Y4vqAuq#U+v z2bsM@QZN=y@J9+ZDV&&4Qy{r`XutRxg_#s@Ip$>eFW?ol9VWdZFbtWIAR`xqS*_rP ze$LP3djC=TGlepBuW0)Z9!J0@h=R!DpT>^pbtpv=E}u^}q>stnNq5B!GH;%@sIuzy z<2ke>Jtq$9h$(ZF^Bd@rDZ?myQPBQr!Ko?K$+&SsGBtR_9%T=~990}PJ=!!{5L(V+#ga?wz7@**SeZ~6_Dil#bc@^zSOArW z4Xyye>{{Z?IyZ0oV zVSG__f!dOS@{N*S*;!e}-wjHI+;(G|8|rre_Bm3 zcTU|)Ec<8SJMT(UZ6O=11{Apc1|ox|}tqXeeO)9m=47VqD^FsA36 zwVtxQoa~=soGXM`M@@P;SlTdqHd%oiH0RLf1Y=KJT zhB>jug*IVB!(l~}{hcBkyO>JcUbdcbV^jDWS z5tLvx-%jeDGoRDlADBxMdXk}q2M81tB{4~(+~tkAW!D&OhF|ER-q4i3;w{0%<#;q%qGL}1)^3OQM6Y^ulmGn!Qngt z3Qu!behE6Nzq3kuuW3C|S1P&aycqNQTiM3Mk1~d?xv^HB){iGCDLSa|RW6CO7 zk>a@7*;x$P8C~I_$wUrZ31s|q&K5iMJa;u;?Om2_mcAY^p>Ltnp>v||<37Ua!{zUe zAmO%}>7?|hGhFYn;fYh>HoetXSfgq*oo9GXw|v6yScjrx^#txr_0Uv zhxY5g(y386r)QwFG8wztf$i*0KH?4G^#J$O=G6wh(ay3~-ZowC8KHIw-tDAX8l+2C zQJ3G0{U}|v`pOOW@Ws*h#URg=UlNyL$3_rE5wq5yJaiQ-xsg=rPh(uOwwGC(Lm2)T zJ}Ho)g@Jd;mV6F#{XrF)6y8Wg zPKi#3u$Ol@*RnPt+96+7)&M2Q#Dq(a10GKkM(9^M|EzxNy&1rsQyyB*66O}ha?Q6j z&e@E~C~Yv@^vh;5(5%BO%ZxkWig{kSSW92?*0pm2|Ac{vK~|$lkJEDW0wXarq9Cu} zYXSfG#}Z3jt1{=wDVA;aalMk`k{J~<&F{HeH}1EW48+%5zieJlX;vMKP%nPdN%7|% z*U(YZuzqDrH*x4_)izeq%;r-tX|8lkGyZGm^-OIgK~enJ>5j~# zlbcJ+UKd|b-GGPVS==tN$5)Sxec4$T6Q7COgh&04oKTst)Jd~m(icf?<&2+knsPaE zQFA(zU<%F*uZ%iw1TRPLO3Fv6la26J9rK*H9vnc{+SYDymv9?tI243zlYfEFe$}Xq zYiH|BD+Z+rxlnKP=T#I|46HW{kqYj+-Tp>i3kVFeCET9YoyNS`yS)1BTzz^eyO;Qa z#Y5M2>-mWNb?AP4tj43_^xCdk=L7eSlStwNZrfS8+DW%CpMopr!Ceg(j6KgL{xh;g z{Y|fkD}1acFIDf1uDa6|ss~N59+6cEhI%=kvF#s((YPr#IpPa{6)bW!KP>zLT zQE6y(eL2IW5xe<(M&~eREkljPMxX4uZ@;9f$=*w^gt7!hpT#@-&iqOzv6|^d`37rl zwdv}*>Dd1^i1cOh%OP)>>*JlHUo2l(teU30Z7vB;cjrKRExt(%i@n0gteQWM9TD{H zP<<1S5J=O9a+mSfh22E(EYx`ccjyd*!G}vIAku5^sJ#FKZf?YhdVI3x%qDjX1m)KV zO9BXd?#D``0tG!o@#Uf)*L~%m8H|8OTAJxXIo7f4?`9q)=RZELy(9eQ>}mV+klPi$ zp$Ik8ls1=_N1%s4qah$6zCb{RKOw>|Aw=STpCu4!5gz@O4nRN%vP3}oCyxUBe*b~O zulq88-yg*UBA~+m!hv6|nSejJ0kF(Rf1VM+@OKCzDq_;o@Vkl$*v!n<;hmkMdwBo- z3-k|CS`G*Z1XTAIqV!wJ-|+g!ELAlfHRa{_Ozdo!jZE!~&6r(nKHO(V5OC##KiZf% z8UbBxtZg0mTm{Mh%E1SJzE5T$2mY1C(Mph9Q(g%uW(PI{axt?qvyuy80D(XOu&FuU zTXBhhio^dBB!B1V_<@gw#l^*i*@c7I4s5}~#>>mg!phFV&dvnS!Q|j(>uBW4Wa~ij zcO`%75jS%%0b71>w6wDY-q&knZ0F=CNKSq)=-{7;gt!#~}EcaY`&4GSAH zE6cxi!;1>sr}8OTx|&&QiCfyhbq1Fq#KFxf@K^r-&zt`wJ}9aAUrBB@_J<`Oy!pQ+ z)f~*gVsL(ACjgH+%vbN#YI$I5qHv1lkhsn0Sk2J0wpN-3&sB35p z9rqvi5AJ!N2v}?IsOg=YvK|d2W2|EEIbKUPWWH%^cum2^6>pB!@cvGU%&BV|pMnwu z_~)y1h#nUUzTgN>s(V{31?;9IH+fI3GK|-mjAQDB14R7iD-{8n3toK^aHtL;iOrA5 zOa4U`Fke@QzU*`8TYHDj`sPo4hB&l|pA9*t`_3Ho(N>=%@dIkb)^He(2-w{Rzlz|g zY?vS87@GZ4D{VZIjDIP!b6IMj(x5JoFq?-Ny)CJ&TD8f*Ug@6(LN$ z2IYW+u{?v4MslxGHTH3Lo}fb!{`&fg0bd3G3$KIfgvs}Y`rlqkWY!=%3B1e(4Z`O!!DuPff7e6ngarPI zbM#!d7<)yWR!1BRhUj8+*oXY`rz#(DyB1E?qxf4MBnAZ3=;e?gnA`)~2d^08!zNE( ztQU3lPe*p1HwVZ^|E(bebkiVE6~5)C#zE)ma{9QZEMQ|u>YIK0st)_PcS8-EQlCn| z>i^Vp$)aDHjK-ACOf0eHRF>v5S5htxE~5__DNw*Uk2RY+*Sx z?|{+h$tm}4>h-?Sl$gnzf6Bp#Aev^DJB^V=F7^dlHec+yNUNm=^FfiaB;8;1zDs7k z;jk9q26J$`{LE#Q`Qz|V4nSGYLLpCVN#2{Bd}H%b}^x-CPO&e=NW zvkpF)#QftxQklQ7VVY}~QeS4Zbwky+<#pw|sABr?@f?HozOEMWD2P4pengY5UOE0O z``_MEmd1mo-i}iwsXw;Q)8-7V+eK|BAKw_oAC9 z{t6^Vw!K#sg8%d_I07Um%3O7;Ni5SGOE=yx_Bl0ADpC!&p2njf@;s-6Xr#o_OOU3o z|6n)9DQNXyxt7>cS^?keu?*smZIj*>Jr4kr$eWSJnBc;pGH4HLbQA}70eDsHN!E4*&lf_$V?-9Po}5%sHfygQ*4RIK_eGKsLJVHxULQ)F zENP<8@T!{R%ajWM=abiJB7>87Y@K>KhrdYUG62nE{`3PLKjIVs73Kpmn;c}-n9R7* zsVb1vkh2Nu$VJY*nY>ulV%*VPB@HYrD@zxT2N8%kghSgO5fMfYIZ#VSJeHCppR-O6W2{cak>ShZY1O&;O*t zZGlGh;fmB{#WDYl0up%QSEvFh#!6h^Q!%5`Khg2;@x3;bLbKeZSn4M=9-9gaBhdop zYzt!IcJsX2Z~ck&8ykB&+noAOG=!_#m)y5qytuB;YKLYoAY`QwV};c|yp`*nl0k9J zHJH;@|6yCDfN?EiCf&VRZ^Fd-Mh++~D4`<PTRA z`|!wcZ$msR6ht(X2l{|~LHh6kHmX-5{XQ{LN0C!|kJ_*0*JSl|@k-=}EbRHwmFNnjz|2ZgJeV|M)ksv8xIW@F`E|QHMV?}Bx zQQ~1eI_To~FxDY)${=^B3O-CZM?IHD4pJ!f``?fR_bBWD5Iuls_bYwOsIF-NNI{Jx z`w<>2v*q7;|K97E0Fwl;4Q_ETBY;=U{t2g`{nAJ4GL!m;(!N4LSEtBy^#LOXH-^c7K{2^!Jk6~~6|8aBcIBL_R)mjP;&nx(_@#-SNBSa+tW zGJ*$FHo&O-ce;W576PIokRsY|OTHD4$$}cn*|^P>a2%x$0r1i>y?AKMcSvwYeMgQT zy(3=+`+D{~?F$G6`G4$^i{uF)ihrxrNS8$5cCVvP96VD=;TU+ZpQS%TA80!h3Ze!O zF^S{%6r;j55KjEuoltAB)mRQf5*bGIPz@pgM97oa+VRm`}@}q2?%{wzWWC5eL*}Q zXCqN=KR#ChqDry(KjpT^00f#=(Lb0SJv*)bkJ;} zXH);#76BcP0n&gAd&NP$17+;0J9{3#AySoX!u)W=r1>&KjiQ<0D`TwkH%C(*k-A}Q z$Y37kgokFMq)`GRgOTjR7f1Y4uitdT!~Hc8?i^%)Gq&ioz7m}6gT@y%n5xXfe zxYieBljsb1>3tr3yf>opdv~4yh%v~wEmyl(M+Szy3Yw5J?#Tv4B2y5DgtYW)vB+Ne zVM4~3t!A|)p0MBnAfo0_P&!V_l}A_tp=)E93g!0Fb8gyX0FmICtg#QqssgKCdq6Fu z`5O^37~vU*6tEe6=4X9WxZ6AH6@@v6Gri$rn-th--t)J>9MQ0(s6A!bUmXr_s>2uVsk}S)wSlo(uwa zX+=CDMZ4lX4|?exr=lRJ1}r@J-9Mt(D@~K0Yr&=fpb7<%v~fjp9U^`*0A@@6?b>B| z-eM?ODaybgkTDnf3NeHx-BYG`&pqP1&dJtjJgLis@|SK3Gr3CW@&t_!skSH>=#*gCsez#6qYp$e9C~a z@;b9j#uTuLwgQV7fg;HOA&wty`J4`kg)SLn^#=Yr^KNLt$I7YE&aX1jGx;FjAf+11|ouOc^>Zwu7rD?%G?y96#4 zgZ5{yKezA2eYYCFu>O=jBCcKeZg175de_;~ZNBVgE(R+BR=?j!!=OATWm%Olc+?_bO#C}!6yXPu{$)n<<2VTqol`7pG^Iw#FJrh=F|fzxWN z_c2S;hVD38`gGZ#(4^BA$#SI@#qX)Ms(?PB>mN22tG#OAGr_aVDejn?T7WW?enFne@8fi;F4`mt&EsEgXcZOWk^5Ve|t^0wHk4Ovn-nSQo050U+Y3ULj z+k{3^<&^j5dsq9jyGy0#EQ}=1n)pQQuBET}z8ker;zO?2Gkogm?T)vFfj=U9eS zx_5`G2F!4%I}9Hm*e?%M!?sJBKj)(qPh8(d^4rFmkQ(K;eGXEKy}Q}>p(omW!8OlW z2+j(KoABNbA5n~jZx+tfN_Np^#@Fx$f~xF0Uw_J1E5IPgniM@+TkmNcjHIgHZ>lfi zu_UW`@D6%<`q`E589O)NJM`JA5uB3V{UW(hlD4pijiUQ_jUpkLoVvS)ZG!3jijS zf5cMD%l!}}fX|spNDI=$&g**SRf%2tC5e15*POP=*4@n-{h+Xhi=)-vg1TPrc~4y9 z#i6bxPDbMqe|gv>CI$q16MPX5Q8_!VIzDHUe96Qja96lfvmEJOMV#^4Ep+C`Q5VQt zv+IUJ5=|V_PhKEkROLb$nY{_&xZ%JY(jv<#{tTu()$xkWVZDi-|D)@5`;_bc&DmF# zb!JGXjnU~N)Z;`3=KUoGOx!Rb3R!?bXji10(xAZ6lj_$R0AB0v$FhX8{w`fY$C;^~ z!_rMlj@{uBbNUTR`KozKR`3Z@DgZ=|n3~HN@3E3?Q}4VhA5=Cn0B$P2RM82GJ3P@s z!R=*qhLCi6gcA|s!CHgbNN}XY5rjuG9Kr44)V4&CbG?Xg6@2q6re%FITLTm8(A})i_nY}o!55hY7l|Fp9f&s z5*>;&Y3^{i2?qFsp2lM$528wS_|mb^@Rbzg8pOc~06B6o6@vmQRI_v#Tv+86P|Cxf zm}8j1lUL0P18!iY01SN*`1*DvV?o*+2$4gZ_{ch? zLbLLUtb4BK9gTsX9x&U*TkD_E6vLhks#-FlMqiShqq$~ow<9suY_KDeMj{5WX zk{-Eln%S&;A79I7+z-t-VBmLPCS=rocS0>nX*hT!bhWcQ7D5g^II6SJMqYCsb8#lr zThZ10v>Q5EjuP(edFrp@I=PkXwsE!;U?+2ftEg}xD}sl`-eESoyqz;swPleC zATrUb*ixBvp0-gtLN7^UX%}MjwkQyYQM);Iz!zh6cg-aGh>QBAls@_^Q-1&&!=zV7ZA-)2yQUpj< zK24xU5A@|Q-E+&bc5ADcep8P|;W^9tYr11{8eG^!V%65-Xk#5cyXg z7X^V$JhdG?CziwC&nV1(LqF>$hk|lvowu3Z)`HC-L2kXj@(>UFZJJm|m*DHeIN`g? zk)o-BaT~~+s3aDTvZ`%V0&L?c(Q;P91>iOZ1is=bDN*IE4E0=NynVs?4%*^j8K{bM z2yONMQsxkTJ|0Qid^$z8M-HlJq&N^;$fV6Upp*U**1f%0rQ=Z>cGq;d zb!U1GiymWPyF8MnB(Q7Rl(6)ka~t$)*j#LXWq{-zKGn~p zGOkS7#KCg;S{u`iG#BmWj{>jFD^us$PYlHSn>geFT+zBOI@!`I8KBS5c|P6{-Qv;n zd`{)8F16k^Ff%>@>Nu8^lqZ%xw;gRxmo`LwjA0t_G@BAi2AOnNt2v5p7br0=&_qCa z7RYM6;S&D#*&+TU^Ne4P5wrQs*3x0p%$+ka-X^qt16ATefnClb zrP>s5krk%HOYW6kBJ8T}VBWlw5`)L}baTpf97b9_zcz+N?9fNRgyfK*cE0a($Do#v z()>;Yde*S$Zq~(s{zcvwK(ukaG@daPs-8Db`NfC;eiT3-`STUV3T0G4Cna_og21H1=j+ip)bt+pQTR*l(H%Mf1XQ+29KzpsHKvc&NE?y~5sXDX_l_Ehgh%~&UwM)OE}3jX-WmUJTj13PRuKSIVhc<2_0kT4mzh51gv(sOd&*wVw;)kApuWp}f0{2tjbYybXMui?PA+f4;sv=rD%;)5`M+H$nnBY zDG{$l_l3MxTiLMisjF@~_vl^KpHM=X5miXUuqom$-?%^jqPBg>aYOeDeI@fN2-XN1 z)9p|7Cvhc%FQBB5K4{OO4vOGb`M(0jDcVlJ=zT|r*0>bazYyDTw&~YYm^W>Fi$Pye zCBP3nF&YVU^2c*(Nc9pH3RY9>q4Rd~Bdzpq#KL0A|WYtee_YCxEbjY;6{ zo!3QeHB@o5lOSU4GYuXr6tiR#yEMc^4k9L{nlRXSm>0P&B9Q}dAJ14+Y!!kpD7DQ2 zy#5#68&8qTPmbJ-p)wcp1FAXvsJ7MKzF6nQrKdj0+#%z&!j zlWPNe(sr7L0ltkPWu%0n?2zjnhaqGFtwowG)(#&cm|tLd~qeS-Fm!~&(7%G@%e>&i*b{am3nPSD{C1V8@h5HYQLpW=VWw; zK+g|T0&3`Zq4uUn#D>lEx227+W9uOd6`4}d$dd`0>%5$dQ?u>qihu|$x1^I$JQ&~8 zE)FW}HwcntJ(Vvzm4zuF;h2)xJ$SIr15-Ce9I03YB+cp5U9Wm{-4C}H!?g~QyqCGz zGqLMqyxmOI4GV3)n(a*0JVzS#z8~c`KrM!m<+Ud53>6mjqBy9O0zB?6VM^a)_(wmpO(hA=aH~2#CIo8-JS7iTl(%OdhC1(tg^i z_2fGdo&u>)uZ?(L7V2bVd@ZFR1%l#>4wDHZ%-<`!l_LtDS1)a`jk5610+g&AxAG3* zn+m?}edgl!4C);B zcHCeFu8VIrH&Rc{A19qEf7e!XI~g4pCECyzuY^#N%bsG^|0j_r%ncWAAC(7{%n#1@__j+bSJiO4ifU~yfpH6Ti6OSok*gCiiEx* zMjC$Bu=%S;Vt)BOM;WL~FZ7!-UT0;!Ra<&h;Fr_fEZNbr?Swal4Sz1!J0(5Vt@%p*WD z+N|8xn&CUTS#o?xc;F*)-hHI<&xv$U6?efONl1lZpRx>>Y7yj}dZ$tz=yHWdNQ)3G&_r_*xg_xOXCG1zif*a5K-6gV zAS9e;Ekgq;IfCYC952+d>H!NimU4uw?c)YMyXgd{9kBsd6e+9bFC3)pl>)qJB~>BU zSNqM6BU8KRe3b!6BmP)3`?no-QznGL#A&Wc;(x z?ps;O>7zlC)yC7A5yr#ep3@NpHDI<;|7LTO#gJ4!J?i}OWczEg1LG0#Ao>TcXCbv6 zi9Gd|hWZQyc+?n*!bjoZL>yyV$lWAAt?rZ;!1ri*R)r)}$P^7X*G ziwE6Y<_jU-B9#_lX4<53O6XqQ5RR18@ki4rQi3)LMubUYTw;T7TFQIrZv!Lv>BTFM(?d1feE8#$sbo(hFz8K(xv2f5*? zPCvjTYBc&iu0p$wL<{Y^Wbj=cB0zMFVLQwC496L8V1W)3M386`N;YwK=;N2K@9uGK zkR=cV(S4Cl-VFj=C<1}dpR2xN6MwIXaG$#}lC5Oka)QGt-9;cIt_1z?+JO)pSzkbH zhY+80Dv}Hy#P}I3AsN^CU7(TD-3#7?l@)2+T^o+XzYwU*j%S%5X8WjcQfdf}bf!)H zX%9))V9hld{H(tdl8W#+19kF8BccgQJL~J?5)<t-ikV1{O-+Q5 z(*vSA=?JLqkb9r~2X%pp(Zz9L8)`q*ZQrmJRo7-18|4}ucfztjV`SJ57#$!$G@24n zvQ3=gVcq4Tna60RVQ0^=qU$x|;uG1srT-%e9ANu`B+%qiq@d4e!NjF&bvE^#yN@vh z(5)sj+c=KN2`EYs$6*=e@+H1R$mNo8&mPu{h9naX;#w)?cuhe=DGec6R0H8Yc#jwb zfM47a)2ajV0`LpjdyL}%vzfl+C*??=Oi|9a^|IXm#gUEL(v|I|yVB!R93 zO#F#DWb_bioPZ}z*RnqBU}iWD?PtJ6#=o!2m`F z?_BEA+Q7r&hiP!HY!ZHT8ubt_&w+Q&AvA^ie~P=n6?Sp^aYFc^q*Qn;8lFsbgAlzlft#={NrN(0}0+9r)VTrlB0X+UsVo z)4|9+k{_8~vb5TU#7@8I$0egZ3oFbyJlS69i9MlQe&|AQE);0G$_6(fTPZ|$&&`)QK3wG>zGU5K5f3UKEYlNPrei`@;r+*a3AQg%!lH zY4nQ6eUf^1p#kru2+Qb)oWD;_9v;`Z!)sIsw14Q8rbus}!MG5u`zmHRfYA78W^=W4 zH%^=WO3RWQ8imwc8X}qpER%c0Y^vHWqg0pWb!Tbvn2nn5q+RnN_)warhilqe#T}(P`Y$#H+p`4^tG(7(x4mS^MiX*KVTX;TPF@_G znKgi!!YD^qjnU7{iV^Sh@U+{uMAh1t_^KSZf>B$5fP((8u|h3|^ICMHeXr95e|lB4*O&K))w|hI z2ZvVU#Z)B&$-7^Vc-b#o*@koMnn8qg&_`1D%O@x`#1R>6-(2l|v6^^zGCp6EJ!jNS z`sH#lC`TG7oF9KWRB@e|I;-Eo1a(p_JQFAfNl@u6Y(;$R#GO=3VtrMpo!ob~mSXqi zP2XeF)qFL&s7C$9y2F)a4pTU)u25_H3qyX;l6t@KuE}cdtE>f)zz5&&Tks7Mv2x9*m2=A0BO`fTrmD`4}9u-#VN+E7IUBy}|s4-fC-+$*`AKs6~-MF@!mQ_w|Poh~!n!~FImBVMG@ zCsx&ozaK563L*iQ7V6cj3thU_3LL_Cw8|axhE97Km=h6i{K=Fulu<%*?P!T+vL^D| zIGW7**5__szTj7`cDccYmzd71RY~L5_oMBieGY0$ z>d4^Y^FyILT==?3f)LluGdqrk_}iS2AS|FV-R)GX_Byn{bECAT$g94}_{!YB^AW{< zy+PotTVl!J(U1_u$#%vEoI>P6HYt4XgKA{hL6seqgX5JG96XRPKmJGy@@F5ea_Yz4nUgltP||cMBXs?nf;)0|Oo6{B zn%JPxJfZy1)>kjoeASoc!@pOPy-Zg^CppG5 z%-5_nTK&D*`^H_X&N|t1$94Q{+DLDE70H+H&t3l#9)r zjFsG}@3TV?nRt3Ph2#ig?p`<=Kg)+pBcGsQPFPGc=`!!N+VrfwvC4VUi4e}jdc;CX z<#*+C*h6zzRv|W$z@($g;ub++1#7<3o4vYbpT3y2e=^`1YxRA(-SfQrPDbp7D4_Wx8G-rpP}t4V})Z*h#U*^TtX_V-erR@7fey$ zKKKNQ{TVD|PG^5(RBcrWK%Rz+~UJdNr4%;s$ zBHTVyGBCd+I?Fw-JK<`ac%f*fz+T1dHDSL4r;UwI5psQauqD`A40(F+& zis!=Ko_G~+ZTu~9T;?50xVv2D^>_9hcFZV47_}=kKUE9NR}7z#!HZhN0T0i^H-|TV z1s1>Ino~-5J*2Cx+vY@fSJM2*T|+~b!Q4&iQ8=W22mOt&iSy2+=W4%JA4S&w9RV_! z_QgG+*c1dL1Wb+zQbE`I-PE+JEv+~X4i}!L-%h9|vpZ=Q0*LgN)d#sU-XwZ#5K?1BF7H)zY}_5wAI`q|UMvmol59r~WunuD(#o~06G!)lR`(^4hSN*0b5}!FPf9Z3rj9H*Q+t-#dT`?rE z`mG&_y=sH^_T2r@Uxn~&EXQSm_?q92DdzqZt5|X=!Yx49vhn7WKb`a&IF}B;=BJiL zIvpuLUd`DrRv@#Bv{HLWORQM?Tn# z1w6uv^VqM|p%N<*EUs@o(ceayfaH~P6fKX$Gc<1c=3fsQiG39l@rZZKq1YlbRr9@V zR|(Gxuxq?Y;CE7rU*x-r*8-IA3GA319LZTIe_G1JFx5MzUe28EqK4X!s3LK~#~qx& zbA&XT_msF!f5a4Ph*7wB4t-GCgLu~ZW}P_&)RltS(7%O@0P*q~B3`XsPe1$Ac$v@e z6%HrpzlhEaJ8qlnV8hR{tT^(Vd*oT){B3)5j%;wFkEziX-!)n7M~)p((e9;XL#x6k z*11`A%uV?eu3Cq>XOg}!g_BGyj1^JmYxwRHn*~t?4*X!!bop^VPQ&e$@YxR|hoU~+ zVX>L6w6DIqJ{dRALv(|qgMLhJp0UQ;^!sDg*n8TVEV{s1pn4YmDS0*szR=ke7xDOQ*2$}a(xRRSbC(SJnrt$T{$qA}Q zbNCLwUU2hvugjkw9u3T;q};xO$b=Cxqgnf#-o{ng-)K+5{|ltSgE9=x-=pXN!_S!< z(N<)D^B-=U_JoejU&7Bs8TT9U)6EJ=Yk#*r7N7~REE!J5FzpZWz7C;Lb2x1E*oWQI zTfeFyrSDYjVyF&3Yra`MWY(Lhq=T~E?0qH7IFoNz!k4%Ee!;7pAT)#*JM0{x1KiHi zw7}N_X1`@eOfA%HWA&i{-J3M4R)-@9;`AZ6|HaQ<-5!HMGWVV5x9;5rct+}>m#-x7qtJut)s7zU>= z3<0AJzkvv9_ivTi4Gp7doCXd z*rwp`Ct~Dyuvdmj^6-`EGx#{jDaR_molBGg(zus&C)g6|JBHZhrw9QX)}y=){i|fLSpje)6fTY?$vh&ii4EtNYh?WRhbchORj^J;dbBL3=Bl0fj9#@QpnNugkri^)${}D?`E z`OWeY-NL-NrHkYf*Qg?lmXYDAT zf{rI;-|JJ@T;btOGSfcGKPg$!6&iL1UAP zQck^-7n&X=KUKC=Z7xMoRk7bZ0e8Nsj^~MR`(OqVcw$l*=J{9zu&4T?L5ztsUD?E07^74yPW-yYMJ1-+%|#exN{#m2{H<|k!8zXo;pD9E-B3aRkXpY-ap z?E&<;g&!5u?lDNHB{`F6ch$i5ebLKFo{~D}aq1R#slb?80lU5B#v;tnxpNle-?t4l z0MGAv?#6!Kw8;>3P`&L!SY9uP$G=ymo-hwMgdJ%(08F1GA@ztq(mHbkvDbQ2r zW@MtkQvDJ&g#)g|s2Qc|hn4yDAs2rkAaYPOT8@T23~~7J0$4c>QN;;9VtD>NQ%dqW z(LB&tZ51Z~Ift#7_K^IZ)lii%ilulKl=kJ0uuJ~7Z1!DLV1B~;=3@Ezr0lf&U0N!x zpwxOD=f^is_j)BnCfZY$&|_4?cjIP`@=Gl`79Oidp2?u|ynz#qb#kJhiWyam6N5q~PC4*z8A(B-dz6Oc?z}WExo3f(RN$X8JUGUp(|*TucIT zVRKQ+WC#XV`f)+R*qEZ%R^1^+FE*=}XXdA(x)ga^b$SH%Zwm}i>4B1b6)O2vK%(1h z=l#KT|7ODuF($Qzzkknx_%0bt^74VuVL z#z68rEd!n|d47+A-~Pi!`EqJKH?9RO9urU$eL(=9BWe3-vB_gEZMAunZof$_-k1XV zGO+eY3*00WBrSS^Suf1hFC-}6#!W*l*qciR6Smn63fOyP)mWK`pBL{B&IiSJ9oBvDntY4`YXYdFPxLsymbpQ}cN zS&tcdmuX)OfC7^8%L1h=5GRc%t_w8f0DS>Ikt<%Kn1SCR&?UW;y3R0ij#%{!*-m0r zaaP3y&b@*4p$Tb~^-=Y!J*nq^eo*In`D<+`Z*lrmw#|=TwgZ6Z>pI1J3^{d-`#Z&) z-1eUV*{R6p4&xM8yq&iRdXeYuRV~fV{Ol;$vVX3bX>5viw6fUMql4PRz9!t&g{b*r z(rYi%E!k~xCh?ik+DM_5(!%5npXZ1D2Iqier&j9qwu!x^r68di6=L?IWT$$E=2uL68&?Y*p(|z<#&C!&{%};h7M1wKE2L@c>G-xi-lgFPNN$~G zF1XE?x^NFF98lwaukFi+v`II7&ksfhOw)plPw3}qKW_OS8Ow%KF}f_(u4dVZ4EB`! zowUUpIL>CB;^%hmbn56wL0r#M|J=zElU^~M|=eTwEWsg9y6tVk)-ir`~90&i*`)hXF8Of24e#{ik-$B zYtRgSpp z^$l;npn|9;mo4~3Bu6|`Z>zJSd9k22hpO#93CiGv+C4$+zn(^LL<=xhDCCEt0Ck-l zc;$1*f?Gq0%?Sc-V1d=1V-d7zVb#mzap1r=tjwe6hV3p~{9%_>DQVBzV8T18^oaSz z5WXw13348RuorS?jdROeSP|%FtrwWr)PWnl_V)}g`NVqNrZ{=L_pMK3=M!24)FXNIp_tgQ$5~ne&qDSrS)Nm>amul{wR53ZustxYmRn{1jc!1>VvrKjM zBtWzQh$)a?Y_7>PoSlTNZ>EcEB7g()?U$RcQos$6(9N90cYypi{(ePyuA5j;?^C>9 zy8m4OZa@SMfT-MHW4d-}K=B6r^K^Za%U_aRz5fk37B(0`91yB-?b1FG1e{&5wN3Sx zAb&jrd=q#Jtn^nz*DlooOSg&^5e>d3$N!1;f2;Pt{ri7=?f(ZS^u4dCU+KSK=(%PQzyvSAoN&Vo*@!;jeW?flXbWPW4)|In^QK_Eg#k2%Fvb7d!dw{( zpsQUI0GMykBQpLl;s0xV0wCXsA>agW{8`#-*VF+c7#5n`@sEiDZtx-nu)u>p*q7I? zg}%4}H`JWe1e*K*XZXNsYk*I7ptw`iDS9ydDXr5HyGJ<3c9SrQa6B%V&E`nJYeLrZ||*C`@*puwDOQkxlK9Z@Lu5rQLQBfxka+0Oz&b z?VR>{gjcZY@?+9x=ELWLX`l-SI-F#+&?N^1Q(!O9qi5pzUSaa24`}%{Rc!pBnY9+V z^66AqP&cnst&O@}1xav%s>zalh%CFR;Eu&%9IU6S{=V`jDmGP7Opbj?J5xRTP72b& z-Xi3xkC zam1r!ols~#B}cQS&9iAB3t#$^m36Oz4n%^ z$}R!2Tr|wjsZBm?k74ZrV~=o{!+O9i{M{B+yQz-St6rViJCv3EdoTe!1R=ewx8uRu zm~_F)5K3eju&pfO@QS6LIDUty1GeERP*V_IbRYn`YKk@-UYtTv-M1EpbWB|KL?veR zY{tt%64C=pBo zZWb6y9?SU%0e95JL7~6bE0qKTyRlssf%7ItMVW*(J)kF-*SZhln!j!Av&jnd<)vCF z;`6?!+wCkT9`ZJJeot_yZM3?n`vVq7id-Jph>~NVm!Y zU7M3_g{%p75^m$XLRIJAjgdvO#F&Sci|3fyDq{*fAmo}Ot~@|aEXEr+?Xl7D*k)3B zOjds=@t~XgwS0M&U3)n_e)@4b;c(oJ>+mAyP@yhrX&jJ9M6YuD)?xiOcH0#(1sxjO z#Yz8+`+=w`DsL0t z8tKAfy-LZQUQrNE0Ms>^aBY59D(r^Q_deV4kB>f_T2HYO>HDzc>@Pe`Nty4(_w_qS zyCQ)}C6=dG-|953K{bAltMcia{AqXuWoO;t{a%8y6k(5Oa%122@;G#wV-LfxWXFxI z*EZ90*u5A3OYn@oTe-U#X-NrrM zH*-JSHrovR(byb-Rd>wk1`|wFrVW+Er}tqA=l1b>=_ua91Id_NH;37E$4beTDF0D*b6V?~AiVm{d$OY=Cx$*LlP+6+j)2C?B72N##`Gr5 z4&t8?l2~JyKwIsEpd=%I3UMl9UIWYKegVL`9In~ z_3il#emGqiTTab;%B#+kQ)u2A{*fL}VzSdDCDqC}qw@%Gv@I!ipT0FQIM$rwxv)9) zz?vfXJ#mEaUibJ)M@sB4a3$1XicG*hNhMUGm=${HV6Z2oVC0WNm zbV@VNZi?Ss*lE_R>^xRz|aAtIgB)gHdlOY2I*i)TRJhgLA*&RlKn_VA9PXT75#75=ekWPD6f~yDDp6I=d*dA9bsPHKVSD{Gi1$h!TFzzfI zw|Y@gqARcVVy>{l>Q-SFEuM%{s@I9ap{NpA;LX>Jla398?EGN|{H;EdZI{>GvEBR= zT@muNn3HiG{Zgymo!!+w5KpEQ`+&7fLQl%1u)|H@MA$7H9r{~uF7aIEaQJCqP*D<9 z>*5pjE9DfZZ`J)bVrGy|1F;j%t;m>9Jp_bCw}y~}BMZ%im*-AGJDHfxJXH;+!7opl zB(8QK1?U12Xrx&BT6yua<5Z?m4HEA3-u1YHOpYp!?!Max+0KkeBI<7dt6#OcsXtt~ zj!QZ1q}nHn*9NHH7mH$!h?fSZ?0#28?!oCU#k9HH*Tau}U&v3Vo91^3|ORe`iSZ8>es!NeARY z{15zzDI(1LD68`JvTAQ{)zS;sb~h~2Be?4FgGG5^zCk#aWyz&4`tF92c{SZs4l=ki z{Uk-?2W1C26XGB#EBY1n%V&0&{QHr%iZi=5nnv^+qP_R0_O~?H5v1pz`0SvVpDXmn%*Aea?+x5@&rBxdW{8EqVBfIu{qvKet8( zyJ-NIjCa#-dJ@)}LdwKBQNCX1yqzw&Db}R2wUw`u5tG`DX*&we)XIwo^dNDtkAiM` zk$c+coTFbYto$$bi*N$m1xrePbDcPAI}{Uk;W ziKt(DOmI|qI@OoehSsb*t*kHhpZ3PK$JF{{n}GAIeK(?m#b~t)jnSO+wuP|$;pEb~ zUKu-6$>69Y8P1-f2O>8JwZNwm)n6`VJhrC3{(4lpiXY;*{5jcd z2J=iFoVGL4&=%42G2^v;Mad)Bq1Zsh%s8FDt--|Z?(YQd&7q-Vuh*X0ezecQlqoSk zepKxat^nl=M?SkD0syXT4}_47WzWK#C_bzP(Gy z^R0$h)SmJ}$A*^6WKH(fhNyZJt=EFOM^{RU$*~g5>(#V5l>;S}^bODsabLSbVDSBW zRMK{~sNy^zYESF3X%W+XUKl!)-ks`iT4?GreN6s(kla=Er4L&sUts}$p(JifVt%sU zCFY)qK-1+#e{r|ROsOL*6!uP`In5CU7hNcj9O&13JUA^IK{I~`tn^9jbB|-PaoTB= zP|048NOJ!4MUquoTxqXRuSgUd;+zok^b{bveB|lbSQu+4_BRn)-YA^{25}7!$s51X ze)3(fbndr;f7$p9^U#6U5}YIO78aDk^;H4Wk&_bgVV9P6;b{UhYRBP`P+vC}g4}N# z_UE@i_vv<1l>DJ07fRa0=W^N{e=|=?9dKYDi?@$ll8K6@$!pYYy zmP&Q|`qjK8@&I;3Nha(oxrO8HkBXzgOnXeJ-R{olpGxnhSu(v#xFO&Pl>c2RT$j<3 z%~QM)Z^mQ%hkDQPbPt~~Hh5M%IQFC72=5m|mjM$)8Xy;Es3^;(2LfebVFege=9roB zCyuXZzCXR9^M#u-LR=Yc>F~mqyVM&$tVy)M0wNpu#uD#t%PH|;#4ZLk#%t{K*ZCSC zFw;q08&q{UYkaW@(msjz{G7J7>{*6fRnxYT)EAJDLoW|%6FQ!d57BO`di=YpAn(EB zwmBJ*pcf4ncCBAoW7=bwUd*@LT`|iH~iNss# zNoM{rQMUKem8uk1trXat{qIkHW~4LNwsPX_bZw?_M4pN4%yLVEb~?I+M9A(u6q zwbCjQ=e!AFcn3Ta-2x8~1xCX^U={=2#yYYCR$-3nSS6fVRy@`7m?`rjs5gd z;!DQJ;QJ@Hp~#=X7X)Kwt<}b)Fo`_WURR*n>$}d_3x-YXBzn`*Ps-FdZ+>2{9*2O# zj+_v}Nq?HjQ}q^vBRIG z*ZC?q{s`Wlbm>)0aI`ZS%9Cc|7V^KCfV!@`+4WRFTWIcba8V3?kc|8}c={{S&0~j? zau&_FAlP@{Ga=-{)AgDuHp#`Ouy;^w4fr{kFMa@ zek8Btm?s|Cc`uQsav+9=2S<$Cb^RKVg~W!AG@fAz3$zt>Git8Qp>Tnjg~f9GMy&ix zU{35^IC3>N&&TIAdX~lvQ`glaX?Yu}W@3$Ho?ps3APiqjkkd87w6JLFPvWpc-Qtu!uM?-L*l{IS z>$paW$rpCXl{J#3V5CI#CuPyKmv1;OJE35YL$4eJFfn`C zWCf%gcWGQdSaraDSQ1^jp5buY4ci~`u2i=J;PAP579aQ1*|F>?E}o>4>JcQLNPd;a zEe!qxoKmNWoO}q9mfKc!;ya<&0sH~rpp`)X1hXR^>@b7cSDxuwMSWhJ4o-mW5e;pw5Y zi#M?aPJ>~RD8Kh9SYteeyD51cySNa1Y2uJOf+lq+RiCv8i}A8mXf)4K=h>?f(I#Nz zjmCIde(f;}d}C62TW^U=pvv6YD55ytO%1Cz%<2y?Z{5%a-X)FJHL@y$rj(0y9pZMf2# zAnQaSl26|hV^cgEalCcSc9XxYzId4Jwy~mwH7PsoZC9|u?VQmXKBTz$ZO-x6S=FX~ z$4U81YHd^gbIAhfYCNa@Nu!BFvE|Z{y3_r3-QZD)%dcwiTI-!x9yrSLft!3%6Bi3H zhO}W-=|j?t?o#_&%Z{xV)(n>yrp*oWeR6v^eG6ZFVX^;4vt6Om zj<^__yzP^ES~T0&WPY2udZD5Efj`mb&xj=0IdrH~t;Tzx(*$jclQs3o)kId(V6!x# z1Iu2)p%Jz7lxNyNVYW*ipQw$30;J;lY8s^~Hd_bc)hqG4*=w99m>e)vE{HEtV%hTc zpas@ffAFleEf7DSc<~c+vY&YdH)yN@R#F^ice(lYcvI@EYS)<>L?9m&0DC=dEFz}E zalulIr?dXYcNVQRBgfsikyCl#zldshr?0CQ0|S!Z0zuy8i>x^%?>^((Wd&|ds$`s+ zU^_7Zyvi}XsN(`$EnA=Sn-npuwpe<5c}I1%a;h4<%dmmp8j7y>Wk z!AOZ0_BxsBMm}z7Kz?~a&>!VFN-J9IkZg{okHD?4t8v`TG~T;sVOeY{x#WG`60~`6 zEZ9M@`L$QVtU#YHQQy5$s1Z21@f+Ci5DzcNcgv4{LEMTe<-EGYDynlz$6+m4Y^+J*cjM9b z`PIReqaFOP`tec$YWM!BB*`CXk$B@@M+=p(#u{$G)TShDP9#ZNSnfvCJpeT`J_RaK zRsNH=HkX$IZHJ=*R>U~1jf2|@qnp1p1zGvNoHj)193&WxPf;G)4WQ3~v6jv%!YN(dgn|aTI|Y6i~cW z|BKsIs1SyUIgKr6Hr+zEAnz41-C&uO_$Y|`Js^=vP&mb)xvGDsQezJYk0Wh3szZY$ z=JG57i`S~)f7x`%{c0g6e3rQ-@}wH5kR{r(Z*(4eX@4oUOhnki^UuFDJS=s1vKJrG zGj7Mml)!Zx&vE`(cB#Z`{pT>#Q)-5Q#4>BUtaf9m62Eh`En zxaj(&JRlSEV=Xj~xVWMy^N)Mde>W*Key`x;MM2L4lrGRXIotgqtuwH_h&{_56Mz)y z5iQ&!7xHylfb@_5=VJr`gE}sI-K}@wvrzPt@#VjQ|Z~_&@g@~+(0ZH!} zlQrKBDV>PEXG6jx8KcS5$>hT3-WBda%quR;o5}}p3@VhX{*A;!EPEdT1HwSa1>%Yl z_xGQbIz(qD;m1TZi1zM&(R$?Nf@4woQiCBRMd8^8!B>6l!1mHwNEK4}d2$ z>%4>SAS%*aaYa$s3q+e#hJk-!!fik~Hd3U;4e7-3cXJE#45pAU?JZAy3jw&z^|Yh zL63+7QC@?VsIXoDU#2g``C~W|0&d;0di&sCSV+weo8&PfLpCbzbr#@wAHwrVfLQ5Y zASqN5sDj<^7`*xK6)@rv$dV2b=dK%@L`U}h*xWq-YQ%!Z&JwHdCdx7i|CVBx z1XB)fT*J?B=@7W^{0H}me}3CB1B9WJy8hp<1VALx!|a_8BO#I0zGVi|EnFo7u>ab4 z{LBAo?MgNodNp47gq+O>!(=xdKLkiilrTEYcioEX}F-(J%RBny_K7AE9N zOUo7bEyeY4XRVjyK=g%I%w0HD9NY0VNn#=5psJEN-E~PY`)&Sz6%C{v%xXxGUb`Jh z5;nB`^1&SV-~GnI3St8`R8Yp!JzLX!LW>_i?|;G0?aHJ>Jix(RTLAT|!Qk&dm>)1o zgYBe9;CaW5NR~yyHnV;CYYYi&dbMGY9;KM=U``P-=GqG1fa79SyQB5#I9R?cJZ@XF zh-Kjh3FU|={B^!E-Prz0WLb9>iQ2Ij(jA$BAo!pC00!c5IF;i5LpW7Xn(MVScuB981=2HH2)(fkiq8`z zTrk9{x+bA1vAjMw8Qb*_!96#IgrDUp4@7!i-vXMyBCg*A3>w2KA*_&G{Q8Z85_=)% zciVLsHw!D*5Nx+z`aB?G0H;(EONdQ!SMqQBb)_X1_*1z3JTM6%nQ= zcV{ew0WlO)`F!`!ufQyK^tds-&_8PV%ep>lHOztq7vsI~V@gLwNm(jq}m0tI&Thbps1Z zl*sRv8(w#LF^UEJ;DWZ?V>tw$iy=tQ0SH8&m{Wy(E53eb@P~jNlVmp7oV_`g@WS2Nwj`!CNR!3;Snku#b88B$FWuUFbT zgaqrl1!uWQZR~tm>HKA6ua2MwqJ4Lcs2$+O#{qz%_zZvae`gz#{)kYm?r6*^t$AS1 za88%KUF5C3XqX~H8nlCTpxVvOJRU$B{dj9-1%B0gNAR4wlA6yLJ3~py1qe>9lvM4u%cF zgv%P!^PDkbRwBY45kkE_Ch~eUCBPh+PN4fUTps!5nmNs-yGhy#uyvyWfc^KtNlvu6 zhF&|ig_}HmI}kLys(imn{h#$n|3uhlMrz&~8NmU~KVoApjow|q!@qs=5 z{GTwp%mmBtM5WnHobwkau}f%3*r4|~3dKj0Wn&D=?OD4G%GwMLCfu)3*nifA#R!y3 zm#v!2q+#sEIGj_AtmK{><;XTiJSdTpaip_UK9@X=5SZ3|B;feu0cKp$ecF=zY655$ z5HH0!zEPvjytXYER3Qg*SCq?6u7+4uiDMZu4&x_#z>j*Q!A@ACJIo2&*7WG4Di9@O zIV83feY<16VSD=eXW^yYqi_Ew5;zfJ*=$r)zVPziL22Kv83+6C0)gL+54kimN%g0X z2+O#ByVF?)`hM>ygW4);K{FlyHc}8R0v4G{t@jOMYfmyc-p6(?#Tc^>y5EN9%ibe3 zeIKtw+lZ8MAlDb~DlGffME^r9c;+vor=|pYk6ZBSL_fS5cTwH?*xupEATl1Gq)p$3 zuJJn{=_C7sW-|#q$`;ydDiJ1N(e!1@5VW^2H~QeG!A}U!S0R@UXi=A=;xBO{8u@2+ z10dr#4`+4dMdpg4^Dd;;pDs$@E)iDC@qAL|%ZcrLWIdvO-yeN)O(9t?etu{cJPSi< zCrZ2@HcRMbLkz*Co|}JJYyuyl<_nk|ePI4V|2d5;*`H(~&PQYwbx+f9f3%v2I|CsH zYy7BEZffR6kQ?{vzotE17wc^9X@Pf4$@(Ezr1u#=6xYJ-F&_M3@B;}%(H_J4ivf3C zpKJcenP~f7W7#O?ltKkPwGGSuXKvtzSZ`%a3%HMs zxn!x4s?LMtuQPH0Z>B~1wj|Mwtd#RK3ZPB=!{af5tPJJyKN$$R^#VUClsc6w+na!PI66ZE?5g$s6 zRJ|(e|EVh`}K%b3vK@SK(1Je6`nsulx+>@!1B`K#joIwlT_8JwSgYrL6jn^=kqkBvG z&+B|8%E?~|vu#K`{%EgAhcqW`yJP(l^pv%xW$Wd*PBt>0$iw%4u2ho|E+u26bz+oM z9b;=pA1O-~^**09)?tzCDO84^obEuwG z9Il0frxxyTZvMo~>NR8il1WVozP7BkQJrT9ro5rWs-0Kjh=N_SG9)-82A{|8=jLvH z1ePu%_MI*3@vF=0j^yKGHLbV2IbvF?otL-71sPj%L-Ja$e%(&txr$7Il

+### `Selector` + +Outputs a selector component for use in [interactive UI](interactive-ui.md). + +#### Props + +- `name`: `string` - The name that will be used as a key to the event sent to + [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. +- `title`: `string` - The title of the selector, displayed when the selector is opened. +- `children`: `SelectorOption[]` - One or more `SelectorOption` components, each with a `Card` child (see example). + +#### Example + +```js +import { Selector, SelectorOption, Card } from "@metamask/snaps-sdk/jsx"; + +const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( + + + + + + + + + ), + }, +}); +``` + +

+Selector UI example +

+ ### `Spinner` Outputs a loading indicator. From 6ff8c5f102f7fd91d9ed4c2e6867f47c1fe74b4d Mon Sep 17 00:00:00 2001 From: Ziad Saab Date: Mon, 9 Sep 2024 11:37:26 -0500 Subject: [PATCH 03/16] Document Snaps RadioGroup component --- snaps/assets/custom-ui-radio-group.png | Bin 0 -> 19063 bytes snaps/features/custom-ui/with-jsx.md | 42 +++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 snaps/assets/custom-ui-radio-group.png diff --git a/snaps/assets/custom-ui-radio-group.png b/snaps/assets/custom-ui-radio-group.png new file mode 100644 index 0000000000000000000000000000000000000000..0004c04f5380b4f836d5ce11d749e94586f1c0cc GIT binary patch literal 19063 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 Ki6XK0UjGYPprpY7 literal 0 HcmV?d00001 diff --git a/snaps/features/custom-ui/with-jsx.md b/snaps/features/custom-ui/with-jsx.md index d3dd947a44..e411c0ceb5 100644 --- a/snaps/features/custom-ui/with-jsx.md +++ b/snaps/features/custom-ui/with-jsx.md @@ -359,13 +359,13 @@ await snap.request({ ### `Field` -Outputs a form field, wrapping a [`Dropdown`](#dropdown) or [`Input`](#input) to give it a label and optional error. +Outputs a form field, wrapping a [`Dropdown`](#dropdown), [`Input`](#input), [`Selector`](#selector), or [`RadioGroup`](#radiogroup) to give it a label and optional error. #### Props - `label`: `string` - The label for the wrapped element. -- `error`: `string` - Any error for the wrapped element. Setting this changes the styling of the wrapped element to show that there is an error. -- `children` - The [`Dropdown`](#dropdown) or [`Input`](#input) element to be wrapped. +- `error`: `string` - (Optional) Any error for the wrapped element. Setting this changes the styling of the wrapped element to show that there is an error. +- `children` - The input element to be wrapped. #### Example @@ -621,6 +621,42 @@ module.exports.onHomePage = async () => { Links UI example

+### `RadioGroup` + +Outputs a radio group component for use in [interactive UI](interactive-ui.md). + +#### Props + +- `name`: `string` - The name that will be used as a key to the event sent to + [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. +- `children`: `Radio[]` - One or more `Radio` components, each with a `value` and text child (see example). + +#### Example + +```js +import { RadioGroup, Radio } from "@metamask/snaps-sdk/jsx"; + +const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( +
+ + + Option 1 + Option 2 + + +
+ ), + }, +}); +``` + +

+RadioGroup UI example +

+ ### `Row` Outputs a row with a label and value, which can be used for key-value data. From 650932e4babf512631e6b74d4279c9c4936a8c5e Mon Sep 17 00:00:00 2001 From: Ziad Saab Date: Mon, 9 Sep 2024 11:49:46 -0500 Subject: [PATCH 04/16] Document Snaps Tooltip component --- snaps/assets/custom-ui-tooltip.png | Bin 0 -> 18324 bytes snaps/features/custom-ui/with-jsx.md | 39 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 snaps/assets/custom-ui-tooltip.png diff --git a/snaps/assets/custom-ui-tooltip.png b/snaps/assets/custom-ui-tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1e00b1b582947d3818a4016590150dbe4a26d6 GIT binary patch literal 18324 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 b7WHv6=~Ru~ { Text UI example

+### `Tooltip` + +Outputs a tooltip when the wrapped child is hovered over. + +#### Props + +- `content`: - The content of the tooltip. +- `children`: - The child element to wrap. + +#### Example + +```javascript title="index.jsx" +import { Tooltip, Text } from "@metamask/snaps-sdk/jsx"; + +await snap.request({ + method: "snap_dialog", + params: { + type: "alert", + content: ( + + + Tooltip text +
+ } + > + Hello world! + + + ), + }, +}); +``` + +

+Tooltip UI example +

+ ## Emojis Text-based components (such as [`Heading`](#heading) and [`Text`](#text)) accept emojis. From c01424dd4749d1834b479a91c3c4be665cf39885 Mon Sep 17 00:00:00 2001 From: Ziad Saab Date: Mon, 9 Sep 2024 11:49:56 -0500 Subject: [PATCH 05/16] Update onHomePage screenshot --- snaps/assets/home-page.png | Bin 29200 -> 34186 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/snaps/assets/home-page.png b/snaps/assets/home-page.png index 7b07f72d8f35334b325c912cfdc93467be9ca2d8..8aee9f21cc8681090dc070f38b75469afa0bc45b 100644 GIT binary patch literal 34186 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 literal 29200 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 Date: Mon, 9 Sep 2024 12:12:47 -0500 Subject: [PATCH 06/16] Document Snaps Icon component --- snaps/assets/custom-ui-icon.png | Bin 0 -> 18702 bytes snaps/features/custom-ui/with-jsx.md | 35 ++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 snaps/assets/custom-ui-icon.png diff --git a/snaps/assets/custom-ui-icon.png b/snaps/assets/custom-ui-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6dbe6a3d6999a7b211c63fdfc3c91c75c60ca3 GIT binary patch literal 18702 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 YdjG5Gh6RrcaOjS~)78&qol`;+02Ko9uK)l5 literal 0 HcmV?d00001 diff --git a/snaps/features/custom-ui/with-jsx.md b/snaps/features/custom-ui/with-jsx.md index 72a16555a4..ab3e62d110 100644 --- a/snaps/features/custom-ui/with-jsx.md +++ b/snaps/features/custom-ui/with-jsx.md @@ -209,7 +209,7 @@ For use in [interactive UI](interactive-ui.md). #### Props -- `children`: `string` - The text of the button. +- `children`: `string | Image | Icon` - The contents of the button. - `type` - (Optional) The type of button. Possible values are `"button"` or `"submit"`. The default is `"button"`. @@ -465,6 +465,39 @@ module.exports.onHomePage = async () => { Divider UI example

+### `Icon` + +Outputs an icon. + +#### Props + +- `name`: `"confirmation" | "search" | "bold" | "link" | "data" | "menu" | "filter" | "key" | "warning" | "add-square" | "add" | "arrow-2-down" | "arrow-2-left" | "arrow-2-right" | "arrow-2-up" | "arrow-2-up-right" | "arrow-double-left" | "arrow-double-right" | "arrow-down" | "arrow-left" | "arrow-right" | "arrow-up" | "bank-token" | "bank" | "book" | "bookmark" | "bridge" | "calculator" | "card-pos" | "card-token" | "card" | "category" | "chart" | "check-bold" | "check" | "clock" | "close" | "code-circle" | "coin" | "connect" | "copy-success" | "copy" | "customize" | "danger" | "dark" | "diagram" | "document-code" | "drag-drop" | "dragging-animation" | "pinning-animation" | "edit" | "eraser" | "ethereum" | "expand" | "explore" | "export" | "eye-slash" | "eye" | "flag" | "flash-slash" | "flash" | "full-circle" | "gas" | "global-search" | "global" | "graph" | "hardware" | "heart" | "hierarchy" | "home" | "import" | "info" | "light" | "loading" | "lock-circle" | "lock-slash" | "lock" | "login" | "logout" | "message-question" | "messages" | "minus-bold" | "minus-square" | "minus" | "mobile" | "money" | "monitor" | "more-horizontal" | "more-vertical" | "notification-circle" | "notification" | "password-check" | "people" | "pin" | "programming-arrows" | "custody" | "question" | "received" | "refresh" | "save" | "scan-barcode" | "scan-focus" | "scan" | "scroll" | "security-card" | "security-cross" | "security-key" | "security-search" | "security-slash" | "security-tick" | "security-time" | "security-user" | "security" | "send-1" | "send-2" | "setting" | "slash" | "snaps-mobile" | "snaps-plus" | "snaps" | "speedometer" | "star" | "stake" | "student" | "swap-horizontal" | "swap-vertical" | "tag" | "tilde" | "timer" | "trash" | "trend-down" | "trend-up" | "user-circle-add" | "user-circle-link" | "user-circle-remove" | "user-circle" | "user" | "wallet-card" | "wallet-money" | "wallet" | "warning" | "twitter" | "qr-code" | "user-check" | "unpin" | "ban" | "bold" | "circle-x" | "download" | "file" | "flask" | "plug" | "share" | "square" | "tint" | "upload" | "usb" | "wifi" | "plus-minus"` - The name of the icon. +- `color`: `'default' | 'primary' | 'muted'` - (Optional) The color of the icon. +- `size`: `'md' | 'inherit'` - (Optional) The size of the icon. + +#### Example + +```javascript title="index.jsx" +import { Icon } from "@metamask/snaps-sdk/jsx"; + +await snap.request({ + method: "snap_dialog", + params: { + type: "alert", + content: ( + + + Double-check the "to" address before proceeding. + + ), + }, +}); +``` + +

+Icon UI example +

+ ### `Image` Outputs an image. From b16d5184fd045fb6a150b0cc317412bbfcae3aa8 Mon Sep 17 00:00:00 2001 From: Ziad Saab Date: Mon, 9 Sep 2024 13:01:36 -0500 Subject: [PATCH 07/16] Document checkbox component --- snaps/assets/custom-ui-checkbox.png | Bin 0 -> 20151 bytes snaps/assets/custom-ui-heading.png | Bin 32422 -> 34186 bytes snaps/features/custom-ui/with-jsx.md | 33 +++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 snaps/assets/custom-ui-checkbox.png diff --git a/snaps/assets/custom-ui-checkbox.png b/snaps/assets/custom-ui-checkbox.png new file mode 100644 index 0000000000000000000000000000000000000000..ff803115f84264d775de19528b363e973c12ff18 GIT binary patch literal 20151 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 literal 32422 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 diff --git a/snaps/features/custom-ui/with-jsx.md b/snaps/features/custom-ui/with-jsx.md index ab3e62d110..fdb4b46647 100644 --- a/snaps/features/custom-ui/with-jsx.md +++ b/snaps/features/custom-ui/with-jsx.md @@ -250,6 +250,39 @@ await snap.request({ Button UI example

+### `Checkbox` + +Outputs a checkbox for use in [interactive UI](interactive-ui.md). + +#### Props + +- `name`: `string` - The name sent to [`onUserInput`](../../reference/entry-points.md#onuserinput). +- `checked`: `boolean` - (Optional) Whether the checkbox is checked. +- `label`: `string` - (Optional) The label for the checkbox. +- `variant`: `"default" | "toggle"` - (Optional) The variant of the checkbox. + +#### Example + +```js +import { Checkbox } from "@metamask/snaps-sdk/jsx"; + +const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( + + + + + ), + }, +}); +``` + +

+Checkbox UI example +

+ ### `Copyable` Outputs a read-only text field with a copy-to-clipboard shortcut. From 9cb2059b7dd65134f741e1c77dcae52050a5c15d Mon Sep 17 00:00:00 2001 From: Ziad Saab Date: Tue, 24 Sep 2024 11:28:28 -0500 Subject: [PATCH 08/16] Document `context` parameter of interactive UI --- snaps/features/custom-ui/interactive-ui.md | 7 +++++++ snaps/reference/entry-points.md | 1 + snaps/reference/snaps-api.md | 1 + 3 files changed, 9 insertions(+) diff --git a/snaps/features/custom-ui/interactive-ui.md b/snaps/features/custom-ui/interactive-ui.md index 7eb54e057d..6518896802 100644 --- a/snaps/features/custom-ui/interactive-ui.md +++ b/snaps/features/custom-ui/interactive-ui.md @@ -37,6 +37,13 @@ If you need to [update the interface](#update-an-interactive-interface) or [get its state](#get-an-interactive-interfaces-state) at a future time, you should store its ID in the Snap's storage. +### Optionally add context to an interface + +You can optionally add context to an interface by passing a `context` object to the +[`snap_createInterface`](../../reference/snaps-api.md#snap_createinterface) method. +This object is optional and can contain any data you want to pass to the interface. +This context will be passed to [`onUserInput`](../../reference/entry-points.md#onuserinput) when the user interacts with the interface. + ## Update an interactive interface To update an interactive interface that is still active, use the diff --git a/snaps/reference/entry-points.md b/snaps/reference/entry-points.md index d965204d2b..4497adf4b0 100644 --- a/snaps/reference/entry-points.md +++ b/snaps/reference/entry-points.md @@ -654,6 +654,7 @@ To respond to [interactive UI](../features/custom-ui/interactive-ui.md) events, - `name` - The name of the component that fired the event. Optional when the event type is `ButtonClickEvent`. - `value` - When the event type is `FormSubmitEvent`, the values in the form as an object. +- `context` - The context object passed to the interface when calling [`snap_createInterface`](./snaps-api.md#snap_createinterface), or `null`. #### Example diff --git a/snaps/reference/snaps-api.md b/snaps/reference/snaps-api.md index d85837deee..270a43123e 100644 --- a/snaps/reference/snaps-api.md +++ b/snaps/reference/snaps-api.md @@ -860,6 +860,7 @@ Creates an interactive interface for use in [interactive UI](../features/custom- An object containing: - `ui` - The [custom UI](../features/custom-ui/index.md) to create. +- `context` (optional) - A custom context object that will be passed to [`onUserInput`](./entry-points.md#onuserinput) when the user interacts with the interface. #### Returns From 026b5190806e52a0782486b3cbb533fb9e719a25 Mon Sep 17 00:00:00 2001 From: Ziad Saab Date: Tue, 24 Sep 2024 11:59:16 -0500 Subject: [PATCH 09/16] Document FileInput component --- snaps/assets/custom-ui-file-input.png | Bin 0 -> 21734 bytes snaps/features/custom-ui/with-jsx.md | 55 +++++++++++++++++++++++++- snaps/reference/entry-points.md | 2 +- 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 snaps/assets/custom-ui-file-input.png diff --git a/snaps/assets/custom-ui-file-input.png b/snaps/assets/custom-ui-file-input.png new file mode 100644 index 0000000000000000000000000000000000000000..7f69567c54319d9ae611f00bd1c8b725450b82d3 GIT binary patch literal 21734 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

+### `FileInput` + +Outputs a file input component for use in [interactive UI](interactive-ui.md). + +#### Props + +- `name`: `string` - The name that will be sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) + when a user interacts with the form. +- `accept`: `string[]` - (Optional) The file types that the file input field accepts. If not +specified, the file input field accepts all file types. For examples of +valid values, see the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept). +- `compact`: `boolean` - (Optional) Whether the file input field is compact. + +#### Example + +```js +import { FileInput } from "@metamask/snaps-sdk/jsx"; + +export const onHomePage = async () => { + const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( + + File Upload +
+ + + + +
+
+ ), + }, + }); + + return { + id: interfaceId, + } +}; + +export const onUserInput = async ({ id, event }) => { + if (event.type === UserInputEventType.FileUploadEvent && event.file !== null) { + console.log(event.file); + } +}; +``` + +

+File input UI example +

+ ### `Form` Outputs a form for use in [interactive UI](interactive-ui.md). @@ -861,7 +915,6 @@ module.exports.onHomePage = async () => { Text UI example

-<<<<<<< HEAD ### `Tooltip` Outputs a tooltip when the wrapped child is hovered over. diff --git a/snaps/reference/entry-points.md b/snaps/reference/entry-points.md index 4497adf4b0..dfddfa22a0 100644 --- a/snaps/reference/entry-points.md +++ b/snaps/reference/entry-points.md @@ -649,7 +649,7 @@ To respond to [interactive UI](../features/custom-ui/interactive-ui.md) events, - `id` - The ID of the interface being acted on. - `event` - An event object containing: - `type` - The type of the event. - Possible values are `ButtonClickEvent`, `FormSubmitEvent`, or `InputChangeEvent`. + Possible values are `ButtonClickEvent`, `FormSubmitEvent`, `InputChangeEvent`, and `FileInputEvent`. These enums are exported from the `@metamask/snaps-sdk` module. - `name` - The name of the component that fired the event. Optional when the event type is `ButtonClickEvent`. From 0ad5a14083f58e985fe3ee49515b7b81450ec38f Mon Sep 17 00:00:00 2001 From: Alexandra Tran Date: Wed, 25 Sep 2024 11:55:18 -0700 Subject: [PATCH 10/16] minor edits --- snaps/features/custom-ui/interactive-ui.md | 4 +- snaps/features/custom-ui/with-jsx.md | 53 +++++++++++++--------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/snaps/features/custom-ui/interactive-ui.md b/snaps/features/custom-ui/interactive-ui.md index 6518896802..583228b462 100644 --- a/snaps/features/custom-ui/interactive-ui.md +++ b/snaps/features/custom-ui/interactive-ui.md @@ -37,11 +37,11 @@ If you need to [update the interface](#update-an-interactive-interface) or [get its state](#get-an-interactive-interfaces-state) at a future time, you should store its ID in the Snap's storage. -### Optionally add context to an interface +### Add context to an interface You can optionally add context to an interface by passing a `context` object to the [`snap_createInterface`](../../reference/snaps-api.md#snap_createinterface) method. -This object is optional and can contain any data you want to pass to the interface. +This object can contain any data you want to pass to the interface. This context will be passed to [`onUserInput`](../../reference/entry-points.md#onuserinput) when the user interacts with the interface. ## Update an interactive interface diff --git a/snaps/features/custom-ui/with-jsx.md b/snaps/features/custom-ui/with-jsx.md index 571e547544..8ef4d227a6 100644 --- a/snaps/features/custom-ui/with-jsx.md +++ b/snaps/features/custom-ui/with-jsx.md @@ -168,10 +168,10 @@ Outputs a box, which can be used as a container for other components. #### Props - `direction` - (Optional) The direction in which elements flow inside the box. - Possible values are `"horizontal"` or `"vertical"`. + Possible values are `"horizontal"` and `"vertical"`. The default is `"vertical"`. - `alignment` - (Optional) The alignment of the elements inside the box. - Possible values are `"start"`, `"center"`, `"end"`, `"space-between"`, or `"space-around"`. + Possible values are `"start"`, `"center"`, `"end"`, `"space-between"`, and `"space-around"`. The default is `"start"`. #### Example @@ -209,14 +209,15 @@ For use in [interactive UI](interactive-ui.md). #### Props -- `children`: `string | Image | Icon` - The contents of the button. +- `children` - The contents of the button. + This can be text, an [`Image`](#image) component, or an [`Icon`](#icon) component. - `type` - (Optional) The type of button. - Possible values are `"button"` or `"submit"`. + Possible values are `"button"` and `"submit"`. The default is `"button"`. - `name`: `string` - (Optional) The name that will be sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) when a user selects the button. - `variant` - (Optional) Determines the appearance of the button. - Possible values are `"primary"` or `"destructive"`. + Possible values are `"primary"` and `"destructive"`. The default is `"primary"`. #### Example @@ -259,7 +260,8 @@ Outputs a checkbox for use in [interactive UI](interactive-ui.md). - `name`: `string` - The name sent to [`onUserInput`](../../reference/entry-points.md#onuserinput). - `checked`: `boolean` - (Optional) Whether the checkbox is checked. - `label`: `string` - (Optional) The label for the checkbox. -- `variant`: `"default" | "toggle"` - (Optional) The variant of the checkbox. +- `variant` - (Optional) The variant of the checkbox. + Possible values are `"default"` and `"toggle"`. #### Example @@ -392,13 +394,14 @@ await snap.request({ ### `Field` -Outputs a form field, wrapping a [`Dropdown`](#dropdown), [`Input`](#input), [`Selector`](#selector), or [`RadioGroup`](#radiogroup) to give it a label and optional error. +Outputs a form field, wrapping an element to give it a label and optional error. #### Props - `label`: `string` - The label for the wrapped element. -- `error`: `string` - (Optional) Any error for the wrapped element. Setting this changes the styling of the wrapped element to show that there is an error. -- `children` - The input element to be wrapped. +- `error`: `string` - (Optional) Any error for the wrapped element. Setting this changes the style of the wrapped element to show that there is an error. +- `children` - The element to be wrapped. + This can be a [`Dropdown`](#dropdown), [`Input`](#input), [`Selector`](#selector), or [`RadioGroup`](#radiogroup) component. #### Example @@ -560,9 +563,13 @@ Outputs an icon. #### Props -- `name`: `"confirmation" | "search" | "bold" | "link" | "data" | "menu" | "filter" | "key" | "warning" | "add-square" | "add" | "arrow-2-down" | "arrow-2-left" | "arrow-2-right" | "arrow-2-up" | "arrow-2-up-right" | "arrow-double-left" | "arrow-double-right" | "arrow-down" | "arrow-left" | "arrow-right" | "arrow-up" | "bank-token" | "bank" | "book" | "bookmark" | "bridge" | "calculator" | "card-pos" | "card-token" | "card" | "category" | "chart" | "check-bold" | "check" | "clock" | "close" | "code-circle" | "coin" | "connect" | "copy-success" | "copy" | "customize" | "danger" | "dark" | "diagram" | "document-code" | "drag-drop" | "dragging-animation" | "pinning-animation" | "edit" | "eraser" | "ethereum" | "expand" | "explore" | "export" | "eye-slash" | "eye" | "flag" | "flash-slash" | "flash" | "full-circle" | "gas" | "global-search" | "global" | "graph" | "hardware" | "heart" | "hierarchy" | "home" | "import" | "info" | "light" | "loading" | "lock-circle" | "lock-slash" | "lock" | "login" | "logout" | "message-question" | "messages" | "minus-bold" | "minus-square" | "minus" | "mobile" | "money" | "monitor" | "more-horizontal" | "more-vertical" | "notification-circle" | "notification" | "password-check" | "people" | "pin" | "programming-arrows" | "custody" | "question" | "received" | "refresh" | "save" | "scan-barcode" | "scan-focus" | "scan" | "scroll" | "security-card" | "security-cross" | "security-key" | "security-search" | "security-slash" | "security-tick" | "security-time" | "security-user" | "security" | "send-1" | "send-2" | "setting" | "slash" | "snaps-mobile" | "snaps-plus" | "snaps" | "speedometer" | "star" | "stake" | "student" | "swap-horizontal" | "swap-vertical" | "tag" | "tilde" | "timer" | "trash" | "trend-down" | "trend-up" | "user-circle-add" | "user-circle-link" | "user-circle-remove" | "user-circle" | "user" | "wallet-card" | "wallet-money" | "wallet" | "warning" | "twitter" | "qr-code" | "user-check" | "unpin" | "ban" | "bold" | "circle-x" | "download" | "file" | "flask" | "plug" | "share" | "square" | "tint" | "upload" | "usb" | "wifi" | "plus-minus"` - The name of the icon. -- `color`: `'default' | 'primary' | 'muted'` - (Optional) The color of the icon. -- `size`: `'md' | 'inherit'` - (Optional) The size of the icon. +- `name` - The name of the icon. + Possible values include `"confirmation"`, `"search"`, "`warning`", and `"menu"`. + See the [full list of possible `name` values](https://github.com/MetaMask/snaps/blob/0014ff6d7566dbc2945600db740d0a90f818b2d8/packages/snaps-sdk/src/jsx/components/Icon.ts#L5-L163). +- `color` - (Optional) The color of the icon. + Possible values are `"default"`, `"primary"`, and `"muted"`. +- `size` - (Optional) The size of the icon. + Possible values are `"md"` and `"inherit"`. #### Example @@ -647,7 +654,7 @@ Outputs an input component for use in [interactive UI](interactive-ui.md). - `name`: `string` - The name that will be used as a key to the event sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. - `type` - (Optional) The type of input. - Possible values are `"text"`, `"number"`, or `"password"`. + Possible values are `"text"`, `"number"`, and `"password"`. The default is `"text"`. - `placeholder`: `string` - (Optional) The text displayed when the input is empty. - `label`: `string` - (Optional) The text displayed alongside the input to label it. @@ -753,7 +760,7 @@ Outputs a radio group component for use in [interactive UI](interactive-ui.md). - `name`: `string` - The name that will be used as a key to the event sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. -- `children`: `Radio[]` - One or more `Radio` components, each with a `value` and text child (see example). +- `children`: `Radio[]` - One or more `Radio` components, each with a `value` and text child. #### Example @@ -789,7 +796,7 @@ Outputs a row with a label and value, which can be used for key-value data. - `label`: `string` - The label of the row. - `variant` - (Optional) The variant of the label. - Possible values are `"default"`, `"error"`, or `"warning"`. + Possible values are `"default"`, `"error"`, and `"warning"`. - `children` - The value of the row, which can be a [`Text`](#text), [`Image`](#image), or [`Address`](#address) component. @@ -829,7 +836,7 @@ Outputs a selector component for use in [interactive UI](interactive-ui.md). - `name`: `string` - The name that will be used as a key to the event sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. - `title`: `string` - The title of the selector, displayed when the selector is opened. -- `children`: `SelectorOption[]` - One or more `SelectorOption` components, each with a `Card` child (see example). +- `children`: `SelectorOption[]` - One or more `SelectorOption` components, each with a `Card` child. #### Example @@ -854,7 +861,7 @@ const interfaceId = await snap.request({ ```

-Selector UI example +Selector UI example

### `Spinner` @@ -890,8 +897,10 @@ Outputs text. #### Props -- `color`: `'default' | 'alternative' | 'muted' | 'error' | 'success' | 'warning'` - (Optional) The color of the text. -- `alignment`: `'start' | 'center' | 'end'` - (Optional) The alignment of the text. +- `color` - (Optional) The color of the text. + Possible values are `"default"`, "`alternative`", `"muted"`, `"error"`, `"success"`, and `"warning"`. +- `alignment` - (Optional) The alignment of the text. + Possible values are `"start"`, `"center"`, and `"end"`. #### Example @@ -917,12 +926,12 @@ module.exports.onHomePage = async () => { ### `Tooltip` -Outputs a tooltip when the wrapped child is hovered over. +Outputs a tooltip when the wrapped element is hovered over. #### Props - `content`: - The content of the tooltip. -- `children`: - The child element to wrap. +- `children`: - The element to wrap. #### Example @@ -954,7 +963,7 @@ await snap.request({ Tooltip UI example

-### Emojis +## Emojis Text-based components (such as [`Heading`](#heading) and [`Text`](#text)) accept emojis. From be5de09f47b3421ad79e4d5edddc6ca745878617 Mon Sep 17 00:00:00 2001 From: Alexandra Tran Date: Wed, 25 Sep 2024 12:00:34 -0700 Subject: [PATCH 11/16] update "What's new?" --- docs/whats-new.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/whats-new.md b/docs/whats-new.md index 9a26b94691..e19ede1bd7 100644 --- a/docs/whats-new.md +++ b/docs/whats-new.md @@ -11,6 +11,9 @@ of the [MetaMask developer page](https://metamask.io/developer/). ## September 2024 +- Documented new [Snaps custom UI with JSX components](/snaps/features/custom-ui/with-jsx) for Flask + version 12.4. + ([#1540](https://github.com/MetaMask/metamask-docs/pull/1540)) - Documented [Snaps user-defined components](/snaps/features/custom-ui/user-defined-components). ([#1557](https://github.com/MetaMask/metamask-docs/pull/1557)) - Updated [Android SDK documentation](/wallet/how-to/use-sdk/mobile/android) with convenience From 556b77b28fa8a23a142147226c550d8648179a7a Mon Sep 17 00:00:00 2001 From: Alexandra Tran Date: Wed, 25 Sep 2024 18:55:41 -0700 Subject: [PATCH 12/16] Add default values, replace old custom UI, etc. --- docs/whats-new.md | 4 +- snaps/features/custom-ui/index.md | 903 ++++++++++++++----- snaps/features/custom-ui/interactive-ui.md | 16 +- snaps/features/custom-ui/with-jsx.md | 995 --------------------- snaps/index.mdx | 13 +- vercel.json | 4 + 6 files changed, 699 insertions(+), 1236 deletions(-) delete mode 100644 snaps/features/custom-ui/with-jsx.md diff --git a/docs/whats-new.md b/docs/whats-new.md index e19ede1bd7..75e5e38654 100644 --- a/docs/whats-new.md +++ b/docs/whats-new.md @@ -11,8 +11,8 @@ of the [MetaMask developer page](https://metamask.io/developer/). ## September 2024 -- Documented new [Snaps custom UI with JSX components](/snaps/features/custom-ui/with-jsx) for Flask - version 12.4. +- Documented new [Snaps custom UI JSX components](/snaps/features/custom-ui) for Flask + version 12.4, and removed documentation for deprecated function-based library. ([#1540](https://github.com/MetaMask/metamask-docs/pull/1540)) - Documented [Snaps user-defined components](/snaps/features/custom-ui/user-defined-components). ([#1557](https://github.com/MetaMask/metamask-docs/pull/1557)) diff --git a/snaps/features/custom-ui/index.md b/snaps/features/custom-ui/index.md index 517e9c23f4..679d028f60 100644 --- a/snaps/features/custom-ui/index.md +++ b/snaps/features/custom-ui/index.md @@ -1,16 +1,11 @@ --- -description: Display custom user interface components. +description: Display custom user interface components using JSX. sidebar_position: 4 --- # Custom UI -:::caution -This version of custom UI is deprecated. If you're building a new Snaps project, -use [custom UI with JSX](./with-jsx). JSX is supported in MetaMask Extension and Flask version 12+. -::: - -You can display custom user interface (UI) components using the +You can display custom user interface (UI) JSX components using the [`@metamask/snaps-sdk`](https://github.com/MetaMask/snaps/tree/main/packages/snaps-sdk) module when implementing the following features: @@ -19,6 +14,10 @@ implementing the following features: - [Transaction insights](../transaction-insights.md) - [Signature insights](../signature-insights.md) +:::note +JSX is supported in the MetaMask extension and Flask version 12 and later. New UI components will be added as JSX components. The previous function-based library is deprecated. +::: + To use custom UI, first install [`@metamask/snaps-sdk`](https://github.com/MetaMask/snaps/tree/main/packages/snaps-sdk) using the following command: @@ -27,49 +26,106 @@ yarn add @metamask/snaps-sdk ``` Then, whenever you're required to return a custom UI component, import the components from the -SDK and build your UI with them. -For example, to display a [`panel`](#panel) using [`snap_dialog`](../../reference/snaps-api.md#snap_dialog): +SDK at `@metamask/snaps-sdk/jsx` and build your UI with them. +For example, to display a [`Box`](#box) (the [`panel`](./index.md#panel) function equivalent) using [`snap_dialog`](../../reference/snaps-api.md#snap_dialog): -```javascript title="index.js" -import { panel, heading, text } from "@metamask/snaps-sdk" +```javascript title="index.jsx" +import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; await snap.request({ method: "snap_dialog", params: { type: "alert", - content: panel([ - heading("Alert heading"), - text("Something happened in the system."), - ]), + content: ( + + Alert heading + Something happened in the system. + + ), }, -}) +}); ``` +:::note +JSX can only be used in `.jsx` or `.tsx` files. +::: + +## Upgrade an existing Snap to use JSX + +If you have an existing Snap that uses the deprecated function-based custom UI library, follow these +steps to upgrade it to use JSX: + +1. Upgrade dependencies in `packages/snap/package.json`: + + - Upgrade `@metamask/snaps-sdk` to `^6.1.1` or later. + - Upgrade `@metamask/snaps-cli` to `^6.2.1` or later. + - Upgrade `@metamask/snaps-jest` to `^8.2.0` or later. + + Run `yarn install` to install the new versions. + +2. Update `packages/snap/.eslintrc.js`: + + - Add a new section in `overrides` with the following configuration: + ```json + { + "files": ["**/*.ts", "**/*.tsx"], + "extends": ["@metamask/eslint-config-typescript"], + "rules": { + // This allows importing the `Text` JSX component. + "@typescript-eslint/no-shadow": [ + "error", + { + "allow": ["Text"], + }, + ], + }, + } + ``` + - Replace `["*.test.ts"]` with `["*.test.ts", "*.test.tsx"]`. + +3. Update `packages/snap/src/index.ts`, if it will have JSX: + + - Rename the file to `index.tsx`. + - Modify the `input` field in `packages/snap/snap.config.ts` to `src/index.tsx`. + +4. Update `packages/snap/tsconfig.json`: + + - Under `compilerOptions`, add: + ```json + "jsx": "react-jsx", + "jsxImportSource": "@metamask/snaps-sdk" + ``` + - Change the `include` property from `["**/*.ts"]` to `["**/*.ts", "**/*.tsx"]`. + +5. Replace all custom UI in your code with JSX components, renaming the target files with the `.tsx` extension. + ## Components The following custom UI components are available: -### `address` +### `Address` -Outputs a formatted text field for an Ethereum address. -The address is automatically displayed with a jazzicon and truncated value. +Outputs a formatted text field for an Ethereum address. +The address is automatically displayed with a jazzicon and truncated value. Hovering the address shows the full value in a tooltip. #### Example -```javascript title="index.js" -import { panel, heading, address } from "@metamask/snaps-sdk" +```javascript title="index.jsx" +import { Box, Heading, Address } from "@metamask/snaps-sdk/jsx"; await snap.request({ method: "snap_dialog", params: { type: "alert", - content: panel([ - heading("Are you sure you want to send tokens to this address?"), - address("0x000000000000000000000000000000000000dEaD"), - ]), + content: ( + + Are you sure you want to send tokens to this address? +
+ + ), }, -}) +}); ```
@@ -81,41 +137,106 @@ await snap.request({
-### `button` +### `Bold` + +Outputs bold text. + +#### Example + +```javascript title="index.jsx" +import { Box, Heading, Text, Bold } from "@metamask/snaps-sdk/jsx"; + +await snap.request({ + method: "snap_dialog", + params: { + type: "alert", + content: ( + + Hello world! + + This is bold. + + + ), + }, +}); +``` + +### `Box` + +Outputs a box, which can be used as a container for other components. + +#### Props + +- `direction` - (Optional) The direction in which elements flow inside the box. + Possible values are `"horizontal"` and `"vertical"`. + The default is `"vertical"`. +- `alignment` - (Optional) The alignment of the elements inside the box. + Possible values are `"start"`, `"center"`, `"end"`, `"space-between"`, and `"space-around"`. + The default is `"start"`. + +#### Example + +```javascript title="index.jsx" +import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; + +module.exports.onHomePage = async () => { + return { + content: ( + + Features + + Feature 1 + Feature 2 + Feature 3 + + + ), + }; +}; +``` + +

+Box UI example +

+ +### `Button` Outputs a button that the user can select. For use in [interactive UI](interactive-ui.md). -#### Parameters +#### Props -An object containing: - -- `value`: `string` - The text of the button. -- `buttonType`: `string` - (Optional) Possible values are `button` or `submit`. - The default is `button`. +- `children` - The contents of the button. + This can be text, an [`Image`](#image) component, or an [`Icon`](#icon) component. +- `type` - (Optional) The type of button. + Possible values are `"button"` and `"submit"`. + The default is `"button"`. - `name`: `string` - (Optional) The name that will be sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) when a user selects the button. - `variant` - (Optional) Determines the appearance of the button. - Possible values are `primary` or `secondary`. - The default is `primary`. + Possible values are `"primary"` and `"destructive"`. + The default is `"primary"`. #### Example ```javascript -import { button, panel, heading } from "@metamask/snaps-sdk" +import { Box, Heading, Button } from "@metamask/snaps-sdk/jsx"; const interfaceId = await snap.request({ method: "snap_createInterface", params: { - ui: panel([ - heading("Interactive interface"), - button({ - value: "Click me", - name: "interactive-button", - }), - ]), + ui: ( + + Interactive interface + + + ), }, -}) +}); await snap.request({ method: "snap_dialog", @@ -123,55 +244,99 @@ await snap.request({ type: "Alert", id: interfaceId, }, -}) +}); + ```

Button UI example

-### `copyable` +### `Checkbox` + +Outputs a checkbox for use in [interactive UI](interactive-ui.md). + +#### Props + +- `name`: `string` - The name sent to [`onUserInput`](../../reference/entry-points.md#onuserinput). +- `checked`: `boolean` - (Optional) Whether the checkbox is checked. +- `label`: `string` - (Optional) The label for the checkbox. +- `variant` - (Optional) The variant of the checkbox. + Possible values are `"default"` and `"toggle"`. + The default is `"default"`. + +#### Example + +```js +import { Checkbox } from "@metamask/snaps-sdk/jsx"; + +const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( + + + + + ), + }, +}); +``` + +

+Checkbox UI example +

+ +### `Copyable` Outputs a read-only text field with a copy-to-clipboard shortcut. +#### Props + +- `value`: `string` - The value to copy when the user clicks on the copyable element. +- `sensitive`: `boolean` - (Optional) Indicates whether the value is sensitive. If `true`, the value will be hidden when the user is not interacting with the copyable element. + #### Example -```javascript title="index.js" -import { text, copyable } from "@metamask/snaps-sdk" +```javascript title="index.jsx" +import { Box, Text, Copyable } from "@metamask/snaps-sdk/jsx"; await snap.request({ method: "snap_dialog", params: { type: "alert", - content: panel([ - text("Your address:"), - copyable("0x000000000000000000000000000000000000dEaD"), - ]), + content: ( + + Your address: + + + ), }, -}) +}); ```

Copyable UI example

-### `divider` +### `Divider` Outputs a horizontal divider. #### Example -```javascript title="index.js" -import type { OnHomePageHandler } from "@metamask/snaps-sdk"; -import { panel, divider, text } from "@metamask/snaps-sdk"; +```javascript title="index.jsx" +import { Box, Heading, Divider, Text } from "@metamask/snaps-sdk/jsx"; module.exports.onHomePage = async () => { return { - content: panel([ - heading("Hello world!"), - divider(), - text("Welcome to my Snap home page!"), - ]), + content: ( + + Hello world! + + Welcome to my Snap home page! + + ), }; }; ``` @@ -180,41 +345,180 @@ module.exports.onHomePage = async () => { Divider UI example

-### `form` +### `Dropdown` -Outputs a form for use in [interactive UI](interactive-ui.md). +Outputs a dropdown for use in [interactive UI](interactive-ui.md). + +#### Props -#### Parameters +- `name`: `string` - The name sent to [`onUserInput`](../../reference/entry-points.md#onuserinput). +- `children`: `Option[]` - One or more `Option` components with the following props: + - `value`: `string` - The value sent to [`onUserInput`](../../reference/entry-points.md#onuserinput). + - `children`: `string` - The text displayed in the dropdown for that option. -An object containing: +#### Example + +```js +import { Box, Text, Dropdown } from "@metamask/snaps-sdk/jsx"; + +const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( + + Pick a currency + + + + + + ), + }, +}); + +await snap.request({ + method: "snap_dialog", + params: { + type: "Alert", + id: interfaceId, + }, +}); +``` + +
+
+ Dropdown UI example +
+
+ Active dropdown UI example +
+
+ +### `Field` + +Outputs a form field, wrapping an element to give it a label and optional error. + +#### Props + +- `label`: `string` - The label for the wrapped element. +- `error`: `string` - (Optional) Any error for the wrapped element. Setting this changes the style of the wrapped element to show that there is an error. +- `children` - The element to be wrapped. + This can be a [`Dropdown`](#dropdown), [`Input`](#input), [`Selector`](#selector), or [`RadioGroup`](#radiogroup) component. + +#### Example + +```js +import { Field, Form, Input, Button } from "@metamask/snaps-sdk/jsx"; + +const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( +
+ + + + +
+ ), + }, +}); + +await snap.request({ + method: "snap_dialog", + params: { + type: "Alert", + id: interfaceId, + }, +}); +``` + +

+Field example +

+ +### `FileInput` + +Outputs a file input component for use in [interactive UI](interactive-ui.md). + +#### Props - `name`: `string` - The name that will be sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) when a user interacts with the form. -- `children`: `array` - An array of [`input`](#input) or [`button`](#button) components. +- `accept`: `string[]` - (Optional) The file types that the file input field accepts. If not +specified, the file input field accepts all file types. For examples of +valid values, see the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept). +- `compact`: `boolean` - (Optional) Whether the file input field is compact. #### Example ```js -import { input, button, form } from "@metamask/snaps-sdk" +import { FileInput } from "@metamask/snaps-sdk/jsx"; + +export const onHomePage = async () => { + const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( + + File Upload +
+ + + + +
+
+ ), + }, + }); + + return { + id: interfaceId, + } +}; + +export const onUserInput = async ({ id, event }) => { + if (event.type === UserInputEventType.FileUploadEvent && event.file !== null) { + console.log(event.file); + } +}; +``` + +

+File input UI example +

+ +### `Form` + +Outputs a form for use in [interactive UI](interactive-ui.md). + +#### Props + +- `name`: `string` - The name that will be sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) + when a user interacts with the form. +- `children`: `array` - An array of [`Input`](#input) or [`Button`](#button) components. + +#### Example + +```js +import { Form, Input, Button } from "@metamask/snaps-sdk/jsx"; const interfaceId = await snap.request({ method: "snap_createInterface", params: { - ui: form({ - name: "form-to-fill", - children: [ - input({ - name: "user-name", - placeholder: "Your name", - }), - button({ - value: "Submit", - buttonType: "submit", - }), - ], - }), + ui: ( +
+ + + + +
+ ), }, -}) +}); await snap.request({ method: "snap_dialog", @@ -222,30 +526,31 @@ await snap.request({ type: "Alert", id: interfaceId, }, -}) +}); ```

Form UI example

-### `heading` +### `Heading` Outputs a heading. -This is useful for [`panel`](#panel) titles. +This is useful for [`Box`](#box) titles. #### Example -```javascript title="index.js" -import type { OnHomePageHandler } from "@metamask/snaps-sdk"; -import { panel, heading, text } from "@metamask/snaps-sdk"; +```javascript title="index.jsx" +import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; module.exports.onHomePage = async () => { return { - content: panel([ - heading("Hello world!"), - text("Welcome to my Snap home page!"), - ]), + content: ( + + Hello world! + Welcome to my Snap home page! + + ), }; }; ``` @@ -254,14 +559,53 @@ module.exports.onHomePage = async () => { Divider UI example

-### `image` +### `Icon` + +Outputs an icon. + +#### Props + +- `name` - The name of the icon. + Possible values include `"confirmation"`, `"search"`, "`warning`", and `"menu"`. + See the [full list of possible `name` values](https://github.com/MetaMask/snaps/blob/0014ff6d7566dbc2945600db740d0a90f818b2d8/packages/snaps-sdk/src/jsx/components/Icon.ts#L5-L163). +- `color` - (Optional) The color of the icon. + Possible values are `"default"`, `"primary"`, and `"muted"`. + The default is `"default"`. +- `size` - (Optional) The size of the icon. + Possible values are `"md"` and `"inherit"`. + The default is `"md"`. + +#### Example -Outputs an image. +```javascript title="index.jsx" +import { Icon } from "@metamask/snaps-sdk/jsx"; + +await snap.request({ + method: "snap_dialog", + params: { + type: "alert", + content: ( + + + Double-check the "to" address before proceeding. + + ), + }, +}); +``` + +

+Icon UI example +

+ +### `Image` + +Outputs an image. This component takes an inline SVG. It does not support remote URLs. You can import SVG, PNG, and JPEG files using an import statement. -These files are automatically imported as SVG strings, so you can pass them directly to the `image` component. +These files are automatically imported as SVG strings, so you can pass them directly to the `Image` component. The SVG is rendered within an `` tag, which prevents JavaScript or interaction events from being supported. @@ -272,20 +616,26 @@ configuration option to `false`. The default is `true`. ::: +#### Props + +- `src`: `string` - An inline SVG. +- `alt`: `string` - An optional alternative text for the image. + #### Example -```javascript title="index.js" -import type { OnHomePageHandler } from "@metamask/snaps-sdk"; -import { panel, heading, text, image } from "@metamask/snaps-sdk"; +```javascript title="index.jsx" +import { Box, Heading, Text, Image } from "@metamask/snaps-sdk/jsx"; import svgIcon from "./path/to/icon.svg"; module.exports.onHomePage = async () => { return { - content: panel([ - heading("Hello world!"), - text("Welcome to my Snap home page!"), - image(svgIcon), - ]), + content: ( + + Hello world! + Welcome to my Snap home page! + + + ), }; }; ``` @@ -294,46 +644,44 @@ module.exports.onHomePage = async () => { Divider UI example

-### `input` +:::note +See the [`@metamask/images-example-snap`](https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/images) +package for a full example of implementing images. +::: -Outputs an input component for use in [interactive UI](interactive-ui.md). +### `Input` -#### Parameters +Outputs an input component for use in [interactive UI](interactive-ui.md). -An object containing: +#### Props - `name`: `string` - The name that will be used as a key to the event sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. -- `inputType`: `string` - (Optional) Type of input. - Possible values are `text`, `number`, or `password`. - The default is `text`. +- `type` - (Optional) The type of input. + Possible values are `"text"`, `"number"`, and `"password"`. + The default is `"text"`. - `placeholder`: `string` - (Optional) The text displayed when the input is empty. -- `label`: `string` (Optional) The text displayed alongside the input to label it. -- `value`: `string` (Optional) The default value of the input. +- `label`: `string` - (Optional) The text displayed alongside the input to label it. +- `value`: `string` - (Optional) The default value of the input. #### Example ```js -import { button, input, form } from "@metamask/snaps-sdk"; +import { Form, Input, Button } from "@metamask/snaps-sdk/jsx"; const interfaceId = await snap.request({ method: "snap_createInterface", params: { - ui: form({ - name: "form-to-fill", - children: [ - input({ - name: "user-name", - placeholder: "Your name", - }), - button({ - value: "Submit", - buttonType: "submit", - }), - ], - }), + ui: ( +
+ + + + +
+ ), }, -}) +}); await snap.request({ method: "snap_dialog", @@ -341,201 +689,314 @@ await snap.request({ type: "Alert", id: interfaceId, }, -}) +}); ```

Form UI example

-:::note -See the [`@metamask/images-example-snap`](https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/images) -package for a full example of implementing images. -::: +### `Italic` + +Outputs italic text. + +#### Example + +```javascript title="index.jsx" +import { Box, Heading, Text, Italic } from "@metamask/snaps-sdk/jsx"; + +await snap.request({ + method: "snap_dialog", + params: { + type: "alert", + content: ( + + Hello world! + + This is italic. + + + ), + }, +}); +``` + +### `Link` + +Outputs a clickable link. -### `panel` +#### Props -Outputs a panel, which can be used as a container for other components. -This component takes an array of custom UI components. +- `href`: `string` - The URL to point to. This must be an HTTPS URL. +- `children`: `Array` - The link text. #### Example -```javascript title="index.js" -import type { OnTransactionHandler } from "@metamask/snaps-sdk"; -import { panel, heading, text } from "@metamask/snaps-sdk"; +```javascript title="index.jsx" +import { Box, Heading, Link, Text } from "@metamask/snaps-sdk/jsx"; -module.exports.onTransaction = async ({ transaction }) => { - const gasFeesPercentage = /* Calculate gas fees percentage */; +module.exports.onHomePage = async () => { return { - content: panel([ - heading("Transaction insights"), - text( - `As set up, you are paying **${gasFeesPercentage.toFixed( - 2, - )}%** in gas fees for this transaction.`, - ), - ]), + content: ( + + Hello world! + + Download MetaMask. + + + Read the MetaMask docs at MetaMask docs. + + + ), }; }; ```

-Panel UI example +Links UI example

-### `row` +### `RadioGroup` -Outputs a row with a label and value, which can be used for key-value data. -The label must be a string. The value can be a child component of type -[`text`](#text) or [`address`](#address). +Outputs a radio group component for use in [interactive UI](interactive-ui.md). + +#### Props + +- `name`: `string` - The name that will be used as a key to the event sent to + [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. +- `children`: `Radio[]` - One or more `Radio` components, each with a `value` and text child. #### Example -```javascript title="index.js" -import { panel, row, text, address } from "@metamask/snaps-sdk" +```js +import { RadioGroup, Radio } from "@metamask/snaps-sdk/jsx"; -await snap.request({ - method: "snap_dialog", +const interfaceId = await snap.request({ + method: "snap_createInterface", params: { - type: "alert", - content: panel([ - row("Address", address("0x000000000000000000000000000000000000dEaD")), - row("Balance", text("1.78 ETH")), - ]), + ui: ( +
+ + + Option 1 + Option 2 + + +
+ ), }, -}) +}); ```

-Row UI example +RadioGroup UI example

-### `spinner` +### `Row` -Outputs a loading indicator. +Outputs a row with a label and value, which can be used for key-value data. + +#### Props + +- `label`: `string` - The label of the row. +- `variant` - (Optional) The variant of the label. + Possible values are `"default"`, `"error"`, and `"warning"`. + The default is `"default"`. +- `children` - The value of the row, which can be a [`Text`](#text), [`Image`](#image), or + [`Address`](#address) component. #### Example -```javascript title="index.js" -import { panel, heading, spinner } from "@metamask/snaps-sdk" +```javascript title="index.jsx" +import { Box, Row, Text, Address } from "@metamask/snaps-sdk/jsx"; await snap.request({ method: "snap_dialog", params: { type: "alert", - content: panel([heading("Please wait..."), spinner()]), + content: ( + + +
+ + + 1.78 ETH + + + ), }, -}) +}); ```

-Spinner UI example +Row UI example

-### `text` +### `Selector` -Outputs text. +Outputs a selector component for use in [interactive UI](interactive-ui.md). + +#### Props + +- `name`: `string` - The name that will be used as a key to the event sent to + [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. +- `title`: `string` - The title of the selector, displayed when the selector is opened. +- `children`: `SelectorOption[]` - One or more `SelectorOption` components, each with a `Card` child. #### Example -```javascript title="index.js" -import type { OnHomePageHandler } from "@metamask/snaps-sdk"; -import { panel, heading, text } from "@metamask/snaps-sdk"; +```js +import { Selector, SelectorOption, Card } from "@metamask/snaps-sdk/jsx"; -module.exports.onHomePage = async () => { - return { - content: panel([ - heading("Hello world!"), - text("Welcome to my Snap home page!"), - ]), - }; -}; +const interfaceId = await snap.request({ + method: "snap_createInterface", + params: { + ui: ( + + + + + + + + + ), + }, +}); ```

-Text UI example +Selector UI example

-## Markdown +### `Spinner` -[`text`](#text) components accept bold and italic inline Markdown. +Outputs a loading indicator. #### Example -```javascript title="index.js" -import { panel, heading, text } from "@metamask/snaps-sdk" +```javascript title="index.jsx" +import { Box, Heading, Spinner } from "@metamask/snaps-sdk/jsx"; await snap.request({ method: "snap_dialog", params: { type: "alert", - content: panel([ - heading("Hello world!"), - text("This is **bold** and this is _italic_."), - ]), + content: ( + + Please wait... + + + ), }, -}) +}); ```

-Markdown UI example +Spinner UI example

-## Links +### `Text` + +Outputs text. + +#### Props + +- `color` - (Optional) The color of the text. + Possible values are `"default"`, "`alternative`", `"muted"`, `"error"`, `"success"`, and `"warning"`. + The default is `"default"`. +- `alignment` - (Optional) The alignment of the text. + Possible values are `"start"`, `"center"`, and `"end"`. + The default is `"start"`. -[`text`](#text) components accept inline links. #### Example -```javascript title="index.js" -import type { OnHomePageHandler } from "@metamask/snaps-sdk"; -import { panel, text } from "@metamask/snaps-sdk"; +```javascript title="index.jsx" +import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; module.exports.onHomePage = async () => { return { - content: panel([ - heading("Hello world!"), - text("Download [MetaMask](https://metamask.io)."), - text("Read the MetaMask docs at [](https://docs.metamask.io)."), - ]), + content: ( + + Hello world! + Welcome to my Snap home page! + + ), }; }; ```

-Links UI example +Text UI example +

+ +### `Tooltip` + +Outputs a tooltip when the wrapped element is hovered over. + +#### Props + +- `content`: - The content of the tooltip. +- `children`: - The element to wrap. + +#### Example + +```javascript title="index.jsx" +import { Tooltip, Text } from "@metamask/snaps-sdk/jsx"; + +await snap.request({ + method: "snap_dialog", + params: { + type: "alert", + content: ( + + + Tooltip text + + } + > + Hello world! + + + ), + }, +}); +``` + +

+Tooltip UI example

## Emojis -Text-based components (such as [`heading`](#heading) and [`text`](#text)) accept emojis. +Text-based components (such as [`Heading`](#heading) and [`Text`](#text)) accept emojis. #### Example -```javascript title="index.js" -import { panel, heading, text } from "@metamask/snaps-sdk" +```javascript title="index.jsx" +import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; await snap.request({ method: "snap_dialog", params: { type: "alert", - content: panel([ - heading("Hello world!"), - text("This is an apple 🍎 and this is an orange 🍊."), - ]), + content: ( + + Hello world! + This is an apple 🍎 and this is an orange 🍊. + + ), }, -}) +}); ```

Emojis UI example

-## Examples - -See the following packages for full examples of implementing custom UI: +## User-defined components -- [`@metamask/dialog-example-snap`](https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/dialogs) -- [`@metamask/transaction-insight-example-snap`](https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/transaction-insights) -- [`@metamask/home-page-example-snap`](https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/home-page) -- [`@metamask/images-example-snap`](https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/images) +In addition to the components provided by the SDK, you can [define your own components](user-defined-components.md). diff --git a/snaps/features/custom-ui/interactive-ui.md b/snaps/features/custom-ui/interactive-ui.md index 583228b462..6f0613cdac 100644 --- a/snaps/features/custom-ui/interactive-ui.md +++ b/snaps/features/custom-ui/interactive-ui.md @@ -12,17 +12,11 @@ It allows interfaces returned from [dialogs](dialogs.md), [home pages](home-page The following interactive UI components are available: -- [`button`](index.md#button) -- [`form`](index.md#form) -- [`input`](index.md#input) - -The following interactive UI JSX components are available: - -- [`Button`](with-jsx.md#button) -- [`Dropdown`](with-jsx.md#dropdown) -- [`Field`](with-jsx.md#field) -- [`Form`](with-jsx.md#form) -- [`Input`](with-jsx.md#input) +- [`Button`](index.md#button) +- [`Dropdown`](index.md#dropdown) +- [`Field`](index.md#field) +- [`Form`](index.md#form) +- [`Input`](index.md#input) ## Create an interactive interface diff --git a/snaps/features/custom-ui/with-jsx.md b/snaps/features/custom-ui/with-jsx.md deleted file mode 100644 index 8ef4d227a6..0000000000 --- a/snaps/features/custom-ui/with-jsx.md +++ /dev/null @@ -1,995 +0,0 @@ ---- -description: Display custom user interface components using JSX. -sidebar_position: 4 ---- - -# Custom UI with JSX - -You can display custom user interface (UI) JSX components using the -[`@metamask/snaps-sdk`](https://github.com/MetaMask/snaps/tree/main/packages/snaps-sdk) module when -implementing the following features: - -- [Dialogs](dialogs.md) -- [Home pages](home-pages.md) -- [Transaction insights](../transaction-insights.md) -- [Signature insights](../signature-insights.md) - -:::note -JSX is supported in MetaMask Extension and Flask version 12+. New UI components will be added as JSX components. The previous function-based library is deprecated. -::: - -To use custom UI with JSX, first install [`@metamask/snaps-sdk`](https://github.com/MetaMask/snaps/tree/main/packages/snaps-sdk) -using the following command: - -```bash -yarn add @metamask/snaps-sdk -``` - -Then, whenever you're required to return a custom UI JSX component, import the components from the -SDK at `@metamask/snaps-sdk/jsx` and build your UI with them. -For example, to display a [`Box`](#box) (the [`panel`](./index.md#panel) function equivalent) using [`snap_dialog`](../../reference/snaps-api.md#snap_dialog): - -```javascript title="index.jsx" -import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - Alert heading - Something happened in the system. - - ), - }, -}); -``` - -:::note -Note that JSX can only be used in `.jsx` or `.tsx` files. -::: - -## Upgrade an existing Snap to use JSX - -Follow these steps to upgrade an existing Snap to use JSX: - -1. Upgrade dependencies in `packages/snap/package.json`: - - - Upgrade `@metamask/snaps-sdk` to `^6.1.1` or later. - - Upgrade `@metamask/snaps-cli` to `^6.2.1` or later. - - Upgrade `@metamask/snaps-jest` to `^8.2.0` or later. - - Run `yarn install` to install the new versions. - -2. Update `packages/snap/.eslintrc.js`: - - - Add a new section in `overrides` with the following configuration: - ```json - { - "files": ["**/*.ts", "**/*.tsx"], - "extends": ["@metamask/eslint-config-typescript"], - "rules": { - // This allows importing the `Text` JSX component. - "@typescript-eslint/no-shadow": [ - "error", - { - "allow": ["Text"], - }, - ], - }, - } - ``` - - Replace `["*.test.ts"]` with `["*.test.ts", "*.test.tsx"]`. - -3. Update `packages/snap/src/index.ts`, if it will have JSX: - - - Rename the file to `index.tsx`. - - Modify the `input` field in `packages/snap/snap.config.ts` to `src/index.tsx`. - -4. Update `packages/snap/tsconfig.json`: - - - Under `compilerOptions`, add: - ```json - "jsx": "react-jsx", - "jsxImportSource": "@metamask/snaps-sdk" - ``` - - Change the `include` property from `["**/*.ts"]` to `["**/*.ts", "**/*.tsx"]`. - -5. Replace all Custom UI in your code with JSX components, renaming the target files with the `.tsx` extension. - -## Components - -The following custom UI JSX components are available: - -### `Address` - -Outputs a formatted text field for an Ethereum address. -The address is automatically displayed with a jazzicon and truncated value. -Hovering the address shows the full value in a tooltip. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Address } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - Are you sure you want to send tokens to this address? -
- - ), - }, -}); -``` - -
-
- Address UI example -
-
- Address tooltip UI example -
-
- -### `Bold` - -Outputs bold text. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Text, Bold } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - Hello world! - - This is bold. - - - ), - }, -}); -``` - -### `Box` - -Outputs a box, which can be used as a container for other components. - -#### Props - -- `direction` - (Optional) The direction in which elements flow inside the box. - Possible values are `"horizontal"` and `"vertical"`. - The default is `"vertical"`. -- `alignment` - (Optional) The alignment of the elements inside the box. - Possible values are `"start"`, `"center"`, `"end"`, `"space-between"`, and `"space-around"`. - The default is `"start"`. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; - -module.exports.onHomePage = async () => { - return { - content: ( - - Features - - Feature 1 - Feature 2 - Feature 3 - - - ), - }; -}; -``` - -

-Box UI example -

- -### `Button` - -Outputs a button that the user can select. -For use in [interactive UI](interactive-ui.md). - -#### Props - -- `children` - The contents of the button. - This can be text, an [`Image`](#image) component, or an [`Icon`](#icon) component. -- `type` - (Optional) The type of button. - Possible values are `"button"` and `"submit"`. - The default is `"button"`. -- `name`: `string` - (Optional) The name that will be sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) - when a user selects the button. -- `variant` - (Optional) Determines the appearance of the button. - Possible values are `"primary"` and `"destructive"`. - The default is `"primary"`. - -#### Example - -```javascript -import { Box, Heading, Button } from "@metamask/snaps-sdk/jsx"; - -const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( - - Interactive interface - - - ), - }, -}); - -await snap.request({ - method: "snap_dialog", - params: { - type: "Alert", - id: interfaceId, - }, -}); - -``` - -

-Button UI example -

- -### `Checkbox` - -Outputs a checkbox for use in [interactive UI](interactive-ui.md). - -#### Props - -- `name`: `string` - The name sent to [`onUserInput`](../../reference/entry-points.md#onuserinput). -- `checked`: `boolean` - (Optional) Whether the checkbox is checked. -- `label`: `string` - (Optional) The label for the checkbox. -- `variant` - (Optional) The variant of the checkbox. - Possible values are `"default"` and `"toggle"`. - -#### Example - -```js -import { Checkbox } from "@metamask/snaps-sdk/jsx"; - -const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( - - - - - ), - }, -}); -``` - -

-Checkbox UI example -

- -### `Copyable` - -Outputs a read-only text field with a copy-to-clipboard shortcut. - -#### Props - -- `value`: `string` - The value to copy when the user clicks on the copyable element. -- `sensitive`: `boolean` - (Optional) Indicates whether the value is sensitive. If `true`, the value will be hidden when the user is not interacting with the copyable element. - -#### Example - -```javascript title="index.jsx" -import { Box, Text, Copyable } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - Your address: - - - ), - }, -}); -``` - -

-Copyable UI example -

- -### `Divider` - -Outputs a horizontal divider. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Divider, Text } from "@metamask/snaps-sdk/jsx"; - -module.exports.onHomePage = async () => { - return { - content: ( - - Hello world! - - Welcome to my Snap home page! - - ), - }; -}; -``` - -

-Divider UI example -

- -### `Dropdown` - -Outputs a dropdown for use in [interactive UI](interactive-ui.md). - -#### Props - -- `name`: `string` - The name sent to [`onUserInput`](../../reference/entry-points.md#onuserinput). -- `children`: `Option[]` - One or more `Option` components with the following props: - - `value`: `string` - The value sent to [`onUserInput`](../../reference/entry-points.md#onuserinput). - - `children`: `string` - The text displayed in the dropdown for that option. - -#### Example - -```js -import { Box, Text, Dropdown } from "@metamask/snaps-sdk/jsx"; - -const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( - - Pick a currency - - - - - - ), - }, -}); - -await snap.request({ - method: "snap_dialog", - params: { - type: "Alert", - id: interfaceId, - }, -}); -``` - -
-
- Dropdown UI example -
-
- Active dropdown UI example -
-
- -### `Field` - -Outputs a form field, wrapping an element to give it a label and optional error. - -#### Props - -- `label`: `string` - The label for the wrapped element. -- `error`: `string` - (Optional) Any error for the wrapped element. Setting this changes the style of the wrapped element to show that there is an error. -- `children` - The element to be wrapped. - This can be a [`Dropdown`](#dropdown), [`Input`](#input), [`Selector`](#selector), or [`RadioGroup`](#radiogroup) component. - -#### Example - -```js -import { Field, Form, Input, Button } from "@metamask/snaps-sdk/jsx"; - -const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( -
- - - - -
- ), - }, -}); - -await snap.request({ - method: "snap_dialog", - params: { - type: "Alert", - id: interfaceId, - }, -}); -``` - -

-Field example -

- -### `FileInput` - -Outputs a file input component for use in [interactive UI](interactive-ui.md). - -#### Props - -- `name`: `string` - The name that will be sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) - when a user interacts with the form. -- `accept`: `string[]` - (Optional) The file types that the file input field accepts. If not -specified, the file input field accepts all file types. For examples of -valid values, see the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept). -- `compact`: `boolean` - (Optional) Whether the file input field is compact. - -#### Example - -```js -import { FileInput } from "@metamask/snaps-sdk/jsx"; - -export const onHomePage = async () => { - const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( - - File Upload -
- - - - -
-
- ), - }, - }); - - return { - id: interfaceId, - } -}; - -export const onUserInput = async ({ id, event }) => { - if (event.type === UserInputEventType.FileUploadEvent && event.file !== null) { - console.log(event.file); - } -}; -``` - -

-File input UI example -

- -### `Form` - -Outputs a form for use in [interactive UI](interactive-ui.md). - -#### Props - -- `name`: `string` - The name that will be sent to [`onUserInput`](../../reference/entry-points.md#onuserinput) - when a user interacts with the form. -- `children`: `array` - An array of [`Input`](#input) or [`Button`](#button) components. - -#### Example - -```js -import { Form, Input, Button } from "@metamask/snaps-sdk/jsx"; - -const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( -
- - - - -
- ), - }, -}); - -await snap.request({ - method: "snap_dialog", - params: { - type: "Alert", - id: interfaceId, - }, -}); -``` - -

-Form UI example -

- -### `Heading` - -Outputs a heading. -This is useful for [`Box`](#box) titles. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; - -module.exports.onHomePage = async () => { - return { - content: ( - - Hello world! - Welcome to my Snap home page! - - ), - }; -}; -``` - -

-Divider UI example -

- -### `Icon` - -Outputs an icon. - -#### Props - -- `name` - The name of the icon. - Possible values include `"confirmation"`, `"search"`, "`warning`", and `"menu"`. - See the [full list of possible `name` values](https://github.com/MetaMask/snaps/blob/0014ff6d7566dbc2945600db740d0a90f818b2d8/packages/snaps-sdk/src/jsx/components/Icon.ts#L5-L163). -- `color` - (Optional) The color of the icon. - Possible values are `"default"`, `"primary"`, and `"muted"`. -- `size` - (Optional) The size of the icon. - Possible values are `"md"` and `"inherit"`. - -#### Example - -```javascript title="index.jsx" -import { Icon } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - - Double-check the "to" address before proceeding. - - ), - }, -}); -``` - -

-Icon UI example -

- -### `Image` - -Outputs an image. -This component takes an inline SVG. -It does not support remote URLs. - -You can import SVG, PNG, and JPEG files using an import statement. -These files are automatically imported as SVG strings, so you can pass them directly to the `Image` component. - -The SVG is rendered within an `` tag, which prevents JavaScript or interaction events from -being supported. - -:::note -To disable image support, set the [`features.images`](../../reference/cli/options.md#featuresimages) -configuration option to `false`. -The default is `true`. -::: - -#### Props - -- `src`: `string` - An inline SVG. -- `alt`: `string` - An optional alternative text for the image. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Text, Image } from "@metamask/snaps-sdk/jsx"; -import svgIcon from "./path/to/icon.svg"; - -module.exports.onHomePage = async () => { - return { - content: ( - - Hello world! - Welcome to my Snap home page! - - - ), - }; -}; -``` - -

-Divider UI example -

- -:::note -See the [`@metamask/images-example-snap`](https://github.com/MetaMask/snaps/tree/main/packages/examples/packages/images) -package for a full example of implementing images. -::: - -### `Input` - -Outputs an input component for use in [interactive UI](interactive-ui.md). - -#### Props - -- `name`: `string` - The name that will be used as a key to the event sent to - [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. -- `type` - (Optional) The type of input. - Possible values are `"text"`, `"number"`, and `"password"`. - The default is `"text"`. -- `placeholder`: `string` - (Optional) The text displayed when the input is empty. -- `label`: `string` - (Optional) The text displayed alongside the input to label it. -- `value`: `string` - (Optional) The default value of the input. - -#### Example - -```js -import { Form, Input, Button } from "@metamask/snaps-sdk/jsx"; - -const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( -
- - - - -
- ), - }, -}); - -await snap.request({ - method: "snap_dialog", - params: { - type: "Alert", - id: interfaceId, - }, -}); -``` - -

-Form UI example -

- -### `Italic` - -Outputs italic text. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Text, Italic } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - Hello world! - - This is italic. - - - ), - }, -}); -``` - -### `Link` - -Outputs a clickable link. - -#### Props - -- `href`: `string` - The URL to point to. This must be an HTTPS URL. -- `children`: `Array` - The link text. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Link, Text } from "@metamask/snaps-sdk/jsx"; - -module.exports.onHomePage = async () => { - return { - content: ( - - Hello world! - - Download MetaMask. - - - Read the MetaMask docs at MetaMask docs. - - - ), - }; -}; -``` - -

-Links UI example -

- -### `RadioGroup` - -Outputs a radio group component for use in [interactive UI](interactive-ui.md). - -#### Props - -- `name`: `string` - The name that will be used as a key to the event sent to - [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. -- `children`: `Radio[]` - One or more `Radio` components, each with a `value` and text child. - -#### Example - -```js -import { RadioGroup, Radio } from "@metamask/snaps-sdk/jsx"; - -const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( -
- - - Option 1 - Option 2 - - -
- ), - }, -}); -``` - -

-RadioGroup UI example -

- -### `Row` - -Outputs a row with a label and value, which can be used for key-value data. - -#### Props - -- `label`: `string` - The label of the row. -- `variant` - (Optional) The variant of the label. - Possible values are `"default"`, `"error"`, and `"warning"`. -- `children` - The value of the row, which can be a [`Text`](#text), [`Image`](#image), or - [`Address`](#address) component. - -#### Example - -```javascript title="index.jsx" -import { Box, Row, Text, Address } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - -
- - - 1.78 ETH - - - ), - }, -}); -``` - -

-Row UI example -

- -### `Selector` - -Outputs a selector component for use in [interactive UI](interactive-ui.md). - -#### Props - -- `name`: `string` - The name that will be used as a key to the event sent to - [`onUserInput`](../../reference/entry-points.md#onuserinput) when the containing form is submitted. -- `title`: `string` - The title of the selector, displayed when the selector is opened. -- `children`: `SelectorOption[]` - One or more `SelectorOption` components, each with a `Card` child. - -#### Example - -```js -import { Selector, SelectorOption, Card } from "@metamask/snaps-sdk/jsx"; - -const interfaceId = await snap.request({ - method: "snap_createInterface", - params: { - ui: ( - - - - - - - - - ), - }, -}); -``` - -

-Selector UI example -

- -### `Spinner` - -Outputs a loading indicator. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Spinner } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - Please wait... - - - ), - }, -}); -``` - -

-Spinner UI example -

- -### `Text` - -Outputs text. - -#### Props - -- `color` - (Optional) The color of the text. - Possible values are `"default"`, "`alternative`", `"muted"`, `"error"`, `"success"`, and `"warning"`. -- `alignment` - (Optional) The alignment of the text. - Possible values are `"start"`, `"center"`, and `"end"`. - - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; - -module.exports.onHomePage = async () => { - return { - content: ( - - Hello world! - Welcome to my Snap home page! - - ), - }; -}; -``` - -

-Text UI example -

- -### `Tooltip` - -Outputs a tooltip when the wrapped element is hovered over. - -#### Props - -- `content`: - The content of the tooltip. -- `children`: - The element to wrap. - -#### Example - -```javascript title="index.jsx" -import { Tooltip, Text } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - - Tooltip text - - } - > - Hello world! - - - ), - }, -}); -``` - -

-Tooltip UI example -

- -## Emojis - -Text-based components (such as [`Heading`](#heading) and [`Text`](#text)) accept emojis. - -#### Example - -```javascript title="index.jsx" -import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: ( - - Hello world! - This is an apple 🍎 and this is an orange 🍊. - - ), - }, -}); -``` - -

-Emojis UI example -

- -## User-defined components - -In addition to the components provided by the SDK, you can [define your own components](user-defined-components.md). diff --git a/snaps/index.mdx b/snaps/index.mdx index 843f95f089..c08e5c169b 100644 --- a/snaps/index.mdx +++ b/snaps/index.mdx @@ -36,6 +36,12 @@ The following Snaps features are available in the stable version of MetaMask: title: "Custom EVM accounts", description: "Connect to custom EVM accounts in MetaMask.", }, + { + icon: require("./assets/features/name-resolution.png").default, + href: "features/custom-name-resolution", + title: "Custom name resolution", + description: "Resolve names to addresses and vice versa.", + }, { icon: require("./assets/features/custom-ui.png").default, href: "features/custom-ui", @@ -133,13 +139,6 @@ the canary distribution of MetaMask: description: "Connect to ERC-4337 accounts in MetaMask.", flaskOnly: true, }, - { - icon: require("./assets/features/name-resolution.png").default, - href: "features/custom-name-resolution", - title: "Name resolution", - description: "Resolve names to addresses and vice versa.", - flaskOnly: true, - }, { icon: require("./assets/features/signature-insights.png").default, href: "features/signature-insights", diff --git a/vercel.json b/vercel.json index 0c307a4f33..53fb82e6b7 100644 --- a/vercel.json +++ b/vercel.json @@ -402,6 +402,10 @@ "source": "/snaps/how-to/use-custom-ui/", "destination": "/snaps/features/custom-ui/" }, + { + "source": "/snaps/features/custom-ui/with-jsx/", + "destination": "/snaps/features/custom-ui/" + }, { "source": "/snaps/how-to/localize-a-snap/", "destination": "/snaps/features/localization/" From 9695ea4855e6ea1dc999f73cb2a00d9e72517789 Mon Sep 17 00:00:00 2001 From: Christian Montoya Date: Wed, 25 Sep 2024 23:36:06 -0400 Subject: [PATCH 13/16] Remove old function-based UI examples --- snaps/features/custom-ui/dialogs.md | 82 -------------------------- snaps/features/custom-ui/home-pages.md | 26 -------- 2 files changed, 108 deletions(-) diff --git a/snaps/features/custom-ui/dialogs.md b/snaps/features/custom-ui/dialogs.md index 80831ad3d3..11d81d92fd 100644 --- a/snaps/features/custom-ui/dialogs.md +++ b/snaps/features/custom-ui/dialogs.md @@ -3,9 +3,6 @@ description: Display custom alert, confirmation, or prompt screens in MetaMask. sidebar_position: 2 --- -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - # Dialogs You can display a dialog in the MetaMask UI using the @@ -38,9 +35,6 @@ To display an alert that can only be acknowledged, call [`snap_dialog`](../../reference/snaps-api.md#snap_dialog) with `type: "alert"`. The following example displays custom UI that alerts the user when something happens in the system: - - - ```tsx title="index.tsx" import { Box, Text, Heading } from "@metamask/snaps-sdk/jsx"; @@ -60,30 +54,6 @@ await snap.request({ // Code that should execute after the alert has been acknowledged. ``` - - - -```javascript title="index.js" -import { panel, text, heading } from "@metamask/snaps-sdk" - -await snap.request({ - method: "snap_dialog", - params: { - type: "alert", - content: panel([ - heading("Something happened in the system"), - text("The thing that happened is..."), - ]), - }, -}) - -// Code that should execute after the alert has been acknowledged. -``` - - - - -

Alert dialog example

@@ -95,9 +65,6 @@ To display a confirmation that can be accepted or rejected, call The following example displays custom UI that asks the user to confirm whether they would like to take an action: - - - ```tsx title="index.tsx" import { Box, Text, Heading } from "@metamask/snaps-sdk/jsx"; @@ -119,31 +86,6 @@ if (result === true) { } ``` - - - -```javascript title="index.js" -import { panel, text, heading } from "@metamask/snaps-sdk" - -const result = await snap.request({ - method: "snap_dialog", - params: { - type: "confirmation", - content: panel([ - heading("Would you like to take the action?"), - text("The action is..."), - ]), - }, -}) - -if (result === true) { - // Do the action. -} -``` - - - -

Confirmation dialog example

@@ -156,9 +98,6 @@ Prompt dialogs also accept a `placeholder` value that displays in the input fiel The following example displays custom UI that prompts the user to enter a wallet address: - - - ```tsx title="index.tsx" import { Box, Text, Heading } from "@metamask/snaps-sdk/jsx"; @@ -179,27 +118,6 @@ const walletAddress = await snap.request({ // walletAddress will be a string containing the address entered by the user. ``` - - - -```javascript title="index.js" -import { panel, text, heading } from "@metamask/snaps-sdk" - -const walletAddress = await snap.request({ - method: "snap_dialog", - params: { - type: "prompt", - content: panel([ - heading("What is the wallet address?"), - text("Please enter the wallet address to be monitored"), - ]), - placeholder: "0x123...", - }, -}) - -// walletAddress will be a string containing the address entered by the user. -``` - diff --git a/snaps/features/custom-ui/home-pages.md b/snaps/features/custom-ui/home-pages.md index 7fd7fe0285..fe6555b7f8 100644 --- a/snaps/features/custom-ui/home-pages.md +++ b/snaps/features/custom-ui/home-pages.md @@ -3,9 +3,6 @@ description: Display a dedicated UI page in MetaMask for your Snap. sidebar_position: 3 --- -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - # Home pages You can display a dedicated UI, or "home page," for your Snap within MetaMask. @@ -35,9 +32,6 @@ MetaMask calls this method when a user selects your Snap name in the Snaps menu. The following example displays custom UI that welcomes the user to the Snap's home page: - - - ```tsx title="index.tsx" import type { OnHomePageHandler } from "@metamask/snaps-sdk"; import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; @@ -54,26 +48,6 @@ export const onHomePage: OnHomePageHandler = async () => { }; ``` - - - -```typescript title="index.ts" -import type { OnHomePageHandler } from "@metamask/snaps-sdk" -import { panel, text, heading } from "@metamask/snaps-sdk" - -export const onHomePage: OnHomePageHandler = async () => { - return { - content: panel([ - heading("Hello world!"), - text("Welcome to my Snap home page!"), - ]), - } -} -``` - - - -

Home page example

From 0b7c7879fb8c7a9a11ce22dd5c687745532271aa Mon Sep 17 00:00:00 2001 From: Christian Montoya Date: Wed, 25 Sep 2024 23:36:37 -0400 Subject: [PATCH 14/16] Remove mention of deprecated UI component Also move the migration section to the bottom of the page --- snaps/features/custom-ui/index.md | 100 +++++++++++++++--------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/snaps/features/custom-ui/index.md b/snaps/features/custom-ui/index.md index 679d028f60..02d544ef6f 100644 --- a/snaps/features/custom-ui/index.md +++ b/snaps/features/custom-ui/index.md @@ -27,7 +27,7 @@ yarn add @metamask/snaps-sdk Then, whenever you're required to return a custom UI component, import the components from the SDK at `@metamask/snaps-sdk/jsx` and build your UI with them. -For example, to display a [`Box`](#box) (the [`panel`](./index.md#panel) function equivalent) using [`snap_dialog`](../../reference/snaps-api.md#snap_dialog): +For example, to display a [`Box`](#box) using [`snap_dialog`](../../reference/snaps-api.md#snap_dialog): ```javascript title="index.jsx" import { Box, Heading, Text } from "@metamask/snaps-sdk/jsx"; @@ -50,55 +50,6 @@ await snap.request({ JSX can only be used in `.jsx` or `.tsx` files. ::: -## Upgrade an existing Snap to use JSX - -If you have an existing Snap that uses the deprecated function-based custom UI library, follow these -steps to upgrade it to use JSX: - -1. Upgrade dependencies in `packages/snap/package.json`: - - - Upgrade `@metamask/snaps-sdk` to `^6.1.1` or later. - - Upgrade `@metamask/snaps-cli` to `^6.2.1` or later. - - Upgrade `@metamask/snaps-jest` to `^8.2.0` or later. - - Run `yarn install` to install the new versions. - -2. Update `packages/snap/.eslintrc.js`: - - - Add a new section in `overrides` with the following configuration: - ```json - { - "files": ["**/*.ts", "**/*.tsx"], - "extends": ["@metamask/eslint-config-typescript"], - "rules": { - // This allows importing the `Text` JSX component. - "@typescript-eslint/no-shadow": [ - "error", - { - "allow": ["Text"], - }, - ], - }, - } - ``` - - Replace `["*.test.ts"]` with `["*.test.ts", "*.test.tsx"]`. - -3. Update `packages/snap/src/index.ts`, if it will have JSX: - - - Rename the file to `index.tsx`. - - Modify the `input` field in `packages/snap/snap.config.ts` to `src/index.tsx`. - -4. Update `packages/snap/tsconfig.json`: - - - Under `compilerOptions`, add: - ```json - "jsx": "react-jsx", - "jsxImportSource": "@metamask/snaps-sdk" - ``` - - Change the `include` property from `["**/*.ts"]` to `["**/*.ts", "**/*.tsx"]`. - -5. Replace all custom UI in your code with JSX components, renaming the target files with the `.tsx` extension. - ## Components The following custom UI components are available: @@ -1000,3 +951,52 @@ await snap.request({ ## User-defined components In addition to the components provided by the SDK, you can [define your own components](user-defined-components.md). + +## Upgrade a Snap to use JSX + +If you have a Snap that uses the deprecated function-based custom UI library, follow these +steps to upgrade it to use JSX: + +1. Upgrade dependencies in `packages/snap/package.json`: + + - Upgrade `@metamask/snaps-sdk` to `^6.1.1` or later. + - Upgrade `@metamask/snaps-cli` to `^6.2.1` or later. + - Upgrade `@metamask/snaps-jest` to `^8.2.0` or later. + + Run `yarn install` to install the new versions. + +2. Update `packages/snap/.eslintrc.js`: + + - Add a new section in `overrides` with the following configuration: + ```json + { + "files": ["**/*.ts", "**/*.tsx"], + "extends": ["@metamask/eslint-config-typescript"], + "rules": { + // This allows importing the `Text` JSX component. + "@typescript-eslint/no-shadow": [ + "error", + { + "allow": ["Text"], + }, + ], + }, + } + ``` + - Replace `["*.test.ts"]` with `["*.test.ts", "*.test.tsx"]`. + +3. Update `packages/snap/src/index.ts`, if it will have JSX: + + - Rename the file to `index.tsx`. + - Modify the `input` field in `packages/snap/snap.config.ts` to `src/index.tsx`. + +4. Update `packages/snap/tsconfig.json`: + + - Under `compilerOptions`, add: + ```json + "jsx": "react-jsx", + "jsxImportSource": "@metamask/snaps-sdk" + ``` + - Change the `include` property from `["**/*.ts"]` to `["**/*.ts", "**/*.tsx"]`. + +5. Replace all custom UI in your code with JSX components, renaming the target files with the `.tsx` extension. From ddfa0b7d72d47b5c7d6499ccf3803319dcde98e0 Mon Sep 17 00:00:00 2001 From: Christian Montoya Date: Wed, 25 Sep 2024 23:36:47 -0400 Subject: [PATCH 15/16] Fix incorrect link --- snaps/features/custom-ui/user-defined-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snaps/features/custom-ui/user-defined-components.md b/snaps/features/custom-ui/user-defined-components.md index b1b6b79c7a..a96cf2f3ff 100644 --- a/snaps/features/custom-ui/user-defined-components.md +++ b/snaps/features/custom-ui/user-defined-components.md @@ -5,7 +5,7 @@ sidebar_position: 5 # User-defined components -When using [Custom UI with JSX](with-jsx.md), you can create your own components by composing +When using [Custom UI with JSX](index.md), you can create your own components by composing existing components or other user-defined components. ## Basic example From 1ae5fd99828475671baf5fef7ca84bde688d86f6 Mon Sep 17 00:00:00 2001 From: Christian Montoya Date: Wed, 25 Sep 2024 23:44:15 -0400 Subject: [PATCH 16/16] Remove errant closing tab tags --- snaps/features/custom-ui/dialogs.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/snaps/features/custom-ui/dialogs.md b/snaps/features/custom-ui/dialogs.md index 11d81d92fd..0cd167e729 100644 --- a/snaps/features/custom-ui/dialogs.md +++ b/snaps/features/custom-ui/dialogs.md @@ -118,9 +118,6 @@ const walletAddress = await snap.request({ // walletAddress will be a string containing the address entered by the user. ``` - - -

Prompt dialog example