From 84f8a6bf31f7c34865ea3532e6455d4ce2e616a6 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Fri, 2 May 2025 19:23:38 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20=C3=84nderungen=20commited?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/app.cpython-313.pyc | Bin 80252 -> 82400 bytes app.py | 104 +++++++++++++++++++++++++------- init_db.py | 2 +- instance/systades.db | Bin 131072 -> 0 bytes static/css/assistant.css | 17 ++++-- static/css/base-styles.css | 44 ++++++++++---- 6 files changed, 128 insertions(+), 39 deletions(-) delete mode 100644 instance/systades.db diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index 39c4220084497b9a9d6ae65a5553e96499e7f455..be634cf6e037dcc45797b872f80076bd96d11c77 100644 GIT binary patch delta 7409 zcma(#d3=*qw%^U#CTSa*v?)oOrc2tUyHFOPEM+NBXjxK_u_^}o(T28Zdy|478Xxj| z!qd*cTr>jC10I4fGmJoZmKouRGlDp%w6;uZoVq#lXK6$ z-0i#H{J-q-qw?4rF)=Cue#zhJ>kDFz#BRNpHO-8coK-T?oX%28l~Rf0D6=%oWfd># z*yVBN1iNg)Y(bbra!?I^wYh>|VQ*HXvISdIQ4Sr91iPG_uQ2N-0^3Cv3wFhXrGnu2 zL=epE<#8our9Enlgewa*n&7`6G%5!$E)xB{B2keds_zwvju7#g2#L;eNft{&!8+7} zuvik|lqZiWto-mO_Q)>P;>ClRIbsE&CS|~$VAt4V?6HNCF(gRI6lzijc`^35P(~JE z7MY&`Nhe^^vxp;kAZ>MGNYy1{_cx4I8wSU69LFRLjukZ;_F`qSH(gjP3lT#p)Mi2o z;TW|;VjN)~85yJ9SRxq`=SaIg9Or!R(j^ntKx2N$;$q0pKEiJLQIn=2CYOY3yQnZ! zp71{;Bxmam+t^2YQ|cqK7+&e*NS8x0NRF(uIieD^dZ@%5Ay+k{Lzq34wK{b(Bl~C> zW_`?{Y+9(=nL?USV+qlfg5yD$%2JplFwJw#B$FMPm&_hHqLI1P$E9cGj zcv=R?>vTeY6zS(^RG_!zc8hm# z9Efs@9*@&i=U!)=>2yKDjg4)tI?=_$a5OsIPLX=n#e}2^>pe}4HWS5djh;d9DuRVP z&U(>ND^hnrv!dDM5nY~Tp0zC^g-I^(Qt(1hEdqx2Tzjm;pf&05@*Rmf(+8A>W8B z1Xqz=FJ)JjXL)Zb1f9`Ww6&-=-r5y!?aUhA9e-!%q{^=NN@$yIsibG&(%yw)*Fq77 zi^x(*=PK__L6{+#D*?g`$x_K@gMSUc-lV*&9?_X#?N(d+B`GoU$i#veDHTGX908#&gC*@e%o-?P3qdt6uc zxZ}~MMs;VGBO?=nHCuPxv;Cgll!C65f&-1+DHFG-F6mPGa!a<&>(OUl)yDf&TUEW< zv@UI0k2d3)&Un$3-j|Wxmof7*ximBJh9FHg^b67i!%dZtVC?i7OOHGMqMzMw6k_$A zhMb<5oPJ4eOx4h^J4?#DGiG%{%&A$s)^A_mn_ASBT68$JJ9Wwy&5#5KC9fJXdJUuA zGK}gRJ-yd3qsuVklEDn>ecAba*_9AWjuB$9cuoBZA;r?Klv*qh)<_G4HPYN^o^h(~ zLQ+*% zVUhhYZn}A{PB>kt0eD6>Ew<7moYiR%T1*H_5q~YZEDHYq9Iq*ZzjHcOWs>w9k50rzLrP9k!ugEh^Z;$%f8 zu5ukaBxcENfR?j9F(A(a>~7YvlF17JyN}JUdr)2s*m8Eh?g`Z>z*fSoj^_Kt`Y(y< zP8c`9*nKbCPK%gnXS9F!ss;%e%QQ_R)nkFXF1<=@6D{oJRy}*5EG`N)4iY+^)ihBM zd$XxXJ{d@B{1VqOsRA|VM0TPzUx9+Olzq}_h%W)url)v<(+vp5Fvo5k%cTWIu8@zk z7zCRT;C4pGu~ur9PX*1N`?t|JDGBMsu`_K3GLBtpv#6#6doPB+5yCI=m#(%;Bvj9~ zJ}^m6Ex=>l4^${B0XZgN9akFtzgYXBR7T^7z}7xAS5XcOI+FeQp>m>QBOWd!dN%dp z73rvGiwel_fTQ&oixWW;f(59ukez!e!CY4}oB?=BQEplf z5>>V&T8x^(yiq+0hl`kgV_Q6TC8NJY%1#8;Z0E*2c@2o&@}JwdMM~n?J)3f~Bg|=r zn+q3j8auQpg;?0RP16sN*MX4Ph^43#P-7c2%B*OF=2Fgu0^;Q zNVugvJBA0Vpw%dKKYO-)vSK-)g;M_q?fYbkS|rCY_RB(r2&hft)25PyqE%>)^Q=G( zDC-?=hsQ$$(nirmZy^(<>1+>VLzwV=@EzrI5wcQv4HBLd#gCd7EzU4X&W#vNiori1vvlmb>Ykn#2t zp^b{LaDp=iwTCXDJCwop5au|V7;THDJo;*Oe0LsM&93gwmwQ3!cm9Mu< z^i*w&9cD3!J^5^U@-!6K1OgBdH_7wCs?gP}``LW;1`xO?g>|=AV1L_D$hI6z^jGc6 zluivh36}tq2$ns@sOJ0|Dh*^8QV-8`9$VBvx+uwG<1W|Z@S#DMtJ%v( z6WQzSQEckLSoKDr_hZ~Q1ZLV(>pywWCN+d(ZUOc|C4CGNZDsQhCB^>?D7F#bDbkcf zafAybd(ab?8YmTygd%kfd-RZ1@fe^ZWd7eBxcO+v>xVC@iE>VkbGye{l zE%8T6wCw1}U;xG80KQX?RD#@nu@s~9oi_0A==~tB`(`#&f4G(vIcFpvepi({0Tr8_;+?x zNK(SV1m~xk4t12ojDJv-gy*M(K8|+Km>ZXx#lkPZ0d=j|D1tY1Nq-L9CjZhuG)hP< zJAGn4v9g4d74j#6{E)x)#mh+tmfh{Uxhv1c{$NunRfD3H}A&UEqO&;90 zKSusGq&nHDmr_++0Kwz_4`13WghF9l zS?0|IqD>miZ4VkqK|)MKvJu9BMfW4%6O<>*%M*>XUm@Vz?{k2`VT$h+5r-+4>~3(#xU1>J?#m_O#c%_xN8OFt7tb8o?)-QnFN#R{WsI(hk)?5 zUwwX@tT~)iuo)=I%|DA6Pj4?``vAZk<6RHy@P>z@c?)Ae&w(gBZeZcKtLXvM)DEme zcBDI9$!inr;F!T2ZR+46`*9CEmFHPjPqF+k*!_pUrsufS7+!+IwOK)5dhi-%eF1~x z?xGOm6KuFR-x1QkZ%2Ts5w2x5JKdM2I0^w|$^9Sq?fC8{powfczd63}jy^te69`&^ zD`8TMr@pzZuHHkBfx&V=x!5k@FLuFia-1Fk1r?i`SBuojTG|cl$!9L*sD2O3 z#d4U*8(4pz#h>)ocnO)w@~%{C%Yj4n2xcLe!+vokUH&4VtJn)y_LD0Az3=9dn3F)T zDMG#3_MU}Qv;TfCQ~pPwulHYiPf3*j186lp#Xi28D}M#>|6r!~HPs6PiX+aW~y8X&Y18F~<&sUK5Z%-<=3Q4VPI zUdvLw0fN8c8ccb8srpUS8(^=xp04VI@gC0hKXv_#H#;r(vOtrM`ybhjVM zLN`@(9(wEnG;*`2y+ELS0RF*VxSdblX7Anp2JZ5gKOYVG=)c&Iz^5nQ@c5KHjaIDe zH(xZ4#&4-$3I}-X9_m;jE_bYG;GYix6~1&iJj=ufR=_QQ$DYk9zD(Et1@+!Ra1p`( zvh`nPW_|)_Kn1B&cn5MeiS$DxC>$>L8n`X~7QNnJuY6e|{|4y${eS=Rh9>O-iYOa` zsnaiDoQA;yNr5u)DK*LV{Z|yJCYODmM-dyj;!BGr=_JnQQj>)f`M{=)EebZBe?Ra&v;t|FzB#cZSN##<2#OUQ566-;d7!^b~{t@;hTH*&OuM4kg_+yyQLSBVpa1clEM$~aF#&L*?9gQrLKLMiP$+#yD>+5B``)p_N-+~(bQYPYm;$UgWk*F8iIWhW z@9rEj-e5s@Sa!I!@s-a%x5|76bI26M3{Xf=`aa1a2T6|aX&c#37IjR?B~KGAmYCXr zAN)Gb^&ozpt6~&W? z;<*#hz=qUJ>m9CIc(kW@^w4t%@VKCOC{Wy^_&laKe<@B-inEa7WTMYwANK(W7^Sq$ zMX^H^TSKuW6pK%1JXJ_iRQS3CrUdu&j_gA6l+4e@6LcNshC;n ze!68>dzo!!ZmsO@*hRJv7bl&wEZ|z~Tqt=8L@UKzO{_mIFXC4(G^GR+$(`(h~=93}X zBHNXl!?;n2z&gJT1Xrx>DY zO{{2N>Rm3~eEooEz;%7JPFI`IABS$PZEo}sPj}u`Jb5K7=|-KH8+4|D@y5le#Krc9 zJwrmaw8hRfMr_rl4EU%`8=&Ue2cjAHKTB7eJ}8ZgaNY4WbS?-~(Yqw<3kKAf=B9dY zSgLEH!KJ=NiGG1Xi?_ua_R_j$+Sr;gn_ZUD_4NB})zU@-eM!eYU3zDmY6?l=urIJI z)EYfN6*PqXjcz-|y`skv-a?pzFam+w7B$<{gB-|*j&4MNjnmP$5q^eXM!>S6MgX@! zZLl*m2Eh)HN8^x;2MA$7WZ)mIL45}b5PDHqM%ey_?6z~(xXy$z-PSQ@)3bN2+Oeu9 zy|632@CBheed6ZoQ?}H9in@`RyHa9l=juRXQL?mlUUXiwQo&)VZ<%T`N|J+sT62?2A($p>eivRC%Tj!JsU_>867 zncp4j=`?wIts|e9+HKA6jLN6CL(Y^fjZ=tOHTtDc$h%Bp@A)f?Nti|_VfQ?c$npZQ zLK=)stRkQa=|H8jv>+2)KxMF(gZB$rKxMI#rp=aYpmO1e(G2CCrhgO5SQw9macB|y zs zgkn&ctz2u3H4qfKm}gBAh$?!WY~dP{r4+;x#=ah6FIJviGgq&_@K5%|+9`r+2!$z| z^gxwx6DYMP8z1<76j9lS56u!M1LMM@Y{J8p#K~G8E+A#B{oy5~f<OxDj44}sCq(zZ+Ae$euD%P^OIlcnM zkjlqUVJAX0>)V_!%ma3ZGIqz_F8XLSJZ#Ya< zL!%U+S5b(Q=@hgOMU$9+=U594I44&5>COov@vt+yE5`HMLQAR;2!^GQJ7Z}5;1ph_ zyqobz^4M+9&S*oo!-E=JDs4dNy$C#(QVi%p9yjv(kRm{-W?v|{G)Vp4u-i;MDEk;> zswEJtmqK;WrM=oBagSAVb4a3fD55Kvc~6-@VM3`gbB|4EtH-$#0f?wFx|*q`@JPMwItjUa>=d5U<9m?s)!CHp>RUEHO@dq^fpcGPrK4AD!_D{n_HdtUzuP``gQ7#I-E$K59B1+4)&`V2@msR=+N-0;@BqG+5>#-ICN}y|uDA{?UNk6k4)qwO4+&$y zBkVOlY>^Q7ni7VDz?a|O0y19dJ5r@ji$tVVrIilz##X&yiH}sKo~}nbP3(y`(u55_7Amj4(WobjSk9Yw zkYu*<%_`x?z@DlcfAc@2trAFh;0$YQ7jYMP+v1JSG^BwH)8tA&LXX&nz!JX$`1~!% zT@0XFmNfVp>vl-|kfQ@`OELuSGGQyfvx~-!yK6 zmg(IX>EIj#PX%Qg8e@evB1;Obt) z$mU@*)P~~k;F_Q0-2*XG8Rv4>qIQAoK*n}f(Bp(MyR|1%cpex#6@O1@R9hr3TG~;S zuk0sC@#Q^*)YAZN)BlNvcY5@!n(*?0qZ67(cjL_dhd?|_BGF`KI-d@entMK1H~@kqW&Zh6J(%BKv%QXpKT(qGvlRv;TVh;u+mGJL}KSI-NK%}WS+#|4)0^N9R+C!{^_)@ zE7c4Sl*PXKdU#m<7TC40O8N#6{5yh{frT0?zF4U?n@##W+j1PnbzG78KEKQQ))4WD z&s~<^!FUN5D_?$o)kspGOfWTqJ@wz&7F7)WFcg;j(3sbMIhV93XTE&S5Pbq> zx%G4p2DzO5=z2;FmbogzcdWlD3~xr|`Wlfph#jo7Z@P$Wr!_(L#*u_E*K8RXv!oxc z4AT10Uw|sS-lx?3uCXkfvEo5CnUi}=vyJd(~?_@;+g$gmafB`K0*G#PFl(P^4)R7O;q{8 zIN~Cea;Jl=$ovwGUi*3k$i~T5d3-#{b@T!0j#AAl;CG8F|BX4q$3}TXh?jU2xAHQ2TDe}S*Bv;=@dDdQ}5&j``oJ%At4T2LAFur5qNV1efV+V2@wclhuV#lUCtjOWNw9t|A zXDK8_NCEXyIXabGvGPmfF;u8#TW@yAqtZyckOuObJ4({X$Arw0N2QbEay<4m@XF7{ zg3t#;s!}miW!eQ^ym}e^lU?8?OhRr#x_= z8k@XS3WP)2>xv&r9?7PGaNsNRJks3dbhJMMfnQ-;fKts;{W3}WAd@fTl2K%_Y;uz# zVLX^$-T^PC@dmLN=--GP%^pICI1vVKi}I?mBnkX|!Hm0Y43hlR(rZcI+!4 zv3lZ^Un?TtOTyDX@Vgi95&UbcOty|AQ^g9H&?CyT$B}lDDPJ2$o+niuyT_9!hILdZrKi!dIc7@-saf7zh;D+Qg0umGVJ zf#;kebsxh02&)m+BCJEe=QG8(FU6NGJTcn<@hM30Jw~5Lz{{NC{Yv*E;PppeLO6tQ z7(lf_;|kISZ=fE2nxuGD@oR_Tl|u32pxDZIrBkeMigin|I4Kqr{T1%xa{%ge18oja z+#!lvLvc$eCZA$LwdQ_1YU7WHs;S%`tZ#0VDyRffaG?uL@7OevJZ?xxC!Q+?o!*Wx S?s60iFW*c$CQc?lH~tT#sgwW! diff --git a/app.py b/app.py index f4c2aa6..5fa799f 100644 --- a/app.py +++ b/app.py @@ -487,32 +487,94 @@ def settings(): if request.method == 'POST': action = request.form.get('action') + # Bestimme, ob es eine AJAX-Anfrage ist + is_ajax = request.headers.get('X-Requested-With') == 'XMLHttpRequest' or request.content_type and 'multipart/form-data' in request.content_type + if action == 'update_profile': - current_user.bio = request.form.get('bio') - - # Update avatar if provided - avatar_url = request.form.get('avatar_url') - if avatar_url: - current_user.avatar = avatar_url + try: + current_user.bio = request.form.get('bio', '') + current_user.location = request.form.get('location', '') + current_user.website = request.form.get('website', '') - db.session.commit() - flash('Profil erfolgreich aktualisiert!', 'success') + # Update avatar if provided + avatar_url = request.form.get('avatar_url') + if avatar_url: + current_user.avatar = avatar_url + + db.session.commit() + + if is_ajax: + return jsonify({ + 'success': True, + 'message': 'Profil erfolgreich aktualisiert!' + }) + else: + flash('Profil erfolgreich aktualisiert!', 'success') + except Exception as e: + db.session.rollback() + app.logger.error(f"Fehler beim Aktualisieren des Profils: {str(e)}") + + if is_ajax: + return jsonify({ + 'success': False, + 'message': 'Fehler beim Aktualisieren des Profils' + }), 500 + else: + flash('Fehler beim Aktualisieren des Profils', 'error') elif action == 'update_password': - current_password = request.form.get('current_password') - new_password = request.form.get('new_password') - confirm_password = request.form.get('confirm_password') - - if not current_user.check_password(current_password): - flash('Aktuelles Passwort ist nicht korrekt', 'error') - elif new_password != confirm_password: - flash('Neue Passwörter stimmen nicht überein', 'error') - else: - current_user.set_password(new_password) - db.session.commit() - flash('Passwort erfolgreich aktualisiert!', 'success') + try: + current_password = request.form.get('current_password') + new_password = request.form.get('new_password') + confirm_password = request.form.get('confirm_password') + + if not current_user.check_password(current_password): + if is_ajax: + return jsonify({ + 'success': False, + 'message': 'Aktuelles Passwort ist nicht korrekt' + }), 400 + else: + flash('Aktuelles Passwort ist nicht korrekt', 'error') + elif new_password != confirm_password: + if is_ajax: + return jsonify({ + 'success': False, + 'message': 'Neue Passwörter stimmen nicht überein' + }), 400 + else: + flash('Neue Passwörter stimmen nicht überein', 'error') + else: + current_user.set_password(new_password) + db.session.commit() + + if is_ajax: + return jsonify({ + 'success': True, + 'message': 'Passwort erfolgreich aktualisiert!' + }) + else: + flash('Passwort erfolgreich aktualisiert!', 'success') + except Exception as e: + db.session.rollback() + app.logger.error(f"Fehler beim Aktualisieren des Passworts: {str(e)}") + + if is_ajax: + return jsonify({ + 'success': False, + 'message': 'Fehler beim Aktualisieren des Passworts' + }), 500 + else: + flash('Fehler beim Aktualisieren des Passworts', 'error') - return redirect(url_for('settings')) + if not is_ajax: + return redirect(url_for('settings')) + else: + # Standardantwort für AJAX, falls keine spezifische Antwort zurückgegeben wurde + return jsonify({ + 'success': True, + 'message': 'Einstellungen aktualisiert' + }) return render_template('settings.html') diff --git a/init_db.py b/init_db.py index 59bebab..9538b1e 100644 --- a/init_db.py +++ b/init_db.py @@ -12,7 +12,7 @@ from datetime import datetime # Erstelle eine temporäre Flask-App, um die Datenbank zu initialisieren app = Flask(__name__) -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///systades.db' +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database/systades.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) diff --git a/instance/systades.db b/instance/systades.db deleted file mode 100644 index 6af1e40434e7c1c7d2fb0bd752fcec37d62924d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 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%0Df{wAQs8c`3*7PS$lgq>Vy z)0M?vFI={_`G;HS0)4z8oBz|7{^0`xAOHd&00JNY0w4eaAOHd&00JOzf(c;$e}a{Z zs(}CqfB*=900@8p2!H?xfB*=9fK34Nf0zOYfB*=900@8p2!H?xfB*=900^9X0+|1w zd>x~PAOHd&00JNY0w4eaAOHd&00JPu=KqQ0Uj~x@m;A5fzbAj4{FmfECjTz^*U7)4 zLVQ2~1V8`;KmY_l00ck)1V8`;KmY{30tDy-|0O9Ji^S<+Bpw-Ihj1iD50P*rN)Iu5 z8H!8MaF~9_!y)<|2?yzSFe1_5V2Hi{FOmE~Ao-uk&yv4N{wrMv_-XP7$-k%b|G)SO zR1ie~0T2KI5C8!X009sH0T2KI5CDPGOCT1O*t9>vk0bGT=NKO0$4EHFkFk+xG#sb# zBK!~!^Ft)W55ZuR<`EBu@caMMYeuL!2!H?xfB*=900@8p2!H?xfWYY?!1n*~{=d_s zZ`2e7KmY_l00ck)1V8`;KmY_l;B*qe{{QLJJ8BIAAOHd&00JNY0w4eaAOHd&aJmR! z|NnI98?^-i5C8!X009sH0T2KI5C8!XIGqHr|9?95j#`5N2!H?xfB*=900@8p2!H?x zoGt>`|36*&Mr}a=1V8`;KmY_l00ck)1V8`;PA7r!r&e!M#YnNn^kL^SR1bC>fj=|C60>U-`1uu(AB(2$%@0+8K^nZZ zn0sogl;LG@i^dOMAC0Bv=cS{154k(SK#H+J$nN-zZc8zUW|e&SR`%3J)h|$>+s$WI zb`lL3YB$bv^6h5mHt#{TB+`e)L@YHmB|Z6s18N!iN2Frehfx8BEo2CM>Tao4gUIja zi)-)YiREb$J)E4t@@=oE~JFH1p45C=1T2d_eI(0rf>zf58ZnvtQV&;E+ zZeF1Yc6H;CE1cydAop+u+~-ia8x)gynyu>|LIOu_dyd0UJeE3tUOG}ZRBMk`vfBAh z2uM4!XC|6m_(F-k5V}PAXl#U=)>GZ4z`IS`|HS(^@UYJhqM~aSZIs-s1e;UJre!FV zP6)GyI(f9O8&$Jwri&CRw?w_68>I^KSdIlR^8izC8x`v7AGLZR)U;WevY}{|y>9$W zzkY1v^7OPmmfuiJtJKu1YE30op-sG?Iu7SzvD8~{Nl&J^I^2D&`+P)Dj5}nAb~L5g zV>3X(tKGj;GOAf>8R`S-0OV`i+Z%=a)(f|MYQATqvDD0r^t9861?MST!~|kO&`U*D z@iS1BT7TCDZOddx+U15?aTD<|IY(UX_nnSgdrp@svE0La$L{n?ieq$vkaw+4S zMUP@qEHybPJ^i@r4w!a=0>X~IeEWMAEHwR`{=|IGu3i~zqftl=!jzBvKa9X#gkL^}YaLI1XaZhrnPjMgnG{bdY)hq2L9a=fZ z*9E;h(jh+fm`Qx|a(DchctxH>37pEb2X1P8_DBV-q#5EvFYpplgdg8-ZO_AwHAYGq-oX9!+hh{d}==zfMt08S#4RDE+lqYHm*YUPRQR zy++ZEZC{`F)}bvO?aK!_l=nRrL^^!1gPuFQNe69rgm+N~H6z4qMrE--a(C_w9wSqNiTsM$KXN zY%I0BEIkSJ48du2&L$5pQ@`+)L4)Xz(lrVnV{qd81pBn+LDjNuvX|FDPsxi2w z52x|C@eFz;y1Ksdjn3-&%}y^vOjFq<&CX$3z+wxB@Nkcm1*hRtGh63QUm_&wEIj)S zo4sbz$02!63u7zd^!9>5I;-JSOwr}fchKGE=qh@X%|h(MYXUl3_<7LvOx+XHFoZtT z{X5#@2=>a-N5x(n_prmE&=YC={lE9}2BaVW0w4eaAOHd&00JNY0w4eaAaIfh;P3xW zk~UEn5C8!X009sH0T2KI5C8!X009v2CV>5aZ!VC600@8p2!H?xfB*=900@8p2!Oyz zB7ph-Nzx|j0sTW)KnemN00JNY z0w4eaAOHd&00JNY0w;+8=Km*2o2Uy2fB*=900@8p2!H?xfB*=900?*!!2I8v3#1?b Z0w4eaAOHd&00JNY0w4eaAaIfh{69R~m#P2& diff --git a/static/css/assistant.css b/static/css/assistant.css index 0d5f490..4a72a27 100644 --- a/static/css/assistant.css +++ b/static/css/assistant.css @@ -2,6 +2,8 @@ #chatgpt-assistant { font-family: 'Inter', sans-serif; bottom: 5.5rem; + z-index: 100; + max-height: 85vh; } #assistant-chat { @@ -11,7 +13,15 @@ border-radius: 0.75rem; overflow: hidden; max-width: calc(100vw - 2rem); - max-height: 75vh !important; + max-height: 80vh !important; +} + +#assistant-history { + max-height: calc(80vh - 150px); + overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: rgba(156, 163, 175, 0.5) transparent; + padding-bottom: 2rem; /* Zusätzlicher Abstand unten */ } #assistant-toggle { @@ -24,11 +34,6 @@ transform: scale(1.1) rotate(10deg); } -#assistant-history { - scrollbar-width: thin; - scrollbar-color: rgba(156, 163, 175, 0.5) transparent; -} - #assistant-history::-webkit-scrollbar { width: 6px; } diff --git a/static/css/base-styles.css b/static/css/base-styles.css index 3cda484..06653f8 100644 --- a/static/css/base-styles.css +++ b/static/css/base-styles.css @@ -474,18 +474,19 @@ body:not(.dark) a:hover { } /* Light Mode Buttons */ +body:not(.dark) button:not(.toggle):not(.plain-btn) { + color: white !important; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} + body:not(.dark) .btn, -body:not(.dark) button:not(.toggle) { - background: linear-gradient(135deg, #6d28d9, #5b21b6); - color: white; - border: none; - box-shadow: 0 2px 4px rgba(91, 33, 182, 0.25); - border-radius: 8px; - padding: 0.625rem 1.25rem; - transition: all 0.2s ease; - font-weight: 600; - letter-spacing: 0.02em; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); +body:not(.dark) .btn-primary, +body:not(.dark) .btn-secondary, +body:not(.dark) .btn-success, +body:not(.dark) .btn-danger, +body:not(.dark) .btn-warning, +body:not(.dark) .btn-info { + color: white !important; } body:not(.dark) .btn:hover, @@ -1043,4 +1044,25 @@ body:not(.dark) .chat-message-user { .chat-assistant .chat-messages { max-height: calc(85vh - 180px); /* Angepasst für größeres Fenster */ overflow-y: auto; + padding-bottom: 2rem; /* Zusätzlicher Abstand um Abschneiden zu vermeiden */ +} + +/* Verbesserungen für das Mobilmenü */ +@media (max-width: 768px) { + .mobile-menu-container { + max-height: 85vh; + overflow-y: auto; + } + + #chatgpt-assistant { + bottom: 4.5rem !important; + } + + .chat-assistant { + max-height: 70vh !important; + } + + .chat-assistant .chat-messages { + max-height: calc(70vh - 160px) !important; + } } \ No newline at end of file