au4xse#YVT<`MwT@c<
z?7Bg$Qt}^k1Lc32vo%go@k@-=-4233B0JU~c^I`8HtIGL06Rzd%oNp+c!;rgU0WT<
zhC7RHFbRy?KPg5!OrfQ)&JrJ438LE5Su^%bRc&Flngr5hZ=-^&8~NvRKq*60Aey1)mKZO!BYuho{-r1@
zw0oVR6W{P{o~ZLlG#9PMegqiZ>4n<*i_eSUWK+`zFl&Sei?y&9kyjT%8>O~mo|5lH
zIoPPe}&
z_TdHRggg%jfN=qk&Oadlr*dqn1}
z<+Q_w-&LQXHR`f8j}Y!G_X&2xe4Va7M!(iU*mx-^ztX8BdzA|b~D`7$8g1<2l`kT*79rSIk5Q1sWTrp`gppvNL&*NTep2&!dt
z*x$qAK*zMF)DAJ}lo^ox0LDOes5B+yCL$)6D^g!^UG%y%lYTyANxxv5DyrbAD(!hv
zRh6D}Ioo2|e2&w_du+s9I!&3SShkQAaTRJ^h@^CEc*Vvre;V2#8O*nhw~o@D
znwQaEvdx5P_0kC=^sKDzxFr&-Wowdj+U}(ORR3u5wH|en&ghu$XK?
zweqRsPsa-FAq_0uo3yOf!{f9Qmra2TO~)H|448#aFO}*kl-DQXe31eAKX}uV
z(s5;#f?+MFhdtb2bRIYJ02oJr^ctdVuVPn>hN^mr6RnuZNC$1Wft#ut_p*Mk-c=6i
z|LM*S@Vv|D2sYBdi=t-I=ScL4K#L-Uj;uZcA}#)j1b24!#&d-vK!?T=NIl?FBjDZK
zy!4csOyqph+YK|IlpoN{BrX%_GAuKlI0l${3qW0Cr_3kky3Ups-DKDnbY|zU8`-^7
zp+gZbYy10w3w~sK&JWrwVygz3w;0$vFd3=XI<8-?5T~IM5}el`h&_1T{jQIG1PrTK
zbJI>kMjJQ{Qu^K(cJGnrlmWkOtbqO`bL1Jz)86d7C${$ylrR2jtiWDtUqLc>y_w)q
zjUr|K#3t{jo-cD<#S5iiFs{5Q-;1@svwm@l3%84#
zICp-vTS)Q+E$%xu>vn
zhu`y;$?Qudl)Ynf!L8hq{KY@70>4defAx3W{=wV=j(?5nigNGtL@bfCC+*B=X_FXdlb%@1W^&5xqIzA($g`K^z;$K$F
z_g&U#5n6LzquE2|5f*X#!D2;2aNwtcw}YkYOR+Zf<&i`KdHMa
zM^vU2pG?y>*B|U^hS^Ww@E-fQXXY?_
zyZQwyRcKstfS+nX2Z79{?R6Zy7H7i
zAY(;r)ho2to6_749J9XMzjHdx_Y0Z!3}dVw0S*%@kMy9hA@Hn|Y2neGtq+fYjIa1P
z=Levxdfj>!%_Y(ZqMr(k4?ry=e&?@sMLicRJLhc&D%%>97s1nIQb`iF+vS@ccRDT0
zAq~HX`A2)o>PgUJ{p`LqLa5k(9(gLpA)y78WwiJR9;21|9M9AO@edM;p_Zmv`{41k
zWpS1+ZrxuE8;7iXqrybet81c7`y<{d^9-a^HQkQMDf*KN*T1>W`GeiJ{IFK7esJNB
z3_k)m4s&>39rk;7jb5w
zo8M8v;{|md0wSDOb+{bT7Y~AD=g*fJ!%%P%nN!!BD*U@Rds3ccXo;8S^8ZXmvMI)Cy6>uR#f{X
zP<@)yoy9}#x4qdHjdQMcyTf)f0M(7YnTj0b7*
zFK`GmU;q*)`}?nrhvsb$_D=srv5COU>ovvK-%)3XdW&VMM}YFTAliTsj`94Br@_3$(HcTJbWX7Uth|F9VU!dWFo}BW30lX)`E=Fu
z2x$HOgtC
z=%2uw`Ru67%VQJ0(kDj5daAspLHjNv3o1zcVFCZfx8S5O-Z6OQqVx<~>|(RD8%OM_
zz;J-f!QQcizM*>~`{5vH_X_ZVTSbl(P8R$Og8v4P9Vez`{Bw(uu;^L()GQo3Z8R4#
zPkvtNuy#OJ+OkFf7ntCiG9>HsBpMoyLqyD~bo`=uT_?|=`KprEg>3QH1AFLPJ0oYe
z*W|+3eot6X#7lo;@KA1XMR2Vj$%^1jSg~YqCNpb*cfrG@
z-hd;IA14TJjCy;pIc
zZ4TwIqJKUWUC(~Vaq$5(H778i;b~5=Fx;qPXek$e@_N`}WfS)-f8XD?+12X+8eGXX
zE?#cAyVFzgb8@?#OBa*Gd+@HEJRQ=qE
z{&`F+iM8mjV-N}_NZNH%+X&MbBvmYmUjo{7XBeb#UeFh65*|&rVRS1O>{l3UI+@)K
znAxxT>6c31La`lK?_7
zZu;_|K2wf4v_MDg*+cp?ZHQ2jUf&sOl}PEDM$05^D?MxL_^jo^7cqsI9514C=Lg
zCQB|_UwEu5sK+7ZZ1D)-Ej}rU2*Rk^uCMjikrxpGkyNoFq@M2!wAE~zF3Qa%
z$$G^~sOysoM-KnUg)=??$~a{Lhzu6%x;;(KFmPH2J%%7TGv~1GviBxI!$g=f9j@;9
zrC8u!x-9*=u0M=g+Zo#C%2S4=!;0N}isYX~ZR7UUP1kX~UiHg9+lkB+6QY#9(m~a&
z7%Unhu7;f)2nPBcTI2Tp4%Af0i=%QT7fIdP2$nxF+1Fm%OZfaE(0>rew0)(@2(h)(
zwS?DGr({fFH#S8vV$@KKILObslT`8&);6wGdeB@hdj_c5yj=Oz=s_msy_xTnK=A%w
z-Fk@@c^Buv`7U6_~#~FsZ<9G}LC%V7zxP2`cOz-q3qx>u3*&Jfe@-
z*w(oRN4K1Y6ypf2QYKkjH>NtlpDKJ2zBMu>XP(|d1a}wNmYWOv*2w{6dO_3_*gC${
zw`Y|r5`yv4n`kN>67}w*6a$&j7qqF|(#U5J7Rl`?wC4kF-Nkg7ay!i0@2qg@8<*lp
z$yruX5eK@5?v`z{?@QNzY9?mlSX;9F7(XfZzg7db*(Bh7_(KGjbC9XYdH3#tfnp{>
zaj`l$*C!88K`nr$t0|l^H2@bGi|PUjD9rAHk?8~ILTGX4q{|LyiW(n@;9{HB~yaYv)
z)w^T^O6Iuq?t8F|v2GVyQcL)W{XG9>1yT3=P%q4sBnz5vm4C?Io@xPKfO1Q-y(O0M
zL-kaR5aktz7k6fy-3~XNCc914Dm~wlvU0+H(}|e@NBr}vS9ev~;#BB7*a(1j5f>Na
z2PwByG{$Ps4sp|M-y>1pqOfba+yGuesg_4T(6`O2Bu}*k#~q@k!(Uj_uzsxe-xcY;
zvKy+(=St!FQM`B_QItM-#5~Xc+(K>%x)4roci>uKgKQK-EiG-^X8^n1L?)JI(
zyldReI7FIkmcZnvk6jqyK{UiN!cupHh
z1KC6W49aa-Cra7FrS(-dDH*`Vsct{G)o
z?MVDO5>l`5Nq2>urp{Tb{kvBdl5S(>iE#KS=m$#vZK5K)+bw{uuLeQT_nWta+?g(*
z+w2n!SBHv*)0qc`752B#bCSk)
zC@r7IDNI0(q|r4(1Y}Ps1_u*)aoxLfg@ReWgF7LkB2{DK}jkqS2i_8?zfI
z!uZ{6u3i|!Z|+aqh334My&APAW04jf*Sc3k9HX-XgAZVkTKXfvDvP^R8=!W_!QNa$?V^kYB*Ot=ls8N4hYEGpGeQrPg|cMe~9xdiIA
zv`@S`sAnY8Xb~zx2p^7bsd^E!EGdz(u?%v2#on}|$xQkv0ognDH7!{FSYem+W@q_}
z)e`-{DC!zGmlfDEKV8YJZ0I=-6mS>`z$AOHrBoo)1?9RSbI$I;W33un=>bXtj{vi2
z&Zn;2u&!tnWhFy|_58xz1;uJ!Sx>ahz<10S&V>U_zYM9u=8@wj-gw`#JGJnI4Aa^+
zfkcL$-;@*gW!rttpQ8F<@8euH0*84i{VQinJ+RBFL=}8g5JcE
zb?CnfM9TI}l3vC2(GdZHaJm|52Fcoj;>m4x5USWny@`SH%&7%`p~jxL;IG3ij-Odt
zfVuZhqbxft24uE^$u9pO)cX?^^)>}Djp
z>tPg%=6#mN#DCmlQ3&N8ai9!()$GE5>BB$cmRcfDPW*8QJFB0zoGr8)Jng>TV)I2f
zad36^5wOk-oq#Nhd%H%hlq8*4@jU{_kf};2Y|mqQ^vOoasn)-JR0|$=c5a`ohmF0`
z=k1hPbyR4uz<;Wa?BCH9;Wz;T=2c*C`)!Oh_cl5gs-bjWyf1egjNag#zvfpp
zRa>GG!}Q5=WaVcR+mG49+D@?k^?ptk2k@fe{XB|)RN~H$2C$BvocpjugiM1?)d%AYn^P-h40;ty+bJg!
zE9Sf-Im7PwEPgJZUf5X#!a3Z9Xk*)YrtxgMlVi1eL6&U6S>Eh{!DViEUvd)I$~Fmg<`$d@img;FkodFTbq
zLTtj9q2FF~3Li%36(LaECv79P_!%W%en>r|_ibxmcx!Q1x_wwpoNC`$gVe~cJH86(
z2=FRh%K#bXe3uBnXIN^X7FC$8&1JW+#uFBPr)_PGq0wl0oaAW|_S4@F4{RD2
z%u7`c!>)Q7b>I+S(e0#Cnzy>}MXqv##$xXJB|1bL5vxii%Og@Sv-y1@K-pxLSh*Un
zTsb3@O8e*cH;vg4mWgK&R=H=m8cK2i#^Nu(CPbNb7+f;s{diYf_qRSasZLet~I&JJO4O-5B%$F5``(Cn3I632-){8!3$JMnJD|0=VP?tQ0j1~@1;Ck<&k~N
z`1T6p6sc(^5?LN+!MU>)6f7)J>H`psLl}eMSHabSZ!f6Xe@3zJkNVZUZMRCbV2$df
zjp4`%`5m=R^9F9`Fq;w2O$6(zdv7B_)_#gHxqpjHT$(4ZpN?M-7TE535@v9kx+eh?ef
zvQby#t#!MNL+UKI(f6yIDuk&hJd{)@`8he{4F}v!(x#*~B*0~SS2}{c=Up=w4B@&^
zaIRt9Y`4Hc2|`T_AzC9C@LA|t3(IuK6^~O>|I$5ml18$VuVKZwyQqsCL4H`0NCXYMs)RMtWKEH!)HKg=+ERo+f775^oCM%)x5ShjY+nhhg*!NzZ;ribR
zz8eu^udBLeCsrktQx!hB{08MIm8?AtZ^u@e7|Ys-o_NWD1bt;Ig=Hutf0keV&+EB4
zn`QBpX0)66Z{@b8%OVyAlm{hp9+O%o
z$6sxQ>T6|eW=~KFn>jC3$`7nZlE|YN)z!W6aN!OYEh-+X44ll@+oCW@Eu%kA?DmXa
zW*>yNHK(Ga4ZGXk3<;naJPRKul*>49Vtsg_>pup}JaVTgArT!)qWbbG(g+bXkDwdhIt-Zss57Xle0
zfetIB6Odm;e0@#}y8MbY0U+x)gHBJy)w+Q-$3UWM)LwwWY_j
z`xBkiEpYkdE<8o#@sHA!guP$E8I30%;S{icqt=?WX4lddA^~gfd7*tpF7AAh5{?mw
z)ZP?NcnvKQUoWojCE8t!?bB#lU9az8gj2&eqgJ#>OaZNH{d!
zex&&xkcQ$PusuyZ4#VrA4Apd)
zfY$4s<`IOHz*XOHujI(beSRDX%lpiUk|*Z9Lv-z$EuoZ_EN;aSqnAsLaydYGn$-o6aL
zovxbMY%nOz)N5YY?%eq%J1{5?sIVZoDPnRNm$#L+cKFPg{TrB(s17-PY;SON?cA2dc(x;*JluG<8-G73tcD
zGA@~LrPh|lC@)L!&+j({?_?s-V10E(l4T@f507DM_IH-%=K3+=voJNs^nju{9dBI3x4kJIQ
z@R+JVRcZ?#WP&9-P*Xi#LrE%-2FZ8IijHBGEXU6jY(d*YLq2_JOmGf-9bMEEyruhM
z!2CIezfiePmq?tECs1aVb~{!G)$5H-W+{pzaf6P!Ex&Sn26ILQi0Qq{^7Qr-ZiW}&H3(!4_t-A(bY4^gkAvT?I<<0HVT>S#An
zT#Uaf!6W$a=_OH5yg=mn&D`A6@bz1`Aj
zq-pCZjZ>l>h+fj6tbX)UJtCf0O0GxBgf<&uw{<#WGJdbai=
zDfhDr;`gJ(FBK^J3ne2ZSQs1Q6l+O;a!1@utNWygIc(m%5@Bc8scq2zPT3K5n^L8|{I}EXM_B>ni#UZK
z9`_}w;GSwe^u20>7bf!-6d{c;x(>hB18*2}jmLbNccpzlx9EQ{zThVgoJ#pbpOz8I
zbt29qCT`&(1TL
zbbP+zY}5v!+Vbf~n;yST-wl7T^48lg8kRc=@EK~
zt{ijcEMLBQ3R6E2)_G!3xDml85IeH6+r=*xj0*P-M)gh}Pz4(ugbKyB6cLp!!|z&r
zPX}vbVhLq0O7}3uBljn&Kiw*v-`kXnZX8EgpL!(k8ZG7WWSOJzq>MQkQ`<+2CMpRuui`&`%>>&H6w73X5G;teu#b46YynXiy`ASla<#mfw#
zL*~k>sI@yYj!fR7gprz7gx0bu)il)qR=tX
zy)wCtRF>@N(LDnzX2whOsd~r!GdiBFZ}rZ`M0≠w&1GEUp9Nbu;&pm{b2p00RO1
z{>i6m*BWH+$nx0j&$^x~q|^Lsty(@Ud`G0-qjDpa
zZ}#m?wX4|fFZG8TVOEc1Hmjb1ALs2@pnSLo0Cw$CMFEx7OK?v-S4BLo7uB4<+B}Z&
zRyvOX>#`4uP_)iL)a@PzIs4APIR03#bg!J2F{JC>9=d>&Dr#`9PjJTsepU2uJ^r=f
z=NNd=u9SM6I6Bg;7b!cirw1d0(wjyzUP^50Xb%*W
+
+
+
+ Needlework.Net is the .NET rewrite of Needlework. This tool was made to help others with LCU and Game Client development. Feel free to ask any questions
+ or help contribute to the project! Made with love. 💜
+
+
+
+
+
diff --git a/Needlework.Net/Controls/UserCard.axaml.cs b/Needlework.Net/Controls/UserCard.axaml.cs
new file mode 100644
index 0000000..8f683f4
--- /dev/null
+++ b/Needlework.Net/Controls/UserCard.axaml.cs
@@ -0,0 +1,91 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Metadata;
+using Avalonia.Controls.Primitives;
+using Avalonia.Interactivity;
+using Avalonia.Media;
+using System.Diagnostics;
+
+namespace Needlework.Net.Controls;
+
+[TemplatePart("PART_GithubButton", typeof(Button))]
+public partial class UserCard : ContentControl
+{
+ private Button? _githubButton;
+
+ public UserCard()
+ {
+ UserImageMargin = new(0, !double.IsNaN(Height) ? 100 - Height : 0, 0, 0);
+ }
+
+ public static readonly StyledProperty UserImageProperty =
+ AvaloniaProperty.Register(nameof(UserImage), defaultValue: null);
+
+ public IImage? UserImage
+ {
+ get { return GetValue(UserImageProperty); }
+ set { SetValue(UserImageProperty, value); }
+ }
+
+ public static readonly StyledProperty UserNameProperty =
+ AvaloniaProperty.Register(nameof(UserName), defaultValue: null);
+
+ public string? UserName
+ {
+ get { return GetValue(UserNameProperty); }
+ set { SetValue(UserNameProperty, value); }
+ }
+
+ public static readonly StyledProperty UserGithubProperty =
+ AvaloniaProperty.Register(nameof(UserGithub), defaultValue: null);
+
+ public string? UserGithub
+ {
+ get { return GetValue(UserGithubProperty); }
+ set { SetValue(UserGithubProperty, value); }
+ }
+
+ public static readonly DirectProperty UserImageMarginProperty =
+ AvaloniaProperty.RegisterDirect(nameof(UserImageMargin), o => o.UserImageMargin);
+
+ private Thickness _userImageMargin = new(0, 0, 0, 0);
+
+ public Thickness UserImageMargin
+ {
+ get { return _userImageMargin; }
+ private set { SetAndRaise(UserImageMarginProperty, ref _userImageMargin, value); }
+ }
+
+ protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
+ {
+ base.OnApplyTemplate(e);
+
+ SizeChanged += UserCard_SizeChanged;
+
+ if (_githubButton != null)
+ {
+ _githubButton.Click -= GithubButton_Click;
+ }
+
+ _githubButton = e.NameScope.Find("PART_GithubButton") as Button;
+
+ if (_githubButton != null)
+ {
+ _githubButton.Click += GithubButton_Click;
+ }
+ }
+
+ private void UserCard_SizeChanged(object? sender, SizeChangedEventArgs e)
+ {
+ UserImageMargin = new(0, !double.IsNaN(e.NewSize.Height) ? 100 - e.NewSize.Height : 0, 0, 0);
+ }
+
+ private void GithubButton_Click(object? sender, RoutedEventArgs e)
+ {
+ var process = new Process()
+ {
+ StartInfo = new ProcessStartInfo($"https://github.com/{UserGithub}") { UseShellExecute = true }
+ };
+ process.Start();
+ }
+}
\ No newline at end of file
diff --git a/Needlework.Net/Views/Pages/AboutView.axaml b/Needlework.Net/Views/Pages/AboutView.axaml
index beea255..c049c74 100644
--- a/Needlework.Net/Views/Pages/AboutView.axaml
+++ b/Needlework.Net/Views/Pages/AboutView.axaml
@@ -8,160 +8,41 @@
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Needlework.Net.Views.Pages.AboutView"
x:DataType="vm:AboutViewModel">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blossomi Shymae
-
-
-
-
-
- About
-
- Needlework.Net is the .NET rewrite of Needlework. This tool was made to help others with LCU development. Feel free to ask any questions
- or help contribute to the project! Made with love. 💜
-
-
-
-
-
-
-
- Thanks to the friends and people who made this tool possible...
-
-
-
-
-
-
-
-
-
- dysolix
-
-
-
-
-
-
- For providing and hosting an auto-generated OpenAPI document of the LCU.
-
-
-
-
-
-
-
-
-
-
-
-
- Ray
-
-
-
-
-
-
- For guidance, advice, or providing help via HextechDocs.
-
-
-
-
-
-
-
-
-
-
-
-
- dubble
-
-
-
-
-
-
- For encouraging me to publish Needlework. This project may never have seen the light of day without him.
-
-
-
-
-
-
-
-
-
-
-
-
- Third Party Developer Community
-
-
-
-
-
- For providing numerous documentation on the LCU.
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ Needlework.Net is the .NET rewrite of Needlework. This tool was made to help others with LCU and Game Client development. Feel free to ask any questions
+ or help contribute to the project! Made with love. 💜
+
+
+ For providing LCU Schema, the auto-generated OpenAPI document for the LCU.
+
+
+ For providing a fixed up-to-date Game Client schema.
+
+
+ For guidance, advice, and providing help via HextechDocs.
+
+
+ For encouraging me to publish Needlework.Net and other ideas.
+
+
+