From c4ed0822fe4c966110fbd25c32123a850ed6c6c4 Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Sat, 24 Oct 2026 04:49:32 +0300 Subject: [PATCH 1/2] feat: add accessibility preferences and inline account settings Refs PapyrusReader/docs#65. Preserve system accessibility behavior, improve shared controls, and persist guest profiles alongside private account photo uploads. --- app/fonts/OpenDyslexic/OFL.txt | 94 ++++ app/fonts/OpenDyslexic/OpenDyslexic-Bold.otf | Bin 0 -> 184472 bytes .../OpenDyslexic/OpenDyslexic-BoldItalic.otf | Bin 0 -> 235788 bytes .../OpenDyslexic/OpenDyslexic-Italic.otf | Bin 0 -> 190448 bytes .../OpenDyslexic/OpenDyslexic-Regular.otf | Bin 0 -> 175872 bytes app/fonts/OpenDyslexic/README.md | 10 + app/lib/auth/auth_api_client.dart | 29 ++ app/lib/auth/auth_repository.dart | 10 + app/lib/config/app_router.dart | 6 - app/lib/main.dart | 45 +- app/lib/opds/opds_catalog_store.dart | 10 + app/lib/opds/opds_catalogs.dart | 10 + app/lib/opds/opds_downloads.dart | 6 + app/lib/opds/opds_library.dart | 17 + app/lib/opds/opds_resource_cache.dart | 10 + app/lib/pages/book_edit_page.dart | 122 ++--- app/lib/pages/edit_profile_page.dart | 421 ------------------ app/lib/pages/forgot_password_page.dart | 94 ++-- app/lib/pages/login_page.dart | 72 +-- app/lib/pages/profile_page.dart | 138 ++---- app/lib/pages/reader_page.dart | 29 +- app/lib/pages/register_page.dart | 92 ++-- app/lib/powersync/powersync_service.dart | 36 ++ app/lib/providers/auth_provider.dart | 126 +++++- app/lib/providers/preferences_provider.dart | 29 ++ app/lib/reader/reader_panel_sheet.dart | 11 +- app/lib/services/book_import_session.dart | 4 +- .../guest_account_deletion_service.dart | 38 ++ app/lib/services/guest_profile_store.dart | 66 +++ app/lib/services/profile_photo.dart | 59 +++ app/lib/themes/app_accessibility.dart | 104 +++++ app/lib/themes/app_theme.dart | 148 ++++-- app/lib/themes/design_tokens.dart | 1 + .../acquisition_endpoint_editor.dart | 1 + .../add_book/add_book_sheet_scaffold.dart | 32 +- .../add_book/add_physical_book_sheet.dart | 68 ++- .../add_book/book_import_sheet_sections.dart | 5 +- .../widgets/auth/auth_continue_button.dart | 10 +- .../book_details/book_action_buttons.dart | 29 +- .../widgets/book_edit/cover_image_picker.dart | 75 ++-- app/lib/widgets/goals/add_goal_sheet.dart | 1 + app/lib/widgets/input/email_input.dart | 1 + app/lib/widgets/input/password_input.dart | 4 + app/lib/widgets/input/search_field.dart | 11 +- .../input/validated_text_form_field.dart | 3 + app/lib/widgets/library/book_card.dart | 86 +++- app/lib/widgets/library/book_list_item.dart | 291 ++++++------ .../widgets/library/library_filter_chips.dart | 34 +- .../library/library_filter_fields.dart | 1 + .../accessibility_settings_section.dart | 138 +++--- .../profile/account_deletion_dialog.dart | 24 +- .../widgets/profile/account_profile_form.dart | 275 ++++++++++++ .../profile/account_settings_section.dart | 97 +--- .../notifications_settings_section.dart | 6 - .../profile/privacy_settings_section.dart | 18 +- app/lib/widgets/profile/profile_header.dart | 166 ------- .../widgets/profile/profile_picker_sheet.dart | 23 +- .../storage_sync_settings_section.dart | 1 + app/lib/widgets/settings/settings_row.dart | 54 ++- .../widgets/settings/settings_section.dart | 20 +- app/lib/widgets/shared/app_bottom_sheet.dart | 53 ++- .../widgets/shared/app_motion_control.dart | 4 + app/lib/widgets/shell/adaptive_app_shell.dart | 22 +- app/lib/widgets/shell/desktop_sidebar.dart | 249 ++++++----- app/lib/widgets/shell/mobile_bottom_nav.dart | 55 ++- app/lib/widgets/titled_divider.dart | 27 +- app/pubspec.yaml | 11 + app/test/auth/auth_api_client_test.dart | 38 ++ .../auth/profile_photo_contract_test.dart | 115 +++++ app/test/opds/layout_test.dart | 3 +- .../pages/account_deletion_dialog_test.dart | 62 ++- app/test/pages/account_profile_form_test.dart | 198 ++++++++ .../book_edit_details_alignment_test.dart | 14 +- .../pages/book_edit_page_layout_test.dart | 17 +- app/test/pages/profile_page_test.dart | 207 +++++++-- app/test/pages/profile_storage_sync_test.dart | 75 +++- .../accessibility_preferences_test.dart | 40 ++ app/test/providers/auth_provider_test.dart | 34 ++ app/test/providers/guest_profile_test.dart | 135 ++++++ .../services/book_import_session_test.dart | 35 +- .../guest_account_deletion_service_test.dart | 194 ++++++++ .../services/guest_profile_browser_test.dart | 42 ++ app/test/services/profile_photo_test.dart | 23 + app/test/themes/app_accessibility_test.dart | 171 +++++++ .../widgets/accessibility_journeys_test.dart | 203 +++++++++ .../accessibility_library_journeys_test.dart | 110 +++++ app/test/widgets/app_motion_control_test.dart | 68 +++ app/test/widgets/library/book_card_test.dart | 35 +- .../library/library_filter_chips_test.dart | 38 ++ .../accessibility_settings_section_test.dart | 122 +++++ .../widgets/shell/desktop_sidebar_test.dart | 36 ++ .../widgets/shell/navigation_counts_test.dart | 43 +- 92 files changed, 4145 insertions(+), 1645 deletions(-) create mode 100644 app/fonts/OpenDyslexic/OFL.txt create mode 100644 app/fonts/OpenDyslexic/OpenDyslexic-Bold.otf create mode 100644 app/fonts/OpenDyslexic/OpenDyslexic-BoldItalic.otf create mode 100644 app/fonts/OpenDyslexic/OpenDyslexic-Italic.otf create mode 100644 app/fonts/OpenDyslexic/OpenDyslexic-Regular.otf create mode 100644 app/fonts/OpenDyslexic/README.md delete mode 100644 app/lib/pages/edit_profile_page.dart create mode 100644 app/lib/services/guest_account_deletion_service.dart create mode 100644 app/lib/services/guest_profile_store.dart create mode 100644 app/lib/services/profile_photo.dart create mode 100644 app/lib/themes/app_accessibility.dart create mode 100644 app/lib/widgets/profile/account_profile_form.dart delete mode 100644 app/lib/widgets/profile/profile_header.dart create mode 100644 app/test/auth/profile_photo_contract_test.dart create mode 100644 app/test/pages/account_profile_form_test.dart create mode 100644 app/test/providers/accessibility_preferences_test.dart create mode 100644 app/test/providers/guest_profile_test.dart create mode 100644 app/test/services/guest_account_deletion_service_test.dart create mode 100644 app/test/services/guest_profile_browser_test.dart create mode 100644 app/test/services/profile_photo_test.dart create mode 100644 app/test/themes/app_accessibility_test.dart create mode 100644 app/test/widgets/accessibility_journeys_test.dart create mode 100644 app/test/widgets/accessibility_library_journeys_test.dart create mode 100644 app/test/widgets/profile/accessibility_settings_section_test.dart create mode 100644 app/test/widgets/shell/desktop_sidebar_test.dart diff --git a/app/fonts/OpenDyslexic/OFL.txt b/app/fonts/OpenDyslexic/OFL.txt new file mode 100644 index 00000000..0a1d034b --- /dev/null +++ b/app/fonts/OpenDyslexic/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2019-07-29, Abbie Gonzalez (https://abbiecod.es|support@abbiecod.es), +with Reserved Font Name OpenDyslexic. +Copyright (c) 12/2012 - 2019 +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/app/fonts/OpenDyslexic/OpenDyslexic-Bold.otf b/app/fonts/OpenDyslexic/OpenDyslexic-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..a3bd88c4aed10226bed040c961c4549b25448afd GIT binary patch literal 184472 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

ZvY_B_>!G`Qd(Mc+6FGA zS#*sugD&2nRc?vmGY$KVB+2-`#^FH8_KGscyqLnM993aNV3x0P^~$idtJHHAy0s5; zONg@9C+m{5$$00nWR1~{3x?^iIAO-`0BS2P*}mr+LAb@jOdh5c7z0D4=2xr@F9ewJ zhrOHGzNRoSe7+dgjc*L2d{Y=kOKc|u3Aq>Pn=>>Hr{#wcrjj0Cx1lw{bbi~`j7@p! zurpFW(04DE7$Uih@PO11<#eO>bnO_~Xl?1z@0Ibl`2{g4HCgI2IXNkL%G$&=t25MY zSy53_lzsl%lW4p3uV46`dCB>^)pJiTTCrq%!fA)I$y@7XR9yd=B5-Vk0!42&Q!Z(M@CIh_V}wT z(e~P3AMyEz0y35*`x_hv7}l>`<>*?m=0KEc_l62X^qN?I|CCUpS5jzJc=qHm_JKQ& zYmOr(ts=4VCwOU zI8#zmi&H|!M~XcfVZA3$odRE#-^q%tT173Qcd*nxtpAls)Vm|4!*Ff|c@39Q+a>#% zbflw8NdJ!RD*t$Ikh+hTfOjA%Bq+-}-Ou1K*syqTLRZ<>2?wUXQtm0s&M#80OOj@< zIlj6qg%*?+)AX>{!SvA=7%F-cPD^K>>DfoUWhemK$(9(wgEV)v4C!SGpYUU&(l6ww zA8y@}x=nf6;JzeVJuNpRw7*imKAN0`JGaCN3}HR~pqxK1f~EEzpyzz~N>3O{Om>|- zs=MRtv;}9Ts^-?6TYq2q>S1Z_K6QTP)=dSQuS~b!dmu4!cg@s8_LX&|-#-PHV^aF; z@TI=19VQ+dd1m6N+7kO~Rl907?$17Ks9tke_GEUC!ohG?9Kg86UxlfozRjP0evWJp zz=_r!KXT)V{;K}&l(=c}3kSK4T{-{Ait4Bmoai284g8+$;+owmTEv{Wh!xnqR?g^L zbRA=u8$8NhgSzlnEM`Bqf!*9PKDY4|2Ozmn(<_eMHt;>V_H94(=$MOZ)ZNU%A_3c3 z(`zh7-6oP`X^?5SxUh64$%sE`G)SuK0sZAI92PF~XULknFlSu3vyy!@bYjOP*R%n7O+C%p7O9q{b2GBMw`_4N-CJ<^?Dl{Wl`4fl%VTbQ zS<`Uu%lT}<3W<+71ES?f^k-9qt`-PONW?h&Unk9XD6u*Wv^ zvrvrl^OvviHgDOowlBY-HtHuWN6$EQ?M8k5^=qeQj2b;-#%T4%-F$I&QuYqD`~DSv zUisSn4wXqc2MwxChHQOdoNS*|ml9|UGswmyEnPm@an>&H+dzZZZR+&o?IHi->$}1? zr#*zgz%<4}7x|6G>T2bQ$BOH9^s}kc-}$Q*XX;P}749~dL-nL(c%(5ULcK*2_b?}| zC~M<7eXxUeDpx3pkBHQTD;4|e4%0_`Zbn94vE%VITj!~~Fap=5Y{nczDHh!$%sU`Z z9kmxDa$S6`rXVs)Hun|3Elaynja*iS=z~?OuS7KN4X z1qJtD(+zngiRTJ)nqkPyf`j?d@FvWX{=5t2Awgz=AR_RF%cFwmexMe za`h}!N{?9{e@zmJ4I#zilQ8V7#aY=moFX@j4aCM$6r3L>NoKH)AYq?M9ih+i_{bM9 z7NDU|i-T#|1G`q2xB?(z{WNFf#Q_ywODwL04?-y6Xs5>hS4XF{|3Grj(@+mWWXCP@!WIZ;GW&p)qA{L-8?;)h$lv*v1LOnyVEolyZ)wA z;-3C#inTSLW?fBx!D=T!Y)ub*G?i+s-eGe+L>R_r(6O%qqS*;fQTK{<;JrK zP{+<#YhX=5?d{-eu4W%KS?REim_qLwGU!JD;nM2#FmQONSrGQ(b4+*1D}63~fo(&e zpQZ`0ePI)pVbdj?I$2|LNsV2Bo)`rGtaVrB4ZX~RceNO_X?a`U6p z*S7|qo3a9?gCDVpu-16eWTg=+X%MR$Cw>U%ikhp^WQ|Ak1=!i!H#J3x&%{b?6?!&A zij^uxrD9n=>l!_ieG0r)T9O`*1(l_aUKzqPa!a2_j$pt;h!iZP{;qP`hbsT>1|O!$ z*j~qUK}1sY!_L?P3gE9ugmVL>->e-3)R)I=! zFpeEMt7uruQ7g8>IOzT3suNc(9hlt@&-$zg9IaxHnFk-%%QRG<^OTdP#NHf#Sr~mj zCz!sjwVWv5WFWZ`unXA^vAmV+A25`t@B=H^N zr>@s}Cpj!j)?_49Mv;yEB#B~A7VE@KOeyiXsgzgfNXG($Oao}@muImmJ!JQf69y2( zc0Gm-jRm%fi5gd+%UA^fUdAd2fEb#^K;_q%e|yg#-n;M6q2>D)>(z@_tXRBg?}|fe z<5@m5d{b`T=1sY|nuu5J)oUzz9RGxJVk{* zjSp$Gts+RUVwZSOu*0Mw0RWZ>9A!uVzCD-{Y(X?R_QsuhJGaYs&MV#^)&tgME`O@# zP<{R4nwc|Q7SEbd<5I6S-r$2m^9r`)<`x#_g{}(@2?onBT!PKB*9d5eA|Ql`-W@BgMY;l()KNNPPz4n zqluD5U<;W-9-KKwkWm#J>7+i^VT=|;1uTv>DB@HHdhW7ial=7^T*dkpBI@V9I z$#q55Yos;YL=2P%F0t9*94K zmHLRyLED0a`yv3kSQ3k+>rcae>fdAq5;!*D5wKr`cBXhf0iJWLYtR6oH;-~uEViM7{VPEF=dr>GWu~cD^A)2r_hcvpz0ibfberJ4Dq*yG)d`;ZO z`5Ep>$u!iS4L1k!WR-gCdLGJV70b?HK+>$p_corAjf{3ifN?7WUX1 zfj++*&LtG%tw=h9RMGc!32cbS@vP{gfrNluZ!^grQd>tH`hWBbTfR@F=wOvXE*0_B zF?%!)_ecp!4y!ep1G9#tBvUtg=5PLlFF8~Su9Bu z_nc>(fIK@2;IlK^qVq+!wF2^L2grOYk z-Cd%%Z$;fDIu~wi!s^>Sl}y@$wPcQJF{J!*2l@ir_Es@)n;Ew@@A3~dwa1U|UpQ>M zPsmuzg*?8dc}-RmM4PUrCLC$eXZO7U89|@lpO}M}rHK$B1{Pq;ZNXh0N>j7$r8B#|FO`fBbdRFW zhd2ZgP>8+i+>&}`jY>|T<@W4wBc}SJkKLgbMZn{A)|k<0c-3_%bUz&N)&eAGCv~?W7i?Uz)(yaDU`1I{>fYf;Hu786GBnCtbrrTPxreT0ZC9SW z2iqJyjIq_`!)y$~zmn=>^fA$nn7Xv>M^T5UkM z)Ra_}X(F|TQDu%VfaWKV)m3W!oH)Bm8rhy&Z2%~K``rptC60lZl~nNudElf~;&+vU zi4D?@l9EfE7Mb`9cFeHOrtUP3{4rX^VW}WP}DPq-gRh)+uH(E5`(34Z0 zo(<9Zk}85uKhB^a2SqXaTB6XO^~Q_)cvPI>4|_#DO}+-RQYo7}nyZlheSvV(Mxjt0 z^p!wkceIgkn1JHIldioO~I`#;nG{CvZ3MFlD(cR%avHHy#31YP$}AJ9C`$ zn>hODNA{)Uja$cytb>w;!VYE-#|D2({otI4qcLebca!3!(bHXHM`~rjpZS{K{X}}D zDk5kr^#81wM<>wT8T z&lJmZo3Ex=sWHwF7w_mRWeGp?3UmGwDcp8<$3_*a<;&32J*ah)RX0?9ZBtVhd@aI0 ztytLY`0d@)1S6j&t3#Mk47z2D*H%Y3QIvnx0B=ECg$m5h{GC3DC6xnx z6T{lPXOom5NkoCyvqw0+XJB=|tD!F>y2TtzWQh4nL$MM%E_})ZM@Vc*n(;(RHdP)= zj4+VbB=>fS?hgYvG6zvFoV51WK8N{OOFIGZ?G*l#qE^reUHF5$iY+t6!FO3l6&odS z6K9H3CE-+6wGEy6rTsgH>&C}0PkZu^%%D)5IftM2x#qcF22Q8P{EeL(m<(MxYrRM} zOEnO-tnm7;W&8P(H!BJzXDkD%xMR|qQR5uD)la_ar#caIIw@jO)Z7&teUfLV`4$K4 z=*+s<*DQMIf8RjujTe4N{>4xlf`h(~56mbSnUYW&cl&t!-uUu_J+b9}n6c&HOl0sD zYIBv^*u4}I6u!dGrc~Y>9jp7o7z+aS-I~I68(}HF7A*5)C5pF^>wKcuDm$`qlFJ(( zZaU(lo#L>8tr8tg##2Q2aj%o^6|f@MQ&3!|L@J(T#i1WXn(H}~{nUjnzqjSh%{gzER4(JJIFH4xa7eFHNw^#+X zum~PdPsskP^;!5)4-o2kD$fWqU*X70vQD@{<ngnJqW)}-P5%iCr92WaW#aYHLNcaai9JO4XV5+&g8)WU&tuRPfN-eB2OfY1C z0dRN8ZMykAyNSVCa#>i4fuCA{2xmW)a!>$whA*ik;s`fP61IS2ZD5y;J0D4Qiw{1= zdO{^3#b?(f3t4Xt_$IyitC9dV1kF6N$;wfjRIrv!R?!-(d*UyV_+mRvYigQ|7Mq4; z{(hkouMc9Mi?aX@W5uL2Z5Q@Q^Hm8Z3JKUgq-hd`S28vy2BuM}ozo`}L-iUvb4BxVT7(KDScLU}9l-Y^)+v%i&31qskhi40< z%+R7P;&MbebqPCdtvPJ3*7?_n$-{V1N(vQ z*=-aqi;i4fdFsjf!fy+94Z}F{m7KeBX&guX5;hkL-uCFl*g%QGZN#{5uW|C3vE*}& zKD~xoJvA+|p}|52-kE)3T2ugPM9w_WJnEkY*~@4vYWYqyHL5`7&tYgpH5RSGZB{g;PrNEUk*{vD=ek2A0WnbMifj~1`yrr_8%T%<`*%!i%a z2BB@{cue>-niH?dkcOWf;;}kU#jF2%OOSP)Da_`X$(}-N**ILr;nFk>*9V%v#u* z3-}^VF8C9GsY7FJ*~?OT2@}UAt6Vs+)(Ne6)=5ggMj1u2jRDx{JOSe>xw(VMjf~c1 zLa_~PZdlOQLVXGnk?&w)s&Y#DGw^4(>zG%4Zr}F_JSaZm>c{oo)lqrHw$sKT#go-A z?^HkOhpmi{F3x-zKx(}M8Ctq}B&V-d(;Yg;Wi3xzG|!P9+p;j4D5#xI9}Qf-SH=Ef zZ@8#!@jJ11yZkwfUMAC07{qjfF;qvpI-HDcy+r{)S<0tl&-wf3%g$7&6>F!J)qCGo z(#Ox>+uehDpo3)}kC?q`68yUI&v{HLAEab``*nk1jPv7e)K{HMlldO;z6Dnt?;bpO z@5Z$y-%gnq{&k!Ry9^D5{P0=%CokSOaOr5-(g||{f+nazlNIFDoxnG@T6q0Gw8#WI zcDu)oGJ*mT6baw0egb-w9KZteY_sMzNUVP}9kQWf>cf-2sjtvZKmSW+@Mj|%<2VMF z7+VTUeF-7T0|^?KKI~Cbxpf^>^f>W0bO&CKgYUpo|G+^U?r*0-m^2Dqo!+OGN2bh5 z9~eC^a)j*c(pe=Vlx)D4?b%QmURa}(8la}1Y@b%w-8{E{LD$V{m$Z5Aqm&lzF0x+@ zcd9YhA}pVFG#hkWPv9euPsKwxkRLNYF}w2b&R>UxRf|dAcj`Q847N<9=SII%lWog| zzB%X4mhP=NRJvm76yLA~Y9Ykz-5eU5*#C;4QXI3yQT-hU4?jf1BQYinBgcANoOE&f z_0iYMxA|`){lneQtIO;t?_|!2{9|NYomIW5veNRY826*IN#)5O*}nhA4Zr>K7x=i3 z8nwgyh+6S+ODh5&)@WNRdgk=Z6#Xj*POY7T;UE6rVcT12#ISl$zdv&_uM@iQ7s`)4 z|7GRTNs~P1_3X80?gh2Ny1f;(Zkd;nTT~XC7aSb3epNtbC@^SRT($CQxhA6c%$d#G zN=kElW~iscM+Ex9Wwq4@=eH_~v#Emf8=GVC=(>S3DY_xt;1i^*jKw|c1Gkd_oOu*% zXU9ot9P9b)XLgq=;!<^nbwTc)5P++29H|njY=o79k=N-2&l4s~l zF4NGb`Zac-SyptuvU1Y`Ul8y`T(@6JVI#y11JNJii-~+b7pka2xciK&Q z&R~=pw`H6{yg7cRF4ojs!JT}vq|$RskkOEuN~lk-p8*`ylM}|V&&{Kx40Z0+hfx2& zv#Uk@-XgaoZN?0vA7|7{HW`HPk~Cnc+W>P!deHeNxZvFNz$U9A=D67!(R3dwSbz%N z5$h-QbPrl*(51$qhZ;34XYfWAS{k*`Zzq?em9j+?KEfGi3cWcqXhR&S_lR3;5e5=D z`{uO?)JA_2tX}_wlSGnar(a=n%N0_D^Gyb-LZl1VU&i0M$#74Uj-a5`ew-GL7~yQu ztr74RazwgPhHvK)FbG(L4Wt&nrV7zm-RdN@vJvV{nS5gfwGyz(9>*p>dB>S2o5%2` zMCtS-nD)MW+zBl@n=_|L+fY zdgr1VgMEH!`T4UqWZOz4+u=B{dxvqqJ@9%vF1oYijZ2FC(%A(i?z5A;>`T^eTT$+U z^+Ag%|D#A#c(7$P^?e87n9K=Ttd(@uXUxi+CV_;^?$-(PgO{h_Q6iSd^akZIhtV`! zVbVKui6k;BbW><{dWOAl1+(W4qWtW;U|G53SS80cO6OH_D@Ra0CSZ0aEyQ}$O((9G;ZZY@#$W_!G23)O%Aa~t9E6l`wb{LclSiOiK;u|PI3 zSN!1{SGcb>JjbLMCf|K&0Su3uzZU>=p)ZV%7vQrmTYw#h_j1d{C8itz}g ztd*vd@)aF^ilFz%3OFEbghn1a3R~en!)Elx0R}sa6{-BxGShZ3uWVXtiwm+94gqo! z>C1!);LfeJC7F3IFGNbWWTbCV3I38T88PeB=1A$f=$LgXv%h3rbov$?S#t>dMvMnm zy*9v+U~lL(y}{%b51!Hxu^hkAAe6&bkb!a*dvAjzoq?V9AspGsDc%6hxM9-T2;RZG z;3A=q&-_8wGu2EZ%$$aueLis-YvsV!gN2Y;&pg+KK32+0aX_vWD-bTW#WvpTB4r=H znL^g}Dq%L{yw#aRI3P&QIGAU`A(UCycbvvPc9b8OZwiMM81gc$Hcdb*3Hx|T7d%!I zl0U;*5ubR5Bo2hEIV3ji4<=^Dd_H7m`g075D5a0PoI_bu=GoAsR?`wOZb_y&2s4=m zv1a~phLG2i9b_l8p|1O> z>=BWP#4bT1yDY>W1WD|%jBPBj8w|!6!|)i7VJu@X7}f2@^!KkD%e>F~zQ6DLeYwAL zx>C1p-Kx4(r%s(Zbq-8b@?=J_$u>;-ZQs?~;acrR{^FY+?(3n>EFU2Hjo#Pekr}ky z)udjOrX=TWT5iRVy0v`c@{Hv%9$-0s5~nRsS^&PcM7tC`3}-Il!UP4g|77{1&%KVyE(d=K>} zoVS@ae?d->R_bObHCD49OKlIZ2O?{!>F6GQ`>X_I-S2xZ{lG63jdXke=&Q}laOLZY ztfiuy1=HqRRg@L^X3XE{fywlixM_ZN-WC)a%0OB}(7d&m@b&^yiYC$h)@5JYa7#Jb zuhqzO-+SR6wgKu)@y_Ur`yP3MOR9z@(M?&H9JAbl)$W&HEl*p%X}Jga32fiyKdGjcv5PyCBh7BlXICD)n*qw%Hir&Y*N}IqVYc-Alnp| zBev!Wae>uU&;Q5AvHkh02?um`F3;OH$6|9=>;F12eWlMNk8)2as*IYGm{*Ed&|E!{ zs|(%%EsXmnb+2w*;=)m@Eajf0w$JwTxxeo4u(^}^;=WbO7fygW&3iDMFKF}p#iQKS zO*rLwrs$hv)2x_YBBqvwrbiF(sHu(>2S;xieg>8^cxdeZMbp2a1+Q&VC+hlq6Mby6 z1+{hSZQ}_}Yfsdj8Co=WnnjIJxq(yDLr+9|kg+wzW6_7UoI&oF?%yOc z=#all=KsRua9C^lhB+B&`8n3NWNgmz6zzZwr$&g0IT`8m%<6o96WE1w#Yf7fTG6Sq zqfYipkLu?E_Agf)IJIQ>c^sDc;nFW;{$1osGv_fKw4eo9m6n#DWWn2)CuL;KUF1QF zBqk=Mr>*exC-Y61*LxkAT2^d<3a-b=lJs-^N<7qDhz1505047f%KDJZ!12wBvXaTR z`n0iEq@^b&p|RD7MRT(vDjhdB&e6Z%Q!WMm}dSnwU@=cJ{q%!MOa!imdr(lh3H-c;wK z1$5`aiU&@$zz~Q>|ETm{r=mPaE*RFbsfS9=d%Ap!lUc#4<#$(fW`Brg=ymZJdgj_2nEiOUArm$)5zW1krxUREs2FyG0>#29DGkR7ExD zT&^jL41XA)ji9;D#X0)UJUK|l7_KSro9@$~yv?V(Yw6v5+>g6t&K9%&+X4aW03ZowNZj$U5f2A=c0gTp2) zyk6XcyP>Klx~JaD;VyA@+%tMSfrWt&c~~F;?4PZaS`5o1FtQD5$=Qb7aJ7PU@`oz z(DbL_0brG4459Amhb@Ia%dI#f|H&OaT+v5OO`87|Cipg_yWu11O+y-LL_>{W-@w5Q zqMwPy9+!nDJ8f?u0m~sZU_qhcH1R-sniyZHrh#@UDjcIgKQELv@ZC3P-+jY7bH#Vp z`rBT`#r6_HNo+Ju#%Z+f(&jYmBB6E3M(6% zKmBLh+#EyUzn>soWU%dp4EAfh@0q<>V|Yk{-y^iZUPL^#H~UyD`>!a}=QyoQ_OzF5 zp}i;nyZwa;+A{W@Yr7LD+1YM=?@HzeqvMkd+X#~}JHTKpYi}^7w1J9Vhfg(8XQC>$ z>b5r-2DOMI|FE2ym`QZP}IJ8Y3+EZIA+P|~uzq9PAxUCKaWvD|0 zp46FP3TRsEQ3q@=ErnDK@ntl+%?uN^{Ff5pr$=v^N-nnDWCu%LIhbS!Gf&wsVCz^% z4kcz%`!iN(cV$pvCaibwV_y-GUuT1^pN$2^#+opsGA|7FrAnb=L&WZtHJfyq`0V>Ovchhqo=0K zFvrczNn5?^(3Nkk#;Y^S#EhBK(kGi+1P|}t$J6)W2vRr8vUL}P=1IkgSJU#*c<;zv zb|2}$U!H23rrs4H&%cX?NCIWYSzFhw#0o`DW9e4JWE(Km?O@|=IQ6_x%{ASZj^4$d zaF~d#UA1W~weg$b1~MFHs$H~naWvh6B2%AM>Tq?)1bEhYLz>o_V8Ft5$dF&KI-R39 zIOr(8#T+q(|I=P-8dA$PWz9(Fa=Rc+Ll}!l;jaXk2BGCr)(xjEheu$vq>NNP_r!HS zX;tfu@!o!_bl|MJAOF+U`=0;yzuGe1(hNfNL(6eS(s*xdW?ru}XhbiEx?LSo;F<&0 z7jD;$r8&7KwZImn!|CAy2<45XI38!9|5d_wJ50paSQc%=BE$ponQgFwg7bT~%Q>hH zsgq2viAQanOUU!)4_&cS#0*GadY#j@es5#jVFFwcWM!j)Pf1xX#l3~;>3Qbt+=a8P zS*m<k|%yPK#YQcc#TSVb#pIyjXL`NmDu`S`*c3w-&4+?Zu=eiK}z-7tCH} z!LhL9WX}w+AjZL)Fl1opf_+Lh@}vqB(tfPzrOHq}JAUPGSNt@_((Es&G!N=E>>LLF zPyhJ=5t9uMH`r>?_IcE_e{{)mKQiBYxRwbW_X^gLsLU37%m<={Vw%L0l(o zcfA7pQL)e^+D^vU2bhS{S2=68nOCiuIC-O0ZHOgnwSQsacnZ&wi}P2ctS}QcWm{Pm z37W9Oy#pRv|6}9f(^`ooUqu#$n^kVoAhkn+b;me7f`if?rp-^p;QaJx7=yGa#3!mG zioO^8-wO4scvQo+!rTi3yRxqKfn=hwQv$hUTaQu8Wc3}+92J7pFus!>!~iL z0 z#1%7^&M5Jy8>YGqQ2U!zf0f(&OJD1l?1f457RE+{@x4!^FoHFnJ?vu+_I)NbTE(uY z$;Vn4y<%Zr(%x+MUrrNlFYz~nd2<_3_lUKiq+sc?6&c&z2@hT5BPyB}Rx)&K*}Ju% zkw$1r*k}3Z$N>mI4-kvk3KaVQOnH25+rfWrZ)m#Z|N1qKywu*ZB{LQBp6=~$;^?kt z@Rfx8=%O)uL>GIlNeWwH%jIn|?Db41q2RV1st#%%QKF#e-5lLGZM*_A0}-yax-gX# zZL4eV6$}<@fbx<&uW6un9n4-jPgW%8{W-z6q<38{0Z|`7No=cOl9oYbd#?~E`8J08 zy8()E!f8loU?wVh1KizxjsG7i+8f)$X`-&7p(7rd%+NgX%%lW7l$$U>*-YAha8fsj z0Y?PabOyMl15bp|2Pbuy{2`!;Af?J|@&ZgBx2X5 z{Ybyi^TvB*@$N6d#=caH_fV?y8JSyii_OIwk`vcj^ODljQ#@0WlV&EsRKi1rW_zoi z;U&1W8{jkWSdq%zG8u1tVAgK@S7uH7G`sO>Y(L=JK+e{EOhj~aLPBs?j1kZF{^+IM zGc&hLfylP@>)N7=gY%->;~zf|bg%|2$1ZDg6<>#br0plhMCBK`S{Sy3GUNm+w;+{i!X!_;T&=5bnLWE|hCx6U{bs%0ShUt>e^Yn^d*XEhF99+v8iTU0+th}yuU z9jq(b=JVu`?QIW3dDs8s`ZP|G@{K+IJ2&^=c2CP|{Ri__Ugw(fKbZj0n9vXhHyKu| z*+Vv8{-M3UX=GEI@2UuF7QWYE>Mkc3JTj5KiH^grD2K&&A|~%*Rl?+*G(IL}mU-sv z?6g(e_MSV5$$R!;F=KXY`c!lK-lO{rCQYH=Rg%1E!TB`kAC~9Xw~`cgC*_Xw?I*|) zL-|s=iB)2&#+TTxlLxRPbRPx=*+fJn+I~btdA0KAkm*Zmf3lTYg0gM-z}{hBy23VD zf}#9R+g8l*$4MqncGx?aGM27*m{Y7aSgv}7oc7;1>2&nU&YP#Z@7|G~wZ@wC+n9sV zh5Aeh_Ck|(fv2bTk+N9LppplaOkgtUeJ@yeILKla;eW(b+7{+^@b3WpJHWmQ{~n_5 zh*g$!v+d$-LGQ+y)Fm}kk!mKBCAcB};PxL8F6dHOaCA@=R?CjP=8s`Tp8Qi1abIR3 zEtao4R6yeNxqm&*%Q5GYIwJfpREsoE1vSoKh=02;cR|6L$mVqI7tJZpVo`pU! z^_b%dD=zPROgVp_B(Awh?@ov$BL^5dbyaq+;+G^nQPyq}u+#z7>Yj%ISTABRw0EI!%c; zQoTm1&FY{vvxuiF35MB+a1xwl3QEtNXu;{k^|l(+{m+(?G3FyYz!|WcT52~Xq$EuiEH|moE?^BXG=Gqhb`Fk zdDpTwW_%l6>~0KKt2C~ox}m%E#fGNLF0;+yZOPbV1U-|*0JLG9#%dL7arCzt8?&zE zc_g0STzYnyK4-_3bmEHH>%bXX2n*?r$dhbavZ*`-T3I1Fm-jvx7Ye(C9OHLlhijQ( zee$uCJ(iT6Vtj1;f|=&g(cfHLY*poDGa8EXx}}VY_4LP*r?Y)L@nE;?=IuE!D){~@ zQfAnA{K%He+4{`l+ZlV!Bv|_P+SKs{R+~jpJFkt?_L*DS`tYPB4wctZ%KMaez>iC8 zq3!fRlDgE^bG1~yeYMWAzLmq-DcxBnwG1Rseiv%mWn@oq49f_NfvLh&XKFHym}X21 zrWMnU31B)i-I<=uKxQZt!Nf8%m<%SLImjGi?lBLT_iRNh!7*p7gB^>!ZG2Za6|aF@I-hn5WyijiB&{*(IR?@^~Ez% zptMI2~N2=#J~o>weJP*8Qq`s(Yz>t5fxY-bwGG zZ>{g5@2MZ8AE%Gi&(i1Ux9N}Ruj+5>pE_|)Rh>MYYB|+)YT@MX)Xk}{Q@GPurx>R> zPDxG~PRpGNoQj-wIvsF2>U75GqG7UOp<#`o&`@kRY&c=KYJir8;iW9desTvnQ0^xW zmPg2ADmAXuvQqm>ohx;# z^i3tZOM**kWzWjvDi>D1Ud2?Ub(Qccr>Zus+PCVIs_UyBsd}pF?W+H-`rMUwb#|@c z+Qv1_^@i&s*EhzhMvJk&(Z|@)*vpt`Tx{HE{H>aIwU*V|REw{cQmv%g1Cyue3sXIl zk15DB$`ol@WLjccZ7MNcH9d2a+$y_$>DJaQ+%3gzpW6|)Gj1=cyH~GSJ-B*k_370U zsxPa)zWSN!kE_3QXWiZ18@l_u4|kvIzR-P%`!e@^?kC;9cYo%=dsO$R>*4Pa<}uP^ zoJXR^3XcMhgC5sBo_f6Tls&6^nmy}#cJ%D!ImUCc=K{|Z&jQb#o~J#3_WZZ!bDZ*H z&2Hv~<`!l@bErAYJkA_#UT9uoE;JXL51KES@0cH&Ne!nOE;Xz*n$_r7qi>BdHDYTd z)mU0%Q;mH!PS?0z%05xSy3FWpl|exQtR<<%#fSDbG8r$bW#{lW)OkqdW-y$BLEJ zncFfvbZ9tY}{E9gi_Zu zgB%MY@4M`57t~5#w@iU0fj}}v_FmDWDB&kPPD#|CVURzFh-GMKsMRHz7<=ODLWS%k z|D__UPvedn7~myNK*ssh|Fe1CNJg?y`A;mkz-$I4rthB?-Jhj{!T+jrV) zm}EGmL<3-c{F1o6m9ONTSnw!bFH?z&jH6(poPu67RA@D#==H0k7k|EWtcO?a5z(!z zGTDie`=pA8lG1J*B?1akVPMvK-tU8nVwUqDo85+F-(w$5CjIPR5NEh+_azf$ks$9e zL@+`2-q_~gZDp$Xl_J|*6??Naz%GeUM%j*PFD3>NqIa2ea5#p8E%KC!-e8fTrA!1l z-NC?Q9nFF?0f(cI)ruPQs}~tP$)-l;JTrBWm+O z&po9ZzqRa@X5JC;xUU_o=t(SB$d#n>q2;4RvIC#YUqR1tFH%H&vg`$`51-g`A=RTS z^-$Ehk@%KS=ih)$iNUt+qS{1KgUSV1DixqSFOjhF?x=3gH0bm9+D?Xaw92*?#KRz8 zSQd7my*W>k)g?O(a?5F>RnG-h*)(Cq>LvaqdO2)nEKb+UwSVkFL<`jXahe2pC$Q~E zJwqARU)!NqeZ=&IQb7oeYtF+vDOO)0SQc)trFcVREo2JVS^3-^66Fg{pk?;V6S*Xr7|w!wa`9D%?7|#G@YRoUk@7XT}1Leo@osCB>|s z;qj;Ho|~AzXnCp!+9DDr@BM2)qSve~TI<8QQ&gLxqcW|Y60fJN2vb4DVxnFIf&iEw z6QzlWvC#&d#vd9e2DPUQJ?liWOO#(U{|QPH(yTRdg|{S^bn*o(3d?AXwOX6N{R4Vu zup~!fd!sKbZ4CI+^&V{Qx?)io2~mJ6X=Qw4(?`M;0BjrS?vlpvwDvgsTb~`U9dUlu zo|7pL^u%>>``cX4p`o9NXhi-^7r=|bIZ5Pwt9 zfPFi!AJ}*M_JPrX69c}KO#^265LN4q+^$GpQ-5-882t=i}7hu$)=`X9v>LN}32A$L}axWWAMm_UaY$k4M^e zPqq$PJZ4-+vr8H*RE{Bv>pfek+8*z@M|8x?G)1i=+DdW21A5DYBuLFik%)z)YRWb} ziH}nw@`jsx1kH?S2BBn2@f?xQtv_r2@zCgyxa66Man_ij69=ifj(X$0FS?8yw_v2+ zK?{tzbmjxGJ^W#tER~7;_Lzz|MzU0d9o(WMCM4?ISkLG0?+4?0bAl#K*S`>vTN!aq8`X;I2w44RPuU-xfKVWV$tV6h*{*=)3n64BgRs> z!aBWPUPac4syos&RU45;=+QXQ2aJtGd6RO5j@-t!i~Jr%?rFHGxD=3Ops)dpeyj~~ z*?edRsg>eZ628Pr>h0N^f6z<}8G-&AthKg8Mq$R5+fpfMDHQj7Lw&;3tdzpo*Q0U)gfrZN>Rr%V%>tq`$j*!gSB*FUi-yMO5DEmF@@+H4H&K^W9Ha15I*C`pGVYljHtVGM8QPAA|F?9 z6np{>Ru9I(>Itx0Py(|B6L3Nr_9SL2;3Yj3G~*IOzQGvXTQQcxlWTMc8kIMY6vgF( z1GW#I&Sa8k*kvGR4EA19vh5W~Gr+eVyp<^GVQD4?qD)*3mlR_CO?6TGsqP^|)V7#1 zM-oE{YzZ?h6PU{inNIgp%4|QHGRj}#_^p&^nK`wf~5JjWLOn`rE@uJcxI3v z8(g|8_J_35?UTtC1x%>iN9l*sMUh5|ObzOSX(F;=lWo7K#;(IqiK1sxmynh`Swgq* zUErG+%$ao2@S{Q2yy^X-$omV|Y&+ojpzEpHkrR?;^|HkJitB$U$~|EIb{9PA#l(hK z1Eg6kP@5LeKmE62e>+Bz?fuC;6KSZ(@uv)=1?{-MDlWIBvYk`M#toS>D$_b4bJVIS zE5cPzcR4&EVS0p>=)PI<1N7q`OKPPI5h4*^!Wm>NSPin9?HU;+eKc<%(*uh*>qkuT zhaPza+AoymVDBT7@~X`>PZgcz&r&~G9rzc{s|A37HHHdcs)N~sK3YH+6l^GQnnZqI z4TfZJM+|^YgB5u+`ge8kii1G%z9BIdH9^{;cFzEToGASPzZ5btDAUP1{I=0G95O1g zMZS!K9I9XUW2CwqXA8opkx{$?(i{1YM63F`L2q)p1bQ+aC#&29H%leHS-cv8bLfshqeJn%jfTt&IaPpzO>UYZE_tIM-g~Z9n!Q{c@N}YhZiqRAh zLF(z!mWjrsfcOI^63!7An81EbRYL{yZEI2N9!&=LKZ0;lpDMNK5yk_JAVRB=5wRxvh6n5-BZB@CpYAjQ~_>7p3Z8RDcfrX>VX zb0FQIzmU+`fHZ0?9TN3ajLj3|W3Tg{AAjv|;5a7^_9QU%p1azg!%k!k2)6p;gvlL~ zF(l^6(&f8TVNP~Mb5Ssuoah|GvTRUrqQ*{Fy()kAOWzc&)6V%5#2 zub$*B--CxPX%ESGXjM>d#Y1B=$7l~#uXt#0q`M1=RInY|qq$)awtre-C)hiFFKO#~ zf;7T3S{00hsUA42Cnq2>jMk-C!djLM)yU{>T<8OT@PHSUv$ui-<=mJs-Lu7OBCVf}tNopN9^zDXCNr{^+%b+2( zw#R^FbklBVh}tm0ng)F~duI7qau50{@rv>KcZOlvvEM8P7nq~ai4ms=+9;~O4Siud zIjl&=VYaT%bY$4?twDl}+f|RYgVadNJ8zrsr=3W=~XSk&8isajN^nj)c zRM}4aulpic02q5Ej(n6VrmfeN;@pI7m990k=U`ZTtid=a{*_oh0tA1fq+V4IE&gGf zO&xA9j=!%MmoHF^#gPWN#PFJy^A09!xGfrIqDk+o7syHYE=CS_vK4vpOM;_y*t)X) z1zBZzi)owH0XJd2V!j7Cq8P8*nt@Q01qPS&x8w_WEB<%Ohpu1W^L^0#8D+PPKkjzJ z8ADR_!b!rNoV`DCi`DpK%j99JdYZqK7Lv*Edg2FvCQr)yno?nB>84b)e&Os@)|GQ| z!a3|z{8q4ASnw!hGUb@YOU79VNN_j-DP|=g$>D?p z2FUo^fl8DsWQhXH3$1Kb6k4k7C{+|K)pnF>CrU-;DWtc3x8(8)4z7=(BIv#^NoU+h zG!QS$rM4#$tO1CmtMoOw<&(PDHURS~HN392Bu#Do;!!EhM*XSesDXoueokV*`GxU&17-u)$d|EyL{iD{W{;_IKZXEgtc7^8} z?8iuJI`iBk(2J|DKtFz!V!u+}!t~StK1*}J4t-e=ENDs^?^SqV$EqP;p?+B3yfuK? zH)9s54mCF^QJJd9AIEc!0uBx~Z2C`E-r9Ykxe8~flMEl63xn^K6#k4tDi3|!=7^QF zwY|nVRrM~PE6$U03~H4FjeZ(zRojrJ-KY0G zby1^E4o`L;S#PL6j4##B9OJ%o>bA(DD1Fps-TA;BAq7(orMYkYCU@z&jrtwB(Z|IK zqP7=1%6k z>AUp|Sd?o9c@oA_By6Ua*%J9OvK5ZmBTeBGN)F^$w`Ug?9x(6U96Kq?8lF9IO1N2O zZ%~<2%q@tVP_11(=YxwSe<`K5bM9(QXr7!@*jg8XPOLQDI+2|7(U$Sd7FFt$t2aZz7_W2sm+ew(+jBC1T+qw_oH zVgIu}+}JFgJ#0V(d1!F))g(nnz^2-NgNBl%7QFvWBpoFZY1<*@OC+&;2UN76;@U!5 zHB`*jWpy7Lry57WBFzEvY87zL*^oF*#aNSYTs?`XIUD?4eGL3W%V*?I9IjiOfiQK zn?Ehox=3Zjy|?$S++#knHG0(Cl=+M1T4zn3KEXds)=Uc|8Nh#Dl2ZDo_Q>dnv$ay% z_nF^i!J=aJX;@+L{ks0<(6N)%O8PdE{2Cjo2C&f1cEwcwK-a5u+&PQwhIFp9^qkf9 zKzD9jX)jCp4XM|-alP=7atsc(QUViYpfdH#(zIE#Vw0yP^ezkgBX-3P?y|NRh_?3( zgcxm}YEh+v*d0zHNS|2ZJA+jHb^{sXanHU_gpm`uyc?A4rLUl{0>c5BuX1gT zHk09cxKEp)UYb|FUmsO`j7eaEl`ZlKatM;oVM-whRFZLA z^NBRqmL$sdcD5wbxYHrqI%M?E7(QoglwQ7gaZB;df9I}uPyRY>%lz-BZE%-O3)MQd zmg-QPNN`ER?jfwIY@L(2@%ZW?g}Hx;E}N5JA}mQic3gN*wYI04LLje(#e!(eDn2CD zBF|OGw-{j+U6wMlGMP*k8f0j)`<%VewZh-r0#)u4uhtqAKh%AA=3;oPlWoKplg6DT3_nB5#`uPfpPoN<-oyoPdc<0uFo;m7Hr zpEG-L>Kuz)yhU|N`_=j^wd7DHX%@M~y{*)CW$vU1$TO(#v}5ms>m6jujVok}erQZPopeGM(an#4+#1QT!&#Dy5?F85unTf)b+OQ6A42w^b!vfz&u zZ)HjP%?Du?ncZ zL|5Z3wl1W=G#x6;Fup6>CZkQJmwSk?gCb+=9xFYQ+C)dDCZ8%JQ{jsTDlC%fA!lxh z!3nT7`~BC|&rUwF@TVV=k0r}Cy)shua7Td=(#wy9m3b=)HYcr|Jv(Vm%#6HwDjJP&w8!K$F@Y1mKt2;cOvz+m8;h2qzc@*pyXR1Tq4t z*EA}_R~M=&qRW3c7L)(O2#}1kyZz&1!?P^mSzi_I_LN}=XV$XR;vSalf}G`wx6gAqwMlm zq9(Yg->;!zD5(#bI-Gggay1#DC(8S)A%6FO0#s$FvM*^*;tquL*u5bhM@+k?h^JOv zTvm!?v(-BGb`_%!XI*S#;O_|gBJZn1SW;PrPMHljNn8_v}b>bMW#%T|&vkiQ3Rr0+!ZBurrj`6rf{f26n-a?_t3HXnRZo<>J){?HTw(G52$fy=LVy@X++5|U zQq$0WegkieyoK#OYVd7#%!mcSpfW9>%HD#PNr=#S=8*mMQ8*{P1aoh~x`CJ0Saf#dlgp;`p;3Zrha6Y#lxRBcjyqVhqyp7uq zyocKZypKBqe2hB|e3H8ee1-b~_(u+<;>x*l;J>-Q8J1^w)P(1FXuI$NF9Pd%8MqQ} z0n_Ts&Oz4`jU4f!U(&G_cPK74!Nj(lg}t~}a-59KEUPv)b5qxopy z7(NboA-@nfiBASj<#T}Zc+`kr#xDb2&aVPq!=pz0HhvrMPJSnFsbFMS!6cwmLUo}! zu!o=kTLmld7s407wT0Tib%fTyeu5uxd%+(#K2X-3@dSx1nefE%#uZ_2|P?1#qiQX>3iVcrQZ?rTzZb)!ZITIl{+8|umF$( zIFER%G(s9Fh2xn;Qj)Y-N|n;33@KB}l9ou>(o$)elrJrpR!FO*{n7#H8|jF2R5~S{ zhUwAE(iQ0{dZr|;l{PVqR3sHMdTEQai!n%hq_3H((n0AkW0Hcb#yxUWY!u_eMB;80h70W4wl~MMpj4NYg zsxch?=EJmPe4$&`nrXxMF>Rq^)}HZaI-vd?nLwr!69kR3E=*S@nCXTxF(^$B)UGEe zO)sW5Q^;HwZbE~rKs<}S=B@M64b;uk73v=A`|3;eZ=D)AjdQwRHK=NoYqaZCV{79C z(^EHpXcs-NKCpU$`&Rdt9yL94%}eW4s}on}q<8naLj6k(sx;Ww(7)lNMnR2RH+j{p zd9$=;rOhAsq;${i;U4m?=c>>u^NjpI$NA0&c$f_LA);hh>>_p{8_v$-oa>mDE=ls5+93C#HZr# z;xq9N@wxayd`ZV99hn%Hs#q?*7ylL=Xfa+ABvF#2>XKEeiP4CDGtC#!4iE?kW|$Z~ zenSEM0T`Rp!U5v|=)u!s05bsd0E+-=fNVfMU=5%UPy*Nq*atWaCTMpg2=z z0TKY9iBmx1r(j-~vI0<54fO*shweVB3?a2@b7;2z*N4VY0hm<6KH;?v4ePke=#<^arV8lc|VZ#DdS0%`)h0gV7O zU2A|pdhlg@vFiYa`I)%~{2L82&j7Cgcq{WaE3gK(3g*HZY%R7P+l2LD{n!Au3md}r zWe2k(*a&tK8_mYCbJzuJ3Y*0)WmmE5*`lt#U7NAn**)zqv_H)rWRJ0@*$Z7?c73V= zy?2$p!QNr-L$mUE`{(T+vv1gU0h0nEIs|p_{|FqzNt`q1%DHov4o5od=e#h}HbbYw zcMe(;l;3$p=Tfd67sv&3p_q}4Jf&er*+_(am~7zDELxlGh-X;#s1_5;>_WJZSppnQ zW4Mca62+)1%l5}}EL+=g6fxsjSKvvGr@#>`<}YrH19Ke8gZYIM8T4(oB_B*NGZi?L z?+M(STL=tM8*on!^C0KSqgOE7xbX6Q@K6T7a9*J_PRTp!Mp&hf(an zEXlfa9e}+Z=x5MUy+tu-AqUwsW)5N-MP(!GW>Io@CITe09tPEYr{N4CNQ;w`OLsiJwc;Z4WI? z*F{>HIq{KX1znT6(su0P`1^CZuJ>rV;3nE!EPSACPZ(he=48w_XakHF+N&19B_As` zz^w9#T871H&%VT*1S(4T3fyCP4=&E=hO`JeRi6Se$6 zD?idn3+AXG%tyVU2|bJ%jk!CjcNP=d`zo$1W)=fC%b}s6hePMl3p&!dq1nueUYC2< zV+t71Gj1A_3OtcXM4b|uKY#~tFHx#pJZ1&%6_bhZ8MZ#{$>6V9?i3wm`lIYRgnKZw zpYμ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 literal 0 HcmV?d00001 diff --git a/app/fonts/OpenDyslexic/OpenDyslexic-BoldItalic.otf b/app/fonts/OpenDyslexic/OpenDyslexic-BoldItalic.otf new file mode 100644 index 0000000000000000000000000000000000000000..070a0cf5292068170d4bef0b2f8e15fe0bfde008 GIT binary patch literal 235788 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 d+iC4kE4x~DwNUEp3@D9uMwE5!>Y{YF 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

1j`1IaDI_VqF(7y3vX8y{V%h7UcngQA$ z4%C^ytEqua%pgXx$D6_Is(G3jVq4i(rbPS6q4sJ!*bJjC;U~;qpU>l;^f`0uqqT1w zuj>)lXj>&p3wgw>yn)$qR( zbGAIiuMwU%Pk7?57N$u!*7dIprfM=Hz25F3&0f#5j+r`I8Cf2omlY!Se+A{yQ#55v zcBUz2q|z2Dr|qmfKC<2E4|+lsweD6j*Fe>Dq*Pt|fTPgwZ!-;b9padMbiC)y^XPb@ zPoE3U>}zO+YoLziU8s|4faj?O*k3ikfy_^{_M>CpLAEk;F4xenRH3fRip~&5WB^*y(Z)TfO*PGks)b%#l!i?6IFh=LY$7(+`PFuw^Z56js{=>}e_9n*kGr<48 z!^}jJoM-N2_t{6xEM(XMbC=ADo4aLJ-29gEUu=HI>hm*Zj`m^qpb@S%^8|<8JO(~0 zDCMeuu4VU#G9ca7b#={pSD)4G_t^*V7`$bhppkA6jnqb>ks@7tf{&38&P6|aguB*V zYYTM#yo}DDA1N~jww%ly*a|vlUQy@F3(-zD*y_?FA`?6^=0AAvQIGcOWX0@_x%@s9lKm_;@itr83t)%am5}UH2O{<)UrxLpg?uU-(qBhqVvBs18iJYK)VBx~ z{F$LbmVBE~Psn#j{%g2vPPhm7#e1ozhWo$=W@1PBER`@S7RvrU^#9}ej+?<3nB^BJ z&B^?~pa1hS;YA=XyjV(0N<(|&4i;LD_vl*e7VGi0A1dF*_iy(*;d?>|1>{2&5DDrD z0v1m|U+~9>4I!JGqd&6$n9NIb3244oNrvslTIa%E^w%=D-;{Jy9yF+21rI|99J7~z;x@OOa@Wc_jp zhjRluxc^faN6KCPM`Y%wYLW7z$W=GfB5Bz%;%oR7g0N+Gh8~1lxR2l`yA@m;i?sv! zyp)(5y=Yi1#X`fq=7zy%`!nGMGAHZq@<+ov_;TFmWo#F$zrrJ{LGZeWn5hoU)TV^9 z&%`b8#4q$_u{ujUMcwBiMf%xd`$yYfPkdr!bh*rxyZ6=NXoK>HlrL8PZ?}b%iQnmF ziSgHa$+u$Pi>q$-^epVDv52RitWUpIa@aj7?}>jfJggMXdKNtI4B=MsoWpvJFVvXb zp7~;bjNBhhM!Z;C`I_*<@nWU_ivElo7rPzivpC2-q_A}l@V^5`R}MvS<_7Y`E$E1LNDY z>(t$(`i>hu*i;+bdt?drJ>q>2c2IHqZbhc$1>K5^%pha1qODB4jMf7hT8w6vk4Bb4 zQ>((fUNz?Rj=~D2Ci4f9R_?KX+DeC&y7EC&H#7OIFKt_7dY#?6dy$!Ob~pHvj;${( zGF#8<(y7Q+>(=GGBHOMzXYI)D-8vSbN9}!g|BK(f;Gl2wb6;BVuu_*ftkg1ta_D(p z;jmJdKdjV89#(3>7(4L2YxnLwc%*r{Z|@QP&62)-hYT|>CcNL^tFJO^`jreFV%{Dw zymw!-exSr`hV?ev2A7N)Vzv(++IO(o`5*ZnJ*(UX3EKkY6}Z80TV*K!Y|Wv=`<2*w z!z6s{h^tEm*b_#KIN?Ow9DcHGIbu|w5w>{5s9_`QIU^-aXRX^XYPi@KMq1O8x+QTn z^o)$SJ?*HX0neFO{Cwdxl@}_HmFFo}dvMy5q$yA?nzW@|VWLROOWIQvjRPZ^Gqf{! zZRKT@AE~@5Bm55NP}9P^Xh$>uHp@Q1Xl4mxmUVWs-NtO= zPSAP+`b`C}B3Ms3Fb;2nMyx$I!v?*TYsY>X-Q30Q3arrvxIwOj@xo{~p4rwZV&~&# zu-n&f-S4sbp64EM3()Zw<4^P~`_R3Jj=#dKa&PiQXijD|$2#M%XB$iJ_c*c4zPN@Q zCvk}W!YEaAN*V9^Az-4E_(|}gVvp_7%$WJKemKVnj*%RrI7X9VjGqD@t7}l>2#xns zIddJy^&B^FOd#7{FmZHhbaqrHDvWISo?oX$ZK5Lfl67GxzfO}o)XW?UfVO-c0m4$y29SPrz-;fJiKw@^`(?}5I zK8q^Cw?>uVpGV+@gl$m@{(bm2d}sIq{zLc@{$uzG{!{oGzAJ2p?+)L<_k?fZ>F}L# zkqJBKrwTc$aG+gB)i}@r#e*rT!BLZ=7DsIk>r2PGE|;b65f zrc`1|B&IatF&yaSF?k=8?=dAAQ+n|ml)da|cdvQfyp6r%Jl1U*xD(yo?g8pdn%#8p zp<(xwvg|Ql&X;Fbn@YZlukPzGW~=M#`=kBwU?zQx<4ATP>~jv&X&us6YxQMsr*y9ZZfmx9XJ1l6JR>r%?~ zDb1rPwPPrq3G6CxXWS?5A72$;9bdyvy(P5i;o$F&X2;&~@%8N5J1KsWzD*yCLR}G7vB(1j3-lfW%VN|y9UhFCg_r4*PHBfncd|w*;&VuqOoaWnwwM1L~NDs zU>4{~+naTackM=ZgPXwJj)W+Zt|8`fItq7p(#K)$+e zZd~RG5|`wM!#aZ5L*`X>`yoi*p?FAL%iiE4n8_H$KA~ffvEz`g*D)HsL1ZeawFMta z`^|YuC2*}KGSe~HPXU<=S#4rufJgvo^F=u+Yn!sj?9-6VEs?=zB5PYAQ;XT9`wqSl z85*{s63}A#-t1Rctmu2?{F1%@w1zz9J1X zHQTG-2j}YX21rw6rL0XQEuw*@YRnT7J;dnB1#fEWXRps_C31%AlP@4Wve9nNkt!+T zM7o4%Gs1Cm)Ss}W7VZ7YIK55p@IAeWd|mQ|&ivY>4pma>7g&0f{jNV$3Ci`EG6?b( zd&?ksi-XDLgUI2%cj37O``o3oX>ibQ`FHpte2MMn*X#`cP53r^7j~4k`Y8u*_vBE6 zgZ35&d87YH{^yjFl#xhTEZm5dUvkvun`9J2`8jkLd=?}$F%xoljpU|ou2+dQOp4k8 z`XPR*9tkiH8zT9?6bm6F0=7hsI3$j?T;`v+E?erzST|PtS?U`7Q}&FEUMKU*hBM$5 zI1-IFmN>Z|GAEnXA)WV1&!5l73Wt$DIXPiiA5&Qr@KjAgA|02OK3`hr4y}`QqDK4F V$#Uf0WHe3=QU}u9YwO$1{|}>)B0K;9 literal 0 HcmV?d00001 diff --git a/app/fonts/OpenDyslexic/OpenDyslexic-Italic.otf b/app/fonts/OpenDyslexic/OpenDyslexic-Italic.otf new file mode 100644 index 0000000000000000000000000000000000000000..fe66b97b3e20d3acff5f5be638e06a9cc788ad46 GIT binary patch literal 190448 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 WiueZk+#xrP7J%yr^Q5k-_x&I3l53s- literal 0 HcmV?d00001 diff --git a/app/fonts/OpenDyslexic/OpenDyslexic-Regular.otf b/app/fonts/OpenDyslexic/OpenDyslexic-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..f0f51d6702cac75e478f1e612541013410795f44 GIT binary patch literal 175872 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%0AMBU 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 @etsa8PagWVALz(y# zK9=>%4i=Rae>O-LrRV;(@fGC?Y{qjN?o^$WN>7~??WoNne^T-*UDT@uZg96pM}c&V zVrT`m-d~Tl+g?{k#o0*UQ3{qiD&_f1fk!32^1o9j)l*SgKxAvo)PR-sWY>7$jzw7KF3FC{{V5PK!u4<{sRkueXOZ zsdD;|wX;kh=>abf=iuzOR3U9=tXrguU&rA;Pevp=XPTbAaaG)}wS>**HUy(EF@t8h zQ73eBK5GZ}r!deDXJPPtLJ!}j7TQQwEwY_ulujSUJ4N$`ge$H^PQDh+La~k-q0uZ2 z*>DIKyi@9Y8!<3-h^O1l*;H=f+U4t4WN%OUV=nD*i^pIkP^E;60*PqpK4Q~iw+Sm< zVs|FQU5Spn;>M~ZOpXkzs*9dt4Gr?JYOTng`ULRpxQk?O20BIQD;3kwlwn3kPH zU`9)t!XxL9d%Kx~mb7VMc~-|yWTkm4pDNXz>C>_gu|sx&TW%Kt$#_{PS&c? zkp;}9z?KN80aLd1w;g=__ohB)xJXTKL254{C1rl>M&oT4rj4B#9@K3oY4poXxBwadvl0{|QG3QpnQ{BS83}t01$GS!FK%&>MIpv441~IHcQV*TJ33n2J z&ly#E>U!xd3ioI(9t# zQuG}wzUcNQ^s^x~J|!i|l#!jCoMp_KA37(~99C86xoG6Z6j8N|oPL zeJw?ytMdQZRmUK16n&0s1w_=B-HHyQUgAq8{KHj`jkQx7q&C=`#$v*FUBdHz;${{KPn39MXi)QF(pc5tS>zN0E#fO@^0fsS9I*Whls~D8 zmH0({tovV}{{P49QXkucbqUSbn#c;q1TrC@c>p5*bxt?n8&#VGXJzt20~7oN_C51V zj3tdJmWD+tbLLTXT|@0G)_Q^+!@ePkX)>Gcj;4U%M^Wjt20lyU*y86{3C;>!2C=K5 zN0scS*bB5}F-X#@e|GHS+W5w=3A8uJV9ppbjJ& zYUPYuZLP&#Erxl_?xs^WWk=`!R9W76eD{lcJZr0yc+q+x?z}D}BRhPakwgR-!U%NJ zU!D_~F)z@ZKyDdSE}JT0f(3kSVL~V?tqa#m8`QJV&DnCi*1~#3v$o0Yb^5mv$gy0W zN-L(zxia-#3d1I{Z7BvAm7-Q`h|Vd_4D@evt~v6x>^ka3V*n)K+rNjv`Z<=~&+5{f zGz;H*J~f=E+B;{keZzV+?h18#;nr#q6M83-ltEw3B_o#EOjb6KH4J6d*%ej?@eR`v zCW6d{?y*dpIKW;1)=H(}Df2l!Ll(ly?y5m)+8*?|z~*b=X#P6zfndL+ zO}d_PE$xmD3xCyHayCSe9;2Q_TAhO351DhLX2Lq$fcnb#&uWomczz9*yHW-WOpYgT zJI9lT6oi9t1Ll<+cK5drxpfP%g&c9>K@QllIN{6EC=Jg7>tp#_ z+A9>8$kqxGk`WebUC6{%mLK{;-Sh;W&RtXk5ldZE2qe`{<$;PL%==3i+$ zj}0A2iW@9*j6^*m>q5xZ-y!0IRMsZ3>z1xL2r%rQ4zacbB#WB$qY zdE3mg@(UR}O)V$q+lKRoe#1*mxR zM=R+H?~98XHC6m{9D1Go#truU)}5+pr?Wmh>(we4^ph5@h+k{W+c#zMNppXe!86=1 zqp8B2gQtUT8`o%kQBqpvjZ9%-NH8v~sz9Hlp56chi4LC0k>fMQPo06tAd7V|@1QHi z9mKAGZ;;MwjxYLU*9GH=on3xNG|%ndCB2!Ews$f}1(x6DZasCcI1gD^SHT(-7~^k5 zh337MF7IrHc)WWXUslHB3V^3i?x!py(ctKovw0g%Z!=3?!3~86+B{_^&n%<%dgg!X z^?v_buj`Mei2CFExLa+1T<5Nugve>wN^&NOY^^N{^RdxB8Cu6t4s8Idm4TK41jatc z0HX@Gscf2v+9@K7u+6S1@;~k~?|*F8$JuQ!`Fw^9`n5s7KI*NTDB7#B+pq*6(w8?6 zzd^jt!Rvy5ZUKtuiW)1-7r~vVp86 zW$l&t8HKZ!WSa#4>l!e;YOZF;u1MB7Lruu+2;{v^-*xA1yX{T_>3YlXxH&D1`XJ={)7%G9WjW#$3T)FEyqz^J z?Lt$ITFvoVm53FI&5jDu$kY?lXE(xzGMVi;t1ZSmeC|i(5Gc)iGF&=7k-uRFS3@mI?fBH0bLU8da76 zEEAn&!qC~Qw7Yaw1D~svG3)0qGx;%~vhXB}`_B07Yeiqob`NLW_y7bV7c6_0!Nq1K#mtOG@6fEm6eJ8_p3r_8xFR0*!a|5xfZCVBS64e#?n^|g#O}rb^Kpy)-deT6YE>bxp zR$L}Z4`AiG3M1FUZ$uE9ZmUvLyhIH|m15_QDNe90g6C0Z)&lG168i;v_-BLzo(^FG z712@yk!6nh_;LUZD+~A~#tYiMZ_bPEfHZ3$T5Owf&7!DxGjDJ=120xyt~&Q)c@a=q z41OU!w=@uE+Ge5HQ^#%0Ier`SOoQ8)iyG|gziDtA^Axu+T(S<_r=&#YUok!(+;uM@ z(-nPokt*GT(>1@cd0G7xBJLCA1y4iGbTI>=Mis+{`Y~tY7Ug{{ag!Y>%XFznH$F1n zJv_d8mRWy^A$*l;??Y%%Ndpb-qabRq+*2v60+BBP$)bViYio}4F2}AxFe-RbB`$c8 zu}^x{Puv~0BXFZxQbJ|v)ey%pS=DP8K1?W5@S(_c6e$>j8-uR4x)`~V#{Z(Gd?;#1 zQDuni;O4(JIM(LoU=&Tg`B49N)PIAf3LUH$hq&_Y9Hx$ge`PU*Gxyx`p~~}I)Ol_} zB@9X%+b0I;KaNVU%)YZ#pCDffyo{*PlCERDY;9|)&)$4IsrX~uE6sibk^fO1FMcZc z+mzy#1N}b4#GotHzb|8NM_ePP9UgI0`2^~x68y@UW<54Ea9I@gYxtg69W_fh_kac< z@UYVZHX_T^C81N;pvh0Fy1m^`<=UpPvN~3?bGKSn)8rwEY2z{Q=m=bmHKbo@kUGiy zpuylldD}Kbw|?=yL-FIr|1xQL*R)n}efS@{hW9Y+@|7JkK<#GfsW(>R6K_YSp7q95 zf5I;w&+&`Lr~KmaiFaoXX^2pWQ|Kg+XxvtW5rIz($AWpmDg5T`X!|0k@EfOaiBovN zDg0JU!G~rdpyw>EdstcAm$+ep+`l)7U-7=6v+tyaJTvR#^P5lQn5Fdg`)-eXV?39a zwKC7#T9mp}O7FOF>S0}6c5L=MkGU>N!xiJHeYH!hbgFyJ=7YRp25Xo%q}8TxjN~Ri zJUWI6Y38U|(X*_6x`5b#*g#YBfFS`jjnX&DWy-(}-zgd=pGuKmV}+UF;?j685{Dxa z+76A-<28SC2-`a{iZ^;h`#5;h6llQDXP*-`yX;AbzhJ`IwtVcA@JMLh(UW4r0zB;I z6qly<^2kArkl1~9lqLnP_f%YmqM{8J&1ku(2*#i%2oQcIM2&MBbTHgqx*t#V zSo0UGQZhi<+@uQ|-hXWf4T(<(GlwbFh2+%q#B}3+s#Bw3w3$_iVqe#U*Y7DduC2HY z17bhn>VM%Txm-R*%}z)yEMRliM_I8)u-oI$c>>Zy8&ZI`t z`RhO(bDLHD8wQ7B?>8`eyM>vqMIPF~p%8BqzTBL&68*qIowQA^w=dF6vuM6nGkL;H z{jcQH$dZmz{QWibBJp6{n#8^FaW}${@=}oQvRYY_BK?^V*3Zof2kiU)|Ct5paS0Qz zN|?ZYqRKaeyY2sLtBK^1d{{_|iM7U=F!O?9<+;u3^SF^*njJp z@#&66taOl>2|)t}*G7U*njz~wVasie7;1q&dBxZ8z{lTEX=xj>nCBpidBNYZm~Vqu z*Cg^vI(gXRrOcL*Uj?~GXr5v`(fuf{m(M@D@cLAqv=7)6j|_R*!x3=2)JL1Xw~iV+ zv4>8&d0_15jRTFWa!g$>^KtFXl;xKoT>!_2U(={@cI zoaf7{UqJN&RDb-p>KAzR0`~j+brofMdu7ILr)#&JuPK!ccJpnexeKnm&hUi}4?cCF z>+S6c>+bn&*Z#-P+`hhF+Q-YzbcqiQiw!YKL)7ED)obkXjWf-@ zoN z%rcX2BI&mgZp#q#tzE^u!aH{Ns5PrOYqJR#Toqs+!z2@2>F#4`5%esT77p1f=N{Y+ zl#_0cU1;Vq#mEV;DZF|XyW8DET2w*-6P3ER6)!mEs_Tj4`5;*O@#+22Wp9kdrCbcg z)m)55D{JTI9;Sql(70fuv?5pS!^_@kCx)h&!)pcApUz6@FqQpphaZW~(ZS@pBKIn; zIKBPl=&f2VeKD^k(tq<9_N@=nuPSC5&I2mbiS)TD^`?JHy^y{W7sdmrhx+@AtS^OC zkc)p3CX(Y(ah&?X8zQSqzBPGy#i+i-&$DtEb%p}iQC`Rv;6~^QHZARCSNPM?`0Zoq zOQarOrvw;w9Ti|u;mMhIj!U0JZLCOb=_c8Klvg3>rI6ecPi-KBhr=RcqGK{|tP#Db zE-ti>fmN<$302r~{ONnR7qRt!cEwVCbt{-`IV8TOb8#yWa4bsd>_WeA2_cY}ffl6m?-+Iendl zV~^e&2CW`tlD2L2S?jlWc3OaYYCvLOfX9dtGg=HAn!2!$366ww_UsJZZY25AF)E$s zx3NOLdGdVWrlZSgC%Alc^p$6x?7rt57cHFwHA?B#8=q1+0x}Y_`gg*Ye zSxb8U_e8|_p39;horSSkDz-XZ}F?Cyw$e55l!#pr3a8gKT-3{#$>*}R* zO&h1|3|<Pl%J92IG>J=XJ$>uY8OIL)c9R+j3#c?ex8lRm3TrD~q!(TC^dxIBTp)yt&swFwW4^C3(3 zr}Ddtue9NH1O&12E2ZzWVXR!#w}BpE2|ukjf!|a7qmvrvE8-7u>K@KIU}dGCH{S5R;0!_6*e>NDQS%*mECdXLV_-Zu$vJ!? zHg*B!$(U$dv>f=U@~*t^`40=qaQjzY@|&?ZIPu=_LT}VZ|9PP=a{TOHVP#G4Eb|Vd zF!DNsqv6Vm@^I!uUcahboDo+rA9dB!_iO@r?MK14r(9{*J8J!VTPlSmy|$!_0?3iQ zI_bXq0?2yEiqn4FsHNOsNDsUhYh!ex@0+grMxi@~_z4G|)H z3ovu9b9^Lj;v*4{sKM5e%zaMrtY%#SWb(DL9&P^oy3RxBj!p_QAcr&TlD=&I4ED!N zwd8K978AG06iPLO*jcS(`Wcrg>ji4ZQ;D;>+9cBB0>~5Bgpp&SMnn$6jX?f*AX$E* z4mX@+T65+0GW?jP;Cnl{NHg7{srOrv6AYx-l6&NmhqB8c4bL6x5->)9PecIo3um3w zme=keub8+ErdgN=H5^&YQ~8{)s|{Z&Y`4U^NW*dwua`_cYIPN)?zth%AV?i@ZT$us zq_(-cP6(1UH=}>otRIcoraYT56Y0n2gqhF!AM+jS(Y1ZTn0Ql{q-jarmw;QhF*`HH zQ%AlNuA^!>>)_Yy+>Gw^t~6CR0Wt6 z-oL|mW~o6B43v^+^^Ib>2p_=qxR+$Y)~TGfh9gyvJj#Yg`(cY_4)^g#``avNf4T+j z!`;6ZJZ3e+;C!s1+Jz0^PPJVFL(>KgEKNI*0unMu+osjz{|4J$Ru{Sah&^5^7uZ@> zmy3UKvn}lxL4O;_ZvpkGocMIm-Zo4`$y)gO0=Z%!dJOd|@cKt>ok}n&{^c15s3<0^ zrbMrV03%L&FKF)u?b)2RKWOhQrX5R@YstF-WB}ar?J`OhpyUOV+{R1hpk%=?u>*rU zAEX##YwsZc5CPkz;0#fu@!;d*W6{)lE^R^0&8Rtr*PM!)ThKMTZE>Ze;C>9t(e8f* zu-HB4B_u|z6{t0u*BTdrT4A!<|Gm*KJ7j4W-fzYGY5e^Ryx$du`GWv^2h*T%1trd- z#8zHnJ4##$lN}uYC;EZ5pZ|>^7kH=FhOK0DW%wW7v}pcGY)2x9?WhA{zI8Y;-)7b!`0%(waor zGH zw~lK&ZZ|#1N{ZQ(sC(*?FtbbKC?oUI4oeu9+{g5K{84y$y2jU$9`GY=pv(o|N3+0R$rKECn-)s+{-SKfZC zyhS`Sz`u5V$$Z>lQA*7*NISfFmwT&SZb7{rmSKoEQ@fnoTz7Jt>soGe-N|jPJ79CA z>W*acFa;zB5yNLl=DsMO!6Ik>izdK?!S|__7tM-+3&TQZgN-O#php zQ@T$#fb+m#^?-t2N>-ZEw|`lV)gmXU(Z`lYURXKd=T!Jro-^$&3&4Rl)a(Uo#y@Si z-EBEPINdjK$_HQvN#L*!cUjqO-1PxUD*WPY6iBn_mmH)#cj^FqljtgRKp|BA&L&IHY!D>4qCx#FGIrcoR;= z%0qk?HUWoI`H3~DSWK*Ep}q?L)5$gjvOkyMu;{mP*4&9nW89N|R&gv|sM6vtr>rS< z%qEp5r3tn{Pwo@;cr}dGAm>cHxa2FA1fq3}$L!}gan-TtNURLf$O1mR78`s!+d@q|`?GDf||M$alK z&hVI-B9}bkKFJ?Frq0T<3i3aTI}!){o97d4{i};UAdhG!pVLl?gxDo#YNq%a=##xCy1&;!uL@hZG-8$Uf%TV!cq*-Ht{oLMe`I5$e_(uKkQpF5y=f(q zvcNYq)pttrcz{t&ol-Z@{7}0tW>22gGu9Xe;q>pM zzj%VGn;&Vj06TVb$llt?=0QU&e#6cFp>c767TqP6`6)G3z?h}v83 zsPw3)Xc>=|taFb?5U_8^SETKirS_{hoyDs-o$jkZr~N9GPWw#I8P<=}=`aR#Y<=y! z4HN>ZtNd;KVLyMzorPY4723g_ke3C}+VV(CP}di|6KL^K3{p0rfu?-WhI5&9&Eto;>g9-;#-A~=Aa z*oPPfV|$CVf{Ryb00OU|vT{|eatT#-pvrDkxq>Rnr}m+0!&lMn75KDJqN2ks2Stg% zZs{+p?X$Z|y{puErxS@gsMUUF3R3DBwr|c}ztH^CewT@~MHmfdx0$OaWeg8@pBUM7 zwja~z;2p8A+YMv*RYT{XHM^6{=hJp9UuE2|C8+7t$Zm}ghI2=$T|ljJKy)8{zt5SH z5FU4H-?6(7`yFc3s9%pd_4jqTWiBY)c}B*W^J^FH-@kUo5A9|I!JUC4zroS%oEp(t zr0IxD=L(J=*Ig;*Y*7)w_f<%~qM}@j=B%`Y7TUT2!`zeA3YpMGkd{%qWd5tN`YV&X zlY{J4gtKr4$xy1%PbrfM1gRJEwj==UxWD=faSZiYO}%ui`uqNd4a`e;rv)lK7Tr>txX+2o z1A}OG3HD~fMJ;vk*|_b9@oYjD*3ieC568eq zbY(lS^G@`Os)RVxW~HVfXvFa78413_+%|_DNu8TMHzRpL{O(LjbQ=a&&$cn$LZ|4$ z=%V3*HuyX;3#i_O+&P1J!dEv4&@xI#XX>kbh62Z49jzu@(%z=)!VlU3Y-m#|g~4sg zN)4c)c;d)SRx<|L9Z;^u<-0xwY5^i>Z^2Aesw@z}5oYy8Y$%Nt=r`@Ud_j6{57Cml z{gxpdEIc8#{ed0=rsyD#RELIU+Pa< ze7T;MmEPVwIe)`$^X`pHf64QB*ZBndav@^DZe(uT|Ip)*U(WC~rZvO6XL}pj%=Z(u z6m9$3uzO?B^kwEHGcqQQ@@O@1bZrx>MnPJt%g!K~#QrT7-xcO%zL_&;dkhVnICZwk zfBJ~fUcjIMRH(it`H3~5nUudy9K8OB43BW2pE@2nDFJt!l>pmu!?$*`OThby0x~0w zwUrl?&pA{~&6qvP^XpDDCeQgA+?`pOJn|l>ouE8N-Y-2UC||sxCf8k6Tn-f>v8V_s zA;?*Jh2piL_Xv6EN zjkQf|DyuMu;n6YHhb{`NiWV?e1MRMM6R%0%(&$+rqK75^wybo0+2l7E^18saJ=eND zXw5X;>gjVQkMWosFlEv-)8ui31G*SHwqLllt(kq}@&rK9Pp{HMmAk?A zyF#7vrI+CdJpm`^K{!B90N`T*g~}|oa2%X|)Qkk#B5reWCDp^`CgnWGSrvH%at_Ma zLCaQ-oR7^N_p&BrkX|m|DOvsCX1+Lb!rr%=4TNsa*;n=BHE{7--8yo~&aW z+*aYG_=)Rn$3fJ|-J)57L+AtB1Vixq34+p3JA(VvmC{N+n`!P3(f*1}XaP{E8Fo9H z7agd)7xaf>)X*L^#{rdsl@JL#K{Wu0wpW@7T%PpD**nCB$2$@W3^VauJ>eurll~*8_ZGX+$Sd*2joY;K( zRW>$O&<~FJ&FR`Za=l50H&BMU8Qymzf7b0L;U8PKD)tvhR`$Y0Uyoo3EjSH}a56fp znf9UmnIV#5kyB2)XH&rB<>qBR89xv4m>M{PZ($QhSq2;RiWZe%P%I-|N5$u;czv6w zOlM^=#<-1)38EDl6w32!q}Q5ncOJv`>h$%vZ9Dc1b${ad#`W#(hWF|{p>=np^C0j5 z1nzBv8Npsvd26Ub3*NZs70=ms+B#~C$ewfAl}6p{f4%87T6>~Xam{gwKn$E{XrVN{ z>>{nJV_*8dhGA9%a>Z>yGJWnYjjfYKAqf{UDO@K_sgoY&ml$LW@(mA0zQT2N;@OnR zEG?v$ZghBjKszG}D?{57?80Naftj&&wm~6r;v9!uZhxx%8Q=ll2}z~59~wWDOZ}B@ zh88Z;32){5%UXLh?KHff<^n{VJGNEtGPAl6dQE%c05q zNI7x#?d!Oe%@B4m!|0FnP@3q(2XYIY$Ugf*u_K$`Bfx0!HO3VzA%gfZ0i=J>8 zUSu0pD9-W)4%-ug@2>DaL-3!91rXah6&6)^l7;Y!;|;%3-r9D2TR!#1%d33pUJ$u8 z+1xtDPI%uwW=`N>&t+8Ib~V}1egm=tKK5r?HBQ;1TW|x745#|yx+^yH-Ls#5zx`VL z2Qps7SK(S3_yXE_7)3OpZ($Gqr2#;`*Dchy+Ylovfq17{ja@`|RSGNbrbn@eF=YK$ zzW#|^9U@R1!p(DI%0&IRgZ?Kk+dtoMZQlvUoaC&Xc@FelUVS#I+XA=A6Z8|Oc+MZ} zU`7bHpu{(pVhyo}cJ!1XizcxeeOVNT+g?mTA-J4;v%1h=ch=y~$~ZvxaOsf}$f2x# z!_KS~v&bA$j4KaE;wC4y0w8IvdlhDp;?mAiz>03hQ5U}n)~b^RMUjnI{Wo}g=xV7j zkNQZvwWE8`nwX%ElW?vzQPb$eLUQ?|6>h&;%F)cHqjY_>S1~&hr0fu;vc4SvK%b$f zs3i*E#6N0@cmXTgTqwK)jH;hDV%Y3?9k2+Vvg*^qZvb^=IW>;f3-4Y=ZE7*wp1nkc zt?v1;YpIq4b=Vb8zE?b7vzDyh{CKJpqo>6^TulKOv63 z^Rg|S>-;ns0pE@etnM^-)@y;DRH{qMUzS8T3b&6$>=}8~699{gkaFk5CffsrXgbm* z8_{@2a;wUk4&9BI(4HlyFoO2>5E!{T4V}T7BJ3D?VyIX_!xkmrXfy^1sZtMKd}y0= z;ZREU`tvBQlbUj4eR9%m*7*XAa6gVp+WfM&C%3&%tR|IVH_bN*K_y`f&yP#r- zmmi~QADk#xgzeJGzZ8w{ncWq#%db>7u6?0y9G2CMeP5~@r^#ApJ%xQo_H(vXSOA(w zPI#iJk8J4B9a3{eV-X!%qlIhP{*D@d+pF)Q`0f(esQ=fh$D+@whyC(&DU;V4LZUD3 z%wJchI>4zu4%GSM&^4H*h@3rD>^c1obqUHt>PcA7rX!Bv&~rA&5G2eG+c%jhCcO!*$LD`|(88Q5&Jf%$5JDkeg?0vR=cOr!u6drBp=OsuP9 z0?tzuK$0e0=}zC<;9BWjQL&bfz?0s0r)&H%Jey~-T2JB7)Se?D=SmA853D%Nsv)fC zeCQC+$61}){R!^goKWEJ7QYznEqPDg5A~Bw!y=Tm=?0$nMBH=x!DkSYFbJA&F!n%v z!9YG*6#l~%&s)M=sTv2Qgs)O@OD)W$_Ne~qqnaY^p~)yfhALz9>K#g$iB-tCqGBfR zyAqs=D4GUeb}!X5X(13}a7IKTSUAAs#v#8Kh;F=C+FXbZ>M;e=L?td0A8>u?fXyX* zD}3M9m1@&3h)xUVG{Ax=BHr=HV(+r|4xL)3^aJNE)gX0_c>=@Np;)QKpAu zj^t8H2O*2jXs#@ODrRvAw@(BUbW86GZzVNUG2!_eW^#(oW24P@_hm$rpsc-LRPAMfBH94uUfS{VzuL=#rww%x37mo;|Eq{kmHE7 zSywLu&O4g*%zZ{dY$nZQBYk)JO2NEdtC%(hnog7f^;(x3Kl*`$bIji^JuO0uTN^6vXS8456kJ|LRP*G)z8Ju5vb999Q zA4c#Il^3*-$TrYtd;o?w={GZ|{`8L>u%+Sc9YFVq&{|7!~}?e1$~Nb=++-}u5`oi@G^W24YD(h`Dm#Yvc)*&@;jXYG6nla zJki>8f}Mj(D+W@>VzqS%oaPgnKcVQWHc&sa%}}uX5|;p#R)_FN!B?zU46gv2@Io#4 z(gd|h6enq!+lDhhRCPc-(E| z@V3}cZ5>SuHGfc$4iL5S-@o-Kz`umYxh}}_EV!{kwd|GP=_z#=-)@<%uP zNKtAN^8x#=a2#mP6A|5ep)Gtss?+;0m7g_}<3kyN*I2<-sFEn{@QFav1ibuh^t=B&<0MMcu9-$`fvf z|C8Z{kQ%y1x9N`TyDMtIN77eo)$-VSgpl&V5s118>fufuzZFwURA1j!kco4P*EuTy z!pgt8A>S~3ab~3((ST!%w$!M)m3wnJIL3YhE~9CNrkW&t@8m2C@d$lo zDcU$`nFgg!S5nw9vTlsJj8pX#BG%&DJ{yO+Fc$%yj+0`)GCC?e+L4?VQ%zT9YhQ0^ zJJurD(K?uQL-gUd50GCVZbLrWVEU>pJV`M6_P8vJq~CNxYkHv*+U2Xl{dop&!f;lT zn?Z!uas;B4WNGTqC{l%{TVYGQ!e*>l49}WcE+EOvP@4CC?mXunbm}E6z&4(t>Jo17 z>*aue+sxTal{1%oHt$Wf+rD#iK`27R;(eoh!T?z`P4c6CaB=dDTs{{pN>T20aP?f( zLgol&Dp}!-c&a8z4{>~SW`n8Wfb+EXs?DK4=*Z2kl^0NX-C=F^9;amuv9b6+RtvND z{5PvAk%cNhuf@aWwYZU;fnu_N?WO&jkdf?aY$JG6whjmn3z?2jPU06FbyM|{9?)Z4 z-h~#x8Gu-PgKPK)lvyudWNeR*`T^gx9G~<9N{;a+F!!QVdsS&NK-qaEaM@l%nhu(h za(C|i7yh6OluT}H+>Oq^qjP1&hLGv}# zQ>u&FV0n`~6-umBp?ZlP7@%VaeJ_UIv=CeWW=Z$NrZf}vM@Hx>EOF&RNI|5| z)WW!~q5PY1AiRr_I@TBX>T)r&=e!Fb2m1P!2W!L&400l5;JE-_5;Af^AO1$j z_=(U#X-7j%&_^Jq{1dUC5f(zN-%;RYWPziW;{WqoD^=%To7;dYEIZ4SWvR72QZ#eQkDrEDU4CH*!{*Bo2SaIym6VOyIL7_l-d6wt%!mqV%A29s}F zRS=7b7`ABa3>+0R#|MmZ@SYmGah~31Yrr9XRBW>aK;U7r{maWMs?2r|6e4JA^WJQ_ zkS!*xdqLu_NBVjWO!UqOT4#&BWAi`j0kT1|+z zM%%8w$-YCZ(DV9{Blj2B-^@Pn>cYjPftMU3ij|37daoJm;4)~zWG}t<A`C&o+>i;8^VeE3;5hZ=J&l!qjQ9GT5?u9NKH2D(n)dA?P~kc zGeZ_n&@YBJhX&qI2@BZNB~w(vrsc|8Dw^Q4YyTSuA^r6+=CPjX_15b?nDHb5&*&yP zeHq!%j7Kb2)CsQRZr#crmaT2o_HWUmcg$#b_Y z$Xr|$X7%*q+AW9mQ2?}^*{4@PcZU|yJ-3a_uo|8@tDw|A`pNdona8Y-Wfp9|>u@9N zq<`v^1CzE4iRoYYti&c_SRy5YNKK2$xGKR zMPuEL@^s=z$roV~EtRn9H5OY=HX%~b8787{QKenQnwji@{|&q( zeosaH5+u|9h;O-<3pRocD=Ij!f?b70E5zjCh9y3)PEAxZq_35Au?sy^vI12AJp_P= z|HrR+8HKv=!!=h@uFASu0GtYcT(l@DqXJZ_y&s^xb$7Fs%arlw*vu``lPgRGGkKHg&KXXgK;j{J^;*af0 zbxhrLU}Kg;)&c(syY#yz#E#e=tD%Ncls(Iod}{9xcsWc*;~)fm))>D zE3Va=)>3EYcpf+1&f;1Z(*VS(48VR;ms~U#mcOF@IW{k3X95qcLm+2`g%ZYy54V6F zq^M4#Rn(*ybs*1+6W--?2d=7bV29vE%a(?6JAM>vDjcn)1}ajXKKABVz=4@N z^}@74J7;*u4{>OR72>W$n_;RvQ!{Ni{fvdVZ~J2ZjrtA#tLIF!U$A81{6NP=zO$B2 zb+F#N{0X(q@i^*{X>$)HTz;2XK0g3u;ByU%b3&d0u_WiT!_-27fsW>=SUGuUO)Jle zE7d~0ftH$9YN?@$)TfWVJr;0q2G~e2?416Ijp0h5zYbMhFtyNzfsN;?eLG|}=C7VD zv*B-MV;a~%z6z_l82WA1tJFHn;^j3!{|;@D3j4@Y8^8kC17+_$mujl_#9J zQ0j2$_^*Ao>#wU`PU&>|M+a8(r#di^Ougz!NG_y05&4K!`2lrQs!+KOlI%y*kjz*K z?e!&G*FVEZaX7TBaKH*RKV?&1q3F%`sC2$t4dMU!8A3&8ZeoGYg?+x^jn_cNAK~(v zHDt9q)nelU^}P}3k)=fBwW$QQ`9c7cPrd@U&^w5czSV^q!!}<{>pdZU_YD2Cq(w(g z+22@qW@nmX`mTeC*$(B$Inf>+=aNW&BSjrEU;&mFY9Tw4VW^V^(F;lkOM^odM zn_A7*vobbBn=^Ln8q!BtQM-seVdQIXw%c1xT>W6FBTc)`rmG@XE?=?2K86}9o3J)a z)dlc=5iETL}K1jl1t0t5>Rd+v0OWscBS{ZMgdSssn>}1C#ZM%B^T4xiM#0 z?fX*)Ed{FB*FcQ2meb@PKWz1~AQ!v9)xI$O3k&$CjdRbs8)dt&UtBzB=44K6z!r+LV^t`uASYKgiQIdNG`6C5ZH3&BYE7 zMj8mut2KSUoVKzk=*|@t3LbAz5o%DJ#CCbdpvV>`iHX$%5hsUAjLL`2vY#FSI4Vm( zeVoB`5h1*Ywwz_4Z&#I%iWn6c)7ZcS_}XUS0S#ss*?P8>XXo`+{Xw;Z;5W8r=UE_< zTaLZ!1Pddr%%yf2Hpm=1bA7-u;i(G^fobfifocOP!G*d2Q`bN^Id8a3YpN6qT{ecS z58beAY7^UD{I|`yO0){wxISV77DUbEdo09xnU?pezfrA4fN&!=1~re`XOiVK6$^v{ zJ(w=h4$UM$XckX9;PHRJRH_yC zps6ftt7MIx37BW7CoINXw(t-cFXL1We!Zw6^Wy0lfPvfsAN2)g174>gW&^EiheLc` z51I*;waRi>H>%q_Eo&^>_bL<;Du~R<6&{Pdsy}qeg+)Sm?hj2l4Ml_&vpgkRi4=uA zlzdo-;z&TltfmU3x=LE6vR;VoqYie}#c(d_KUb_O=QF`A@1N1XkfP>ST|gNIm9H49 zqy<-4At;|WQ$8eHQa7Z;1V&wT!+TdPaCFb`$$+&!|~>R2Zi6 zo+?Bibbnljidvn)K>^$bXn{DxuadDsfqN^cxN&9>K2c#|!~Yu3+2X>U7s;BzA&AKGGPni9lYLEoha7UU)^1FLC4K4U#IUUn zuagZWguy(=KI}T$%`i6H?$)jJ->=$Vn01@kvZh_I;r#=)_+jhZcX&I7EnE=3$bnUJ zz5a}w;(K0!lHm~Sn9CBh_cBVJIBrxG1@D~pt9{4XwVXX1$L;eyebU}Kgf)c;UQ^pQ z$yZ!pE;X_!4X}VHHImGlX0@b-GaN$~Duqkj=Dum=?j@TR#3!vtirt=IC0uIq+nk_T zAwH3IC_3n;`gu*SyroaAs6pP@R{&$$v@0VNbweOSJ*ld9dWFRWK9vLcq#ovfK_#=H zm=hHhrEWJ&X2gD%aUSQol zBH2PL%(4U^*=^KxV3}+JOH-1a3NbBX;Dj8beA_yUzV=eFUyzqG04M3sDwvIDv*y5D zvW{E+lHMcPGw>$OIv;mKc>6$Hu63jOCO5SpiYoTq4IrBeZ(E7A2AFEGStw%g%}EGs zGX#S*g8BLvz8Ro&oSgMUlZv}tO)P|&e&AAWrf*cp&Ge1broQw@%N*m<=HG*rK6h_S zT$+A8OMsO=U$sWOtZWHz!97#QF_i#3$Hs|ETFgao| z_oci_x?C5M&jDI*__}dBd>nmtqy}UzpoJbB3Ic0U!? zS#8HuZF(@pME!J?S6I{ueP>lfqnP=>h3$>74G)M2j96rak6=-sTI8QwxBaXmDb+ou zdoS&^3MIJX2c39mPbXh%Yb{0@7FFD-3#aa`EQ{GSIM&U|IysQ4v1(-9$d|G&kmkJ2 zLkv#Bals3oodm7uv;zz@E#eGVwdv;cxA9lbfA_`s!q3d{UQ-h0ISQMbA1__4E;zex z$2mPX=|0^%xEG-By_k00z#Q;$rd(SSybO?exfjEESu@1S+B6yWnkT=@fkK-<4pRQE z@{mW8|;*WA8m=n$t+WUGg=uW4xOv#$5(Pt@nEUgBCx-`tlo)+!XuUApVScVCbULzH)TihXLh6yZ1}?> zS>ySvO~`mFVI;puK)qbV8kRngPl&&c2MVrG0N9-USfTLd+eRwp<2&>D@LQ5tuegf#X?W$sJN(Q*OZ=dJ_DHgkj+q>s!QL(=vbW>ZuAj5QxlW5@;+jhMC)m$&af2;iH4^9CHU;; z&=BQFm4|qpmprY>2sc$A2&m<%f7AeRdrfXHgU*w{YnM&owaXGvyA1h)Kuli)%RxMM z3a#Z%p?EljV4EWw_OQdn=yXMN$V{q!p0=efsEyR-&y=XiR%`@`Ab#BlIR7%76t_ z1kF4yfaugH2@O8S|$5NMGH+;*mYKC?riCrF!*rl{O`A#ryx)u9Pcg)zircWAt2CiLq5){|#_TSL!yt z22{-rV8|JnBE-x86UbJINuozO`GWfj>>d->;EsD-vPX7OAGjx9@)z~eoivVY$bX=@ za`w_e<3Hr*Kx2nTV2|#JvBNYOc^Y;bu`6czzu0a>Zo7H^pR5rW3G4jj5HMS0#2-NM zUt49$|CLqd13dJyRi^y^(kjEcN)zhoc6*YA7Z&Xg(l=PNt;D-pI0>@ZM3ydV9Mxf6 zgWtf0jg1VA42uf0OCC-~XLd;ZJlP5Gxz z?-}DtV69n!#fPwHML+4f}7h1%^lOno>^RRBLT<3qM);)EfVnC z;~;qT!sT)2Vz?>thiiidJ%}idi@s+U1N8fNaWy;AJ5m+J8vA2^pI{|Co+a<^@57WrYG#J@y)|;O-f9FtEwRQhfWKo{?sPsWz%lgcs{}5-rHTPx6ehj=9 z#$L^#)M3z&{rH_YTs90nIE+&1N_Aj2FBB7LY_RgK2~}{5TBzyQ1cWXA9{&W=*^N9fikX zO_imp=%@57>NomFEG@TNjmV-d?^yyuf(l|_O*K_Dozep792VP7TO5UJi%dRBp@6ko zUH>S3Z;xy0Yt~PjAkI-zw*_Q@P((+2{6{&K4G43TYm1-lB|Wt%LHU*}r2SM>oX3A@ zVkw*e-KEXiMygo0E|PiC<{6M+1N(rCpS95V568#Q__egnu7zp~8{D1sU~T<@P#q`Q zDSN1bOt$Q&?cJ$U8o2_gH;AgCdQ&?j1GELuXqj4=1_+wN?eW2c6FRXFfqeau-q}Ig zEEL1B|J-y;EJV_)OGm_*#X>6@F&sa3hXn^j4TBZ0{Os2Ae1s+TxouU!3h!6(i{Y_Do9~-3X5wkFfkX9b4X@T_UtWV z?L;1F5FYojKNcAiB3;#?(P1l=I<8n6xjs5_N9z8>WF$|;+g4_JRIEaUA1U@JLNie9 zraO?F76P4gkyu0{w5)ZVqsU2h`3=9frq*v+cf`?luIs^C>rFO@4rXhgvzp{F%@K?5 zYs7ZpqDS$ucc|_vN)f*X-Vpt)(_6_hphgi&vG%1l zro=>j469Sx?eHA>x(6+P67_RbN9MYub)1#;?-Zb8I!tll3yX8&0_4qAf1#pLViP5U zH>fr|Ev;3oHah}5Sg$5ZDpy(ix=6^FJ@p*B0{x*a8iXj|Wk<#)dv5cvW7FBJbN%tP zypxz!IBPPE+1impwUwOb(!~B`>w*%3-4RPZK4t7s+dJXqo~3=U>u+PDa*?215VQ$h~YN1_{uk?s?F*w;H%3g#=?!>l`9PBHI#VIJXc$IG1Sog7;)UT^fj?U@U zNyl2I3-9scI(SBfS8bqQc9SD_4$apc%od*FNr;rh2mXM8pS}Wk=Xm+~DU?9@O74p6 zxTVs}pV8Cb%=nC_14RHIrYYLb0FgjEGWtDIIL6 z6SF31#1cOnW8Yi7FADy+03Q}-ute=kwU9Axe2dWN<16n((87hM7cTQzGB+4CM_b`z z@J`-I&-^y$+azQgtMRT275wsSn57Z26pi^`txy$IQG@j`*834#E$=Zcsl;z@zRj#` zW2=AHjYhK$-ZF^D>c2;MZA-x8Rly3d3JISizD3LoTAw4_&?$*+=p&K+(s{EoNx~0G8uPUNr`g`=u6l)lN zmkNHAB`VDyQjsn~D$@KR73m@*DpQ0+fdiOZ95t-2AE}Squn13$^n{a~lM0fDc7x=h zRFFKhn{)rR26GWFL(~qXLevhYg6Ppy5Ivj2i{k%@v6_+P%wazxC+$omWICpbXMTSY80pQ{R( zD+@o-I+PAlcPL5wi#k1QYe=|nxc~IUQCfO43;ZS)_%kf< z{PC4-;R>CrVTm9M9|CwTM_cRD+BUjE@b53{co4&{+1>d`yyN@(JVN@nTi}bU2=3M$J#Zk~%EYNpAe%P^4+C1}9FS?Z_Nu^c|i- z&4ciHH0C(ueH*V*zD~G`i*|TxHj3(@UJRTV4ocw`HC^EQ5q^$8sEO`R2WjY2jkT1; z$)4(@`z^hq%8z_Rp}a=bol|sw`ba1Sc@H~bc{h!;g}3TBUq?GJWkcm=Z)#MHL^BWR z5aj&kc#U)rZDlV{l{Cr&%NdQ+*`iSy{)5@x^NmE6E!bAaid=(kMp6_m@`Eu zQ0d1M(GG(9p%j8E@2?*|@2?+9>*%-^{&ASN4iY2Jbr0ZJAnX)h;E-hDq?5i|e06L~ z4eZ2u28B2D0w{5rVi23gx4mqvk4$WGbVY7N{43g2enqqmGJN`u!U>leN{c^#;hj$K zJ>dlQgiqb%&udfpc|Uc-2c`qSnsG6Te+vJyn`B+c18xvz^l1O@Hp@y$|K^jU|!J z0e2XWJAY<}%L?mmmK9K$$tTb(DMwte5q8iS-+p}l#rQIXBQ9T3sFWl&V}oXs1~dXp zpz&FFGEESkV*_!;Yic78&A(^k`?;oz_+2Q*gE_`* z*f;U%io0p#6h>!!mdI>kczy@Zy^U|NH1~}+KkR|o?wk(YOzsT3sFyJftFqX9=Exka zH7`uIXM^T3no$lIt}qTZFU6NRm`%#Ti@(glY*J1g^UY=$=Ifp(uX6Ss(6WEg2yYDR zpfn7t@U;Q+b)CZ>$tc>_4e0jTz`O0%u>;1jNL$C%$Otf*AsUu$>|A*(IoCmxP*6hO zoh{&R0d3u@MpY5^%sa3sWW%6v2R3)~6PsNbh@9D0FyYuBF)o#ysw2p-Cj!PC5C$It zXmIBkTaNya%It$tEC>|`0b*>2gk7O1X7DPei)8JXO|b2>9@IQWZWY4n2QWKmiSlhM zJZbOKY56v3+2sSVci~EQ&r~jT=Q@l0cumsgr~dgim~JOLPnMtem%f9FV&7gz&V?58 zJ*8DTvbHsrU0{?nT0tklGkiq$C|&e5Q~h{Ya{Ii^^2hue>ar;bj|;o#K5jvA4ce_i zIddFKg*cYtpirRML|GAeS!ly%r;EzU#@(cuIF^LXSjdIQ*4PC_6v^c#lhh9i3_4+^ zaeYGLVz8TGBJl9?0LG7fp#7KFdxI` zaSWq{c#!KjR(_>Wab`ksermXeSv261Jdd4+Kt6>)=BWS~ek8&%Eh3S9bvNRC#Ququ z5b;kTnv^$3W5G_=sJhnDOT*q@`P-?^c}U>*c=nB-%{XH%VVxI;8=e0%zklzpyvlP5 zawYMHu*$zegFE6h@kfa7m%)IbL_1|4;h^FQi)RJ}3=OVQXWYPw>A6;xNO!geSA3)# zQHq)zR?aAP38lqi;5&XzTWUf*Gk(zzO3J!CE8pf=w!b?N{S3J4&oZ4vkC-7?*K>ZE&L zXj6h5)wO{2NvD&)3zN}hB6{pXhlyyv2hIJcmvpVG+&mW_u_RqofcgYZeLSbWgHs>> zi8{-XJhT`Bk~)u{IqBvzr?!sscPh#6a(^1p6dJY`nL-E7;5aWdT9oL(S2#}&~4)eNb#dFBcrm+t@8=)-^~;iP-N;A$^ey{>W1p@Ra< zv{8T=cLkVfqX09b6!@BJ4O28i99JIJa^>N@k4BuDRCw7V-)4Pwg0D{K;Ej&$OVM#; zDLS?<_+sw{B^}nOgT^h$X7VH&# zqtMH=7La~GVgJiEHPfjksMX{A)aCs2dq zDOLcee1{bfeR(}3)eS4)mAnEPoDkRiF3U%&-?@OaddVfk?Ijlx{0$D>e&<3GTgIg% z_9Yh+{0%PKzQnEGL+WJK7M!OlAjqwsDIm$t6BQ6;{0&(~D+sfXhKerHz|*dmdr;@$ z*sa4oHFNPQ&TBEGb2LUA8jS&+qcPslwHR(q6h>PUjltGLVJzoMf0l_|v1Xj3v1VFC zW2kmJF;a`27^vM&jN=@Q8*2Z6W=LwFM>Ip&;Dmj!iAEUSNF!`$q7#NU1x(COI_ut4 zN7I~TO7|^9KUmuDF(80BZkh_KxFz|YeLRhJ+0_Lq{E$(s^DkrAB(V;v-ccV@y=}}| zY26}EAI5MTh(Y43d9(%Xw z(9*2nEg@8Gp4C(JCg*Oe2ctAW2k%}TpSGj64fRn0fy)COSo4nTD^`Vl{{&HXz4TPQ zYRe%fE|#4uxc@Y_PvhQ0+*=^TCw`D7Q6u~|3?90nxa_#$|0D44LC`zLa8v6kwkR~H>#>S$fs zT<3BXn3d(InZzq5>4l8Pv#xt&J5noE)>S2Yk9_B-fQ6BZ9LP&!-6*V>#OsI{li#IC z91^Al*QFyP+?TA(v5Hi2#%bVnQ%DyCE>2)4!%>E$XdcsUTSNUL5PsbmSf-<47DOGI zYiu;oqytE8Q6e?9lmgjkIEU2CazetHnfhix?;cA}d304rX884va__>9s7E%)fvKVU zXMcLB(`M*3O1 z*RZS1Q=5`^1kl0Br9wta03Q7W)TI_!aaaOU z8xD#oFM|nE6wj97KQ@7L-u&ZzDHyQ{{5Qli-1^-1gESr}%hhk;^24V~+)E=y>wcr} zIRW{HEy#4#p^$(Ey+8ecy9HYDALa7WuI6e+D2D|kOa5u)s%5BsC9^DkfZG3=?G0di zG}zwI0`Sa(#0n=JqDvmV*NqTYg9U6VD4L9Y<+%YHOPK;Y%M%5*mNEtQmgj~+Fs&$@ z#ivd>z8gT}#fESm8^UgE2Y@qge3(=xeCP~?m0?97`ae-5h$O5 zCSM538^o!82Oq&p?lWots2O-!J>i(Oc*G6S-4U~TE)shU$B3;0kJ6$)mL&!6T^R3U zw=6m;EXpA&DtZ;7zrt6WJmElU6FEU0hJdP2$LP@IYoj7JY}*pQWi?sH+FFM!CySOG za@K}yML$3gut z7w~-vRl7sYZVQ`4)O*r0i=IhHJ+~@?$qlHM_ihf;L^Db-dfFRUnb(*tL*vgl8xzO)oh2j^{wL;N&%qGNjHD93>iU+)+ zUoMnmlH@LH#szSu}&ooNwpAbA^V{t}IvPAg!NbNfn%@i|~CVOD;A+f8e zinTD=E5lTyP@zQxrrBBMY#e4GX^_(U4|=M-(-V=LDaS?~9=>a+9b3uP7Inj#3rc47 ze3_d!v#|pX+F|OjnAW*atGYA=>ABysxd%q}vwagzs^PD?SXsYdhynT$=Sp*Nk0mv) z4iJxZv>d@4%MtpmLa2M2Cc9Y2E8$C5&I=2qzCTgR2xO^`vRbQRMRc3|#IJdwWj27F z+f3&h;O4~7e1358eMw#+l=rOJ)8OeDTRScnkmU$)t6bVZnk>5Rh^xO`;pE;h{L*aXVczjcL&}+OO}q}SLniO z=7zBLz_;?8dhojbg?dp-@H4o4G8X_3$3}GUJR}}!1fw8V)~Hiq1Kq`RlscLr#G(B}w0B4QIJ9?1`#3%T z`$4MTRcCI$s}rgn-i}G9gXmEiOou)rIb#W&v5}my1kTt9g`YG)D-2aYDIcMLNr4Y| z0iZNZZj*I3j&%%~!^h0wgBtj#Ieb_HA2){+FdP>bbl|^uRF1Bq5&nJ+bkoxjsWk() zCGnd8ZOPT7f&+S7enDjzXJajAV;E;+EoWn>Vu<7bC48jf1*-xFKj$J1)0+*YNRxf( z#4=FYbPasWxCRQI#h|e18Yp-cgTkh3px~J?S#tVO!xXUod9;P<>zM)7*JC(TU(aHw zzMdJCsxJ+i$lor>Q{x4q8_)9(a2`ZGia>PZc@Xs|0@01PkDelw?ZrlzzlG`DNa@Xf57rgSwoXS@| zEk{;Pb=J+o8z;Dc-V_(m8_7Rsf(z)4ZOr7W{8RT&E4>5+^1Lzr z0dI`I#|7i(d1L%NE*L-08{_ZG;WJker0IkTL~pA!S&9-jO!_`RGe#EB6AJq~>Q*qZ52bxKxI5(#tST@+*vUsSM*J zzrr||$}mpyD}2V}_hXFV*cOssVO!Wg4WlK$!f5-aVYK8|d|Rk|39RCq$ikA>@x|Ss zo3J=olh zb&wYRC(db^@Rm-xlB@mG$7In!GvUYlH6HWVc)(xdF@KH6{59SghDciw9m4IS?+ozl z;B`(<)^N5iWnVFOE?lOSHi8TC5HL!Ljx5sqk8Xp@`1 zfX`v&&=2|04?hq6kPrQk5BuSbBuc3fKl_foA5e(F>{$u5xH=qQ zLpEOz2eG^BKGU*!r_&bAo$IdkR>)03e2;Ih^u0=IQ;!f}U1@rT1(ZX)(|;0kSc?1qRf4yh+r zB%IanS{@&k>KHP2e%K-h!{R7ZKb}FZ%gJpOwYBP?VpA6}`#{#$F?5phH`G1Mk@oYW zhm#CLXpdd`Mvw#pZ<)qe6JCG*;9V!(we(vzh2qY-rN&-=dHne^N8DcqXM5cg4x`iQ zd}%H|bO!VlxT(xk2h00^YC5T80z!tjQHu{-Y~J8GiLdxRQ%iRy@A}QDP(TE70jUo; zzDE1Xo#mwqCXQS%aWA>TOeyH|e_*!fOM%mK(~X-}s07ciw*t zT4@s7FI~hjf`5yq&-SpT60BJ=={{zr?xV8H20tq<(wjDId z1ut$sN3;M&&!+Cimj5MK0Ie#jY&R%?uWmNQv3gQLLv!y5pY3yRq-+?|h7dp5I9)u! z>BfbEe-Zg95g}m@7L1Z$UA-W?Fr${|BV#Lq_-ng?Izyt4c_i1-tJ8uxj?xm zK8|eD8=U=sTlGApTx>+Vba~Jv{`>jEG@JjvTB-**;=iXN@}Noig>;(1e`jr^4P7}U z(VpLw%cIjNsaz;?hHuwZ4m=6Gc6k;-NgbY9n9Kq@G9K2?VSDc zI$W_Hcn@yuUU3^AC7B*v*NhfV@wFh^IFsb}K9YU=uH^t2#OV@Ro1f(4z1tk7sdp{k zqBhp=8X6l%jmdhk9_HH_Wn(j~I;yhzZR`Z|EgQ7icUD7(_FgEE6{t5GfXR(oeICSw zscM%_6aUXhCDI-&P|mG10dDei+ICkc2D7$=$`qfXa^#m;g_)g|O%3h}*#mS!0eQW{ zv}Qv=lb@cEC$Oc=v0(`zzl4wW6{+49s1~ z?aK%VGs8Zz?b){Ilg0XYE!~q^8t`^|fNl-d!?g=U?||k$kh}wmw<`&XksUOboONUG z3fI8NVJf6dtki3`eP`6imekbDbww3hZvW-bWJ9zim6LQ^Hi8FJx6eydo*Mkj*QnU$ zu26(|k)MBBq@NmKm42wDnRr)t{iy|CYuCZ!=lWRut!rz{#_~Tf+h#-H?rd@>6^_AP z9sqm!G1&D^%#)5n5HrHWYPyxO6CfQ=eepCMPcxGwJ!C5*jE-v}|M@9%l485U-Y8n= z&dX0%pzlERU4gzSGo(zduoOO?(O| z+6Y?|1~lqk{S(Q}eWYcOq!f8|n&0ibS&~ZL737`HS&hv;6%fhAAiS^`gtLl4I7{@F zA}fU}tr(M(Rg5p0R*X-X#f?i@2q%__Nh2qMzxR-?2{|Yg8&)c$58{(Ch|k6#P)c8U zP5Kprc4QC)ZSNqEI>Ha%ByW&P_XepWgDOdVvb+AxrxGXqT)WbLk@au=7c)@qty3jG zU)9o?UkoP^-YX>s+|0}YHz_$SbgYqt%(S>1aFLP&F5+^)MM_Q`T?V^ZL@VIfp&$5$ z2DZ`T2H3ytiVywYJZx_)27jL#h~SY^$OnbJppXv=cU=)4W%Pg-=5wo0!qq#|E5|He zcU{oqm1)UP=U+EDvn9)N$@d_e^*zXzd=IiEwL!L|yPwen zfi8*VJ7+AYmaGHS>$ad;VhgGzv0qZHlt<31St4)xfaVb&(7frxXE+rv8)n?A74rGj z?Iypv<@2lCO&`#@i3ocn8M(rbpJ_?s*g)+S^}rzC@Zg|;Ypw=8^hSZvrTyTHBC>z$~zRnDZDr`XpHLT1qL<;#~&v=SCj&5tXz zQ#Ni&KbW;~%Z|-kcP{n}9JgeyVWy$q_|1TEunz_7HVk*q^# z^U&sZ=aFgyT8$TX7nvtd+y`UQcBB9c7UcE{H8o#qsTJ!>&eT`Qs?z9&jF-{cE`@(; zU>vMP+S=$>G@7a+9SY6NiJEP=3k89^^iYn>6+K;b){?~+KYsDR{P1@aO&Fpv1{c8# z-hfu?B>sa%4P{-@=&Wlfc})fRU!0^yC-3aE%#o8s4~n%1iN9z1>Xw_iU$5W9c; z$gA0jFU4E) zJ8`xe05%YD33hC(66i(1KFo#s7{^Pmpt55(6rJeCF)o267LQ~{UPn~qM2rPARcCG7 zDgTL?!M{EY!Y1F-06X#tHP8U3*j?8G*y3Hb>X>SkhAB7dTGA{X`zBG>VzZ9@W3R6J zN=@?(|JQKx^~!fQ5hK(9=Yr!9P1;(*kx0%xaP_XRsIW< zk)izyP&UH)eT6pwG@F4(=T}a%bsbMSv+)(V@F7$)2`x)6C zgS??qOc78Kl@|(CJ;VJdA~G@}GAtF9G%o5`X~3I~zO?EDIc3^ZD7qr5m)}Qw2N2Ay zi{`Sb*f9f+rU7sYfTQrf-=guJA^ojT z#%9S4_YV${7q$H+9Xc4H4^KOAA}`V^KY7Twag%=Srx#v@=~(`fM-TF8_7R($b2Q>M zHdK*Zmrz#?yFfeW>vsTuthU1<=W;>Ol9oi3hfao+ue`nU7wLRaG zEc7&|>aLjNZJ8l^W=;^#u+)T*1z>%$MlEQhc3xbVXFVLb~zeaynoN z1%2Fz7ZgE^zj-h|;`lX$HiJAVUsP-9Y~>Q|%GZ>^8Tx)2t8_r8N1OT$CVq&N zB1ch0{*?Xss|9Vakukt%j)&Sr_d7Aw>rTxfW*N;^dM8`!oe+()DrRSJq?*Gj2)_Hk zmM&OyTNJuNn(^@lWME)M#{uWPhUPwLMOHHH&=op3bZLHN?w}eSh(l(Z<7u0y3U2d7 z8a;hBhm!R;3%*~ZRi0sgmU33dAKeMMaGbl!*8Oe6!M3DC&kbR?Ks`cJOTW6@^XA>A zOA{>Y!t9*om<~QqX>EBddDDTI!=Eo2&w}3K=`iTod2ES`V?^LSS?ms~ps_ZyQqof4Y7-h88WkcB@$hrrXk+hv zz$?}VSNSW+{F}hd32X#GH9|d{-cyT)B^l;Jbmv(|kKa~AbW zU3_8`wz5!rDyzOSsZ?_En7_4!L+~#7Zf>|WC2DEoo+)#2I1uE&GQ>P7)nD$lh7uhM zt*wfx#A#~*k@&p(-REB($Mj&!g{`kd<=2q5T7|Pea8yxaac;T8jd)A7o#O6L2Esaa zZ4g(Azk0-x8N?~Yk}AMBq3SmJ86Z246f0vpna~GA>fa9NVCb#xi20PSy5kKbfmed*x%OH!+9@ea6XxLrRM}Jtk!F6fw32Mu|*z@`F!4$ z3dS(f@+8;@4#H}Bk9%e3sq(7hjl~`&Y4XJx?opet!qzg|AK!fWFjx0zdt3X-77ol} zw$pcyAy^`OvhTv;C3`lagXgg3^>^hkduU!#(UIzy0$=Y~S2zD;&pi3Ep}RdBzkgKJ zbfUd@?;QD@C||4HDAb~@^$u&^+n}a#VouDR8C+62&(kJr&FsOQf474#}6G1 z-?jdw90ja$)ETv3RF2(pb8ff|Dn~2#bh(RzW1zp$pmKO?m7}IQ zsshWqoN@Dc^ZVX^Sv2aw#%{BpMb~sS@m7Um|cdE zN1qc#v4jvkx2uTguOK*fPk%qIFdw~G-HWlEean6bJs zpV@W-{&^feEz)Z^W7h=w&9-MyHx@A4=mn@UR{mBsr~gUjrQB_ zaLBbg7KXZEp>RDAZHc-^g&*$e-aYa4Sq8*hZ3)aw< z?v))Ks2sD0 z{c;(9L5E)iq=WgKlaMk>iX-$QB%zYyCQdZMO|?USs2+i4+5~GpZt)e6@^R|p7(8>G z!;DgIp~-bJ0LL}!3(@@Ifa?+`A#=lc83wP;d`6*X|N@Z&6@ft=VaV^0bD2Z@Yudrs+kRk@W3>JmF}+y zar-N(YWv4|54|Y$0Up@_N9g0kiUNIZ1z2HzRwW=;{CV8O+yb(EmNT2!b_ zdq$hK5Yr0DPNZ90g1~1ZIT*xol-{$Bh(}Q%uZ*zf$0Bca~Ye#2GXUSTfvGT z;T1NA9=06fKd~($3i=hoAdQV3mq-CAApT?Ph=R23GuZes5c^)Y|5r2)zM;qbisa1E zdm%+#@>CBpVe&VRpPRA1rwHT7QGl8Ssy^pX`7$x*dVW{L;Nr zy^{Gbgg4hUX8G*cnU0q8#1$?nQ8_+{Q+B4eE3YHYO=G6-7(x*-Z;xgpjWNE?kU|lC zmOf=F4R3h~N|iF+;H-1Q-e95=ZsfepaxY)V&@l5c#5~sR|J|0u$S``!o`h1wkL!+v zIni7@5jUNI0sOAZ*4`K#0OU>-qgGj-R~ z+1i?7D<7-}+hC9S43zzcisy^!w3@MApt?=Yr^r<3W|}S zG(o_Qd&Haxe>xM^>-B4C~~Pe5RlLJS*#UapJ2plR2?_Tq4MrXfjM+^fqc@c=WPpXO(^|8G`SqH&phERS37ur$kScWK4}M%!$S5 z7i|WV@d#*%As0w}fcZc};%3YMD*K$ontCOSi2}a~EamGmn;!!)ztjEvt(3D;h){oRoWgaQ z$xT4MC>4&_f2F<4PLy&? zylMnx#{QTvkxh7R1UnYYLSS7!YAZVv;y>98Lj=rz+$5=H$7HJj+$6b6YAEK*;eVY7 z$wok=kcD8u9)qu)m9C7UM;=o;~g>EUaxI{xJ?1-C6CL?&q zS7Zd57>EZl^87vRRZM#g_e986x?nScz}tJlP(&FSK_-J<+>e;_X$@nC8kE6#hu~J- z_?&-VK-YqEc&|`1OPiyMaDW4QwK)>Lz$?+Z7uEJ0c+Om*8wDgM29HeY@J7Mkeq?qq zcd!6}KPsh~RBbVAnVxx4y-qFY)qsu66LX8h& zkN2G%Oq~xqkqK606$xKa>D*F~Q)DT|uCn(D$rbqiB!cr^c#2D1SJX_P7CPdiH$U-%o&oO1?rJrz2?3=C8$blx-Et9rHS3Q>!?M_o$y z^Rf=urrIFD{USqR;Drz!`w)|Fx*`>^SJRyk>#z`A%t|l??)de+Tq1SIhe0k}@3QBVe?nn`7P>Me>6Ygq%Wgav4Xqa&srWO{iBSL&X zo;eO|$#DA&mmD9tCa6ik9OMNzos8<12$?C6EP&tD%jua)o+wLm3x9mUV=lacu*r)S~vxSjPZj9UGVrS+TypB$4tU{qzxVQYiy*{uhErJWhAzZ^8W$3z<1oYv;bc;re>S zQtf21RA>CW13nl1Y6zyo(GecWTcU|KqNpZ=H|`r@K(1~L>`ay?!@|wi$k;-@=$+!b ztTU&hUPZ#NIXB4M#3XRjH{!++H;U{+vLQnRnq5lU;r-=QCAYuPJ19$D?wqGEF&MvL zANdr4;T0jwXLKMYaHlf4pwnc&!f3A}(UFt+n$Hm9hKDllU?$3`6_^g(d7}4*5Aocc z5{_if)Shh6-KM_J*~a`p+pF)_@;=^wO53RKH}Hg-8D#>pVPJ^1Zmsc6te=_8VQlx% zx#&Ee&P)7(idAVQAXUwML@S?$?ZEr2|?&@fHk7KEU4X zq0pK5Qk2hTs6agl@4#fF6CZ^e*U+rJpS>ykjUJ=-;+w~RPwB=ECYQ%?G2t0p$JL_r zae!U}WorPv0w=%?4!EzOUvUfWBfFA6wSx_Y^qUKQ_^p@t<5VDgdPWyURXnNZAQE3X zJzarxe-|<-C*Izi-QAtVZC$d9Jc}SIJuu!g$iU7yI?ydLzc@w~dpN%8Fmi>@%2PYx zlpe`>%J?B89oe!ET}$l?11ht{VD~m9F)1-IQJff?9FvM6h!gcIf{U`Fs`o&kK61uw zp-OYZitQxCiaQQW0xR5AfllH{#DpRqT!#=Zmpp{{oH7j<;#{?bD)-GQtdW2R_h&H4sVq_EIE&xlbKzPyO^UFJAlbXoLFKbgO#VrdDRP2q z5#Vf7Du>l1bsOo9Ft6}x&J&BApavuCVRS4CuQP<)NkI|wek-IMJS^rLI~Sh1Jf%IwRtGUEDwQA)q4Fk7$wiaweC<@ zQH`$bOr#Huz~@V`6W9T6<1Zykk$D9#u%B`=ld+{Mii;~MJc^y2JUpD8i#;mk2;&78 zlyqfrab=}Pu@hc*a$>LJjD3;r2C5wN-^;_ZlnGI(eC&2QU;FNq>?WTS0X<6|5fvR1 z6~!lC{s^DhbxTypSpxpZ=duxx{I*bU}h^wP-#^N)G0DE7b&gnQ0d3>lk$yk4m-Lowzb z%OEF{2t%{O-aZm)7f7 zRII;LSejj(d{q3jX(l(OKCsri^x{Q*=ZXy*-0}}(+b4;i;^?#h#`H4&S9SZZez^Dk zDhJw_3G~9XJ^lBt^z`@l7%y08Y`jp8b`mp0|5#4;-$Uk$rM*~XU-Dk%^*w%X0K+Ez zjHU;{q)BAh=-abj`^(6eJYjpwRXBbHCiLm{Ux%h%_zJ1`WQ-1dZfoMyt)^QxPm47< zYkDU3+1c*XUC)!wVL1CexJQ%pDKM< zX3k#Vs8!5i`opZpBe$4&?6Z>{vo$N;Dj7NJn^9yJvJ{;{dw~==xmsY4e4~mc%kVE} z)L7&m%7w)@FPy*G-s-xiNY=?cUf5E0Qqp%}^K!X%I-kwl^uFe(9>)X`5JSH|?87n%BGL zVQEQfR)NfW<+e@su6z_45E$=|m3<|fCRNn(5gvMk>&G2FD-5N(>gSRPrP2-u)^Bz;J| zuobo?vbBCvDl{E;6vkJ8?@^e00v)^hj)F_$^^+Wo9SEUsZ@#=NRhFKYlvikQPr0^t zfn>p&H4D6xz0>{V%OW?eUt+M}%9{Hng-IE?GGAlMo%Sw#{{U4$ltFeNP7K`a94e8Q z6P+2FA+swpKj+!Q56vqKFOuBr?Y$@88BK58y?v8sKvJo@%riK9ZpX4FdvRhMMKZVv z35_+~-)8>6)|7{zPt*a)rd=HuFSeiRPE3ebCdv;LP{H|81qB9|Pn^2Y-M(X;ccgc) zkL<7ymB3Brok3+A6REFxhAPUR7mN5pAKDamQ6%vffaennY) zwM&^xnNz&8EBQbk=p!Axv1heYs-vga(KE`a2-yzd(0q^(3CPsr&gu2vQ!o8N{(zD#7_zZoWmmBV6Qgf34Iiuu)G1bTr%wfX@zsG9t^355yxPDo9MX$EO48ox+1GITQ2HX zI2_}7Ay2Oh7k^QC1{HawJI08;Vs?iH&Ed}uY&5?tiMd4Y3M;BhmUpGqp+hb!@^acL4 z^0Jn!{J7|Bnb0e!7gpB6iYuGCVQifqaOz-8Gfb%a?L51x*w3t^YpSx!bL66j3cF^W zC)yvKxGImpV$TeRXt77^&fvfqd`vklplR1NNz@g3M_6$~vb;O3uAoR#UKO_1Cw7;S zeD=R~CP=^gc#>xoETSaD4c zmrO%J*v2gE7S$=3OP;t8_IX}@D=VVO`?jKvC>D_wohxD4NF>KQhA-_di})b2XeOT< z8qD3bYQCe)BHR%=C~Gca>#7d;R6Au^Mu`tZul4sK0zUc7`>gR(N$asA^#yYCbY7NM zlY4m*Y%VVZqoAL?a3h-!pOP<+Y)&O#D9NX@(RQjJ#bkGa#*$fQ#7B|vVd$FR>Qkxm z?=suUt0YI8LT0LSf3t}B}^rH?;!C#E^GHOmGl)8WV9p0<~z-f zF^sdQn|ajj>ds5PJyAb~Un*=mT$Oda$lB) zpNk`j25WlsRm~N;{nh6i;6OD83J?*hL^{W4 zPstj6P3wFy)xT338K?Fg>dmo)b41h<`uMa2YCDz8p*^BX) z*wsi`j-veCosr`^7UJpR+z6*&KVJ{IbstwaS}lRY0|Wi+docp9+vBi>?n;x;_&UBt zG!OLEG~IzzB4N*CsCwdxq?FdY=LkQ$ngr74xglV711FzGZV%uTlod?OkhI(z4pTe1 zYsj2cFo)X875YW?!1wZKE4@P3vGt5NgF_*zPxs6#h_PXAm3|5`fEFAfSvD{PC*9iv z1E&-^_s|vfsX`|NS!)pV{t@2m1L!=Lj1j4+A4fbPqbSj4g}NHN(+)hKL{?;5XcYQk z3yGfM7v}g6x?u1GcD&>CKcJ`Zt{iMV+*oqO=xs2J|8?a<{iRzshg#?69?366dzBD5 zJbBQJ8x@}s-V=lnTIfVL&O|4fEImsE?!gYBR^fbvaFWwGPx^p&dK=EiyP!g_Ov zpTa-L-|40b1O-TrEF@FlQ!QrLDlE3{)W4Smxog>yG_W0rC7@;b39Y4w`>bFKRg8s7 z#69Fm3TGrJECl1UM3SH_;=U*(y_=ir`h*f~B_qOOkR^Dqz*&D57{&*Jh^acSSB3aj z$oGd%)}G)(!+4&WTeS;($>-NdSf-dHl5xoA=cSMnXIO}&**ORRwjcv(PV{ADdT{JE z%5yuB#;lY~nSbf{4!P)&5?80McwM*p8eU5tKXkKelTYIbe?Poa3YJ~x(QMOjQ}6fh z9zyv;QOFkLuJDrn-l~a449bT{KMWJ+{)B^}Z0;0f7$5U+JjgH(dFa=6x!BPJo%N3% zb=ndnPPg;>T24-o4Rn|(yOGmH3EQH+HSRISmfmp+7S`*%X&KO6z*gBb)HMCGyHAMn zblz%aqE0kwOzES%q%h9}Z;4@?qxCFi@v#+NoDjo{*|(lW|b@} zFE09!93#-+c; zKmA7SW`D^fatcK(O(_ewfYysdmS1MOk2)GSel704FsfXyx#2|}&V3lUfflJRwS)@;Ist4=uyAKuBP=dSO-Jw^A^WT8@IlZssLY~}W2_DrWw2a| zpk^O$142{H!mu@RNBs-|vL)E4^iq%oam1F#h5f)`1&YA{+%^-Zn6B zL;Db{`3k+HV{hw45B~iO1XdHhCZp!jCmS12p0GZ)Qz_qNZM}PEqjkGHv5j{1Dkv)} zEG#Q6^m29e@^+I8lk&3!y3D&b9CaZxkDfi&;ilCg+Y<4egKbE5W&pD%-XRNQ#Dcry z;Fj+QZ!dkuVO{P?}jdS|R-D2)+vjc_3|^U<}Bl z>bXd7;nE;g7k><(nWh^U&UZra`|yu_G*g0OJs9#dBm4{1Yj+8RQ4wfAKt?9U_dzUH z;gq+}uMG@zvo*U?p<_CrV}$1IIXdl9|CD{ndsQ*O(_a-$iKgl#5sD&GKa&|`jRBe6 zITPl3$VBTE36|HAmDOEwXVaUC#i9(IDerv4Jfpmo;$UVNg@VeJjnU=de9;sgau_Wd zz^l7(u~3#pe%)MXaXRX@SQr%ve1`u(>6@?3jW!VK`ew9scd-NJp>}CdvVF3>Dh1Y} z(OOgyMT{vjE@b_5ve7_vm`rY)1!J9Mu|x;Q&&1c165rkuBNM=dYa2-rF)~_7rg)QKVka`EjEw$n=2Ft6|2_8t z1Xc#rD(a)f+sQ8Kd-Rh!1>0V#;Io4#v&C@`vNgcLdlIhaxgckXDa{0=h0D5Ld*MXe z9CA}Xpdsc&###P%!~=IX7{}s_qLh*Zah578K3hrTno@n6G>1d3x%ldcYUoDXz@3=; z6!|d2AI^P(_D{|qWdP;1RS!hNJFz5mr&b+@ccMCu?R*gq>$5NA@$5-)2$1RI6l#v++zxtsP7L@|-Z=tbL zfCRq7J7JD=9?Zly;{DfkVZ={h^D_q{l`3cxi?(xJZEam$ZRVyX=H{kyNS{M5y+dV{ zq*hcJG$`tPD`h=BOYa&PQCaTJsZJ6n=g1IuxzY8di+hYIUnhl~je%pTbC$bo>5|)v zZ{DQ*D(Vysl7_m>+zR>4Ww`adCj=1%jbS~RjkMhAwZJ75(w0Fh=smiz60sTC$)*({ z`Ha4OaARdIZW#}ri2j+ZzNemt8!sHYREuP*M6pQnk7v9UvD94N78Mm19j2%yglUa|=enjFdm3SQQ+awA@+s21i zl&ca-gS@W8n0+4pY^ME{J%9qZ5Ul1ay8O28eYeN zNyn=yPUiB-GT!DxPDheX;N*)7j-sTJgt7#F8u8~UV^ndHl?SP~7?n~Yid{)WLz^R; z!znVKXRf4dxR`zfT^Nw+>uI2L2@MEP@P$jm9~I*~pZ>7^o*s<54Z**l7qE6+g0=B- zV4#2<08sTe-Vn7Y`ft;7c%oJvCgBlR#3&{*Q)uT7i@No(Uq#IzLn6r+=mYy`CVUac z7yYhtDXulQ;uPN$sk{}p;=;k?ARzLO!94`PHzZ$jlU`FRxH02VXOR(@QNU;}DI|sT zqn69JWg?Bv?K+chCT$JeEXUuLT2TMGl`_2ft_F`=mS=yVY7)N9N)r zq(1l@9fx7mfX*!(l}xUz?Hd?4&F;mGeJ>he#a#V8j*h{Q8joPIczd>Hs8}Q$nL!Sp zz)hcypjh&S{&lWs>c~X+$Grs5$$HWy4n;2X5I=T$9Fb2h*QUZ#>cXoS=T>>hD`fMv z@+er5HZ?8@=IWD+n#VMR^xlI7IXK+rhiLAz3CN6e#IoILAW9gCE4Oqy8JyF1!bJDD zuif1?Dh!o4oGrrWrF-u&5Pd6rh9>zS;)AP-J{TtY@E8;{?zb2aE*ycezlQg|kde<| zF?GO-Opo6nFDl+BRUtC}#)f4vqJjCss`Vtq8b?UM7R7Ik3oV{|fm<+L^ zrt@G(6GDEHA$##VhVBh%QW7)J3xVt#Rj^UKh^v@RHqWulQNcKUSpO~cjEBS$>sL}Q zcz>K-BO6yxahKwAZW;*5m&xiljDUT2-Sj#L5!dDWRQhMGHLMFq$DrY-b2Mq#Qv#X8 zu)y1qobx7I#7~iaRslsnzz?MENDR<82PP3Qg=oF0R!>P^I6*2xxPxobz9)Kb26R~_ z?SFm1gYM_3J3rwh=ESaC)+1nVAM1gKpx*eolY5vwo%w`J;TAF&O8W)ZPJJ;PC;@z)}t* z31DIRqplo~ihHiD=l&En`vuu9LDG>hcK2|?DkPbN{G~LR97#QZc3$AR-4P2hMtL&Y z6JLOk_wHNkt*LV1NLKU&g$`~U-~CAs4ghap07rlU9o&?~=je(E`=E(w58Fy%h#2&1 zG5ZNQ?92ti2BOD(>_6)AW|3Q!Jmo)JLC$Gd!hFTyRVfpPYC~-^FY_yW(hZ1kExF5g6I}{b?9EFrdVohz4|i zQRw`HeF#U;0i9Aj4A`>Y@W+9HSoWLi9~pkBfPV-=aSee0B8bbSAhz6?K0xG*pA?u& zKk|mceUOoeY@~oiTznBB`^F&th62pF&ofkS}HEV6=~2U5?@g!Hd>RO5}Pv^XG_Y z@>v84)rW7mJ0Jny1KePQWwvcKe=OXhdpq55e_!Of+idk38E&#A;rd_QL~`lcZYp!X zW!6p!8SXxFIr;LLb4{eYGq}aq(ZF<9l6#`eBH2G>Pr-7+(RZxMa6(*Npw3l-?5=kc z`TUf8ZRxHGWfi|gd9ePaq$KW0LMzf2lkw;j$hmz5KEI+17tv2D7pWXI>m%c~Cq&{% z&=%5UpJvD>UTeXTyT@yz<7V79`jlIj(w*@kGJ2#qoFIYe8ZNrEc;7X-w6{QfF1@iK z<6AzAyF$itqdWbMxs>x^2Lj^uvH{=IU*IbmeD)AzFF0xuMn)F9Q|cAdcu^WB<)U@= zo72RWDb&=1i@Tm1z$)IXtTbYgOhmUP!h%4t#8mek_9%b6nWf;)e%LeUggStSsQx7(%O+_t?*>G6M^-}9XYdH0irE$G8 zk_WB1=wJ$ow3*tt6G?~fI+b7giQ_YVrjjHGHNt9Nn};?d)iGjSSxz z`xA&y4Gw)HwnxL14YJjgHKVLxq&;_ult}Luh)}$YSJXo z`y`$_{k~kGGi<1OfpP_ueE2XxSUWm z;5Nz)Y801j$1U5P;IK{_nhEn5A-avfL4VRW8oLCkMxb#fbdBjphE#rZu zk|L%Ld1wwY;lXkxbrZMUaJO(5ZY+-*(0Pl+LxR3D2$D7TS7eASf>OPHX1U1f7v^(x zO2hsBDQGxCd`3}zU;o{OtPdi>Bz%RA?=&@?E3%rqWO_d(%m{;dXsyv%i_+MFXt}I~ zaEjh*#Jo9da|iv=$)oiGd*parB3LKY`nJIP0i8Csu5rP=;r4(|0{eZ9LTCLQJxF9U zNT^U|Nx$WS0a|>R4C_0jG!&h?zK5yclY(cXqmX97@O<-U~}Q`X&PtRX(MBr?b1sL3t$T}tL>JO zuezWS4d^(XyhlIYmozRwehN**5X}!<1*q`-7CXpJwGC{?Mq&Nze;+pv;n0zUnymCu zCwz|{e&8%f_$A+e^{*LIN4_{IC4$_kjYe`DP9~7i7#MVN7p}G? zm)1OY1U)7C1`XY^GvyGnBYy@Tsl1(;CZ+~NOUEoDhY_^vg5XiF`N~$AW+EcT+t&D< zx`n<*bMU2aIBsfALhJ9$r+WRjq3s^TcVRqp2Yf>Rc(wIKfn4M=G5^Az2a;bN;^rZI zJ@>`vdD|=|qpdpkh4<>#sS+}3@gig|{^sr?7=@l|!|6%U+w*@i_^GSw=kGgBr%W+X z%!-zYTmYfu47VP6_~^pPTbEAkoHKWuKW@YR1`7l%XL}H9E>iQ6B}1!TBENq1W_rbw zkNnqa#O_D>+mFLutA{2q54h+ zu1J+7}@Mcb37&MhV;2P|jKt~T$IBNrciDCtO6aZFBdV63lCNRofHT)CCD_pj)=e5A6j zF4t+De0_AVqb-JQu~9u~?40}N4))~-bO$2Uzz z?%1V0kbHoNqgBhH)|=cT{b#nq19*@}3aLJ>8}lU<%oQdwpGldih#$3MJHGTgqPQiD zJ(sK^drxhLG-!=XMRCL0zY?H0HxAQ@5rHd`tVlHm!2Y^bM&d?U>!}X13N1#A{T+=p7uJL0-^{=0H>^*p5UuHRJke3B}}a$#}A) z$qIKpqa#x>2uros3YYtI9eVn*g7lucEY%RcGOIH3uPD$~c_R9OQcEdFDA5);H)g zowzD=hN&msp1Ng!sQlUPj3kOj? zrypJQ{I2i+ZZ%(VkXPkW<50a1hr%)UPQ7i}+EnJdt*_e8!yDv;DMVvju{a}zDFy{3(AZ68XcZXu}i`J3Qym# zh+U3+xX-MjHMKk&TdykLBHscr3e79XD=Mtw3llMLV>0-%eo#Mhw0dN;5^Vv~DUFOw zWVUW_Wf}BVAoO9|CfLj%CB&O8@GMNdDdj0Cx z$j%ZOLqja=LhI9ZIf4P*Cg&;irr*vhUZxolu}b33BO@-t+)1!Sf)RU0^fhKgeDO^= z?B&62a+v}%^zE8KV$ly}?j$1FfW8+-uIdbYcqTgUx}uvl7~-D;*c1H3<)s69eQ7@d zKfwXt(B``LsE6Pn-K*wY;V^sLX|TZvxy5+2A^1sb$bRhS?57R(^Tn`V-ZKa|*^k+<8Jva4??X zb-C&&jTtmVuT6VY$H7l~t@EZGUT2**?Q!36ijcGc?plRb>Grcn4zg{`q>arwdoFjf z|7Poq&CJ%x9f#iU?R{{6P4E19Yu3z17qAC%A=>_@LORSq?~-Zwi6KACWm6Jy9DCU%I4N#2n;sP$i@p=*wMAJ`$b#1|o#nYXyIyvRJeh!-v* z+6fcFtIyA?moXmP`g~toxh8~X>*H%H(|B-gee&wD%x5sdpapY&93QcokxNN7jIIMW zd~P-PA>9qdjHbblxM8H<0Z7LLsY0OEGH-R!p8pYpTF_0%f_uHJ?cxDBQ7~H^E}Opqai4bE4n2%TsZ&CT?(i#h%QIk_ojf~j_ewSB3e*XfKbB&z#8rR4HCDyF#im$mW27C^6vD&rG2!-4HAzN+Oh&kb1 z-&<+yAk%Cke(N0KO)oo$8T1FEE*@wryKW#XJadCt{tj0^%)FNz_~s1Fm~*d}w_S8# zvu^6pV;XbXs%Mc}f#-4oTv6ccc+(uW2 z=KRWlUAS!K-DlWIX9w)Z9{A@8M_mq!Xhx5B$GmX4i%b(jc9Y>|$^-D_4lxr(worGR z8%ytK@4n7VzlJWv%vtmg7F;FY(-_xst~Te4kBreL6F%%yc@rILvBm(G`6fQjN6!82 zrhClUtN+Ul_d^jd%^kD*ZCcie&1kIY~jzW#@J!r(u zprbT6aI3TO%LC}zT z^l~0jksV*^jK&k&-zeuCzaU3eG%o3C2W3BGYA`w1G04w3NB$eJ&2cV`&#n-o^Y?zL zJSQao04w~8R(1^sKEB7C@Tz^XTmoe{?hkPeig&9B6oc(3svUGge z_ZVvIN074e4+Q5{WXnIm{_M)q_#7vcPi!ccoM0bE2?_P0A(PvXQ(B7w4j7N%SLYb- zXD3E7##GAA@31F}5S9$HSb4hrtZdGEKp%L_NA97DAS~m^O3a2+pcv<%A(Ts?&!H*< zF9@YcCeNlcur^l)$sn%FjjyuH6_ZqaC%4P>46q)|YCY5x{+ZSB4DNzBaH|gaxUlt1 zYyzF!;)5#1Be5zff)3?YOF&VGQn}Uvo_4u%eDP1swX2HHtrO#xT{2ah8(3*?M!E^q8H%7v=Xeb7-Q+3`68FJ~JeNhgdTZ*hB)+fYB7k z3?Y2Y5S~zt>&_jgcEDmixb{G_xgUeacYuN?N+zE?fKODXFnDY_2z>+Ogspf;f`RECO?1~%5yN`4 zi1BeuroR+RCaTvKO|%)g<9DkKve>w)_jC!W%&trtM$DEf4}|*m;5i< zDnd~CsGkvxNGnPU#i|83{}1%rTEO!yaR*Je?DPZ5P_i&!KhY1z*>O?8SmMA(rQE zKR-2%D`dJsq03-s-42Bgu4Ec%Lmsq*Cy>e1b8a{y9Vinp%@PFgfN`fdHyJm&cxP!= z0+dTb6pA>v0NfwQIP;-gx4(gdi}noq4A0d|)mdIxR30JX8 zt0vK-TgV=HZH=`02g(lDm)iy84rJ@y`gQI@QU1>xKu0hNW=n}V)C-8+zZ;&|O%MO@mSSMPwsPRh z28`afq_^@;Ha2&5SU2yKyYR{iJzdPal&+|bd+^!2XfhS*Vd|8-rbRn^NH!Yoe}!zW zC>fFJYj0hUtRx}|IM_RPY7MT;?a|V1@RjSBoX>onp-fWG$QLzbdE%{<2y9M21&!hlT#w)x1qqwXDu!u zDttVvtntS&0%k8r0#*s)L86CtT!CoJNtB9qc+plA`$j2yp==|=U?cKZqGy-#PD(P& z=Mw?`yd}EK6yx70E1(FvC66I%ZE&>pm5Wq}d?28a1l1QL=#zvm;Zy!P6S9`&*xIyO zy*G@t$cl+3dbG8X{dF5&PZvfnYrYywH(swbYTy~0QbH7<3!mc3>?GZ2RC~RFYubZ$ zs`dC%qb|m`aI&6;$k)C1&&wk+!V)7g_-3}#=8+f)iCy@x!(JX46%id8%AenTe+|S+ zglg|U?^7S5N$mVJ^Eb&e73oo_QT&eD{)dkvB z!BUK{Q%;{wQMw?%LK?s7;6%`3__%b%ex&gO0 z48Ho!x&b@PqQ_Fk79+|luM?kev?`F`t?j9Sn!1Ujsdl#Z^96&0AEb{rI zWglds9k?mmvR!ZkjFE*eO!^9@kCC!BFl#&X-uAq^S$EI5N94gQ)85oDRv_}g8``!D z-a#B4d6So=%1FtOA$Uy?UX2Nl3kWpOJ}(}2nIg!2kL5)qOtkJn&cZ*Qo2g|mG(;h# zhTD-MU115MXi=O3J6Q%x?x1AJ9Wap;Pmw6`OW65TFbhQN6uyO7@l>z@V|nKI6KnWC zoV^KrO-KJfJ~L;z*FABw+|GSV}}}X{y9hlvJ$|X(&NNBoVRJR+Q9U zO;I~VQ&mM3Rn>*6t*R&i*v|3DNd>e$V&yzvuON&*#qB=FIY$&&+&grXdz! zw(1SH`nf}R4N#~ro)?N5;FlGs2MSRSTyANpb|isoS$_ABllSV2jhFu}Y>dHIP+WNa z#+&(WJ$q}ro<+F(BgDADV|i$e>QH^1uMI_Gpw^r@?~lgtQO$qXRIDC`dPzjPzr*OY z)IfB{OvZ$w*Y)(QXJ>V(#2>>idio;R)4U$D!a!#{k}Ktk3umAz_nM}|=llv(lCK-- zi;(*Y7G{vEa_c45Q|I8)(*JLlWbq>9PInIk!TaFp6?Zu{* z`XGm`laHQ;E}1md<`c7DZ|pF9O*S74!(%-iqsl^utzI=O%7Xn#Ooq=?2g(zS##CD; z^9%Zm4r3aZgb=A4`WN|UWdK~ z%Up}~t{S>OFJFBIU4B@8#_d;f3CqtI4aIsG_uR3_C`a|rUB+Ug#%?UgQ}X&rdf_`s zUs5u}vE*yRG^ft1MXv^~PC4<$iZ^hT08R- zbEgseKFtc5xpnr}ThY3E8&}t%df2~tBdnz(|BG20vX7eECVz5ldPw$;*%x*=YZ{W0 z{7TnUXA`|aW4$ic1G;FmS(uI0m4@hzk%~jsK|70_{br|Nl-t5LTko5!C%m(9Ltx>m zclX06!JNO*X!HhOkf@P9;jo89Ws-eV?}0||Xm_x~aPj2@9xc(mvG7VA{af8JZ7Cjn z5*pGF7;K-^t;#9WjqW!M{{g{x*G`LV(1JH+zxcY-+Wr@p-y+v?81^scdg(~0tKVL> z6}i3jX%<^r6PWv8*FODoOKBZwCzV(g=9k?K|B&K>wR1jMU_P_2=+i~P3$}hedux#O zqr>j{RKNJ6q+fIoc9hot(On;FON1CbuA^S(a}7u$G|yW`y#BGPPu}()W`yK^81-&; zSYC4OnB26$e_5>SO7ef9J4(7k0%2*XKf4<-YR=redD+49vI|zsE!g|z*DDXsHP89r z*Mhx4dR_Ii+i6`t3~^gs*0q1QW2oNK9V7v4P#)YtdIK0jlm;2URQ$7MEO)~yYQtRj zODojUq7|m#!d4!yO0&JRYnDH>l9`SVZFB=8lz0&z;!lD|FsVW6kucJh#E>qeKN&~n zk_F@=vX^{EE|4qKL2J;aG?FIMx9D^_lP;qx>00_e-9?V6CnI#{ox)drkks_pa zQk>LFdPRCo8Y87kQ>7efuC!QMA-yMUm-a{prO%|}(s$C&(r?luS&=o_A=i~#$x(7Q zxt}~j&XNn{h4K=4rMyPoByW{>Ds7d%N|AC<`BeEvxuHCO*d=Nu)mIHrL)6-812sZ@ zL48r}s`gTcsUy@W>U4EBCfhDo-&gmjht%WhMfI9`$K)`zF?BNaGW9jRW}0A{VVZAR zW?E}{-}IsBBhwz!LDLb_m!`9(A52$FznQRoyXj9eF)QW>bDX)SxsSP@d7L@jyx;sw zr7D%0R!XUqR%uzKcPp)_w4u_rN;@kZtaPH%nMxNb{b{Lcsb^_!X=CYTdEGM7GSM>4 zQeataDYERd9JZXaoVWaJ!P(C z)OKs1Xh*fP+9mCl_CR~=#k?$DeqI4y!Cv*eaw^xU998*{wShI5NtUB$bm zcU|xH-h;ef^Dgv$-}|cfuihm-R-Z9GZ}}AYeD8C|x3+IR-CzrKFs z{bu@Y_uKEM+bY?DY;9~EY&~qFZR2b+Y)fpLY`bkoY!B^{-C?h7Z(#3jA8pUJFR~xB zAG6=JmpH09Iy*)=7CKfr);KtMsnYzskreGpekp@?MoaRgP8ps><~$_X6aAfPh8;5drZ5g96e5 zG6UuZtPLm%I27=Cz?pz60S^LTz!7K*tQlB8FfuSMut(slfujQ_1Wpf}9k@7fb>QZ} zeSyaUzYDw(cq`EDRGoHb4QB&qb7wnecV|E6aOa!OEayDuO6OYVX6HxFgU;j5Z=F9o ze|6q-J`PfXe1d|4>I5|jimKSrTSEtlCTv+Wu6}9VELO)li&m!bX`%S{w?>!twaXfB zF}~o7Olos_z5aRPdr_Hz2{R1ysAS_cvo>^C)10}7=3mU$Cr>^yIX5LMZH8HE{kCcK zupgH_SZbd4-n=b`obh9a<)*%qjaqD*z_jBVXEP8G+Ar}EFSiB z_jxVdoqle{mzw+kxrM5>dWcI)$B9jVm=!#{wORF*cHNDk6ryhR;+EPuu<}Zei5ns25VXi$gIJBpS9D9qrN_c@|Co)S}xhV$Y&Caf6R3dPM&j z?cO$PM)l=!pWkxoS9G%1rIl&4nqDozrQNa^?J(sQ-Fs(GzO(UUum*X*(4o26WQSJL zYXqJfZGoAVR^COWUHD{B-JB2&wjHot33Laa(x%1#9l6&_G+>Mc!zu zMP;T9j(2Jb>>IU6SAYKIgdQ%bolDaLzIADQN4VHev~#Yzh@$$s$))8P=A0D6maiw` zlA705qwy?ddsc>C^?K07^KDezkDXC|vuKm{C|%UoN_Q(dtm!a%tLa^gs5Xe&0E?Iw zr0KyHv<3M-mc5dS|{vTtLYwYFZ+R#?B7?h3_zZaNOb$?Z0f&pyeDg zEh<ZOTm-9sxT_U_XwYwLsYMy4CMA#8zKz%3b}P8~W^z{VwWq%r$+@ zwHRH-a>KvD*ro&Roo-l%QVZW~jxLzZIBo6%@DX>Fn9NM?q>%Re6));^|B_f{d+$@(tWWTZ-*#kMKNWgDK`3Iq9xNUp&aZMI&+{mv!o zPPi*QL|Zi#)`afyFioqW7+I>GuaD3C3MR&V(B*af1*(Ml^Chqy+bm8%!Ye!#> z9zS#ZwDBS1`VQ-5XwjWtje9j4E2JKBEyv5oV4LEha7QBnDj{QTvix=XR!z^gyzf38 z5T<69)|qWMC-sChsMv4_ViDHR`n+EerMoN;D-1ogBP|*>HTnfp%e3QP9?&a)qUm-0 z^=uVM04qh{AfTVvrMzs1Z9K(QRcV1U199d&CX)JU#tJn~MczeGEXkFgZM=j@gN5na z(2aZOxL&!4p5CLI_n?Q;eQ1#dJqK27MO3zNl7W$Ldj$D`#>Q43JZBxds4_TM8^!0(x)TwW#ObkvRJuGuTkcK7yep`L|RMv5`rlW}r zjn&VMOe`d_S>uTkj6HQjG^0nh;kv#>?^Q7o422<1O~EWh?5?EgX(o52!Zm-C&dN|U z*rYc6G3&U-mldyHFvAFf1gfWBzXsDmi*>a{LX5W*Dbg2MtIr$8h!AZ_-yX|igS2D0 zCl>DCsD0Jt2R-pCjiS?E($AwJ`4`p zE6lsLuRQgsb6M{4+;@XJFH{y{X^+Xyv^jC3#|BTEK0R;Zbn}haYTJ!~gRT(GPhU0* zyZdgzw#}*7XQ;PJdt}kya#_Xp8XsD;a~A9DyRe&fNp8he5~$|54=4>(y})wIb>5<# zK%W)NLmY4KhV^pXw$Ddh2+{*@V0Lwk-a1@28G&t#px#D@11$fbM58 z>jtt?x_gp`MDs=NNKf9*83mx&gwsQk(c*EZxFDSrWF z(+~GqKA!t+=9igfZKh7$YtGUOe_)A8zAU?9Z8b+{)9$=AGiRmGnmBs;$Sm_{)8}s= zShL5uCuw`Hw~>{fP7}r?VU1hM-kS1b$}!~j=KgvXo}Z`haOnFiM(b+OT{>rnXnm(H z#TYC7YRo|0*4L=iRl$1MAG~_|2SwX$Q8ckKIUgdz%H&qP(0%X$p7A2As#~~gPSAI| zvEaIT4Eue|d!N(U$iyq5RYtSQr-6X)h`oEfYoS&Wp@03+2MkOZ}~*U}?{bnhSy zYsx0n?4ctYuYe`?a6as$@tHAv(uwA<6^l;nLeYs`Ce$YDl459To+dhX4r+Xci#{6@ zSRS1l*h|A6B`C7PhuuLhM3W#CxBg-`FRe^GV!~@l06ephcldg~*R@;w+8e~E+-X8g zh;}Uh!`Go;p+3g$sVYc2*ki^&8}-( zX04fX9E$lVy$4qlk*TWdCM_&+`z@GsRf6eYI(CadwT#&Sf%9DbPStbipFXUiTMVfN z=7@fsNq)D*RjX#P)vpFc6|DZA#gq=(3Y@IUEJGgi+uORdyeADtzJswP3_mCEthH&AGhx`CV!shYh!cp~cKihuNpZM!l zG2T#wMK~@VU%g{@$j zG4IN)-}1)>1dXup^H=&H=iOds3`b$G&3$3n?&4pZ5N~Jn1x6j?c5r^_V5PwL>UVt& zmKW8Vo_82cPbvBn%n&_;a++cUwR5)X|9XSq!ELbgz{BDl)8AYdvOaBP>I7%A_=I}9 zg00vN!N8({Lv_1{Oy>G#x$cEp9rG`bV0SJ(A>W}lP;F5s^gzB2n5}=V5ulvS*P9jS zr`2Tr1;zMA?WYgY3s+)E0F&|lH05JUejSr7%IH>l+JSDb*u%z$IYwi}ns3Q;L9MBb zIglguIk)vjZXdq;8>G)9zOwk%uk=SrA^NbfSnoK+_$J7hr1Fh7aY@NeW29poL`VZv z3h3(WcTR71%ulcRvp)Tsp*Q(f4gOfmQV;oQEmqM9nWtACc)*}5%{KSZMLW0Wo;6>Y z+2s?%9%Q`CV`)q&CS^JyW}WI6?@!KL98#FRe8ymB#{r|8Ad08!>m2CvZiXp*7e9F8 zmA)g>B14dRSipHdI@%75#fs`3OqfcEO-}cZMTl_XC!Dy16Nhl(AV2XFPE7g3(%)jl zmmKeciw3%^khG6CN?0X)g$3pazbJ;kYP2aW)$6*nT`oVj8ABwG!m#_%gvSXOC3%Da zkGmMFc+|-96GYuj7nTpW8+uPaf6w-?qHTH9a@Q52*OP5`sttVi_pA{8JZ79dG|0?X zCmK=^8lO@6HCM^%l3@;gm`lrb2f0e*8@6pFvcA(%`r^3FMwk09=yFz|-a7x09{4sk z9nssk3d|kjrliD$*v_~Epor=pxTfkYE!rVV#dhVRN(xaspvbMlu(yshEYt^a&S61J zbL0_@m@4~-pKGHw?4H147YIVdFZ2Apj_m;Zdh%j0;#=4Pnjr>(eD3j-m;IC7Mefo~Brq zS^AHwGQVoPGsyTDYcX%t3wPv!KJh-aqOjUR5OMcj5!W;d_eK7$EJ4J3Q+bI&; z6X{o7*sJI>m%GS4#j)=T<%mVcUKvwex(h1#-OvYqQ(X@|JRK zCJXwnj_EL0k5Q+W9#ZsSs^09!!>|!GMSX5GM+@YF7#>|}ZO7P?)<=sQO7i0)};gSzSYR?=tt8>tc`4bk7T|Bu-fX$t? zvoPmS&`Lea(c_I>XU=Tj_4%hCyb--5q}DsbXGCFfl0_EVhbRDBPyoiD0E|Wf(Dc@N z8dokF-qo?cJuX!>~W+;hQ~O-4|`xS6?zJgaX&rm4rD-|Ksj5ZLkT4z@=#u2fa9 zHEZ@QX`g|q-@YoUhRtM_$g4?2M?_u1T1I4Po(`Y!*n2Py4n}V%{ zx(Q7vXeG8YbCG=x3mx&u1bnmmCy6Ug^IX<>8`jKO6|`~ptiErJcyq}3tl103g-q>% z&YaC-aTkj=c1VvoeB)Ojxpd{fE0x9SbR#I&t>+pcfNI^&94V z>GVk5G$+`KN1wr?FXPc?@MwLk#Td|b7bXxd{NY=Dz=9C%SC401CMmFlUqdyNjw`-& z8I_RpLXPjg7ra=lXIxNvFHhfo!wFmQMviOxX=Qin+N9=KPIhRjVa|s|I|bl@$sK3 z6iR#|s^$ex~RhDc`>zjQZszy~?5dBE!Epuym^4PieoYe_FJYD^oL$P<@w} zd@bpl{dI?$=ANOaj8iU^7Dkx#6ijo)V7$vwdfhZ|UFzOo_jz^ix^;U)+}BNeQ`Zd) zEL~rgC|p>5R{orPOr)7xP~vSQ}%Gd-gxBJi#L)y&gH6l4q)8DdK)7=dm^+&JQl|>=f7QT1& zc97<#FQ2`rqf^bL@f{?weWZ52oxaublZVkY=Hnc zfl}HIn`r9c7mRc3jdADzO9^k7(|6H;h5?tcmc#0z^;f`{b&x!E%9=w5-&wbD)AH25A$@Z*$B#iY_*l~1Hr=@p zGDpvQP0usNW2f$t3+`hVY!TYG1=~jqbPgQ%TIc-Wr2IYw>mQi4-{hrp-dVhQ*3xOy zW=)l+P|1EVkNh zfN9fuD-{C>9rf1ezPDgPS6>(?q6>^-B?!z&sqZ19(JS(F=(v1zS)2OjPNbxkyG0p! z;EPFTf<(7@h&IOPq7D{>-7@1(b=D~`lgrcX}ShP}K zq_kG8ir#!?zkeG(LE6+`l+vaR^gXJU)m53N7O!3K3eUX5?l$`Fg`3*5Wr;L&)AIdr z3iWlG5{cy@jw{9jb((%$(f&G2jvB*XFF5V@@LIFq^r9=;c@zTdk;<2ZScFeL6OY=jpbylcaUXbzGi6tW(hOEy2bA+O~U)(rS?^5TyAukHlx{P@(eqM0< z`4bOrb)v}}4ppfb`vmEov?b{!FJhEi_i}HNw8z+UGNZH7F?=nYU(5)2A=jjJ9{N%pKK#KI5mI^?1Y#_O7_& zS(&pMt?FS~PDgD;-2$UcP7|%d(h!o&RBuSn%!W(M$dEnfoVdGKPukAQkueD3Y!EUR zT1Plu*ORqnZWZ=oaet0hw9l|GRsJV$O#MATBluCmh?O&huo2*gg5u%Zog4xdlgGeP zYA2NX(@wxx`WA39%>YiNvw*YdLf|6iMJUFgLxJ^K17Jgz225uYfzwzfVQf0f0-wVQ zfb-bfz$I)c@Ex`qxQ49-u4nH9KVU_`?QA=6Cp!Q<#6AHYW?uqNvu}XkvY&uIGdJ)t zLpa$J_JmN0NcbuVL*hVLQh;Wu5)ebUz{-*@&?e!Fq$*MX&?yB0gQZ|#EvXi;j#LlW zKxzbRA~gjzm)Zi`NiPCBONbw-yVL{NOL_x1N*V)9ky3!E(wo2;(hT5CDF--9S^#`o z!uMiKeKByUv>don!k0=PNFM;VNLzs0WE-IvTXz7f$W?%WvI`g@hXAX~)qyqTn!ws} z1Ta#L1h$o=neRZc;aqApRCo74JDn zg4IvePf2yW?F=k6D87Ys7Y#(+N2JtOG07A zQlB({B}+rnh%_eQqzP$Cnjt1ykd~wsi6E^>BxysUVCfP~UcmRaLl_9&-hp%^FOp8A zGl?Y&$q~6&zNyq#x~uW(MA(BIGRdYfrjuqbb0lmzZuWmBGqJ@cci|-TdHJ@jK|yFvKMz>9i34o1rWw^D>AMn1+%!S;c=9)-t~;H54T2j7 z>Iv!%>JJ(M8V-WgOol8AZ-Ig<-O3-Lb{G!Zlv{~?Q#mw{H{e>Nx| zv>$};6g0owT?uy$XcGwee#A}?zpfZ`6gl%0KK>ktkRQoq;0?}_JD>+3H|PnKsfGHW z-m3~LtWesBHisov4DCeYX#(v-2hyQ*1WlpoG=pZ*JUW*yqRVL^-O&Dg`!lqNZjW$B zJfM5&A$o+K=rF%SJ|}VR3_VXT(yR0)z1zA*>#Fo2eca|$n`4nHBbPiSMwrUHm>&yZ z!EKyv?5q}QRip<)dc@R^snxD&yEqob+Ot^J9kp*Y3G$a5q=UgzG9MUCA;GDGbpc)$ zJ{`$Q@EyrIU@2>O(yp{JQ1cvwPcIq>O!T;c9cgu7jOR087uFT{BKZx={MigLojfxj(thpAQSVs~kPYaAlFS z2#DMRoXW3Z7XIyQH+>Jd&$AV{lYI*O)pMny?049VvQOJ(L25u+D8H&9_&T-S_jt-@ zLgwOmTt>9J#II`~2I&gPQ7#RB!*eW9?c3dq9Pxnx4O@TDz#V)d_*oaU&6JN^+SbA*>K8JWHCjqmfq(% zmN{u(_zML%<5#k-=enM&xFY^OzoMI57T?N+^7!t-4pm&!O+2MrC)AhFco55w=v+P{2YTVY zfbM40Ba}@czu`MCv5&!TgS{t}T2ZbUl&5S$8h=xFKh(5HY1AE0>ka5?%5O+}JPFUK zg<3ZpHEa|{hJT@RaqSU-p>#R;P`U?ORZ7fa-bJpJrV-F?KHE|HK6S@BF+01_PYq3CI%rcqPSD7$0Zs2jzA7sVE71rIQLNDA6uT5$&Q>(Jsmm?V{fhADZn699 z5i3PZm?f)ZkGv6i2j5x^@2w++Nljr59o@7>(@;)QM=6fKPwLsGkJMZ0-@ICLCnsr$ zG#r-FX}D*SlnHBTP6g6JX_>T&zl(=o+AMA3_lo;>O9u#PGlGA2_J+M8L+@L2B8)RAbku4y9xvE?P-xmsM#J>{-EJp4m$CrJtoY0&# zH!D+>Y-oy)aIOz%AZTdI*p~GEJV9y`2}aJz{T^SCn6* zJ<`ev{&PW#TGwwKE-#l0+oZHfZ)I+Iy;XFpYAsK;Jj+SmAQwgCMf8!k%X{TR@{xf) zxZ{L;Mm{fJY&E3SaQUiyQ@$%dRFdS!3W@SlRK-j2Qvx_e_Ev(GS_*VbCH(30l$J`A z(jF545LTtTlBgspgSgg=YoPxr6UF!88(T!SXfD1hv1L-rL?vHk3UoeY30kqx_Y~-R z3eQtJdDtTI6zF_Paim>23OWgbwxfIxx};oJZnb{Yy0k3Ll+v;|Qt|C&B;u%=%5{`1 zxeyqRJVNOe8Es#BMVbZtK^lefZIkzdKZx8w=|vApKmA^c1HLY`!P(QECBO)-EivLj z>mSW7e%AyKWX zd)}|WCVINV{~Xue=s5|R4SgW4e84p)noiyUCh&d~I!3AioFvZn7H_ZR;kB}#lnY!U z_-w&{Bf>C9T)AAlvAcLqebFD&R_4!qf%m4+JYIj(0_k6na4{nM-^sJ#(_DsJq^*VC z87?%!tMUr?{31hdW3lo`V1P6a7~(;13actl#@S*Kha=^>;D^Y`z+p0^ERFZ@XAYK7 zgV6*Tx{x%<^9A@%E6 zBOQV-8Y1%)Y$&w`w)Xr042P~uX`(b9_=?mGI8Z`(=o;Q%MMIFzlx~$S0=G-Mfuls6 zUzDJU;2MOA=83oGvFhMQimhpFGc)sSy z##Ypp5sAEhZW&fqKciMW!M;Q-cUiJaQBqsfI0?kkGKu&@D&T>9hyeqj&TzoA_};q@o4 zAElR3E4(5Nm4->lh#hAu8NC=!kCvomD@>AUWr2Ri`Kr*;+P4bDQB@qA3&quxImqky z+I=Fv&`yQVWZ<)qwMyb4Yn4)_1F-{ABh|uM^KDM77V4pyn;BkAJoxyyev(P8LLp}Nf`;lGX z@y)KVUon5^HoL=qXLs2>)TaMJefn6$33^(Q9_Uv^U0Rpx3(yuCitsiUsnkwtFLgkz z+L?!6>MF(abVCgGk@`wW(g0~NYSuC6JMBYLpB{c${AhErZCaFHbn~cM)Q@Z@d!qu# zA?g)fHM%M}0*&hoIp5}DbaQess(n;@a+Tb~ahE)duG;2en~UUe)X}J;lx)swD0=1Z1M3rB`s27J zig1qvj-(@i?Pw6ti#EkwI(-3rSK3aT<=2c7SJvP{-P{;mp|oM`4vyAD8t^q z7x@w0n^cSL%@6($eT-qGDS8p35htbSf28bl-k-~S&_798w7?ex#sHs{oEKvFn_oyQ zYyGjSBGl3gy@{D19VAL-;_i>hThHAgq|6I>ka!0m*V+HpFx;=Z0Djd~6$>o;NR(Xxq@MiaSHII(m}yeacC*|NWPG7^`w?)CA1L| zjZ3rcLW=c6OXp4WeNXKC5Xa5f?y>nKn+zgTV<*N=B*|nH_a~`1lOOAcVvlWf6J40k_}pQq#{p?~E|$h+jRz(@%>kDU>GggE;v zTH%z8X0HGv=`V=?Lk#7e6!AVf@*_iiLqgF@L_NRq>rq406W9RH>CZ>kh|We-#9%^I z9)k&C1T{CQju_`fC=a{zE^;Adlla%O zZITOE%z0@&*KedQB0gq{-j5^^6FYcJ&<)ZM)H^#$JlcTk1o$C43=XY!0Ew)CT8ez4qwe2->Y82E< zmzOulX;4t(K@E4UqqWeU42!JotX-{MdcBOAH*4Olm0W97t^2iZ$%XQU1`isz(SDlG zpTnQQ@8|dOYxy<&T!S3BsMh_m)*QcAJ|dss=WBGV5htHPsmAm9{beMdui&5h{l$&K z`Kh7}$lHNsbn$Qhg@27Y@?8<8I`YFZ7vbY!d`bu_4=-;;K5IjY)}s>6+l>4iCnffI z;w{PN|CjL%a+L1;yWu95xt#w`q$J^*LHzs6NJ*~XpZb-@GvbfO;Xg@1{A0uiaa&Hj z4f~Y;r<;#+6_ouP|IA-qRr`V3TkX$VyJ)ALGFePMrUX+TWsR~)*`n;Mzp{R|vR^5# z*QZ{nX|8fqxaUn5dDxYc%2|vxT`~ulgG~v_bEfC@khLCZkHMfmwQ zl+k5EIIj*bcmK!zwb7;(qr98pZUgNGp7dFfKGreK1XMs<1d;6OgBMyK@UNXkv;^Z zg1kU}@Vg2(xPqSk|6ljvo?3*M>zl*PExA1CaSO6DoV@`&;#m$n$_&&G-^<6rSCO|u z%4Xp*N~iJO14vrV|A{)1w+GSgA)iZ!;jhT3jbxh#H4yWaKE&A{Wk`2=O70E$y4ZW zrv*oL8raA)9Eg5Gj=YA1|2p6tsjz#_sW|(F^bTV056O?8Wp@PfxXP8f3Vc-{PxqlxBv6*V2I`U< zSI&^eiL)hm*L-;c_^BeyxjfgAo6;VRyzc^e33-MLlaY&P9~u2Qp6e3wA2Jzk}W|jH3ESJ6z*SrVJk$M2fh%n?x z?}9g%jeYW75%PWu*N8n|V2h0-JjD2Mu!)B=qu#)r^u(NoMnQLQogT%Fx z4bn7$Ujb)`9>1ErSB?4e{w}hHTN2R?av*%R%16P^^&n4TNs(DNyTH=`e6e`uL7qQJ z5qzF$GfNc>a3 zzqySNjwQTrh5ae;n!twwiv-R9J_|vuyF3K7qwrjeheD^Ci4eTYV^R7@`Wzwfm3>JS zxvAWg1jrrb{v?nzt-bxfAJD1)cGN!c|L4H_LlDYm;j9zO!&x^4qlt_-rF>})!npu( zFALpI5xSoW-R~V@g6_AHSP+lz6HPiQ9VPzKDcJ{K!DBN?=zINyrq^GtBiA7VJdC_4r^p#39V@FWA~UeI$`Vq59`^%e z4*J>;k#%yhTuj!J4GpT*-x(Gk_OL;nu=x77>X$Zf((ZIV{2qqIgP)HxPMTQ1lqQA6 z(?Ruj*58S>WJd8G3s~=E^Z)-mXg==#Pe(l7^xRSZRs$^9@%%yO|6h)<4Ph}j;_0QZ z7%dwvp)1%^e>X!ZEc(VM7{HfxgXR$KQbv*B%$1Tc_>jKO8 zGQ3YwUfBWkl|ypV(ZCXvb4t%J^p;2qc)yM07I;bEJ%JkqPUYy?OpoCDopc~d-k+j3 zW(f6$&p>X;01J^&;0#!o@P6DTxaJ<&3VsU3z2sZZVBjUnWp)O?o;(pfIjhk>OA$Yf zfCW#`f~E&~*hmWNRgqsCiT=R`yUW_q(tPCAO=y9%k~r5#QRTJPo!e$Q|U0)kvbxMj{MV2en}oGkC9X5 zneyB6YOEQxgVb!8+%TEMa{NyR>Hd!+ktE?5Bx-?CBo%fgQ*ltwO`3ynWx~pVdhUrb zIFg}klJD4br0Ots8T?URSJMosCHNa$v!mJ2U!Hwo*kkd9C&+T7T@|$aXCdthP!p6{ z@=DS>kp8krQ$<=OtwMcPD7}aJU@b}T@V7}1aR%?<2G6;> z9Krwf*bCqPbY$S#=MMCf{~r!Y8fP_5X`Dh;yze1Jq~YK_>1yK?^0;wExlft@e?Wfk z^GDge{~Zy}`JO+J@16*WHQsXuDfE!{Fk&2sYsIPXd6rs@L~1p*pkI`sHZDsoF2l-F zi-{Ur!sz_6XKBXEp(?GH)+5ahN>_+k`W;dmURzCo)`^T{v*F1lm z!yVhmZgK$D%*Qa=#Q*>E;C6<8J@`BRdhj>??}L&JypPVKOOU4Mafc2LTR@IA1UBPH zZwoxk5q*XnmvC(t@-H0sK9Qn$!6Os;5#myj<~-AWC~|lqVX$mi zhnnDubO-nNG=9){IOx9~70-=a#YqM3Rw3K@ zfBcIEGVoQKHlpVLcv$J*4nC6f{6Qmd*r}6NqjhK)R{G=r|9M2in)7c*)9rYF-rtV+ zrhhpQ#(y4h7$f@Y(Gy?UoA#$e=x}gjkRRUVZ9&);@pfUjlnH*A)B^k|F>>2NV35Et zj`X^~k2#WffxfVJp(GFaijriu5_pk~0{T+4jYw}+1-OMFAJR&qr@9ZubDovvHd}Ze zXmhB%?{&5WyC{+FOh{cxNL^XzB??w3d=KTAmu8cYx@MuHR6@_dLsC^p-CA-Gbn#X~ z-nJIYi$PevB9_S$I+>S!t#*_ZdH@7HiQH1{Y>zpIkTNE|l+

zi$6)ulJChS{{No`zw7yfT>n2Ew_4n6QP`r8l;U0YNhv?@?-8B^-{+6AbN>&d@=MSX zsXUSQiOW9={9NF9fpY~8<0wTjq!(<7-v*{r^i{Ce=(oT(!9Pov7JZN|tVIFILfN!| z;?dUR^Mtx0HXcLz@p(czpC<&X=~(2acCe6s3poq3h0x-_Y$2M4evkPylP+Oi=nb*5 zD)diS+=em}pEJb#8RiVZ;u&*>*dRVzh`ol{LbKU0KBI+=WV0<y z{9GrvF(B?frFifOpgy31ApV@8urNsH3jgIWqVSsSG# zYq6m2AkHV2yGiBlAmL8cvNcYr!ks91{KtFp?Nja9+I(#ZcPmI+X`iaC0d1=Ai1R;(Q@^Vd#drA)qB=Jy~hM5En*o*Y((U3;XJI;>ud^PIfQW$v^8RxjZ%&N&@T zF&jfz$?rPu2+QMqpbnl#s7|Ft~J1Z%PY>Sr&sT%|NX}JrInFa|8jS@ z-x#kUAnrb;G2n5X*QAQ;`F&nFpv-cY^PCFGpR)}7LJ(YW?JBQzUYotPdF}Q(;B^@O z$2fVN@;c{r+3N=AN8#S_df@e>vh4N5%U$MjzJe+@uN(=ofP6sypsJN?2)|J9{9Gg9 z##HW9d0^$Cf1&ti{}Z11_bK-)s=U2&1&w%)PXV7^{yzgQr>ye-&)<{xH@^+#|K|#K zQRU@u3qiu)zQw+i``fov-dp)lNpXS!~)>vzIYoayDI>?%g)mc-m6RlIN+17mPeCrad z)OxF&*1%l};x4C6pe-PNem`jEb3FGeF8_ZN?#XigY`I(Z%=^|y`2YQLewPFfe{W_j z^=95??`qz4K-O}%4$nW{c5f&D?>Oi9(Q(c@tjraBQ|}1xX!v#Xj`Qy6-P^mrcd$ad8@7+E=-Ve&@0C&9)i~r}q z9|N5Nah_lEW4U{|+|^oq!Hlk|J~ezoeHsZWms36o zK7BwjKAn8x1)t%Q<&)tv5Hu9T`4Q!AO1Ya}?q>Nc@>%|j@&rHk*?)en&}V}q!V&Fr z#^=!As0jbJ`HNBO4uP88>-`eq9^ z-*>*_j^lyjj_(rCO3wSP@!j;)wI|z0*^_;@`0n)G&w1Zs{$KbVEpy>_()X-5_r33> zr+(b^>*-gmf_$%Y-uJ%mBhamK_fgq--_r8ySjF|v?lu3-&szT93D*wdE`LuQzc9b1 za3es`ppKw8P;bBfenb2w`DKD2Yau7g_)NbXzk+A9&2P8gHot{_%luZs<$MJl@H_0c z&Tq5uuj+_|9Tj^U0m zwnEzm$8cMbZM$u+?GV;{{!etmcE+*JvDtRfcK(0RRohM5UAvz>!0w0Dqs!dKc1)WE z?^X7npR)(>d?@lwu)UVOzCGOD(jH}RZ;!Qiw{qrYPa z|87T`W0E7&k>e=9D%Q)ejy1l|vCXmDalmnyzgx&b$U0sopuLV)hXGqFXl<~bYF%KO zG7lIjw*!Wos{=dAeB|;)rHK10je%`coTYDzag;p9uZ)B(26SN+Hd`#hGY#09kJ3rM z@liMFriAtlYo|2BT^{)?cuj@|t-b*}MyihT;En3*GJ1~azn-9VMgNf30B@FJ)Jplv zvm5v;8xNl!6&3fY9*lvpua!Q)rLqP7Uz>e^m*fwC7i9El(PVZ7cvy`2ea7F8@hyZO zv*P$D;E%#*g@=zS&0&jyAIa|nKNMf|Ax2awn=StW?4?j(7dadFG9O)I3H(Zyz^Czt_dO`o9uPoB+wg?~r+H}D;#Snz*J7*%C$O#c@CZvbCZCIho&jBv9!p89OCd=NMb zGYTl{A)fi7jQ(^0q4~m&a(Z7E%Q~-E@Uq8jjyO0c!zjqu!1nN zt|I67$)6)Uzw?m=dP~f?w4o25vQQD*l|7rm`${{2N%AaU2X0x;I`AF>273+Q=X_kB z2`d3MP4G5}r*8?jhG+HVZ-7JOuYuL%6kr&)41g8kJYXm&xsIL1#upp$Ku%# z;8J1ZzJQGZ|B>K75PTX-L*85ALF<+*WQYyeyB`I=kG%?hl!*U4#$%?KkNU$JdK~*2ce>a*(6|+80jCy+s*U~1tl6I=z9d>d+9p)3p`;hw{Ku?2ut^Dm6wHu zGJ4%$C66*l*UCC@uEgJdTs{oU;qzHha=QUHdaePtFkV8(^4>eCjfYE{6h4Mcev(h( zEN1#}q`b7Q^C0cW4-#@FMc+H{EvX-{t+=Kws|tRmGzB=q(}g3SHA~TEbq+e);4zTyc?+1qtsJB`JUf6h7}7<`@VpOP!jggc!hfCc?~FAM zsFcWR;I6fDbKpe}L-A@!`LqHFUV8z_V0N9k-}LH zeA}=ESJ^9cmg>OrQ5j80i-R`2-d|s1z&qo4BRX7d6M9Z1aIY|Yc!Mv0tfNg&*YIb5d5kq2oG(} zc&=+FBOatl;%Sq_(;QDG;O*6UDL@Ylq#S`|0B}9S6WGoth(pW{d=dOK&pW_8ehusF z!E@MP#%0B)=n+PpA`Js-9;5|kiihJ}*k=tGDB>rT%>h63NfhuCQA6z%GovbVfA&51 zmzu!-8KLDi9PE;G2K-_V&(#}*wZvjmGw}21IpFtlW#BGhX>ngJ1izb070luJ1h`sQ zkc{vg20v7UB!TfVRUkbEu9b3u_qcqcYd!dOx=}`&O1*eqk~)ZdwM*)aFmwf|3I8bJKSR2VE9apXmCK)dz+91U=VL^U&uZgO z%jP+j&fvM1?)0<FY-m#`WftHqIuCeW>4|q$q9~!{5TB=qUQ1qTqNV!4AtJ|q zEOKlYIuSly_zX94g=;e89G4I51J1KmoR{C^ygXd+m3bKC$~?!i4xC4Q2VQxdU!x@P zYfMczZ>q(4v%z`uU2!iH_cA_bk41=kBRH@06!&%z_d3PBl{rt3i<-j9^AGFhf#hK( zQK#G!s~7x>>uGEhFALcmLkZG5F!Xfj1Uk3l|mG?6n%)eRB5U_7qqCURf-6RR4t;-14K$)(7Ga0 zN#6gQ@5_RueSp97JLk@wZ|;1v&zUo4&WPJRD()~u++mWqsXtQdSL!*j7sYM&h&x=N zVe%zR+(z8-nc_~_CGM1c`t2h9c9Hgojr#3IafeIw+mZThrha>}xNQ?X-<9G=8uYnCq>7bEcU)u1Fbd9ZEQPxj>)p;+FqtRvhqB0uDi@#X3le0p?lvG`S&byA@c9J zrVlZQwIQ)7WI6S4CUgt$7nwVb5tf?e<{|W(jvY9Ibr_TxT7W$M zxvM4JK1WsnZfqrO6Yk>$=pfgtrUV-mQHGXs$|ld2{Q#Yxll9q<-J^!+K?t->J`-;V zDrbaP7l{=CTdK6sjlo@ryLKHl<{z?67pTQv6sA_}Z|r@XH=oD(L}t+BzunAgM9%sg z3Zh@aNI)3YOfq_zQaG>Lu{Yx%yV-&K;?aOEiC6Itrc96e8YeRN^9%AGQ=C|yUH#NU!glcY{v&Y*kPQGQ^Z1ZPr zGwaxC>0{P&s_Uob6?>_@)NHnwF|NJF-pe$zgPoTm^96e^^Vqd7;rws~R%-6FmK?9J z-mV0WL+k2Mb}Cl^4ejIh5A5EQ0WCP;+Q1&qE=@Ws&J34fM`Mqsi5=rIT_-eW*s;MX z%4zOrw%Cn#*V;$ex0%MwFx$%&G{7G4d1u`h-@^pl9-U+~rU}-{cv7DHFXo zzu^#At8ZI;HN+WpgWszD*}go^t_^;dyoJ2)0xSPd#4j3iEa1QN2Qa^--v$gh0S)Sa z#(`_L>VWp)=%7t?_|9mUB%o{Pei-C%t6LH@&wWCFG_9@(L&K;r9(|p{P#BHj&bDd@ zGvb082y?_8ZUIZ!LA@ue2#+2iJWRMJ!y14(44Z&;;On%N?O}KLFnn4I_Jw`n+ju|% zA{TM(TQ#IdP2&*)QOm?r-EE_e7_}S`oe7>DPfbA7GoBjt#LCBBEOZI2g1)#eNxlt^ zjtwra_1#rsb&tBvhfa?cR6}u8jQjRzuF@q@-M}dzV42c{`+=l;RkS*K@u=WA4ZS%^ z!20BKGo`W@Yh>?4JEJ|~jx(@1wjWwS!%U-JG>co&3p&y32E^Us9?;ylH&)sP#DlQj zH-h$15W^pOwIdLZM;hdk`lfmW^PYxgnP4PCbwhlSVriF>{-xfEb}?x4nl9zU&ouRgdAsoj8D0nND4>T zCb(ac82nTT?{5|#|7&$$$f!(CCA`@wlodNXFnRxouP(E!XnclcF0`#JGmIMxcVo@# z=52gVH(%lYSSWfJnb5^@ZrDanzP;bp=i5f+U$~zai$_QUWCq$NG72n_l@MD%msCy$ z<_Nr_#?Ok!QJra4E-*_7KSpk*rOoGEpL zHjI?m9NPx>CzjdMJ}7Q`qsBQ7txjuyqI958cyICPsPswBE+SQ6Wnk?k(jJ(3pseVB z2;D83@#OSmXiq1#aJR&X9xneI<_e7pg{I^Qt=B*(@r(a3^*==@=bLFo?qXYxJJbFa z_rp>zVZ72YLgQ0~rhF>Y>{kCP)xVwk{7p*F-fmBV?$CBJmie}NUU&PHFA?rhIJ#Tl z1dVM@h(@*zWzpEqwR24q+Vst)spvSEX6Q99F|F)doH@+m9?of|i@OCatkW6MUN^!w zBzV-j(HT2~*b*?#d>2Mk`xL+_6x9jB1Ak74)rC?*ISN$hg^n!?UpM&O=*9j{#nYSx;&QWDQDBY2FcPu)c^`VVoZNDS zGOD_lDjBI=fn5(xwPn;szALUNHKdcYDsHW=5={chrjhdUg%~R$i^R#)^ z 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 literal 0 HcmV?d00001 diff --git a/app/fonts/OpenDyslexic/README.md b/app/fonts/OpenDyslexic/README.md new file mode 100644 index 00000000..f9d5ed5a --- /dev/null +++ b/app/fonts/OpenDyslexic/README.md @@ -0,0 +1,10 @@ +# OpenDyslexic + +Unmodified OpenDyslexic font files from the author's repository: +https://github.com/antijingoist/opendyslexic/tree/1824da5c0e41dc3e13ffc7f3a636dcaf695d61b7/compiled + +Upstream project: https://opendyslexic.org/ +Current source repository: https://forge.hackers.town/antijingoist/opendyslexic + +Bundled under the SIL Open Font License 1.1 in `OFL.txt`. +The app registers this license in Settings > About > Licenses. diff --git a/app/lib/auth/auth_api_client.dart b/app/lib/auth/auth_api_client.dart index 308b4d31..de09691a 100644 --- a/app/lib/auth/auth_api_client.dart +++ b/app/lib/auth/auth_api_client.dart @@ -141,6 +141,35 @@ class AuthApiClient { return DateTime.parse(json['deletion_due_at'] as String); } + Future uploadProfilePhoto(String accessToken, Uint8List bytes, {required String displayName}) { + return _withUploadCooldown('/users/me/avatar', accessToken, () async { + final request = http.MultipartRequest('POST', config.endpoint('/users/me/avatar')) + ..headers.addAll(_authHeaders(accessToken)) + ..fields['display_name'] = displayName + ..files.add( + http.MultipartFile.fromBytes('file', bytes, filename: 'avatar.jpg', contentType: MediaType('image', 'jpeg')), + ); + + final response = await http.Response.fromStream(await _httpClient.send(request)); + return PapyrusUser.fromJson(_decodeResponse(response)); + }); + } + + Future downloadProfilePhoto(String accessToken, String avatarUrl) async { + if (!RegExp(r'^/users/me/avatar/[0-9a-fA-F-]{36}$').hasMatch(avatarUrl)) { + throw const AuthApiException(statusCode: 0, message: 'Invalid profile photo'); + } + + final response = await _httpClient.get(config.endpoint(avatarUrl), headers: _authHeaders(accessToken)); + + if (response.statusCode >= 200 && response.statusCode < 300) { + return response.bodyBytes; + } + + _decodeResponse(response); + throw const AuthApiException(statusCode: 0, message: 'Photo download failed'); + } + Future recoverAccount( AccountDeletionAuthorization authorization, { required String clientType, diff --git a/app/lib/auth/auth_repository.dart b/app/lib/auth/auth_repository.dart index 679dff23..9533888b 100644 --- a/app/lib/auth/auth_repository.dart +++ b/app/lib/auth/auth_repository.dart @@ -197,6 +197,16 @@ class AuthRepository { return apiClient.updateCurrentUser(accessToken: accessToken, displayName: displayName, avatarUrl: avatarUrl); } + Future uploadProfilePhoto(Uint8List bytes, {required String displayName}) { + return _withFreshAccessToken((accessToken) { + return apiClient.uploadProfilePhoto(accessToken, bytes, displayName: displayName); + }); + } + + Future downloadProfilePhoto(String avatarUrl) { + return _withFreshAccessToken((accessToken) => apiClient.downloadProfilePhoto(accessToken, avatarUrl)); + } + Future forgotPassword(String email) { return apiClient.forgotPassword(email); } diff --git a/app/lib/config/app_router.dart b/app/lib/config/app_router.dart index b53377e4..822aa235 100644 --- a/app/lib/config/app_router.dart +++ b/app/lib/config/app_router.dart @@ -14,7 +14,6 @@ import 'package:papyrus/pages/catalogs_page.dart'; import 'package:papyrus/pages/catalog_book_page.dart'; import 'package:papyrus/pages/forgot_password_page.dart'; import 'package:papyrus/pages/login_page.dart'; -import 'package:papyrus/pages/edit_profile_page.dart'; import 'package:papyrus/pages/profile_page.dart'; import 'package:papyrus/pages/licenses_page.dart'; import 'package:papyrus/pages/support_page.dart'; @@ -282,11 +281,6 @@ class AppRouter { child: SupportPage(client: SupportApiClient(config: syncSettingsProvider.activeApiConfig)), ), ), - GoRoute( - name: 'EDIT_PROFILE', - path: 'edit', - pageBuilder: (context, state) => NoTransitionPage(key: state.pageKey, child: const EditProfilePage()), - ), ], ), // Developer Options (debug only) diff --git a/app/lib/main.dart b/app/lib/main.dart index fb50a215..de10a436 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -4,7 +4,9 @@ import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; -import 'package:papyrus/themes/app_motion.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:papyrus/themes/app_accessibility.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; import 'package:papyrus/acquisition/acquisition_api_client.dart'; import 'package:papyrus/auth/auth_api_client.dart'; @@ -24,6 +26,7 @@ import 'package:papyrus/opds/opds_http_client.dart'; import 'package:papyrus/opds/opds_library.dart'; import 'package:papyrus/opds/opds_resource_cache.dart'; import 'package:papyrus/services/book_import_session.dart'; +import 'package:papyrus/services/guest_account_deletion_service.dart'; import 'package:papyrus/platform/book_import_drop_registration.dart'; import 'package:papyrus/powersync/powersync_service.dart'; import 'package:papyrus/powersync/papyrus_powersync_connector.dart'; @@ -52,6 +55,11 @@ Future main() async { ensureBookImportDropPluginRegistered(); usePathUrlStrategy(); + LicenseRegistry.addLicense(() async* { + final license = await rootBundle.loadString('fonts/OpenDyslexic/OFL.txt'); + yield LicenseEntryWithLineBreaks(['OpenDyslexic'], license); + }); + try { await GoalCalendar.deviceTimezone(); } catch (_) { @@ -540,6 +548,15 @@ class _PapyrusState extends State { ChangeNotifierProvider.value(value: _bookStorageStatusController), Provider.value(value: _powerSyncService), Provider.value(value: _bookImportService), + Provider( + create: (_) => GuestAccountDeletionService( + auth: _authProvider, + library: _powerSyncService, + files: _bookImportService, + catalogs: _opdsCatalogs, + downloads: _opdsDownloads, + ), + ), ChangeNotifierProvider.value(value: _opdsCatalogs), ChangeNotifierProvider.value(value: _opdsDownloads), Provider.value(value: _opdsHttpClient), @@ -559,18 +576,34 @@ class _PapyrusState extends State { child: Consumer( builder: (context, preferencesProvider, child) { final isEink = preferencesProvider.isEinkMode; + final lightTheme = preferencesProvider.increaseContrast ? AppTheme.highContrastLight : AppTheme.light; + final darkTheme = preferencesProvider.increaseContrast ? AppTheme.highContrastDark : AppTheme.dark; return MaterialApp.router( title: 'Papyrus', debugShowCheckedModeBanner: false, - theme: isEink ? AppTheme.eink : AppTheme.light, - darkTheme: isEink ? AppTheme.eink : AppTheme.dark, + theme: AppTheme.withTypography( + isEink ? AppTheme.eink : lightTheme, + dyslexiaFont: preferencesProvider.dyslexiaFont, + ), + darkTheme: AppTheme.withTypography( + isEink ? AppTheme.eink : darkTheme, + dyslexiaFont: preferencesProvider.dyslexiaFont, + ), + highContrastTheme: AppTheme.withTypography( + isEink ? AppTheme.eink : AppTheme.highContrastLight, + dyslexiaFont: preferencesProvider.dyslexiaFont, + ), + highContrastDarkTheme: AppTheme.withTypography( + isEink ? AppTheme.eink : AppTheme.highContrastDark, + dyslexiaFont: preferencesProvider.dyslexiaFont, + ), themeMode: isEink ? ThemeMode.light : preferencesProvider.themeMode, - themeAnimationDuration: isEink || preferencesProvider.reduceAnimations + themeAnimationDuration: + isEink || preferencesProvider.reduceAnimations || MediaQuery.disableAnimationsOf(context) ? Duration.zero : kThemeAnimationDuration, - builder: (context, child) => - AppMotionScope(reduceAnimations: isEink || preferencesProvider.reduceAnimations, child: child!), + builder: (context, child) => AppAccessibilityScope(preferences: preferencesProvider, child: child!), routerConfig: _appRouter.router, ); }, diff --git a/app/lib/opds/opds_catalog_store.dart b/app/lib/opds/opds_catalog_store.dart index 8d2b8be4..28ce6004 100644 --- a/app/lib/opds/opds_catalog_store.dart +++ b/app/lib/opds/opds_catalog_store.dart @@ -75,6 +75,16 @@ class OpdsCatalogStore { return result; } + Future clearScope(String scope) => _serialize(() async { + for (final catalog in load(scope)) { + await _secrets.delete(_secretKey(scope, catalog.id)); + } + + if (!await _prefs.remove(_key(scope))) { + throw const OpdsException('Could not remove saved catalogs.'); + } + }); + /// Omitted credentials preserve the existing secret unless the origin changes. Future save(String scope, OpdsCatalog catalog, {OpdsCredentials? credentials, bool clearCredentials = false}) => _serialize(() async { diff --git a/app/lib/opds/opds_catalogs.dart b/app/lib/opds/opds_catalogs.dart index 08490776..678da6a8 100644 --- a/app/lib/opds/opds_catalogs.dart +++ b/app/lib/opds/opds_catalogs.dart @@ -118,6 +118,16 @@ class OpdsCatalogs extends ChangeNotifier { } } + Future clearScope(String scope) async { + await cache?.clearScope(scope); + await library?.clearScope(scope); + await store.clearScope(scope); + + if (_scope == scope && !_disposed) { + reload(); + } + } + @override void dispose() { _disposed = true; diff --git a/app/lib/opds/opds_downloads.dart b/app/lib/opds/opds_downloads.dart index ad608629..d36f6ff5 100644 --- a/app/lib/opds/opds_downloads.dart +++ b/app/lib/opds/opds_downloads.dart @@ -234,6 +234,12 @@ class OpdsDownloads extends ChangeNotifier { _notify(); } + Future cancelAndWait() async { + final operations = _operations.values.toList(); + reset(); + await Future.wait(operations); + } + void _notify() { if (!_disposed) { notifyListeners(); diff --git a/app/lib/opds/opds_library.dart b/app/lib/opds/opds_library.dart index 62140145..82bc3cba 100644 --- a/app/lib/opds/opds_library.dart +++ b/app/lib/opds/opds_library.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:papyrus/data/data_store.dart'; import 'package:papyrus/opds/opds_models.dart'; +import 'package:papyrus/opds/opds_http_client.dart'; import 'package:shared_preferences/shared_preferences.dart'; /// Captured before import, so its result cannot be attributed to another account. @@ -157,6 +158,22 @@ class OpdsLibrary extends ChangeNotifier { return _pending; } + Future clearScope(String scope) async { + if (_scope == scope) { + _generation++; + _imports = {}; + } + + _scopedImports.remove(scope); + await _pending; + + if (!await _prefs.remove(_key(scope))) { + throw const OpdsException('Could not remove catalog import history.'); + } + + _changed(); + } + void _changed() { if (!_disposed) { notifyListeners(); diff --git a/app/lib/opds/opds_resource_cache.dart b/app/lib/opds/opds_resource_cache.dart index 8d14409f..2178d096 100644 --- a/app/lib/opds/opds_resource_cache.dart +++ b/app/lib/opds/opds_resource_cache.dart @@ -165,6 +165,16 @@ class OpdsResourceCache extends ChangeNotifier { String _serialize() => jsonEncode({'version': 1, 'entries': _entries.values.toList()}); + Future clearScope(String scope) { + if (_scope == scope) { + _epoch++; + } + + _entries.removeWhere((key, _) => (jsonDecode(key) as List).first == scope); + notifyListeners(); + return _persist(); + } + void _trim() { while (_entries.isNotEmpty && (_entries.length > maxEntries || utf8.encode(_serialize()).length > maxBytes)) { _entries.remove(_entries.keys.first); diff --git a/app/lib/pages/book_edit_page.dart b/app/lib/pages/book_edit_page.dart index 244f85a9..0c187b8a 100644 --- a/app/lib/pages/book_edit_page.dart +++ b/app/lib/pages/book_edit_page.dart @@ -40,7 +40,7 @@ class _BookEditPageState extends State { static const double _desktopContentMaxWidth = 1120; static const double _desktopCoverPaneWidth = ComponentSizes.bookCoverWidthDesktop; static const double _minimumDesktopFormPaneWidth = 420; - // Section cards already inset their contents by Spacing.md. + // Form sections already inset their contents by Spacing.md. static const double _desktopPaneGap = Spacing.xl - Spacing.md; static const double _desktopPaneBreakpoint = @@ -227,15 +227,18 @@ class _BookEditPageState extends State { } Widget _buildDesktopScaffold(BuildContext context, BookEditProvider provider) { - return Form( - key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildDesktopPageHeader(context, provider), - const Divider(height: 1), - Expanded(child: _buildDesktopLayout(context, provider)), - ], + return Material( + color: Theme.of(context).colorScheme.surface, + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildDesktopPageHeader(context, provider), + const Divider(height: 1), + Expanded(child: _buildDesktopLayout(context, provider)), + ], + ), ), ); } @@ -271,12 +274,9 @@ class _BookEditPageState extends State { return ListView( padding: const EdgeInsets.all(Spacing.md), children: [ - Card( - margin: const EdgeInsets.only(bottom: Spacing.xs), - child: Padding( - padding: const EdgeInsets.all(Spacing.md), - child: _buildCoverSection(context, provider, isDesktop: false), - ), + Padding( + padding: const EdgeInsets.fromLTRB(Spacing.md, Spacing.md, Spacing.md, Spacing.md + Spacing.xs), + child: _buildCoverSection(context, provider, isDesktop: false), ), ..._buildFormSections(context, provider), ], @@ -326,7 +326,7 @@ class _BookEditPageState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - _buildSectionCard( + _buildFormSection( title: 'Fetch metadata', padding: const EdgeInsets.fromLTRB(Spacing.md, 0, Spacing.md, Spacing.md), children: [_buildMetadataSection(context, provider)], @@ -342,20 +342,17 @@ class _BookEditPageState extends State { _buildPublicationSection(), _buildIdentifiersSection(), _buildSeriesSection(), - Card( - margin: EdgeInsets.zero, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.xs), - child: _buildPhysicalBookSection(context, provider), - ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.xs), + child: _buildPhysicalBookSection(context, provider), ), if (!skipMetadata) - _buildSectionCard(title: 'Fetch metadata', children: [_buildMetadataSection(context, provider)]), + _buildFormSection(title: 'Fetch metadata', children: [_buildMetadataSection(context, provider)]), ]; } Widget _buildBasicInfoSection(BuildContext context, BookEditProvider provider) { - return _buildSectionCard( + return _buildFormSection( title: 'Basic information', children: [ BookTextField(controller: _titleController, label: 'Title', required: true, onChanged: _provider.updateTitle), @@ -395,7 +392,7 @@ class _BookEditPageState extends State { } Widget _buildPublicationSection() { - return _buildSectionCard( + return _buildFormSection( title: 'Publication details', children: [ ResponsiveFormRow( @@ -431,7 +428,7 @@ class _BookEditPageState extends State { } Widget _buildIdentifiersSection() { - return _buildSectionCard( + return _buildFormSection( title: 'Identifiers', children: [ ResponsiveFormRow( @@ -446,7 +443,7 @@ class _BookEditPageState extends State { } Widget _buildSeriesSection() { - return _buildSectionCard( + return _buildFormSection( title: 'Series', children: [ ResponsiveFormRow( @@ -472,23 +469,20 @@ class _BookEditPageState extends State { ); } - Widget _buildSectionCard({ + Widget _buildFormSection({ required String title, required List children, EdgeInsetsGeometry padding = const EdgeInsets.all(Spacing.md), }) { - return Card( - margin: const EdgeInsets.only(bottom: Spacing.xs), - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(title, style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600)), - const SizedBox(height: Spacing.md), - ...children, - ], - ), + return Padding( + padding: padding.add(const EdgeInsets.only(bottom: Spacing.xs)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600)), + const SizedBox(height: Spacing.md), + ...children, + ], ), ); } @@ -497,28 +491,31 @@ class _BookEditPageState extends State { final rating = provider.editedBook?.rating ?? 0; final colorScheme = Theme.of(context).colorScheme; - return Row( + return Wrap( + spacing: Spacing.sm, + crossAxisAlignment: WrapCrossAlignment.center, children: [ Text('Rating', style: Theme.of(context).textTheme.bodySmall?.copyWith(color: colorScheme.onSurfaceVariant)), - const SizedBox(width: Spacing.sm), - ...List.generate(5, (index) { - final starValue = index + 1; - final isSelected = starValue <= rating; - - return GestureDetector( - onTap: () { - _provider.updateRating(starValue == rating ? null : starValue); - }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 2), - child: Icon( - isSelected ? Icons.star_rounded : Icons.star_outline_rounded, - color: isSelected ? colorScheme.primary : colorScheme.onSurfaceVariant, - size: 28, + Wrap( + children: List.generate(5, (index) { + final starValue = index + 1; + final isSelected = starValue <= rating; + + return Semantics( + selected: starValue == rating, + child: IconButton( + tooltip: starValue == rating ? 'Clear $starValue star rating' : 'Rate $starValue out of 5 stars', + onPressed: () => _provider.updateRating(starValue == rating ? null : starValue), + constraints: const BoxConstraints(minWidth: 48, minHeight: 48), + icon: Icon( + isSelected ? Icons.star_rounded : Icons.star_outline_rounded, + color: isSelected ? colorScheme.primary : colorScheme.onSurfaceVariant, + size: 28, + ), ), - ), - ); - }), + ); + }), + ), ], ); } @@ -532,6 +529,7 @@ class _BookEditPageState extends State { AppMotionControl( value: isPhysical, builder: (focusNode) => SwitchListTile( + hoverColor: Colors.transparent, focusNode: focusNode, title: const Text('Physical book'), value: isPhysical, @@ -590,7 +588,8 @@ class _BookEditPageState extends State { onSelectionChanged: (selection) { provider.setMetadataSource(selection.first); }, - style: const ButtonStyle(visualDensity: VisualDensity.compact, tapTargetSize: MaterialTapTargetSize.shrinkWrap), + direction: MediaQuery.textScalerOf(context).scale(14) > 20 ? Axis.vertical : Axis.horizontal, + style: const ButtonStyle(minimumSize: WidgetStatePropertyAll(Size(48, 48))), ); final searchField = TextFormField( @@ -601,6 +600,7 @@ class _BookEditPageState extends State { border: OutlineInputBorder(borderRadius: BorderRadius.circular(AppRadius.md)), prefixIcon: const Icon(Icons.search), suffixIcon: IconButton( + tooltip: 'Search book metadata', icon: provider.isFetching ? const SizedBox(width: 20, height: 20, child: AppCircularProgressIndicator(strokeWidth: 2)) : const Icon(Icons.arrow_forward), diff --git a/app/lib/pages/edit_profile_page.dart b/app/lib/pages/edit_profile_page.dart deleted file mode 100644 index 173f9da7..00000000 --- a/app/lib/pages/edit_profile_page.dart +++ /dev/null @@ -1,421 +0,0 @@ -import 'package:papyrus/widgets/shared/app_bottom_sheet.dart'; -import 'dart:typed_data'; - -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:papyrus/widgets/shared/app_page_bar.dart'; -import 'package:go_router/go_router.dart'; -import 'package:papyrus/providers/auth_provider.dart'; -import 'package:papyrus/themes/design_tokens.dart'; -import 'package:provider/provider.dart'; -import 'package:papyrus/themes/app_motion.dart'; -import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; - -/// Page for editing user profile information (display name and avatar). -/// -/// Reads current values from Papyrus auth and writes back on save. -/// Mobile: full-screen form with AppBar save action. -/// Desktop: top-centered card within the adaptive shell. -class EditProfilePage extends StatefulWidget { - const EditProfilePage({super.key}); - - @override - State createState() => _EditProfilePageState(); -} - -class _EditProfilePageState extends State { - final _formKey = GlobalKey(); - late final TextEditingController _nameController; - bool _isSaving = false; - String? _errorMessage; - - // Photo state — picked image bytes for preview, null means unchanged. - Uint8List? _pickedImageBytes; - bool _photoRemoved = false; - - @override - void initState() { - super.initState(); - final user = context.read().user; - final displayName = user?.displayName ?? ''; - _nameController = TextEditingController(text: displayName); - } - - @override - void dispose() { - _nameController.dispose(); - super.dispose(); - } - - bool get _hasChanges { - final user = context.read().user; - final currentName = user?.displayName ?? ''; - final nameChanged = _nameController.text.trim() != currentName; - return nameChanged || _pickedImageBytes != null || _photoRemoved; - } - - @override - Widget build(BuildContext context) { - final screenWidth = MediaQuery.of(context).size.width; - final isDesktop = screenWidth >= Breakpoints.desktopSmall; - - return Scaffold( - appBar: AppPageBar( - context: context, - title: const Text('Edit profile'), - leading: IconButton(icon: const Icon(Icons.close), onPressed: () => _handleBack(context)), - actions: [ - Padding( - padding: const EdgeInsets.only(right: Spacing.sm), - child: FilledButton( - onPressed: _isSaving ? null : () => _handleSave(context), - child: _isSaving - ? const SizedBox( - width: 20, - height: 20, - child: AppCircularProgressIndicator(strokeWidth: 2, color: Colors.white), - ) - : const Text('Save'), - ), - ), - ], - ), - body: SafeArea(child: isDesktop ? _buildDesktopBody(context) : _buildMobileBody(context)), - ); - } - - Widget _buildMobileBody(BuildContext context) { - return SingleChildScrollView(padding: const EdgeInsets.all(Spacing.md), child: _buildForm(context)); - } - - Widget _buildDesktopBody(BuildContext context) { - return Align( - alignment: Alignment.topCenter, - child: SingleChildScrollView( - padding: const EdgeInsets.all(Spacing.xl), - child: ConstrainedBox(constraints: const BoxConstraints(maxWidth: 480), child: _buildForm(context)), - ), - ); - } - - Widget _buildForm(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - - return Form( - key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Avatar - Center(child: _buildAvatarEditor(context)), - const SizedBox(height: Spacing.xl), - - // Error banner - if (_errorMessage != null) ...[_buildErrorBanner(context), const SizedBox(height: Spacing.md)], - - // Display name - Text('Display name', style: textTheme.bodyMedium?.copyWith(color: colorScheme.onSurfaceVariant)), - const SizedBox(height: Spacing.sm), - TextFormField( - controller: _nameController, - textCapitalization: TextCapitalization.words, - textInputAction: TextInputAction.done, - decoration: const InputDecoration(hintText: 'Enter your name'), - validator: (value) { - if (value == null || value.trim().isEmpty) { - return 'Name cannot be empty'; - } - - if (value.trim().length > 100) { - return 'Name is too long'; - } - - return null; - }, - autovalidateMode: AutovalidateMode.onUserInteraction, - onChanged: (_) => setState(() {}), - ), - const SizedBox(height: Spacing.lg), - - // Email (read-only) - Text('Email', style: textTheme.bodyMedium?.copyWith(color: colorScheme.onSurfaceVariant)), - const SizedBox(height: Spacing.sm), - TextFormField(initialValue: _getEmail(), enabled: false, decoration: const InputDecoration()), - ], - ), - ); - } - - Widget _buildErrorBanner(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - - return Container( - width: double.infinity, - padding: const EdgeInsets.all(Spacing.md), - decoration: BoxDecoration(color: colorScheme.errorContainer, borderRadius: BorderRadius.circular(AppRadius.md)), - child: Row( - children: [ - Icon(Icons.error_outline, color: colorScheme.onErrorContainer, size: IconSizes.medium), - const SizedBox(width: Spacing.sm), - Expanded( - child: Text(_errorMessage!, style: textTheme.bodyMedium?.copyWith(color: colorScheme.onErrorContainer)), - ), - ], - ), - ); - } - - Widget _buildAvatarEditor(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - const size = 120.0; - - return GestureDetector( - onTap: () => _showPhotoOptions(context), - child: Stack( - children: [ - Container( - width: size, - height: size, - decoration: BoxDecoration(shape: BoxShape.circle, color: colorScheme.primaryContainer), - clipBehavior: Clip.antiAlias, - child: _buildAvatarImage(context, size), - ), - Positioned( - bottom: 0, - right: 0, - child: Container( - width: 36, - height: 36, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: colorScheme.primary, - border: Border.all(color: colorScheme.surface, width: 2), - ), - child: Icon(Icons.camera_alt, size: IconSizes.small, color: colorScheme.onPrimary), - ), - ), - ], - ), - ); - } - - Widget _buildAvatarImage(BuildContext context, double size) { - final colorScheme = Theme.of(context).colorScheme; - - final initialsWidget = Center( - child: Text( - _initials, - style: Theme.of( - context, - ).textTheme.headlineMedium?.copyWith(color: colorScheme.onPrimaryContainer, fontSize: size * 0.35), - ), - ); - - // Show picked image if available. - if (_pickedImageBytes != null) { - return Image.memory( - _pickedImageBytes!, - fit: BoxFit.cover, - width: size, - height: size, - errorBuilder: (_, _, _) => initialsWidget, - ); - } - - // Show existing network photo if not removed. - if (!_photoRemoved) { - final photoUrl = context.read().user?.avatarUrl; - - if (photoUrl != null && photoUrl.isNotEmpty) { - return Image.network( - photoUrl, - fit: BoxFit.cover, - width: size, - height: size, - errorBuilder: (_, _, _) => initialsWidget, - ); - } - } - - return initialsWidget; - } - - bool get _hasExistingPhoto { - if (_photoRemoved) { - return false; - } - - if (_pickedImageBytes != null) { - return true; - } - - final photoUrl = context.read().user?.avatarUrl; - return photoUrl != null && photoUrl.isNotEmpty; - } - - void _showPhotoOptions(BuildContext context) { - showModalBottomSheet( - sheetAnimationStyle: AppMotion.animationStyle(context), - context: context, - isScrollControlled: true, - useSafeArea: true, - builder: (sheetContext) => AppBottomSheet( - header: Text( - 'Profile photo', - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), - body: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ListTile( - leading: const Icon(Icons.photo_library_outlined), - title: const Text('Choose from gallery'), - onTap: () { - Navigator.pop(sheetContext); - _pickImage(); - }, - ), - if (_hasExistingPhoto) - ListTile( - leading: Icon(Icons.delete_outline, color: Theme.of(context).colorScheme.error), - title: Text('Remove photo', style: TextStyle(color: Theme.of(context).colorScheme.error)), - onTap: () { - Navigator.pop(sheetContext); - - setState(() { - _pickedImageBytes = null; - _photoRemoved = true; - }); - }, - ), - ], - ), - ), - ); - } - - Future _pickImage() async { - try { - final result = await FilePicker.platform.pickFiles(type: FileType.image, withData: true); - - if (result != null && result.files.single.bytes != null) { - setState(() { - _pickedImageBytes = result.files.single.bytes; - _photoRemoved = false; - }); - } - } catch (error) { - if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - snackBarAnimationStyle: AppMotion.animationStyle(context), - const SnackBar(content: Text('Could not open image picker')), - ); - } - } - } - - Future _handleSave(BuildContext context) async { - if (!_formKey.currentState!.validate()) { - return; - } - - setState(() { - _isSaving = true; - _errorMessage = null; - }); - - try { - final authProvider = context.read(); - final user = authProvider.user; - - if (user == null) { - setState(() { - _errorMessage = 'Not signed in'; - _isSaving = false; - }); - - return; - } - - final newName = _nameController.text.trim(); - final currentName = user.displayName; - - if (newName != currentName) { - final success = await authProvider.updateProfile(displayName: newName); - - if (!success) { - setState(() { - _errorMessage = authProvider.error ?? 'Failed to update profile'; - _isSaving = false; - }); - - return; - } - } - - if (context.mounted) { - context.pop(); - } - } catch (error) { - setState(() { - _errorMessage = 'Failed to update profile'; - _isSaving = false; - }); - } - } - - void _handleBack(BuildContext context) { - if (_hasChanges) { - showDialog( - animationStyle: AppMotion.animationStyle(context), - context: context, - builder: (dialogContext) => AlertDialog( - title: const Text('Discard changes?'), - content: const Text('You have unsaved changes. Are you sure you want to discard them?'), - actions: [ - TextButton(onPressed: () => Navigator.pop(dialogContext), child: const Text('Keep editing')), - FilledButton( - onPressed: () { - Navigator.pop(dialogContext); - context.pop(); - }, - child: const Text('Discard'), - ), - ], - ), - ); - } else { - context.pop(); - } - } - - String _getEmail() { - final email = context.read().user?.email; - - if (email == null || email.trim().isEmpty) { - return 'No email provided'; - } - - return email; - } - - String get _initials { - final name = _nameController.text.trim(); - - if (name.isEmpty) { - return '?'; - } - - final parts = name.split(' '); - - if (parts.length >= 2) { - return '${parts[0][0]}${parts[1][0]}'.toUpperCase(); - } - - return name[0].toUpperCase(); - } -} diff --git a/app/lib/pages/forgot_password_page.dart b/app/lib/pages/forgot_password_page.dart index cee4d889..8cae0dd5 100644 --- a/app/lib/pages/forgot_password_page.dart +++ b/app/lib/pages/forgot_password_page.dart @@ -171,7 +171,7 @@ class _ForgotPasswordPageState extends State { snackBarAnimationStyle: AppMotion.animationStyle(context), SnackBar( duration: const Duration(seconds: 5), - content: Text(message), + content: Text(message, style: TextStyle(color: Theme.of(context).colorScheme.onError)), backgroundColor: Theme.of(context).colorScheme.error, ), ); @@ -276,22 +276,24 @@ class _ForgotPasswordForm extends StatelessWidget { @override Widget build(BuildContext context) { - return Form( - key: formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - EmailInput( - labelText: 'Email address', - controller: emailController, - focusNode: emailFocusNode, - textInputAction: TextInputAction.done, - onEditingComplete: onSubmit, - ), - const SizedBox(height: Spacing.lg), - AuthContinueButton(isLoading: isLoading, onPressed: onSubmit, isDesktop: isDesktop), - ], + return AutofillGroup( + child: Form( + key: formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + EmailInput( + labelText: 'Email address', + controller: emailController, + focusNode: emailFocusNode, + textInputAction: TextInputAction.done, + onEditingComplete: onSubmit, + ), + const SizedBox(height: Spacing.lg), + AuthContinueButton(isLoading: isLoading, onPressed: onSubmit, isDesktop: isDesktop), + ], + ), ), ); } @@ -362,33 +364,37 @@ class _SetNewPasswordForm extends StatelessWidget { @override Widget build(BuildContext context) { - return Form( - key: formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - PasswordInput( - labelText: 'New password', - controller: passwordController, - focusNode: passwordFocusNode, - textInputAction: TextInputAction.next, - extraValidator: validatePasswordStrength, - onEditingComplete: () => confirmPasswordFocusNode.requestFocus(), - ), - const SizedBox(height: Spacing.md), - PasswordInput( - labelText: 'Confirm new password', - controller: confirmPasswordController, - focusNode: confirmPasswordFocusNode, - textInputAction: TextInputAction.done, - extraValidator: validateConfirmPassword, - validationDependency: passwordController, - onFieldSubmitted: (_) => onSubmit(), - ), - const SizedBox(height: Spacing.lg), - AuthContinueButton(isLoading: isLoading, onPressed: onSubmit, isDesktop: isDesktop), - ], + return AutofillGroup( + child: Form( + key: formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + PasswordInput( + autofillHints: const [AutofillHints.newPassword], + labelText: 'New password', + controller: passwordController, + focusNode: passwordFocusNode, + textInputAction: TextInputAction.next, + extraValidator: validatePasswordStrength, + onEditingComplete: () => confirmPasswordFocusNode.requestFocus(), + ), + const SizedBox(height: Spacing.md), + PasswordInput( + autofillHints: const [AutofillHints.newPassword], + labelText: 'Confirm new password', + controller: confirmPasswordController, + focusNode: confirmPasswordFocusNode, + textInputAction: TextInputAction.done, + extraValidator: validateConfirmPassword, + validationDependency: passwordController, + onFieldSubmitted: (_) => onSubmit(), + ), + const SizedBox(height: Spacing.lg), + AuthContinueButton(isLoading: isLoading, onPressed: onSubmit, isDesktop: isDesktop), + ], + ), ), ); } diff --git a/app/lib/pages/login_page.dart b/app/lib/pages/login_page.dart index 5afbb43f..3fb133aa 100644 --- a/app/lib/pages/login_page.dart +++ b/app/lib/pages/login_page.dart @@ -97,7 +97,7 @@ class _LoginPageState extends State { snackBarAnimationStyle: AppMotion.animationStyle(context), SnackBar( duration: const Duration(seconds: 5), - content: Text(message), + content: Text(message, style: TextStyle(color: Theme.of(context).colorScheme.onError)), backgroundColor: Theme.of(context).colorScheme.error, ), ); @@ -188,41 +188,43 @@ class _LoginForm extends StatelessWidget { @override Widget build(BuildContext context) { - return Form( - key: formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - EmailInput( - labelText: 'Email address', - controller: emailController, - focusNode: emailFocusNode, - textInputAction: TextInputAction.next, - onEditingComplete: () => passwordFocusNode.requestFocus(), - ), - const SizedBox(height: Spacing.md), - PasswordInput( - labelText: 'Password', - controller: passwordController, - focusNode: passwordFocusNode, - textInputAction: TextInputAction.done, - onFieldSubmitted: (_) => onLogin(), - ), - const SizedBox(height: Spacing.sm), - Align( - alignment: Alignment.centerRight, - child: TextButton( - onPressed: () { - context.push('/forgot-password'); - }, - style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.primary), - child: const Text('Forgot password?', style: TextStyle(fontWeight: FontWeight.w500)), + return AutofillGroup( + child: Form( + key: formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + EmailInput( + labelText: 'Email address', + controller: emailController, + focusNode: emailFocusNode, + textInputAction: TextInputAction.next, + onEditingComplete: () => passwordFocusNode.requestFocus(), ), - ), - const SizedBox(height: Spacing.sm), - AuthContinueButton(isLoading: isLoading, onPressed: onLogin, isDesktop: isDesktop), - ], + const SizedBox(height: Spacing.md), + PasswordInput( + labelText: 'Password', + controller: passwordController, + focusNode: passwordFocusNode, + textInputAction: TextInputAction.done, + onFieldSubmitted: (_) => onLogin(), + ), + const SizedBox(height: Spacing.sm), + Align( + alignment: Alignment.centerRight, + child: TextButton( + onPressed: () { + context.push('/forgot-password'); + }, + style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.primary), + child: const Text('Forgot password?', style: TextStyle(fontWeight: FontWeight.w500)), + ), + ), + const SizedBox(height: Spacing.sm), + AuthContinueButton(isLoading: isLoading, onPressed: onLogin, isDesktop: isDesktop), + ], + ), ), ); } diff --git a/app/lib/pages/profile_page.dart b/app/lib/pages/profile_page.dart index 00a7c905..793561cd 100644 --- a/app/lib/pages/profile_page.dart +++ b/app/lib/pages/profile_page.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:papyrus/widgets/shared/app_page_bar.dart'; import 'package:go_router/go_router.dart'; @@ -11,27 +10,18 @@ import 'package:papyrus/widgets/profile/about_settings_section.dart'; import 'package:papyrus/widgets/profile/accessibility_settings_section.dart'; import 'package:papyrus/widgets/profile/account_settings_section.dart'; import 'package:papyrus/widgets/profile/appearance_settings_section.dart'; -import 'package:papyrus/widgets/profile/developer_settings_section.dart'; -import 'package:papyrus/widgets/profile/library_settings_section.dart'; import 'package:papyrus/widgets/profile/notifications_settings_section.dart'; import 'package:papyrus/widgets/profile/privacy_settings_section.dart'; -import 'package:papyrus/widgets/profile/profile_header.dart'; import 'package:papyrus/widgets/profile/profile_menu_item.dart'; -import 'package:papyrus/widgets/profile/reading_settings_section.dart'; import 'package:papyrus/widgets/profile/storage_sync_settings_section.dart'; import 'package:provider/provider.dart'; enum _ProfileSection { account, appearance, - reading, - library, - notifications, storageSync, - privacyData, accessibility, about, - developerOptions, } /// User profile page with account settings, preferences, and app configuration. @@ -62,23 +52,18 @@ class _ProfilePageState extends State { Widget _buildMobileLayout(BuildContext context) { return Scaffold( - appBar: AppPageBar(context: context, title: const Text('Profile')), + appBar: AppPageBar(context: context, title: const Text('Settings')), body: SafeArea( child: ListView( padding: const EdgeInsets.all(Spacing.md), children: [ - _buildMobileHeader(context), - const SizedBox(height: Spacing.md), const AccountSettingsSection(isDesktop: false), const AppearanceSettingsSection(isDesktop: false), - const ReadingSettingsSection(isDesktop: false), - const LibrarySettingsSection(isDesktop: false), const NotificationsSettingsSection(isDesktop: false), const StorageSyncSettingsSection(isDesktop: false), StorageSyncSettingsSection.buildMobileAcquisitionSection(context), const PrivacySettingsSection(isDesktop: false), const AccessibilitySettingsSection(isDesktop: false), - if (kDebugMode) const DeveloperSettingsSection(isDesktop: false), const AboutSettingsSection(isDesktop: false), const Divider(height: 1), ProfileMenuItem( @@ -95,29 +80,15 @@ class _ProfilePageState extends State { ); } - Widget _buildMobileHeader(BuildContext context) { - final user = context.watch().user; - final displayName = user?.displayName ?? 'Anonymous User'; - final userEmail = user?.email; - final email = (userEmail != null && userEmail.trim().isNotEmpty) ? userEmail : 'No email provided'; - - return ProfileHeader( - displayName: displayName, - email: email, - avatarUrl: user?.avatarUrl, - onEditProfile: () => context.go('/profile/edit'), - isDesktopLayout: false, - ); - } - Widget _buildDesktopLayout(BuildContext context) { return Scaffold( body: SafeArea( child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - _buildDesktopNav(context), + FocusTraversalGroup(child: _buildDesktopNav(context)), const VerticalDivider(width: 1), - Expanded(child: _buildDesktopContent(context)), + Expanded(child: FocusTraversalGroup(child: _buildDesktopContent(context))), ], ), ), @@ -149,23 +120,11 @@ class _ProfilePageState extends State { label: 'Appearance', section: _ProfileSection.appearance, ), - _buildNavItem( - context, - icon: Icons.auto_stories_outlined, - label: 'Reading', - section: _ProfileSection.reading, - ), - _buildNavItem( - context, - icon: Icons.library_books_outlined, - label: 'Library', - section: _ProfileSection.library, - ), _buildNavItem( context, icon: Icons.notifications_outlined, label: 'Notifications', - section: _ProfileSection.notifications, + enabled: false, ), _buildNavItem( context, @@ -177,7 +136,7 @@ class _ProfilePageState extends State { context, icon: Icons.shield_outlined, label: 'Privacy', - section: _ProfileSection.privacyData, + enabled: false, ), _buildNavItem( context, @@ -185,13 +144,6 @@ class _ProfilePageState extends State { label: 'Accessibility', section: _ProfileSection.accessibility, ), - if (kDebugMode) - _buildNavItem( - context, - icon: Icons.code, - label: 'Developer options', - section: _ProfileSection.developerOptions, - ), _buildNavItem(context, icon: Icons.info_outline, label: 'About', section: _ProfileSection.about), const SizedBox(height: Spacing.sm), Divider(height: 1, color: colorScheme.outlineVariant), @@ -218,6 +170,7 @@ class _ProfilePageState extends State { required IconData icon, required String label, _ProfileSection? section, + bool enabled = true, bool isDestructive = false, VoidCallback? onTap, }) { @@ -241,34 +194,33 @@ class _ProfilePageState extends State { return Padding( padding: const EdgeInsets.symmetric(vertical: 2), - child: Material( - color: bgColor, - borderRadius: BorderRadius.circular(AppRadius.md), - child: InkWell( - onTap: - onTap ?? - () { - if (section != null) { - setState(() => _selectedSection = section); - } - }, + child: Semantics( + enabled: enabled, + button: true, + child: Material( + color: bgColor, borderRadius: BorderRadius.circular(AppRadius.md), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm + 2), - child: Row( - children: [ - Icon(icon, color: iconColor, size: IconSizes.medium), - const SizedBox(width: Spacing.md), - Expanded( - child: Text( - label, - style: textTheme.bodyMedium?.copyWith( - color: textColor, - fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, + child: InkWell( + canRequestFocus: enabled, + onTap: enabled ? onTap ?? () => setState(() => _selectedSection = section!) : null, + borderRadius: BorderRadius.circular(AppRadius.md), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm + 2), + child: Row( + children: [ + Icon(icon, color: enabled ? iconColor : Theme.of(context).disabledColor, size: IconSizes.medium), + const SizedBox(width: Spacing.md), + Expanded( + child: Text( + label, + style: textTheme.bodyMedium?.copyWith( + color: enabled ? textColor : Theme.of(context).disabledColor, + fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, + ), ), ), - ), - ], + ], + ), ), ), ), @@ -279,10 +231,10 @@ class _ProfilePageState extends State { Widget _buildDesktopContent(BuildContext context) { final textTheme = Theme.of(context).textTheme; - return Align( - alignment: Alignment.topLeft, - child: SingleChildScrollView( - padding: const EdgeInsets.all(Spacing.xl), + return SingleChildScrollView( + padding: const EdgeInsets.all(Spacing.xl), + child: Align( + alignment: Alignment.topLeft, child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 600), child: Column( @@ -304,20 +256,10 @@ class _ProfilePageState extends State { return 'Account'; case _ProfileSection.appearance: return 'Appearance'; - case _ProfileSection.reading: - return 'Reading'; - case _ProfileSection.library: - return 'Library'; - case _ProfileSection.notifications: - return 'Notifications'; case _ProfileSection.storageSync: return 'Storage'; - case _ProfileSection.privacyData: - return 'Privacy & data'; case _ProfileSection.accessibility: return 'Accessibility'; - case _ProfileSection.developerOptions: - return 'Developer options'; case _ProfileSection.about: return 'About'; } @@ -329,22 +271,12 @@ class _ProfilePageState extends State { return const AccountSettingsSection(isDesktop: true); case _ProfileSection.appearance: return const AppearanceSettingsSection(isDesktop: true); - case _ProfileSection.reading: - return const ReadingSettingsSection(isDesktop: true); - case _ProfileSection.library: - return const LibrarySettingsSection(isDesktop: true); - case _ProfileSection.notifications: - return const NotificationsSettingsSection(isDesktop: true); case _ProfileSection.storageSync: return const StorageSyncSettingsSection(isDesktop: true); - case _ProfileSection.privacyData: - return const PrivacySettingsSection(isDesktop: true); case _ProfileSection.accessibility: return const AccessibilitySettingsSection(isDesktop: true); case _ProfileSection.about: return const AboutSettingsSection(isDesktop: true); - case _ProfileSection.developerOptions: - return const DeveloperSettingsSection(isDesktop: true); } } diff --git a/app/lib/pages/reader_page.dart b/app/lib/pages/reader_page.dart index b5521923..058ad24b 100644 --- a/app/lib/pages/reader_page.dart +++ b/app/lib/pages/reader_page.dart @@ -1,6 +1,7 @@ import 'package:papyrus/services/reading_device_identity.dart'; import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:papyrus/themes/app_accessibility.dart'; import 'package:papyrus/widgets/shared/app_page_bar.dart'; import 'package:papyrus/reader/reading_activity_tracker.dart'; import 'package:papyrus/providers/enums/library_reading_status.dart'; @@ -233,20 +234,22 @@ class _ReaderPageState extends State { ); } - return PapyrusReader( - document: document, - initialLocator: _initialLocator, - initialPreferences: preferences, - builders: ReaderUiBuilders( - loading: (context, state) => const _ReaderLoading(), - compactPanelRoute: (_, panel) => buildReaderPanelSheet(context, panel), + return ReaderSystemTextScope( + child: PapyrusReader( + document: document, + initialLocator: _initialLocator, + initialPreferences: preferences, + builders: ReaderUiBuilders( + loading: (context, state) => const _ReaderLoading(), + compactPanelRoute: (_, panel) => buildReaderPanelSheet(context, panel), + ), + onLocatorChanged: _session!.updateLocator, + onActivity: _onActivity, + onPreferencesChanged: (updated) { + ReaderBookAdapter.persistPreferences(context.read(), updated); + }, + onBack: _close, ), - onLocatorChanged: _session!.updateLocator, - onActivity: _onActivity, - onPreferencesChanged: (updated) { - ReaderBookAdapter.persistPreferences(context.read(), updated); - }, - onBack: _close, ); } diff --git a/app/lib/pages/register_page.dart b/app/lib/pages/register_page.dart index 565339a9..6024cd14 100644 --- a/app/lib/pages/register_page.dart +++ b/app/lib/pages/register_page.dart @@ -97,7 +97,7 @@ class _RegisterPageState extends State { snackBarAnimationStyle: AppMotion.animationStyle(context), SnackBar( duration: const Duration(seconds: 5), - content: Text(message), + content: Text(message, style: TextStyle(color: Theme.of(context).colorScheme.onError)), backgroundColor: Theme.of(context).colorScheme.error, ), ); @@ -228,49 +228,53 @@ class _RegisterForm extends StatelessWidget { @override Widget build(BuildContext context) { - return Form( - key: formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - NameInput( - labelText: 'Display name', - controller: displayNameController, - focusNode: displayNameFocusNode, - textInputAction: TextInputAction.next, - onEditingComplete: () => emailFocusNode.requestFocus(), - ), - const SizedBox(height: Spacing.md), - EmailInput( - labelText: 'Email address', - controller: emailController, - focusNode: emailFocusNode, - textInputAction: TextInputAction.next, - onEditingComplete: () => passwordFocusNode.requestFocus(), - ), - const SizedBox(height: Spacing.md), - PasswordInput( - labelText: 'Password', - controller: passwordController, - focusNode: passwordFocusNode, - textInputAction: TextInputAction.next, - onEditingComplete: () => confirmPasswordFocusNode.requestFocus(), - extraValidator: validatePasswordStrength, - ), - const SizedBox(height: Spacing.md), - PasswordInput( - labelText: 'Confirm password', - controller: confirmPasswordController, - focusNode: confirmPasswordFocusNode, - textInputAction: TextInputAction.done, - onFieldSubmitted: (_) => onRegister(), - extraValidator: validateConfirmPassword, - validationDependency: passwordController, - ), - const SizedBox(height: Spacing.lg), - AuthContinueButton(isLoading: isLoading, onPressed: onRegister, isDesktop: isDesktop), - ], + return AutofillGroup( + child: Form( + key: formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + NameInput( + labelText: 'Display name', + controller: displayNameController, + focusNode: displayNameFocusNode, + textInputAction: TextInputAction.next, + onEditingComplete: () => emailFocusNode.requestFocus(), + ), + const SizedBox(height: Spacing.md), + EmailInput( + labelText: 'Email address', + controller: emailController, + focusNode: emailFocusNode, + textInputAction: TextInputAction.next, + onEditingComplete: () => passwordFocusNode.requestFocus(), + ), + const SizedBox(height: Spacing.md), + PasswordInput( + autofillHints: const [AutofillHints.newPassword], + labelText: 'Password', + controller: passwordController, + focusNode: passwordFocusNode, + textInputAction: TextInputAction.next, + onEditingComplete: () => confirmPasswordFocusNode.requestFocus(), + extraValidator: validatePasswordStrength, + ), + const SizedBox(height: Spacing.md), + PasswordInput( + autofillHints: const [AutofillHints.newPassword], + labelText: 'Confirm password', + controller: confirmPasswordController, + focusNode: confirmPasswordFocusNode, + textInputAction: TextInputAction.done, + onFieldSubmitted: (_) => onRegister(), + extraValidator: validateConfirmPassword, + validationDependency: passwordController, + ), + const SizedBox(height: Spacing.lg), + AuthContinueButton(isLoading: isLoading, onPressed: onRegister, isDesktop: isDesktop), + ], + ), ), ); } diff --git a/app/lib/powersync/powersync_service.dart b/app/lib/powersync/powersync_service.dart index 8fc1c6c3..c2057663 100644 --- a/app/lib/powersync/powersync_service.dart +++ b/app/lib/powersync/powersync_service.dart @@ -207,6 +207,42 @@ class PapyrusPowerSyncService implements BookRepository, LibraryRepository, Trac _setBookMetadataSyncState(const BookMetadataSyncState()); } + /// Retains book records until their files are removed so failures can be retried. + Future deleteGuestLibrary({required Future Function(List) deleteFiles}) { + final previousOperation = _modeOperation; + + final operation = (() async { + await previousOperation; + + if (_mode != LibraryDatabaseMode.guest) { + throw StateError('Only the active guest library can be deleted.'); + } + + final database = _requireDatabase(); + final snapshot = await _activeLibrary.snapshot(); + await deleteFiles(snapshot.books); + + await database.writeTransaction((tx) async { + for (final table in libraryTableNames.reversed) { + await tx.execute('DELETE FROM $table'); + } + }); + + _databaseSnapshot = const LibrarySnapshot(); + _publishLibrarySnapshot(_databaseSnapshot!, database); + _setSyncState(const SyncState()); + _setBookMetadataSyncState(const BookMetadataSyncState()); + })(); + + _modeOperation = operation; + + return operation.whenComplete(() { + if (identical(_modeOperation, operation)) { + _modeOperation = null; + } + }); + } + Future clearAuthenticatedCache() async { await _modeOperation; diff --git a/app/lib/providers/auth_provider.dart b/app/lib/providers/auth_provider.dart index 7d0d3103..124d4897 100644 --- a/app/lib/providers/auth_provider.dart +++ b/app/lib/providers/auth_provider.dart @@ -4,11 +4,14 @@ import 'package:flutter/foundation.dart'; import 'package:papyrus/auth/auth_api_client.dart'; import 'package:papyrus/auth/auth_models.dart'; import 'package:papyrus/auth/auth_repository.dart'; +import 'package:papyrus/services/guest_profile_store.dart'; import 'package:shared_preferences/shared_preferences.dart'; class AuthProvider extends ChangeNotifier { AuthRepository _repository; final SharedPreferences _prefs; + final GuestProfileStore _guestProfile; + Future? _guestProfileWrite; static const _keyOfflineMode = 'offline_mode'; @@ -21,10 +24,20 @@ class AuthProvider extends ChangeNotifier { bool _isOfflineMode = false; bool get isOfflineMode => _isOfflineMode; + bool _isDeletingGuestAccount = false; + bool get isDeletingGuestAccount => _isDeletingGuestAccount; + bool get isBootstrapping => _status == AuthStatus.bootstrapping; bool get isSignedIn => _user != null && _status == AuthStatus.signedIn; + bool get canEditProfile => !_isDeletingGuestAccount && (isSignedIn || (_isOfflineMode && _user == null)); + + String get profileDisplayName => + _isOfflineMode ? _guestProfile.displayName : _user?.displayName ?? GuestProfileStore.defaultDisplayName; + + Uint8List? get profilePhotoBytes => _isOfflineMode ? _guestProfile.photoBytes : null; + bool get isLoading { return _status == AuthStatus.bootstrapping || _status == AuthStatus.authenticating || @@ -42,8 +55,13 @@ class AuthProvider extends ChangeNotifier { String? _error; String? get error => _error; - AuthProvider(this._prefs, {required AuthRepository repository, bool bootstrapOnCreate = true}) - : _repository = repository { + AuthProvider( + this._prefs, { + required AuthRepository repository, + bool bootstrapOnCreate = true, + GuestProfileStore? guestProfileStore, + }) : _repository = repository, + _guestProfile = guestProfileStore ?? GuestProfileStore(_prefs) { _isOfflineMode = _prefs.getBool(_keyOfflineMode) ?? false; if (bootstrapOnCreate) { @@ -66,6 +84,12 @@ class AuthProvider extends ChangeNotifier { } Future bootstrap() async { + if (_isOfflineMode) { + _user = null; + _setStatus(AuthStatus.signedOut); + return; + } + _setStatus(AuthStatus.bootstrapping); try { @@ -161,19 +185,76 @@ class AuthProvider extends ChangeNotifier { _setStatus(AuthStatus.signedOut); } - Future updateProfile({required String displayName, String? avatarUrl}) async { + Future updateProfile({required String displayName, String? avatarUrl, Uint8List? photoBytes}) async { + if (_isOfflineMode && _user == null) { + if (!canEditProfile || _guestProfileWrite != null) { + return false; + } + + final operation = _saveGuestProfile(displayName, photoBytes); + _guestProfileWrite = operation; + + try { + return await operation; + } finally { + _guestProfileWrite = null; + } + } + + final repository = _repository; + final userId = _user?.userId; + + if (!isSignedIn) { + return false; + } + try { - _user = await _repository.updateCurrentUser(displayName: displayName, avatarUrl: avatarUrl); + final updatedUser = photoBytes == null + ? await repository.updateCurrentUser(displayName: displayName, avatarUrl: avatarUrl) + : await repository.uploadProfilePhoto(photoBytes, displayName: displayName); + + if (!identical(_repository, repository) || _user?.userId != userId || !isSignedIn) { + return false; + } + + _user = updatedUser; _error = null; notifyListeners(); return true; } catch (error) { + if (!identical(_repository, repository) || _user?.userId != userId || !isSignedIn) { + return false; + } + _error = _messageFor(error); notifyListeners(); return false; } } + Future downloadProfilePhoto(String avatarUrl) => _repository.downloadProfilePhoto(avatarUrl); + + Future _saveGuestProfile(String displayName, Uint8List? photoBytes) async { + try { + await _guestProfile.save(displayName: displayName, photoBytes: photoBytes); + + if (!_isOfflineMode || _user != null) { + return false; + } + + _error = null; + notifyListeners(); + return true; + } catch (_) { + if (_isOfflineMode && _user == null) { + _error = 'Could not save your profile on this device. Please try again.'; + notifyListeners(); + } + + return false; + } + } + Future deleteAccount() async { final repository = _repository; final userId = _user?.userId; @@ -193,6 +274,43 @@ class AuthProvider extends ChangeNotifier { return identical(_repository, repository) ? deadline : null; } + Future deleteGuestAccount(Future Function() clearLocalData) async { + if (!_isOfflineMode || _user != null || _isDeletingGuestAccount) { + throw StateError('Only the active anonymous account can be deleted.'); + } + + _isDeletingGuestAccount = true; + final repository = _repository; + notifyListeners(); + + try { + await _guestProfileWrite; + await clearLocalData(); + + if (!identical(_repository, repository) || _user != null || !_isOfflineMode) { + throw StateError('The active account changed during deletion.'); + } + + await _guestProfile.clear(); + + if (!identical(_repository, repository) || _user != null || !_isOfflineMode) { + throw StateError('The active account changed during deletion.'); + } + + if (!await _prefs.setBool(_keyOfflineMode, false)) { + throw StateError('Could not leave anonymous mode.'); + } + + _isOfflineMode = false; + _error = null; + _pendingRecovery = null; + _setStatus(AuthStatus.signedOut); + } finally { + _isDeletingGuestAccount = false; + notifyListeners(); + } + } + Future recoverAccount(AccountDeletionAuthorization authorization) async { final repository = _repository; diff --git a/app/lib/providers/preferences_provider.dart b/app/lib/providers/preferences_provider.dart index c0963645..2fad0e64 100644 --- a/app/lib/providers/preferences_provider.dart +++ b/app/lib/providers/preferences_provider.dart @@ -54,6 +54,11 @@ class PreferencesProvider extends ChangeNotifier { // Accessibility static const _keyReduceAnimations = 'reduce_animations'; static const _keyDyslexiaFont = 'dyslexia_font'; + static const _keyInterfaceTextEnlargement = 'interface_text_enlargement'; + static const _keyIncreaseContrast = 'increase_contrast'; + static const _keyBoldInterfaceText = 'bold_interface_text'; + + static const interfaceTextEnlargements = [1.0, 1.15, 1.3, 1.5, 2.0]; // -- Theme ---------------------------------------------------------------- @@ -279,6 +284,30 @@ class PreferencesProvider extends ChangeNotifier { // -- Accessibility -------------------------------------------------------- + double get interfaceTextEnlargement { + final value = _prefs.get(_keyInterfaceTextEnlargement); + return value is double && interfaceTextEnlargements.contains(value) ? value : 1.0; + } + + set interfaceTextEnlargement(double value) { + _prefs.setDouble(_keyInterfaceTextEnlargement, interfaceTextEnlargements.contains(value) ? value : 1.0); + notifyListeners(); + } + + bool get increaseContrast => _prefs.getBool(_keyIncreaseContrast) ?? false; + + set increaseContrast(bool value) { + _prefs.setBool(_keyIncreaseContrast, value); + notifyListeners(); + } + + bool get boldInterfaceText => _prefs.getBool(_keyBoldInterfaceText) ?? false; + + set boldInterfaceText(bool value) { + _prefs.setBool(_keyBoldInterfaceText, value); + notifyListeners(); + } + bool get reduceAnimations => _prefs.getBool(_keyReduceAnimations) ?? false; set reduceAnimations(bool value) { diff --git a/app/lib/reader/reader_panel_sheet.dart b/app/lib/reader/reader_panel_sheet.dart index 7a0fd734..438a9dff 100644 --- a/app/lib/reader/reader_panel_sheet.dart +++ b/app/lib/reader/reader_panel_sheet.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:papyrus/themes/app_accessibility.dart'; import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/widgets/shared/app_bottom_sheet.dart'; @@ -23,10 +24,12 @@ Route buildReaderPanelSheet(BuildContext context, ReaderPanelRouteContext theme.bottomSheetTheme.shape ?? const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(AppRadius.xl))), clipBehavior: Clip.antiAlias, - builder: (context) => AppBottomSheet( - title: panel.title, - contentPadding: EdgeInsets.zero, - scrollBodyBuilder: panel.buildContent, + builder: (context) => ReaderSystemTextScope( + child: AppBottomSheet( + title: panel.title, + contentPadding: EdgeInsets.zero, + scrollBodyBuilder: panel.buildContent, + ), ), ); } diff --git a/app/lib/services/book_import_session.dart b/app/lib/services/book_import_session.dart index 9bfbdf39..75c9c527 100644 --- a/app/lib/services/book_import_session.dart +++ b/app/lib/services/book_import_session.dart @@ -50,12 +50,14 @@ class BookImportSession { throw StateError('Cannot import account media without an active media storage scope'); } - if ((authProvider.isSignedIn && (!authenticated || scope?.userId != userId)) || + if (authProvider.isDeletingGuestAccount || + (authProvider.isSignedIn && (!authenticated || scope?.userId != userId)) || (authProvider.isOfflineMode && powerSyncService.mode != LibraryDatabaseMode.guest)) { throw StateError('Wait for the selected library to finish loading before importing.'); } bool isCurrent() => + !authProvider.isDeletingGuestAccount && dataStore.isBookRepositoryCurrent(repository) && authProvider.user?.userId == userId && (authProvider.isSignedIn && powerSyncService.mode == LibraryDatabaseMode.authenticated) == authenticated && diff --git a/app/lib/services/guest_account_deletion_service.dart b/app/lib/services/guest_account_deletion_service.dart new file mode 100644 index 00000000..74aa0d70 --- /dev/null +++ b/app/lib/services/guest_account_deletion_service.dart @@ -0,0 +1,38 @@ +import 'package:papyrus/media/media_storage_scope.dart'; +import 'package:papyrus/opds/opds_catalogs.dart'; +import 'package:papyrus/opds/opds_downloads.dart'; +import 'package:papyrus/powersync/powersync_service.dart'; +import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/services/book_import_service_stub.dart' + if (dart.library.js_interop) 'package:papyrus/services/book_import_service.dart'; + +class GuestAccountDeletionService { + const GuestAccountDeletionService({ + required this.auth, + required this.library, + required this.files, + required this.catalogs, + required this.downloads, + }); + + final AuthProvider auth; + final PapyrusPowerSyncService library; + final BookImportService files; + final OpdsCatalogs catalogs; + final OpdsDownloads downloads; + + Future delete() => auth.deleteGuestAccount(() async { + await downloads.cancelAndWait(); + + await library.deleteGuestLibrary( + deleteFiles: (books) async { + for (final book in books) { + await files.deleteBookFile(book.id); + } + + await files.clearCoverFiles(MediaStorageScope.localGuest); + await catalogs.clearScope(MediaStorageScope.localGuest.persistenceKey); + }, + ); + }); +} diff --git a/app/lib/services/guest_profile_store.dart b/app/lib/services/guest_profile_store.dart new file mode 100644 index 00000000..1b469781 --- /dev/null +++ b/app/lib/services/guest_profile_store.dart @@ -0,0 +1,66 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:shared_preferences/shared_preferences.dart'; + +/// Keeps the local account separate from every signed-in account and server. +class GuestProfileStore { + static const preferenceKey = 'guest_profile'; + static const defaultDisplayName = 'Anonymous User'; + + final SharedPreferences _prefs; + String _displayName = defaultDisplayName; + Uint8List? _photoBytes; + + String get displayName => _displayName; + Uint8List? get photoBytes => _photoBytes; + + GuestProfileStore(this._prefs) { + final saved = _prefs.get(preferenceKey); + + if (saved is! String) { + return; + } + + try { + final profile = jsonDecode(saved) as Map; + final name = profile['display_name'] as String; + final photo = profile['photo'] as String?; + + if (name.trim().isEmpty || name.length > 100) { + return; + } + + _photoBytes = photo == null ? null : base64Decode(photo); + _displayName = name; + } catch (_) { + _displayName = defaultDisplayName; + _photoBytes = null; + } + } + + Future save({required String displayName, Uint8List? photoBytes}) async { + // Flutter's web image decoder requires a native typed buffer, not an unmodifiable view. + final photo = photoBytes == null ? _photoBytes : Uint8List.fromList(photoBytes); + final record = jsonEncode({ + 'display_name': displayName, + 'photo': photo == null ? null : base64Encode(photo), + }); + + if (!await _prefs.setString(preferenceKey, record)) { + throw StateError('Could not save the local profile.'); + } + + _displayName = displayName; + _photoBytes = photo; + } + + Future clear() async { + if (!await _prefs.remove(preferenceKey)) { + throw StateError('Could not clear the local profile.'); + } + + _displayName = defaultDisplayName; + _photoBytes = null; + } +} diff --git a/app/lib/services/profile_photo.dart b/app/lib/services/profile_photo.dart new file mode 100644 index 00000000..1284503f --- /dev/null +++ b/app/lib/services/profile_photo.dart @@ -0,0 +1,59 @@ +import 'dart:typed_data'; + +import 'package:image/image.dart' as image; + +const maxProfilePhotoBytes = 5 * 1024 * 1024; + +/// Bounds decoding and strips source metadata before uploading a small JPEG. +Uint8List prepareProfilePhoto(Uint8List bytes) { + if (bytes.length > maxProfilePhotoBytes) { + throw const FormatException('Choose a photo smaller than 5 MB.'); + } + + try { + return _preparePhoto(bytes); + } on FormatException { + rethrow; + } catch (_) { + throw const FormatException('This photo could not be opened. Choose another image.'); + } +} + +Uint8List _preparePhoto(Uint8List bytes) { + image.Decoder? decoder; + + if (bytes.length >= 8) { + if (bytes[0] == 0xff && bytes[1] == 0xd8 && bytes[2] == 0xff) { + decoder = image.JpegDecoder(); + } else if (bytes[0] == 0x89 && bytes[1] == 0x50 && bytes[2] == 0x4e && bytes[3] == 0x47) { + decoder = image.PngDecoder(); + } + } + + final info = decoder?.startDecode(bytes); + + if (info == null || info.width <= 0 || info.height <= 0 || info.width * info.height > 25000000) { + throw const FormatException('Choose a JPEG or PNG photo up to 25 megapixels.'); + } + + final decoded = decoder!.decodeFrame(0); + + if (decoded == null) { + throw const FormatException('This photo could not be opened. Choose another image.'); + } + + final oriented = image.bakeOrientation(decoded); + final longestSide = oriented.width > oriented.height ? oriented.width : oriented.height; + final resized = longestSide > 512 + ? image.copyResize( + oriented, + width: (oriented.width * 512 / longestSide).round().clamp(1, 512), + height: (oriented.height * 512 / longestSide).round().clamp(1, 512), + ) + : oriented; + + final clean = image.Image(width: resized.width, height: resized.height, numChannels: 3); + image.fill(clean, color: image.ColorRgb8(255, 255, 255)); + image.compositeImage(clean, resized); + return image.encodeJpg(clean, quality: 90); +} diff --git a/app/lib/themes/app_accessibility.dart b/app/lib/themes/app_accessibility.dart new file mode 100644 index 00000000..7f8aa6dd --- /dev/null +++ b/app/lib/themes/app_accessibility.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:papyrus/themes/app_motion.dart'; +import 'package:papyrus/themes/app_theme.dart'; + +/// Preserves the platform's nonlinear curve while adding interface enlargement. +@immutable +class InterfaceTextScaler extends TextScaler { + const InterfaceTextScaler(this.system, this.multiplier); + + final TextScaler system; + final double multiplier; + + @override + double scale(double fontSize) => system.scale(fontSize) * multiplier; + + @override + double get textScaleFactor => scale(14) / 14; + + @override + bool operator ==(Object other) => + other is InterfaceTextScaler && other.system == system && other.multiplier == multiplier; + + @override + int get hashCode => Object.hash(system, multiplier); +} + +/// Wraps the navigator so preferences also reach dialogs and sheets. +class AppAccessibilityScope extends StatelessWidget { + const AppAccessibilityScope({super.key, required this.preferences, required this.child}); + + final PreferencesProvider preferences; + final Widget child; + + @override + Widget build(BuildContext context) { + final system = MediaQuery.of(context); + final theme = Theme.of(context); + final boldText = system.boldText || preferences.boldInterfaceText; + + return _SystemTextSettings( + textScaler: system.textScaler, + boldText: system.boldText, + theme: theme, + child: MediaQuery( + data: system.copyWith( + textScaler: preferences.interfaceTextEnlargement == 1 + ? system.textScaler + : InterfaceTextScaler(system.textScaler, preferences.interfaceTextEnlargement), + boldText: boldText, + ), + child: Theme( + data: AppTheme.withTypography(theme, boldText: boldText), + child: AppMotionScope( + reduceAnimations: preferences.isEinkMode || preferences.reduceAnimations, + child: child, + ), + ), + ), + ); + } +} + +/// The embedded reader owns text sizing. Keep OS accessibility, but remove the +/// extra interface overrides, including from reader panels on the root navigator. +class ReaderSystemTextScope extends StatelessWidget { + const ReaderSystemTextScope({super.key, required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + final system = context.dependOnInheritedWidgetOfExactType<_SystemTextSettings>(); + + if (system == null) { + return child; + } + + return MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: system.textScaler, boldText: system.boldText), + child: Theme( + data: AppTheme.withTypography(system.theme, boldText: system.boldText), + child: child, + ), + ); + } +} + +class _SystemTextSettings extends InheritedWidget { + const _SystemTextSettings({ + required this.textScaler, + required this.boldText, + required this.theme, + required super.child, + }); + + final TextScaler textScaler; + final bool boldText; + final ThemeData theme; + + @override + bool updateShouldNotify(_SystemTextSettings oldWidget) => + textScaler != oldWidget.textScaler || boldText != oldWidget.boldText || theme != oldWidget.theme; +} diff --git a/app/lib/themes/app_theme.dart b/app/lib/themes/app_theme.dart index 8c601611..560a84c4 100644 --- a/app/lib/themes/app_theme.dart +++ b/app/lib/themes/app_theme.dart @@ -9,40 +9,114 @@ import 'design_tokens.dart'; class AppTheme { AppTheme._(); - static ThemeData get light => ThemeData( - useMaterial3: true, - colorScheme: lightColorScheme, - // Typography - textTheme: _textTheme, - // Component themes - elevatedButtonTheme: _elevatedButtonTheme(lightColorScheme), - outlinedButtonTheme: _outlinedButtonTheme(lightColorScheme), - textButtonTheme: _textButtonTheme(lightColorScheme), - inputDecorationTheme: _inputDecorationTheme(lightColorScheme), - cardTheme: _cardTheme(lightColorScheme), - appBarTheme: _appBarTheme(lightColorScheme), - bottomNavigationBarTheme: _bottomNavTheme(lightColorScheme), - dividerTheme: _dividerTheme(lightColorScheme), - snackBarTheme: _snackBarTheme(lightColorScheme), - popupMenuTheme: _popupMenuTheme(lightColorScheme), + static const dyslexiaFontFamily = 'OpenDyslexic'; + + static ThemeData withTypography(ThemeData theme, {bool dyslexiaFont = false, bool boldText = false}) { + if (!dyslexiaFont && !boldText) { + return theme; + } + + TextStyle? fontStyle(TextStyle? style) => style?.copyWith( + fontFamily: dyslexiaFont ? dyslexiaFontFamily : null, + fontWeight: boldText && (style.fontWeight ?? FontWeight.normal).value < FontWeight.bold.value + ? FontWeight.bold + : null, + ); + + TextTheme textTheme(TextTheme source) => TextTheme( + displayLarge: fontStyle(source.displayLarge), + displayMedium: fontStyle(source.displayMedium), + displaySmall: fontStyle(source.displaySmall), + headlineLarge: fontStyle(source.headlineLarge), + headlineMedium: fontStyle(source.headlineMedium), + headlineSmall: fontStyle(source.headlineSmall), + titleLarge: fontStyle(source.titleLarge), + titleMedium: fontStyle(source.titleMedium), + titleSmall: fontStyle(source.titleSmall), + bodyLarge: fontStyle(source.bodyLarge), + bodyMedium: fontStyle(source.bodyMedium), + bodySmall: fontStyle(source.bodySmall), + labelLarge: fontStyle(source.labelLarge), + labelMedium: fontStyle(source.labelMedium), + labelSmall: fontStyle(source.labelSmall), + ); + + ButtonStyle? buttonStyle(ButtonStyle? style) { + final textStyle = style?.textStyle; + + if (textStyle == null) { + return style; + } + + return style!.copyWith( + textStyle: WidgetStateProperty.resolveWith((states) => fontStyle(textStyle.resolve(states))), + ); + } + + final navigationLabelStyle = theme.navigationBarTheme.labelTextStyle; + + return theme.copyWith( + textTheme: textTheme(theme.textTheme), + primaryTextTheme: textTheme(theme.primaryTextTheme), + appBarTheme: theme.appBarTheme.copyWith( + titleTextStyle: fontStyle(theme.appBarTheme.titleTextStyle), + toolbarTextStyle: fontStyle(theme.appBarTheme.toolbarTextStyle), + ), + elevatedButtonTheme: ElevatedButtonThemeData(style: buttonStyle(theme.elevatedButtonTheme.style)), + outlinedButtonTheme: OutlinedButtonThemeData(style: buttonStyle(theme.outlinedButtonTheme.style)), + textButtonTheme: TextButtonThemeData(style: buttonStyle(theme.textButtonTheme.style)), + inputDecorationTheme: theme.inputDecorationTheme.copyWith( + labelStyle: fontStyle(theme.inputDecorationTheme.labelStyle), + floatingLabelStyle: fontStyle(theme.inputDecorationTheme.floatingLabelStyle), + hintStyle: fontStyle(theme.inputDecorationTheme.hintStyle), + ), + navigationBarTheme: theme.navigationBarTheme.copyWith( + labelTextStyle: navigationLabelStyle == null + ? null + : WidgetStateProperty.resolveWith((states) => fontStyle(navigationLabelStyle.resolve(states))), + ), + bottomNavigationBarTheme: theme.bottomNavigationBarTheme.copyWith( + selectedLabelStyle: fontStyle(theme.bottomNavigationBarTheme.selectedLabelStyle), + unselectedLabelStyle: fontStyle(theme.bottomNavigationBarTheme.unselectedLabelStyle), + ), + chipTheme: theme.chipTheme.copyWith( + labelStyle: fontStyle(theme.chipTheme.labelStyle), + secondaryLabelStyle: fontStyle(theme.chipTheme.secondaryLabelStyle), + ), + snackBarTheme: theme.snackBarTheme.copyWith(contentTextStyle: fontStyle(theme.snackBarTheme.contentTextStyle)), + popupMenuTheme: theme.popupMenuTheme.copyWith(textStyle: fontStyle(theme.popupMenuTheme.textStyle)), + ); + } + + static ThemeData get light => _standard(lightColorScheme); + static ThemeData get dark => _standard(darkColorScheme); + + static ThemeData get highContrastLight => _highContrast(Brightness.light); + static ThemeData get highContrastDark => _highContrast(Brightness.dark); + + static ThemeData _highContrast(Brightness brightness) => _standard( + ColorScheme.fromSeed(seedColor: lightColorScheme.primary, brightness: brightness, contrastLevel: 1), ); - static ThemeData get dark => ThemeData( + static ThemeData _standard(ColorScheme colors) => ThemeData( useMaterial3: true, - colorScheme: darkColorScheme, - // Typography + colorScheme: colors, textTheme: _textTheme, - // Component themes - elevatedButtonTheme: _elevatedButtonTheme(darkColorScheme), - outlinedButtonTheme: _outlinedButtonTheme(darkColorScheme), - textButtonTheme: _textButtonTheme(darkColorScheme), - inputDecorationTheme: _inputDecorationTheme(darkColorScheme), - cardTheme: _cardTheme(darkColorScheme), - appBarTheme: _appBarTheme(darkColorScheme), - bottomNavigationBarTheme: _bottomNavTheme(darkColorScheme), - dividerTheme: _dividerTheme(darkColorScheme), - snackBarTheme: _snackBarTheme(darkColorScheme), - popupMenuTheme: _popupMenuTheme(darkColorScheme), + elevatedButtonTheme: _elevatedButtonTheme(colors), + outlinedButtonTheme: _outlinedButtonTheme(colors), + textButtonTheme: _textButtonTheme(colors), + switchTheme: _switchTheme, + inputDecorationTheme: _inputDecorationTheme(colors), + cardTheme: _cardTheme(colors), + appBarTheme: _appBarTheme(colors), + bottomSheetTheme: BottomSheetThemeData(backgroundColor: colors.surface), + dialogTheme: const DialogThemeData( + constraints: BoxConstraints(minWidth: 280, maxWidth: ComponentSizes.dialogMaxWidth), + ), + bottomNavigationBarTheme: _bottomNavTheme(colors), + dividerTheme: _dividerTheme(colors), + snackBarTheme: _snackBarTheme(colors), + popupMenuTheme: _popupMenuTheme(colors), ); static ThemeData get eink => ThemeData( @@ -64,6 +138,7 @@ class AppTheme { elevatedButtonTheme: _einkElevatedButtonTheme(), outlinedButtonTheme: _einkOutlinedButtonTheme(), textButtonTheme: _einkTextButtonTheme(), + switchTheme: _switchTheme, filledButtonTheme: FilledButtonThemeData( style: FilledButton.styleFrom( backgroundColor: EinkColors.black, @@ -121,6 +196,7 @@ class AppTheme { ), ), dialogTheme: const DialogThemeData( + constraints: BoxConstraints(minWidth: 280, maxWidth: ComponentSizes.dialogMaxWidth), backgroundColor: EinkColors.white, surfaceTintColor: Colors.transparent, elevation: 0, @@ -263,6 +339,18 @@ class AppTheme { ); } + static final _switchTheme = SwitchThemeData( + overlayColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.hovered) && + !states.contains(WidgetState.focused) && + !states.contains(WidgetState.pressed)) { + return Colors.transparent; + } + + return null; + }), + ); + static DividerThemeData _dividerTheme(ColorScheme colors) { return DividerThemeData(color: colors.outlineVariant, thickness: 1, space: Spacing.md); } diff --git a/app/lib/themes/design_tokens.dart b/app/lib/themes/design_tokens.dart index e47d7b2d..98efd185 100644 --- a/app/lib/themes/design_tokens.dart +++ b/app/lib/themes/design_tokens.dart @@ -131,6 +131,7 @@ class ComponentSizes { // Card widths static const double authCardWidth = 480.0; static const double authCardPadding = 48.0; + static const double dialogMaxWidth = 560.0; // Auth layout (split-screen) static const double authHeroMinWidth = 400.0; diff --git a/app/lib/widgets/acquisition/acquisition_endpoint_editor.dart b/app/lib/widgets/acquisition/acquisition_endpoint_editor.dart index 9792c358..a25abf63 100644 --- a/app/lib/widgets/acquisition/acquisition_endpoint_editor.dart +++ b/app/lib/widgets/acquisition/acquisition_endpoint_editor.dart @@ -289,6 +289,7 @@ class _AcquisitionEndpointEditorState extends State { value: _enabled, enabled: !_busy, builder: (focusNode) => SwitchListTile( + hoverColor: Colors.transparent, focusNode: focusNode, contentPadding: EdgeInsets.zero, title: const Text('Enabled'), diff --git a/app/lib/widgets/add_book/add_book_sheet_scaffold.dart b/app/lib/widgets/add_book/add_book_sheet_scaffold.dart index 1f57e8a5..784c3079 100644 --- a/app/lib/widgets/add_book/add_book_sheet_scaffold.dart +++ b/app/lib/widgets/add_book/add_book_sheet_scaffold.dart @@ -32,25 +32,33 @@ class AddBookSheetScaffold extends StatelessWidget { final isCompactHeight = constraints.maxHeight < 280; final verticalPadding = isCompactHeight ? 0.0 : Spacing.md; + Widget accessibleChrome(Widget child) => MediaQuery.textScalerOf(context).scale(16) > 32 + ? Flexible(child: SingleChildScrollView(primary: false, child: child)) + : child; + return Column( mainAxisSize: fitContent ? MainAxisSize.min : MainAxisSize.max, children: [ - BottomSheetHeader( - key: const Key('add-book-sheet-header'), - title: title, - onDismiss: canClose ? onClose : null, - compact: isCompactHeight, + accessibleChrome( + BottomSheetHeader( + key: const Key('add-book-sheet-header'), + title: title, + onDismiss: canClose ? onClose : null, + compact: isCompactHeight, + ), ), const Divider(height: 1), Flexible(fit: fitContent ? FlexFit.loose : FlexFit.tight, child: body), - Container( - key: const Key('add-book-sheet-footer'), - padding: footerPadding ?? EdgeInsets.symmetric(horizontal: Spacing.lg, vertical: verticalPadding), - decoration: BoxDecoration( - color: colorScheme.surface, - border: Border(top: BorderSide(color: colorScheme.outlineVariant)), + accessibleChrome( + Container( + key: const Key('add-book-sheet-footer'), + padding: footerPadding ?? EdgeInsets.symmetric(horizontal: Spacing.lg, vertical: verticalPadding), + decoration: BoxDecoration( + color: colorScheme.surface, + border: Border(top: BorderSide(color: colorScheme.outlineVariant)), + ), + child: SafeArea(top: false, child: footer), ), - child: SafeArea(top: false, child: footer), ), ], ); diff --git a/app/lib/widgets/add_book/add_physical_book_sheet.dart b/app/lib/widgets/add_book/add_physical_book_sheet.dart index dfca5faa..41cb056e 100644 --- a/app/lib/widgets/add_book/add_physical_book_sheet.dart +++ b/app/lib/widgets/add_book/add_physical_book_sheet.dart @@ -314,23 +314,20 @@ class _PhysicalBookContentState extends State<_PhysicalBookContent> { Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Card( - margin: const EdgeInsets.only(bottom: Spacing.xs), - child: Padding( - padding: const EdgeInsets.all(Spacing.md), - child: CoverImagePicker( - initialUrl: _coverUrl, - initialBytes: _coverImageBytes, - onUrlChanged: (url) => setState(() => _coverUrl = url), - onFileChanged: (bytes) => setState(() { - _coverImageBytes = bytes; - - if (bytes != null) { - _coverUrl = null; - } - }), - coverWidth: 240, - ), + Padding( + padding: const EdgeInsets.fromLTRB(Spacing.md, Spacing.md, Spacing.md, Spacing.md + Spacing.xs), + child: CoverImagePicker( + initialUrl: _coverUrl, + initialBytes: _coverImageBytes, + onUrlChanged: (url) => setState(() => _coverUrl = url), + onFileChanged: (bytes) => setState(() { + _coverImageBytes = bytes; + + if (bytes != null) { + _coverUrl = null; + } + }), + coverWidth: 240, ), ), @@ -354,27 +351,24 @@ class _PhysicalBookContentState extends State<_PhysicalBookContent> { ); } - Widget _buildSectionCard({required String? title, required List children}) { - return Card( - margin: const EdgeInsets.only(bottom: Spacing.xs), - child: Padding( - padding: const EdgeInsets.all(Spacing.md), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (title != null) ...[ - Text(title, style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600)), - const SizedBox(height: Spacing.md), - ], - ...children, + Widget _buildFormSection({required String? title, required List children}) { + return Padding( + padding: const EdgeInsets.fromLTRB(Spacing.md, Spacing.md, Spacing.md, Spacing.md + Spacing.xs), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (title != null) ...[ + Text(title, style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600)), + const SizedBox(height: Spacing.md), ], - ), + ...children, + ], ), ); } Widget _buildBasicInfoSection() { - return _buildSectionCard( + return _buildFormSection( title: 'Basic information', children: [ BookTextField(controller: _titleController, label: 'Title', required: true, onChanged: (_) => setState(() {})), @@ -396,7 +390,7 @@ class _PhysicalBookContentState extends State<_PhysicalBookContent> { } Widget _buildPublicationSection() { - return _buildSectionCard( + return _buildFormSection( title: 'Publication details', children: [ BookTextField(controller: _publisherController, label: 'Publisher'), @@ -416,7 +410,7 @@ class _PhysicalBookContentState extends State<_PhysicalBookContent> { } Widget _buildIdentifiersSection() { - return _buildSectionCard( + return _buildFormSection( title: 'Identifiers', children: [ BookTextField(controller: _isbnController, label: 'ISBN'), @@ -427,7 +421,7 @@ class _PhysicalBookContentState extends State<_PhysicalBookContent> { } Widget _buildSeriesSection() { - return _buildSectionCard( + return _buildFormSection( title: 'Series', children: [ BookTextField(controller: _seriesNameController, label: 'Series name'), @@ -442,7 +436,7 @@ class _PhysicalBookContentState extends State<_PhysicalBookContent> { } Widget _buildPhysicalBookSection() { - return _buildSectionCard( + return _buildFormSection( title: 'Other details', children: [ BookTextField(controller: _locationController, label: 'Location'), @@ -464,7 +458,7 @@ class _PhysicalBookContentState extends State<_PhysicalBookContent> { final textTheme = Theme.of(context).textTheme; final isFetching = _lookupState == _IsbnLookupState.fetching; - return _buildSectionCard( + return _buildFormSection( title: 'ISBN lookup', children: [ // ISBN field with inline look-up button diff --git a/app/lib/widgets/add_book/book_import_sheet_sections.dart b/app/lib/widgets/add_book/book_import_sheet_sections.dart index db21f5ae..62e014d6 100644 --- a/app/lib/widgets/add_book/book_import_sheet_sections.dart +++ b/app/lib/widgets/add_book/book_import_sheet_sections.dart @@ -88,7 +88,10 @@ class BookImportSelectingSection extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: Spacing.lg, vertical: Spacing.md), children: [ if (pickerError case final message?) ...[ - Text(message, style: TextStyle(color: colorScheme.error, fontSize: 13)), + Semantics( + liveRegion: true, + child: Text(message, style: TextStyle(color: colorScheme.error, fontSize: 13)), + ), const SizedBox(height: Spacing.sm), ], Wrap( diff --git a/app/lib/widgets/auth/auth_continue_button.dart b/app/lib/widgets/auth/auth_continue_button.dart index d2d7dd0f..8afc625c 100644 --- a/app/lib/widgets/auth/auth_continue_button.dart +++ b/app/lib/widgets/auth/auth_continue_button.dart @@ -32,12 +32,18 @@ class AuthContinueButton extends StatelessWidget { ? SizedBox( width: 24, height: 24, - child: AppCircularProgressIndicator(strokeWidth: 2, color: theme.colorScheme.onPrimary), + child: AppCircularProgressIndicator( + semanticsLabel: 'Please wait', + strokeWidth: 2, + color: theme.colorScheme.onPrimary, + ), ) : Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text('Continue', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500)), + const Flexible( + child: Text('Continue', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500)), + ), const SizedBox(width: Spacing.sm), Icon(Icons.arrow_forward, size: IconSizes.medium, color: theme.colorScheme.onPrimary), ], diff --git a/app/lib/widgets/book_details/book_action_buttons.dart b/app/lib/widgets/book_details/book_action_buttons.dart index a289c219..e2106f3c 100644 --- a/app/lib/widgets/book_details/book_action_buttons.dart +++ b/app/lib/widgets/book_details/book_action_buttons.dart @@ -84,18 +84,27 @@ class BookActionButtons extends StatelessWidget { icon: digitalIcon, label: Text(digitalLabel), ), - OutlinedButton( - onPressed: onToggleFavorite, - style: iconStyle, - child: Icon( - book.isFavorite ? Icons.favorite : Icons.favorite_border, - color: book.isFavorite ? colorScheme.error : colorScheme.primary, + Tooltip( + message: book.isFavorite ? 'Remove from favorites' : 'Add to favorites', + excludeFromSemantics: true, + child: OutlinedButton( + onPressed: onToggleFavorite, + style: iconStyle, + child: Icon( + book.isFavorite ? Icons.favorite : Icons.favorite_border, + semanticLabel: book.isFavorite ? 'Remove from favorites' : 'Add to favorites', + color: book.isFavorite ? colorScheme.error : colorScheme.primary, + ), ), ), - OutlinedButton( - onPressed: onEdit, - style: iconStyle, - child: Icon(Icons.edit_outlined, color: colorScheme.primary), + Tooltip( + message: 'Edit book', + excludeFromSemantics: true, + child: OutlinedButton( + onPressed: onEdit, + style: iconStyle, + child: Icon(Icons.edit_outlined, semanticLabel: 'Edit book', color: colorScheme.primary), + ), ), ], ); diff --git a/app/lib/widgets/book_edit/cover_image_picker.dart b/app/lib/widgets/book_edit/cover_image_picker.dart index f5296e35..e736e92b 100644 --- a/app/lib/widgets/book_edit/cover_image_picker.dart +++ b/app/lib/widgets/book_edit/cover_image_picker.dart @@ -194,15 +194,29 @@ class _CoverImagePickerState extends State { ); if (widget.coverWidth != null) { - return GestureDetector( - onTap: _pickImage, - child: Center( - child: SizedBox(width: widget.coverWidth, child: cover), + return Semantics( + button: true, + label: 'Choose cover image', + child: Material( + type: MaterialType.transparency, + child: InkWell( + onTap: _pickImage, + child: Center( + child: SizedBox(width: widget.coverWidth, child: cover), + ), + ), ), ); } - return GestureDetector(onTap: _pickImage, child: cover); + return Semantics( + button: true, + label: 'Choose cover image', + child: Material( + type: MaterialType.transparency, + child: InkWell(onTap: _pickImage, child: cover), + ), + ); } Widget _buildCoverImage(BuildContext context) { @@ -254,17 +268,17 @@ class _CoverImagePickerState extends State { } Widget _buildRemoveButton(BuildContext context) { - return Material( - color: Colors.black54, - borderRadius: BorderRadius.circular(16), - child: InkWell( - borderRadius: BorderRadius.circular(16), - onTap: _clearImage, - child: const Padding( - padding: EdgeInsets.all(4), - child: Icon(Icons.close, size: 16, color: Colors.white), - ), + final colorScheme = Theme.of(context).colorScheme; + + return IconButton.filled( + tooltip: 'Remove cover image', + onPressed: _clearImage, + style: IconButton.styleFrom( + backgroundColor: colorScheme.surface, + foregroundColor: colorScheme.onSurface, + minimumSize: const Size(48, 48), ), + icon: const Icon(Icons.close, size: 20), ); } @@ -272,20 +286,23 @@ class _CoverImagePickerState extends State { final colorScheme = Theme.of(context).colorScheme; return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.add_photo_alternate_outlined, - size: widget.isDesktop ? 56 : 40, - color: colorScheme.onSurfaceVariant, - ), - const SizedBox(height: Spacing.sm), - Text( - 'Tap to add cover', - style: TextStyle(color: colorScheme.onSurfaceVariant, fontSize: widget.isDesktop ? 14 : 12), - ), - ], + child: SingleChildScrollView( + primary: false, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.add_photo_alternate_outlined, + size: widget.isDesktop ? 56 : 40, + color: colorScheme.onSurfaceVariant, + ), + const SizedBox(height: Spacing.sm), + Text( + 'No cover image', + style: TextStyle(color: colorScheme.onSurfaceVariant, fontSize: widget.isDesktop ? 14 : 12), + ), + ], + ), ), ); } diff --git a/app/lib/widgets/goals/add_goal_sheet.dart b/app/lib/widgets/goals/add_goal_sheet.dart index 4e56b5e7..c386e7dd 100644 --- a/app/lib/widgets/goals/add_goal_sheet.dart +++ b/app/lib/widgets/goals/add_goal_sheet.dart @@ -315,6 +315,7 @@ class _AddGoalSheetState extends State { ), if (_period != GoalPeriod.custom) SwitchListTile( + hoverColor: Colors.transparent, contentPadding: EdgeInsets.zero, title: const Text('Repeat each period'), value: _recurring, diff --git a/app/lib/widgets/input/email_input.dart b/app/lib/widgets/input/email_input.dart index 70bd869c..99484855 100644 --- a/app/lib/widgets/input/email_input.dart +++ b/app/lib/widgets/input/email_input.dart @@ -39,6 +39,7 @@ class EmailInput extends StatelessWidget { ), controller: controller, focusNode: focusNode, + autofillHints: const [AutofillHints.email], keyboardType: TextInputType.emailAddress, textInputAction: textInputAction ?? TextInputAction.next, onEditingComplete: onEditingComplete, diff --git a/app/lib/widgets/input/password_input.dart b/app/lib/widgets/input/password_input.dart index 48cb5348..fa503e48 100644 --- a/app/lib/widgets/input/password_input.dart +++ b/app/lib/widgets/input/password_input.dart @@ -6,6 +6,7 @@ class PasswordInput extends StatefulWidget { /// Label text displayed for the input field final String labelText; final Listenable? validationDependency; + final Iterable autofillHints; /// Optional text controller for the input final TextEditingController? controller; @@ -31,6 +32,7 @@ class PasswordInput extends StatefulWidget { this.extraValidator, required this.labelText, this.validationDependency, + this.autofillHints = const [AutofillHints.password], this.focusNode, this.onEditingComplete, this.textInputAction, @@ -57,6 +59,7 @@ class _PasswordInputState extends State { border: const OutlineInputBorder(), labelText: widget.labelText, suffixIcon: IconButton( + tooltip: _isTextHidden ? 'Show password' : 'Hide password', onPressed: _toggleVisibility, icon: Icon( _isTextHidden ? Icons.visibility_outlined : Icons.visibility_off_outlined, @@ -64,6 +67,7 @@ class _PasswordInputState extends State { ), ), ), + autofillHints: widget.autofillHints, obscureText: _isTextHidden, enableSuggestions: false, autocorrect: false, diff --git a/app/lib/widgets/input/search_field.dart b/app/lib/widgets/input/search_field.dart index b8b28d14..80db6a59 100644 --- a/app/lib/widgets/input/search_field.dart +++ b/app/lib/widgets/input/search_field.dart @@ -32,7 +32,7 @@ class SearchField extends StatelessWidget { /// [onChanged] with an empty string. final VoidCallback? onClear; - /// Height of the search field. Defaults to 40. + /// Minimum height of the search field, never below a 48-pixel touch target. final double? height; /// An optional action inside the field, after the clear button. @@ -65,15 +65,16 @@ class SearchField extends StatelessWidget { @override Widget build(BuildContext context) { - return SizedBox( - height: height ?? 40, + return ConstrainedBox( + constraints: BoxConstraints(minHeight: (height ?? 48).clamp(48, double.infinity)), child: TextField( controller: controller, onChanged: onChanged, onSubmitted: onSubmitted, textInputAction: onSubmitted == null ? null : TextInputAction.search, decoration: InputDecoration( - hintText: hintText, + labelText: hintText, + floatingLabelBehavior: FloatingLabelBehavior.never, prefixIcon: const Icon(Icons.search, size: 20), suffixIcon: trailing == null && !_hasContent ? null @@ -90,7 +91,7 @@ class SearchField extends StatelessWidget { ], ), border: OutlineInputBorder(borderRadius: BorderRadius.circular(AppRadius.md)), - contentPadding: const EdgeInsets.symmetric(horizontal: Spacing.md), + contentPadding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm), isDense: true, ), ), diff --git a/app/lib/widgets/input/validated_text_form_field.dart b/app/lib/widgets/input/validated_text_form_field.dart index f7525654..de4b7fd3 100644 --- a/app/lib/widgets/input/validated_text_form_field.dart +++ b/app/lib/widgets/input/validated_text_form_field.dart @@ -11,6 +11,7 @@ class ValidatedTextFormField extends StatefulWidget { final TextCapitalization textCapitalization; final VoidCallback? onEditingComplete; final ValueChanged? onFieldSubmitted; + final Iterable? autofillHints; final bool obscureText; final bool autocorrect; final bool enableSuggestions; @@ -27,6 +28,7 @@ class ValidatedTextFormField extends StatefulWidget { this.textCapitalization = TextCapitalization.none, this.onEditingComplete, this.onFieldSubmitted, + this.autofillHints, this.obscureText = false, this.autocorrect = true, this.enableSuggestions = true, @@ -142,6 +144,7 @@ class _ValidatedTextFormFieldState extends State { textCapitalization: widget.textCapitalization, onEditingComplete: widget.onEditingComplete, onFieldSubmitted: widget.onFieldSubmitted, + autofillHints: widget.autofillHints, obscureText: widget.obscureText, autocorrect: widget.autocorrect, enableSuggestions: widget.enableSuggestions, diff --git a/app/lib/widgets/library/book_card.dart b/app/lib/widgets/library/book_card.dart index fc0dc170..7ccd49bf 100644 --- a/app/lib/widgets/library/book_card.dart +++ b/app/lib/widgets/library/book_card.dart @@ -55,6 +55,7 @@ class BookCard extends StatefulWidget { class _BookCardState extends State { bool _isHovered = false; + bool _hasFocus = false; @override void initState() { @@ -76,13 +77,14 @@ class _BookCardState extends State { Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; final inSelection = widget.isSelectionMode; + final hoverDuration = AppMotion.duration(context, const Duration(milliseconds: 150)); final effectiveTap = inSelection ? widget.onSelectToggle : widget.onTap; final effectiveLongPress = inSelection ? null : widget.onEnterSelectionMode; final isUnavailable = widget.acquisitionJob == null && !widget.book.isPhysical && widget.deviceStatus == BookDeviceStatus.missing; - final card = MouseRegion( + final visualCard = MouseRegion( onEnter: (_) => setState(() => _isHovered = true), onExit: (_) => setState(() => _isHovered = false), child: GestureDetector( @@ -116,22 +118,33 @@ class _BookCardState extends State { child: Stack( fit: StackFit.expand, children: [ - _buildCover(context), + ExcludeSemantics(child: _buildCover(context)), // Selection tint overlay if (inSelection && widget.isSelected) Container(color: colorScheme.primary.withValues(alpha: 0.15)), - if (!inSelection && - widget.acquisitionJob == null && - (widget.isFavorite || _isHovered || !WidgetsBinding.instance.mouseTracker.mouseIsConnected)) + if (!inSelection && widget.acquisitionJob == null) Positioned( top: Spacing.xs, left: Spacing.xs, - child: _CardIconButton( - icon: widget.isFavorite ? Icons.favorite : Icons.favorite_border, - color: widget.isFavorite ? colorScheme.error : Colors.white, - onTap: widget.onToggleFavorite != null - ? () => widget.onToggleFavorite!(widget.isFavorite) - : null, + child: AnimatedOpacity( + key: ValueKey(AppMotion.disabled(context)), + duration: hoverDuration, + opacity: + widget.isFavorite || + _isHovered || + _hasFocus || + !WidgetsBinding.instance.mouseTracker.mouseIsConnected + ? 1 + : 0, + alwaysIncludeSemantics: true, + child: _CardIconButton( + tooltip: widget.isFavorite ? 'Remove from favorites' : 'Add to favorites', + icon: widget.isFavorite ? Icons.favorite : Icons.favorite_border, + color: widget.isFavorite ? colorScheme.error : Colors.white, + onTap: widget.onToggleFavorite != null + ? () => widget.onToggleFavorite!(widget.isFavorite) + : null, + ), ), ), // Selection mode: checkbox overlay (top-right) @@ -140,6 +153,9 @@ class _BookCardState extends State { top: Spacing.xs, right: Spacing.xs, child: _CardIconButton( + tooltip: widget.isSelected + ? 'Deselect ${widget.book.title}' + : 'Select ${widget.book.title}', icon: widget.isSelected ? Icons.check_circle : Icons.radio_button_unchecked, color: widget.isSelected ? colorScheme.primary : Colors.white, onTap: widget.onSelectToggle, @@ -152,15 +168,21 @@ class _BookCardState extends State { right: Spacing.xs, child: AnimatedOpacity( key: ValueKey(AppMotion.disabled(context)), - opacity: _isHovered ? 1.0 : 0.0, - duration: AppMotion.duration(context, const Duration(milliseconds: 150)), + opacity: _isHovered || _hasFocus ? 1.0 : 0.0, + alwaysIncludeSemantics: true, + duration: hoverDuration, child: Row( mainAxisSize: MainAxisSize.min, children: [ - _CardIconButton(icon: Icons.radio_button_unchecked, onTap: widget.onEnterSelectionMode), + _CardIconButton( + tooltip: 'Select ${widget.book.title}', + icon: Icons.radio_button_unchecked, + onTap: widget.onEnterSelectionMode, + ), if (widget.acquisitionJob == null) ...[ const SizedBox(width: Spacing.xs), _CardIconButton( + tooltip: 'More options for ${widget.book.title}', icon: Icons.more_vert, onTap: () => showBookContextMenu( context: context, @@ -299,6 +321,12 @@ class _BookCardState extends State { ), ); + final card = Focus( + canRequestFocus: false, + onFocusChange: (focused) => setState(() => _hasFocus = focused), + child: visualCard, + ); + final job = widget.acquisitionJob; if (job == null) { @@ -422,22 +450,32 @@ class _BookCardState extends State { /// Icon button overlay for book card. class _CardIconButton extends StatelessWidget { final IconData icon; + final String tooltip; final Color? color; final VoidCallback? onTap; - const _CardIconButton({required this.icon, this.color, this.onTap}); + const _CardIconButton({required this.icon, required this.tooltip, this.color, this.onTap}); @override Widget build(BuildContext context) { - return Material( - color: Colors.black45, - borderRadius: BorderRadius.circular(AppRadius.full), - child: InkWell( - borderRadius: BorderRadius.circular(AppRadius.full), - onTap: onTap, - child: Padding( - padding: const EdgeInsets.all(6), - child: Icon(icon, size: IconSizes.small, color: color ?? Colors.white), + return Tooltip( + message: tooltip, + excludeFromSemantics: true, + child: Semantics( + label: tooltip, + container: true, + button: true, + child: Material( + color: Colors.black45, + borderRadius: BorderRadius.circular(AppRadius.full), + child: InkWell( + borderRadius: BorderRadius.circular(AppRadius.full), + onTap: onTap, + child: Padding( + padding: const EdgeInsets.all(6), + child: Icon(icon, size: IconSizes.small, color: color ?? Colors.white), + ), + ), ), ), ); diff --git a/app/lib/widgets/library/book_list_item.dart b/app/lib/widgets/library/book_list_item.dart index e2bb3122..3fa5effe 100644 --- a/app/lib/widgets/library/book_list_item.dart +++ b/app/lib/widgets/library/book_list_item.dart @@ -7,7 +7,6 @@ import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/utils/book_actions.dart'; import 'package:papyrus/widgets/book/private_book_cover.dart'; import 'package:papyrus/widgets/library/acquisition_status_text.dart'; -import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; import 'package:papyrus/widgets/shared/app_motion_control.dart'; @@ -55,8 +54,6 @@ class BookListItem extends StatefulWidget { } class _BookListItemState extends State { - bool _isHovered = false; - bool get _isDesktop => MediaQuery.of(context).size.width >= Breakpoints.desktopSmall; @override @@ -78,179 +75,169 @@ class _BookListItemState extends State { final isUnavailable = !isAcquisition && !widget.book.isPhysical && widget.deviceStatus == BookDeviceStatus.missing; - return MouseRegion( - onEnter: (_) => setState(() => _isHovered = true), - onExit: (_) => setState(() => _isHovered = false), - child: GestureDetector( - onLongPressStart: switch (isAcquisition) { - true => switch (widget.onAcquisitionSelectionToggle == null) { - true => null, - false => (_) => widget.onAcquisitionSelectionToggle!(), - }, - false when _isDesktop || inSelection => null, - false => (details) { - showBookContextMenu( - context: context, - book: widget.book, - position: details.globalPosition, - onRemoveFromShelf: widget.onRemoveFromShelf, - ); - }, + return GestureDetector( + onLongPressStart: switch (isAcquisition) { + true => switch (widget.onAcquisitionSelectionToggle == null) { + true => null, + false => (_) => widget.onAcquisitionSelectionToggle!(), + }, + false when _isDesktop || inSelection => null, + false => (details) { + showBookContextMenu( + context: context, + book: widget.book, + position: details.globalPosition, + onRemoveFromShelf: widget.onRemoveFromShelf, + ); + }, + }, + child: Material( + color: switch (inSelection && isSelected) { + true => colorScheme.primary.withValues(alpha: 0.08), + false when isUnavailable => colorScheme.surfaceContainerLow, + false => Colors.transparent, }, - child: Material( - color: switch (inSelection && isSelected) { - true => colorScheme.primary.withValues(alpha: 0.08), - false when isUnavailable => colorScheme.surfaceContainerLow, - false => Colors.transparent, - }, - child: InkWell( - onTap: onTap, - child: Container( - // The list owns the horizontal page gutter. - padding: const EdgeInsets.symmetric(vertical: Spacing.sm), - decoration: BoxDecoration( - border: Border(bottom: BorderSide(color: colorScheme.outlineVariant)), - ), - child: Row( - children: [ - // Selection checkbox (leading) - if (inSelection) ...[ - AppMotionControl( + child: InkWell( + onTap: onTap, + child: Container( + // The list owns the horizontal page gutter. + padding: const EdgeInsets.symmetric(vertical: Spacing.sm), + decoration: BoxDecoration( + border: Border(bottom: BorderSide(color: colorScheme.outlineVariant)), + ), + child: Row( + children: [ + // Selection checkbox (leading) + if (inSelection) ...[ + AppMotionControl( + value: isSelected, + builder: (focusNode) => Checkbox( + focusNode: focusNode, + semanticLabel: 'Select ${widget.book.title}', value: isSelected, - builder: (focusNode) => Checkbox( - focusNode: focusNode, - value: isSelected, - onChanged: (_) => onSelectionToggle?.call(), - ), + onChanged: (_) => onSelectionToggle?.call(), ), - const SizedBox(width: Spacing.sm), - ], - // Cover thumbnail - SizedBox( - width: ComponentSizes.bookCoverWidthList, - height: ComponentSizes.bookCoverHeightList, - child: ClipRRect(borderRadius: BorderRadius.circular(AppRadius.sm), child: _buildCover(context)), ), - const SizedBox(width: Spacing.md), + const SizedBox(width: Spacing.sm), + ], + // Cover thumbnail + SizedBox( + width: ComponentSizes.bookCoverWidthList, + height: ComponentSizes.bookCoverHeightList, + child: ClipRRect(borderRadius: BorderRadius.circular(AppRadius.sm), child: _buildCover(context)), + ), + const SizedBox(width: Spacing.md), - // Book info - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - widget.book.title, - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600), - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), + // Book info + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + widget.book.title, + style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w600), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: Spacing.xs), + Text( + widget.book.author, + style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: colorScheme.onSurfaceVariant), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + if (widget.acquisitionJob case final job?) ...[ const SizedBox(height: Spacing.xs), Text( - widget.book.author, - style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: colorScheme.onSurfaceVariant), + acquisitionStatusLabel(job), + style: Theme.of(context).textTheme.labelSmall?.copyWith( + color: job.requiresAttention ? colorScheme.error : colorScheme.onSurfaceVariant, + fontWeight: job.requiresAttention ? FontWeight.w600 : null, + ), maxLines: 1, overflow: TextOverflow.ellipsis, ), - if (widget.acquisitionJob case final job?) ...[ - const SizedBox(height: Spacing.xs), + if (acquisitionTransferDetails(job) case final details?) ...[ + const SizedBox(height: 2), Text( - acquisitionStatusLabel(job), - style: Theme.of(context).textTheme.labelSmall?.copyWith( - color: job.requiresAttention ? colorScheme.error : colorScheme.onSurfaceVariant, - fontWeight: job.requiresAttention ? FontWeight.w600 : null, - ), + details, + style: Theme.of( + context, + ).textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant), maxLines: 1, overflow: TextOverflow.ellipsis, ), - if (acquisitionTransferDetails(job) case final details?) ...[ - const SizedBox(height: 2), + ], + if (job.progress case final progress?) ...[ + const SizedBox(height: Spacing.xs), + AppLinearProgressIndicator( + value: progress, + backgroundColor: colorScheme.surfaceContainerHighest, + color: job.requiresAttention ? colorScheme.error : colorScheme.primary, + minHeight: 3, + ), + ], + ] else if (widget.showProgress && widget.book.currentPosition > 0) ...[ + const SizedBox(height: Spacing.xs), + Row( + children: [ + Expanded( + child: AppLinearProgressIndicator( + value: widget.book.currentPosition, + backgroundColor: colorScheme.surfaceContainerHighest, + color: widget.book.readingStatus == LibraryReadingStatus.completed + ? colorScheme.tertiary + : colorScheme.primary, + minHeight: 3, + ), + ), + const SizedBox(width: Spacing.sm), Text( - details, + widget.book.progressLabel, style: Theme.of( context, ).textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - if (job.progress case final progress?) ...[ - const SizedBox(height: Spacing.xs), - AppLinearProgressIndicator( - value: progress, - backgroundColor: colorScheme.surfaceContainerHighest, - color: job.requiresAttention ? colorScheme.error : colorScheme.primary, - minHeight: 3, ), ], - ] else if (widget.showProgress && widget.book.currentPosition > 0) ...[ - const SizedBox(height: Spacing.xs), - Row( - children: [ - Expanded( - child: AppLinearProgressIndicator( - value: widget.book.currentPosition, - backgroundColor: colorScheme.surfaceContainerHighest, - color: widget.book.readingStatus == LibraryReadingStatus.completed - ? colorScheme.tertiary - : colorScheme.primary, - minHeight: 3, - ), - ), - const SizedBox(width: Spacing.sm), - Text( - widget.book.progressLabel, - style: Theme.of( - context, - ).textTheme.labelSmall?.copyWith(color: colorScheme.onSurfaceVariant), - ), - ], - ), - ], + ), ], - ), + ], ), + ), - if (!inSelection && !isAcquisition) - Row( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(width: Spacing.xs), - IconButton( - style: IconButton.styleFrom( - minimumSize: const Size.square(TouchTargets.mobileRecommended), - ), - onPressed: widget.onToggleFavorite == null - ? null - : () => widget.onToggleFavorite!(widget.isFavorite), - tooltip: widget.isFavorite ? 'Remove from favorites' : 'Add to favorites', - isSelected: widget.isFavorite, - icon: const Icon(Icons.favorite_border), - selectedIcon: const Icon(Icons.favorite), - color: widget.isFavorite ? colorScheme.error : colorScheme.onSurfaceVariant, + if (!inSelection && !isAcquisition) + Row( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(width: Spacing.xs), + IconButton( + style: IconButton.styleFrom( + minimumSize: const Size.square(TouchTargets.mobileRecommended), ), - // Overflow menu - show on hover (desktop only) - if (_isDesktop) - AnimatedOpacity( - key: ValueKey(AppMotion.disabled(context)), - opacity: _isHovered ? 1.0 : 0.0, - duration: AppMotion.duration(context, const Duration(milliseconds: 150)), - child: IconButton( - icon: const Icon(Icons.more_vert), - iconSize: IconSizes.action, - onPressed: () => showBookContextMenu( - context: context, - book: widget.book, - onRemoveFromShelf: widget.onRemoveFromShelf, - ), - tooltip: 'More options', - visualDensity: VisualDensity.compact, - ), - ), - ], - ), - ], - ), + onPressed: widget.onToggleFavorite == null + ? null + : () => widget.onToggleFavorite!(widget.isFavorite), + tooltip: widget.isFavorite ? 'Remove from favorites' : 'Add to favorites', + isSelected: widget.isFavorite, + icon: const Icon(Icons.favorite_border), + selectedIcon: const Icon(Icons.favorite), + color: widget.isFavorite ? colorScheme.error : colorScheme.onSurfaceVariant, + ), + IconButton( + icon: const Icon(Icons.more_vert), + iconSize: IconSizes.action, + onPressed: () => showBookContextMenu( + context: context, + book: widget.book, + onRemoveFromShelf: widget.onRemoveFromShelf, + ), + tooltip: 'More options', + style: IconButton.styleFrom(minimumSize: const Size.square(TouchTargets.mobileRecommended)), + ), + ], + ), + ], ), ), ), diff --git a/app/lib/widgets/library/library_filter_chips.dart b/app/lib/widgets/library/library_filter_chips.dart index 951433da..2f117ebf 100644 --- a/app/lib/widgets/library/library_filter_chips.dart +++ b/app/lib/widgets/library/library_filter_chips.dart @@ -54,13 +54,22 @@ class _DropdownFilterChip extends StatelessWidget { final colorScheme = Theme.of(context).colorScheme; final foregroundColor = isSelected ? colorScheme.onSecondaryContainer : colorScheme.onSurfaceVariant; - return Semantics( - button: true, - selected: isSelected, - label: '$semanticLabel: $label', - child: AppMotionControl( - value: null, - builder: (focusNode) => ActionChip( + return AppMotionControl( + value: null, + builder: (focusNode) => ListenableBuilder( + listenable: focusNode, + builder: (context, child) => Semantics( + button: true, + selected: isSelected, + label: '$semanticLabel: $label', + focusable: true, + focused: focusNode.hasFocus, + onFocus: focusNode.requestFocus, + onTap: onPressed, + excludeSemantics: true, + child: child, + ), + child: ActionChip( focusNode: focusNode, chipAnimationStyle: appChipAnimationStyle(context), tooltip: tooltip, @@ -542,8 +551,17 @@ class LibraryFilterChips extends StatelessWidget { final orderKey = [...chips.map((chip) => chip.id), if (hasActiveSelections) 'clear-all'].join('-'); + final labelPainter = TextPainter( + text: TextSpan(text: 'Filter', style: Theme.of(context).textTheme.labelLarge), + textScaler: MediaQuery.textScalerOf(context), + textDirection: Directionality.of(context), + )..layout(); + + final chipHeight = (labelPainter.height + 24).clamp(48.0, double.infinity); + labelPainter.dispose(); + return SizedBox( - height: 48, + height: chipHeight, child: AnimatedSwitcher( key: ValueKey(AppMotion.disabled(context)), duration: AppMotion.duration(context, const Duration(milliseconds: 200)), diff --git a/app/lib/widgets/library/library_filter_fields.dart b/app/lib/widgets/library/library_filter_fields.dart index d0c1123d..8adcdeb5 100644 --- a/app/lib/widgets/library/library_filter_fields.dart +++ b/app/lib/widgets/library/library_filter_fields.dart @@ -206,6 +206,7 @@ class LibraryProgressFilterFieldState extends State child: Material( type: MaterialType.transparency, child: InkWell( + hoverColor: Colors.transparent, excludeFromSemantics: true, onTap: toggleEnabled, child: ConstrainedBox( diff --git a/app/lib/widgets/profile/accessibility_settings_section.dart b/app/lib/widgets/profile/accessibility_settings_section.dart index b3e2ec01..7a6d47ab 100644 --- a/app/lib/widgets/profile/accessibility_settings_section.dart +++ b/app/lib/widgets/profile/accessibility_settings_section.dart @@ -1,81 +1,109 @@ import 'package:flutter/material.dart'; import 'package:papyrus/providers/preferences_provider.dart'; import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/widgets/profile/profile_picker_sheet.dart'; import 'package:papyrus/widgets/settings/settings_row.dart'; import 'package:papyrus/widgets/settings/settings_section.dart'; import 'package:provider/provider.dart'; -/// Accessibility settings section for ProfilePage. class AccessibilitySettingsSection extends StatelessWidget { final bool isDesktop; const AccessibilitySettingsSection({super.key, this.isDesktop = false}); + static String enlargementLabel(double value) => value == 1 ? 'System default' : '+${((value - 1) * 100).round()}%'; + @override Widget build(BuildContext context) { + final prefs = context.watch(); + final colorScheme = Theme.of(context).colorScheme; + final children = [ + SettingsRow( + label: 'Interface text enlargement', + value: enlargementLabel(prefs.interfaceTextEnlargement), + onTap: () => showProfilePickerSheet( + context, + title: 'Interface text enlargement', + items: PreferencesProvider.interfaceTextEnlargements + .map((value) => (enlargementLabel(value), '$value')) + .toList(), + selected: '${prefs.interfaceTextEnlargement}', + onSelected: (value) => prefs.interfaceTextEnlargement = double.parse(value), + ), + ), + SettingsRow( + label: 'Interface font', + value: prefs.dyslexiaFont ? 'OpenDyslexic' : 'System default', + onTap: () => showProfilePickerSheet( + context, + title: 'Interface font', + items: const [('System default', 'system'), ('OpenDyslexic', 'opendyslexic')], + selected: prefs.dyslexiaFont ? 'opendyslexic' : 'system', + onSelected: (value) => prefs.dyslexiaFont = value == 'opendyslexic', + ), + ), + Padding( + padding: const EdgeInsets.all(Spacing.sm), + child: Semantics( + label: 'Interface text preview', + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(Spacing.md), + decoration: BoxDecoration( + color: colorScheme.surfaceContainerHighest, + border: Border.all(color: colorScheme.outlineVariant), + borderRadius: BorderRadius.circular(AppRadius.md), + ), + child: Text( + 'The quick brown fox jumps over the lazy dog.', + style: Theme.of(context).textTheme.bodyLarge?.copyWith(color: colorScheme.onSurface), + ), + ), + ), + ), + SettingsToggleRow( + label: 'Increase contrast', + value: prefs.isEinkMode || prefs.increaseContrast, + onChanged: prefs.isEinkMode ? null : (value) => prefs.increaseContrast = value, + ), + _description( + context, + prefs.isEinkMode + ? 'E-ink already provides increased contrast.' + : 'Always increase contrast. When off, follows your device setting.', + ), + SettingsToggleRow( + label: 'Bold interface text', + value: prefs.boldInterfaceText, + onChanged: (value) => prefs.boldInterfaceText = value, + ), + _description(context, 'Always use bold interface text. When off, follows your device setting.'), + SettingsToggleRow( + label: 'Reduce animations', + value: prefs.reduceAnimations, + onChanged: (value) => prefs.reduceAnimations = value, + ), + _description(context, 'Your device’s reduced-motion setting is always respected. E-ink also reduces motion.'), + ]; + if (isDesktop) { - return _buildDesktop(context); + return SettingsCard(children: children); } - return _buildMobile(context); - } - - Widget _buildMobile(BuildContext context) { - final prefs = context.watch(); - return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SettingsSectionHeader(title: 'Accessibility'), - SettingsToggleRow( - label: 'Reduce animations', - value: prefs.reduceAnimations, - onChanged: (value) => prefs.reduceAnimations = value, - ), - SettingsToggleRow( - label: 'Dyslexia-friendly font', - value: prefs.dyslexiaFont, - onChanged: (value) => prefs.dyslexiaFont = value, - ), + ...children, ], ); } - Widget _buildDesktop(BuildContext context) { - final prefs = context.watch(); - - return SettingsCard( - children: [ - SettingsToggleRow( - label: 'Reduce animations', - value: prefs.reduceAnimations, - onChanged: (value) => prefs.reduceAnimations = value, - ), - Padding( - padding: const EdgeInsets.only(left: Spacing.sm, right: Spacing.sm, bottom: Spacing.md), - child: Text( - 'Minimizes motion effects throughout the app. ' - 'Separate from e-ink mode.', - style: Theme.of( - context, - ).textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), - ), - ), - SettingsToggleRow( - label: 'Dyslexia-friendly font', - value: prefs.dyslexiaFont, - onChanged: (value) => prefs.dyslexiaFont = value, - ), - Padding( - padding: const EdgeInsets.only(left: Spacing.sm, right: Spacing.sm, bottom: Spacing.md), - child: Text( - 'Use OpenDyslexic font across the app interface.', - style: Theme.of( - context, - ).textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), - ), - ), - ], - ); - } + Widget _description(BuildContext context, String text) => Padding( + padding: const EdgeInsets.only(left: Spacing.sm, right: Spacing.sm, bottom: Spacing.md), + child: Text( + text, + style: Theme.of(context).textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), + ), + ); } diff --git a/app/lib/widgets/profile/account_deletion_dialog.dart b/app/lib/widgets/profile/account_deletion_dialog.dart index 62fe871e..9d843f24 100644 --- a/app/lib/widgets/profile/account_deletion_dialog.dart +++ b/app/lib/widgets/profile/account_deletion_dialog.dart @@ -4,6 +4,7 @@ import 'package:intl/intl.dart'; import 'package:papyrus/auth/auth_api_client.dart'; import 'package:papyrus/auth/auth_models.dart'; import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/services/guest_account_deletion_service.dart'; import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; @@ -17,6 +18,9 @@ Future showAccountDeletionDialog( final router = GoRouter.of(context); final messenger = ScaffoldMessenger.of(context); final animationStyle = AppMotion.animationStyle(context); + final deleteGuest = authorization == null && auth.isOfflineMode && !auth.isSignedIn + ? context.read().delete + : null; final message = await showDialog( context: context, @@ -25,6 +29,7 @@ Future showAccountDeletionDialog( builder: (_) => AccountDeletionDialog( auth: auth, authorization: authorization, + deleteGuest: deleteGuest, ), ); @@ -48,11 +53,13 @@ Future showAccountDeletionDialog( class AccountDeletionDialog extends StatefulWidget { final AuthProvider auth; final AccountDeletionAuthorization? authorization; + final Future Function()? deleteGuest; const AccountDeletionDialog({ super.key, required this.auth, this.authorization, + this.deleteGuest, }); @override @@ -71,6 +78,9 @@ class _AccountDeletionDialogState extends State { if (await widget.auth.recoverAccount(authorization)) { message = 'Account kept.'; } + } else if (widget.deleteGuest != null) { + await widget.deleteGuest!(); + message = 'Anonymous account and local data deleted.'; } else { final deadline = await widget.auth.deleteAccount(); @@ -100,7 +110,13 @@ class _AccountDeletionDialogState extends State { await action(); } catch (error) { if (mounted) { - _error = error is AuthApiException ? error.message : 'Unable to connect. Please try again.'; + if (error is AuthApiException) { + _error = error.message; + } else if (widget.deleteGuest != null) { + _error = 'Could not delete all local data. Please try again.'; + } else { + _error = 'Unable to connect. Please try again.'; + } } } finally { if (mounted) { @@ -144,6 +160,12 @@ class _AccountDeletionDialogState extends State { ], ), ) + else if (widget.deleteGuest != null) + const Text( + 'This permanently deletes your anonymous account’s local library, imported files, ' + 'covers, reading data and saved catalogs from this device. ' + 'You’ll return to the login page. This cannot be undone.', + ) else const Text( 'Your account, synced library and reading data will be permanently deleted after 30 days. ' diff --git a/app/lib/widgets/profile/account_profile_form.dart b/app/lib/widgets/profile/account_profile_form.dart new file mode 100644 index 00000000..daa20ea7 --- /dev/null +++ b/app/lib/widgets/profile/account_profile_form.dart @@ -0,0 +1,275 @@ +import 'dart:async'; + +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/themes/design_tokens.dart'; +import 'package:papyrus/services/profile_photo.dart'; +import 'package:papyrus/widgets/shared/app_progress_indicator.dart'; +import 'package:provider/provider.dart'; + +class AccountProfileForm extends StatefulWidget { + const AccountProfileForm({super.key}); + + @override + State createState() => _AccountProfileFormState(); +} + +class _AccountProfileFormState extends State { + final _formKey = GlobalKey(); + late final TextEditingController _nameController; + bool _saving = false; + String? _message; + bool _pickingPhoto = false; + Uint8List? _photoBytes; + String? _loadedPhotoUrl; + Uint8List? _savedPhotoBytes; + int _photoLoadGeneration = 0; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final auth = context.watch(); + final url = auth.user?.avatarUrl; + + if (url != _loadedPhotoUrl) { + _loadedPhotoUrl = url; + _savedPhotoBytes = null; + final generation = ++_photoLoadGeneration; + + if (url != null && url.startsWith('/users/me/avatar/')) { + unawaited(_loadSavedPhoto(auth, url, generation)); + } + } + } + + Future _loadSavedPhoto(AuthProvider auth, String url, int generation) async { + try { + final bytes = await auth.downloadProfilePhoto(url); + + if (mounted && generation == _photoLoadGeneration) { + setState(() => _savedPhotoBytes = bytes); + } + } catch (_) { + // A failed download must not discard a newly saved photo or an unsaved selection. + } + } + + @override + void initState() { + super.initState(); + _nameController = TextEditingController( + text: context.read().profileDisplayName, + ); + } + + @override + void dispose() { + _nameController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final auth = context.watch(); + final theme = Theme.of(context); + final hasChanges = _nameController.text.trim() != auth.profileDisplayName || _photoBytes != null; + + final fields = Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!auth.isOfflineMode) ...[ + TextFormField( + key: ValueKey(auth.user?.email), + initialValue: auth.user?.email?.trim().isNotEmpty == true ? auth.user!.email! : 'No email provided', + enabled: false, + decoration: const InputDecoration(labelText: 'Email'), + ), + const SizedBox(height: Spacing.md), + ], + TextFormField( + controller: _nameController, + enabled: auth.canEditProfile && !_saving, + textCapitalization: TextCapitalization.words, + textInputAction: TextInputAction.done, + autofillHints: const [AutofillHints.name], + decoration: const InputDecoration(labelText: 'Display name'), + validator: (value) { + if (value == null || value.trim().isEmpty) { + return 'Name cannot be empty'; + } + + if (value.trim().length > 100) { + return 'Name is too long'; + } + + return null; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, + onChanged: (_) => setState(() => _message = null), + onFieldSubmitted: (_) { + if (auth.canEditProfile && !_saving && !_pickingPhoto && hasChanges) { + _save(); + } + }, + ), + const SizedBox(height: Spacing.lg), + FilledButton( + onPressed: auth.canEditProfile && !_saving && !_pickingPhoto && hasChanges ? _save : null, + child: _saving + ? const SizedBox.square( + dimension: 20, + child: AppCircularProgressIndicator(strokeWidth: 2, semanticsLabel: 'Saving profile'), + ) + : const Text('Save'), + ), + if (_message != null) ...[ + const SizedBox(height: Spacing.sm), + Semantics( + liveRegion: true, + child: Text( + _message!, + style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.error), + ), + ), + ], + ], + ); + + return Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildAvatar(context), + const SizedBox(height: Spacing.lg), + fields, + ], + ), + ); + } + + Widget _buildAvatar(BuildContext context) { + final theme = Theme.of(context); + final auth = context.watch(); + final url = auth.user?.avatarUrl; + final fallback = Icon(Icons.person_outline, size: 40, color: theme.colorScheme.onPrimaryContainer); + + Widget photo = fallback; + + final bytes = _photoBytes ?? _savedPhotoBytes ?? auth.profilePhotoBytes; + + if (bytes != null) { + photo = Image.memory(bytes, fit: BoxFit.cover, errorBuilder: (_, _, _) => fallback); + } else if (url != null && (url.startsWith('https://') || url.startsWith('http://'))) { + photo = Image.network(url, fit: BoxFit.cover, errorBuilder: (_, _, _) => fallback); + } + + return Tooltip( + message: _pickingPhoto ? 'Opening photo…' : 'Change photo', + child: TextButton( + onPressed: auth.canEditProfile && !_saving && !_pickingPhoto ? _pickPhoto : null, + style: + TextButton.styleFrom( + fixedSize: const Size.square(88), + visualDensity: VisualDensity.standard, + padding: EdgeInsets.zero, + shape: const CircleBorder(), + backgroundColor: theme.colorScheme.primaryContainer, + ).copyWith( + side: WidgetStateProperty.resolveWith( + (states) => states.contains(WidgetState.focused) + ? BorderSide(width: 2, color: theme.colorScheme.onSurface) + : BorderSide.none, + ), + ), + child: ExcludeSemantics( + child: ClipOval(child: SizedBox.expand(child: photo)), + ), + ), + ); + } + + Future _pickPhoto() async { + setState(() { + _pickingPhoto = true; + _message = null; + }); + + try { + final result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ['jpg', 'jpeg', 'png'], + allowMultiple: false, + withData: true, + ); + + if (result == null || !mounted) { + return; + } + + final file = result.files.single; + + if (file.size > maxProfilePhotoBytes) { + throw const FormatException('Choose a photo smaller than 5 MB.'); + } + + if (file.bytes == null) { + throw const FormatException('This photo could not be opened. Choose another image.'); + } + + final bytes = await compute(prepareProfilePhoto, file.bytes!); + + if (mounted) { + setState(() => _photoBytes = bytes); + } + } catch (error) { + if (mounted) { + setState(() { + _message = error is FormatException ? error.message : 'Could not open this photo. Please try again.'; + }); + } + } finally { + if (mounted) { + setState(() => _pickingPhoto = false); + } + } + } + + Future _save() async { + if (!_formKey.currentState!.validate()) { + return; + } + + setState(() { + _saving = true; + _message = null; + }); + + final auth = context.read(); + final name = _nameController.text.trim(); + final success = await auth.updateProfile(displayName: name, photoBytes: _photoBytes); + + if (!mounted) { + return; + } + + setState(() { + _saving = false; + _message = success ? null : auth.error ?? 'Could not save your profile. Please try again.'; + + if (success) { + _nameController.text = name; + + if (_photoBytes != null) { + _savedPhotoBytes = _photoBytes; + _loadedPhotoUrl = auth.user?.avatarUrl; + _photoLoadGeneration++; + } + + _photoBytes = null; + } + }); + } +} diff --git a/app/lib/widgets/profile/account_settings_section.dart b/app/lib/widgets/profile/account_settings_section.dart index cfd8b01f..0b4b557a 100644 --- a/app/lib/widgets/profile/account_settings_section.dart +++ b/app/lib/widgets/profile/account_settings_section.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/widgets/profile/account_profile_form.dart'; import 'package:papyrus/themes/design_tokens.dart'; import 'package:papyrus/widgets/settings/settings_row.dart'; import 'package:papyrus/widgets/profile/account_deletion_dialog.dart'; @@ -26,14 +26,19 @@ class AccountSettingsSection extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SettingsSectionHeader(title: 'Account'), + const SettingsSectionHeader( + title: 'Account', + padding: EdgeInsets.only(bottom: Spacing.md), + ), + _buildProfileForm(context), + const SizedBox(height: Spacing.lg), const SettingsRow(label: 'Change password', enabled: false, showChevron: false), _buildGoogleConnection(context), const SettingsRow(label: 'Two-factor authentication', enabled: false, showChevron: false), const SettingsRow(label: 'Active sessions', enabled: false, showChevron: false), SettingsRow( label: 'Delete account', - enabled: context.watch().isSignedIn, + enabled: context.watch().isSignedIn || context.watch().isOfflineMode, onTap: () => showAccountDeletionDialog(context), ), ], @@ -41,45 +46,12 @@ class AccountSettingsSection extends StatelessWidget { } Widget _buildDesktop(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; final auth = context.watch(); - final user = auth.user; - final displayName = user?.displayName ?? 'Anonymous User'; - final userEmail = user?.email; - final email = (userEmail != null && userEmail.trim().isNotEmpty) ? userEmail : 'No email provided'; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SettingsCard( - children: [ - Row( - children: [ - _buildAvatar(context, displayName: displayName, avatarUrl: user?.avatarUrl, size: 96), - const SizedBox(width: Spacing.lg), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(displayName, style: textTheme.headlineSmall), - const SizedBox(height: Spacing.xs), - Text(email, style: textTheme.bodyMedium?.copyWith(color: colorScheme.onSurfaceVariant)), - const SizedBox(height: Spacing.md), - Align( - alignment: Alignment.centerLeft, - child: OutlinedButton( - onPressed: () => context.go('/profile/edit'), - child: const Text('Edit profile'), - ), - ), - ], - ), - ), - ], - ), - ], - ), + SettingsCard(children: [_buildProfileForm(context)]), const SizedBox(height: Spacing.lg), SettingsCard( title: 'Security', @@ -100,7 +72,7 @@ class AccountSettingsSection extends StatelessWidget { children: [ SettingsRow( label: 'Delete account', - enabled: context.watch().isSignedIn, + enabled: auth.isSignedIn || auth.isOfflineMode, onTap: () => showAccountDeletionDialog(context), ), ], @@ -119,51 +91,8 @@ class AccountSettingsSection extends StatelessWidget { ); } - Widget _buildAvatar( - BuildContext context, { - required String displayName, - required String? avatarUrl, - required double size, - }) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - final initials = _getInitials(displayName); - - return Container( - width: size, - height: size, - decoration: BoxDecoration(borderRadius: BorderRadius.circular(size / 2), color: colorScheme.primaryContainer), - clipBehavior: Clip.antiAlias, - child: avatarUrl != null && avatarUrl.isNotEmpty - ? Image.network( - avatarUrl, - fit: BoxFit.cover, - errorBuilder: (_, _, _) => Center( - child: Text( - initials, - style: textTheme.headlineMedium?.copyWith( - color: colorScheme.onPrimaryContainer, - fontSize: size * 0.35, - ), - ), - ), - ) - : Center( - child: Text( - initials, - style: textTheme.headlineMedium?.copyWith(color: colorScheme.onPrimaryContainer, fontSize: size * 0.35), - ), - ), - ); - } - - String _getInitials(String name) { - final parts = name.split(' '); - - if (parts.length >= 2) { - return '${parts[0][0]}${parts[1][0]}'.toUpperCase(); - } - - return name.isNotEmpty ? name[0].toUpperCase() : '?'; + Widget _buildProfileForm(BuildContext context) { + final auth = context.watch(); + return AccountProfileForm(key: ValueKey(auth.user?.userId ?? 'guest')); } } diff --git a/app/lib/widgets/profile/notifications_settings_section.dart b/app/lib/widgets/profile/notifications_settings_section.dart index c9e97358..222cc599 100644 --- a/app/lib/widgets/profile/notifications_settings_section.dart +++ b/app/lib/widgets/profile/notifications_settings_section.dart @@ -29,17 +29,14 @@ class NotificationsSettingsSection extends StatelessWidget { SettingsToggleRow( label: 'Goal reminders', value: prefs.goalReminders, - onChanged: (value) => prefs.goalReminders = value, ), SettingsToggleRow( label: 'Streak alerts', value: prefs.streakAlerts, - onChanged: (value) => prefs.streakAlerts = value, ), SettingsToggleRow( label: 'Sync status', value: prefs.syncStatusNotifications, - onChanged: (value) => prefs.syncStatusNotifications = value, ), ], ); @@ -53,17 +50,14 @@ class NotificationsSettingsSection extends StatelessWidget { SettingsToggleRow( label: 'Goal reminders', value: prefs.goalReminders, - onChanged: (value) => prefs.goalReminders = value, ), SettingsToggleRow( label: 'Streak alerts', value: prefs.streakAlerts, - onChanged: (value) => prefs.streakAlerts = value, ), SettingsToggleRow( label: 'Sync status', value: prefs.syncStatusNotifications, - onChanged: (value) => prefs.syncStatusNotifications = value, ), ], ); diff --git a/app/lib/widgets/profile/privacy_settings_section.dart b/app/lib/widgets/profile/privacy_settings_section.dart index 3fdc1e24..396ae2a3 100644 --- a/app/lib/widgets/profile/privacy_settings_section.dart +++ b/app/lib/widgets/profile/privacy_settings_section.dart @@ -30,12 +30,11 @@ class PrivacySettingsSection extends StatelessWidget { SettingsToggleRow( label: 'Analytics', value: prefs.analyticsOptIn, - onChanged: (value) => prefs.analyticsOptIn = value, ), - SettingsRow(label: 'Privacy policy', onTap: () {}), - SettingsRow(label: 'Export all data', onTap: () {}), - SettingsRow(label: 'Import data', onTap: () {}), - SettingsRow(label: 'Clear local data', onTap: () {}), + const SettingsRow(label: 'Privacy policy', enabled: false), + const SettingsRow(label: 'Export all data', enabled: false), + const SettingsRow(label: 'Import data', enabled: false), + const SettingsRow(label: 'Clear local data', enabled: false), ], ); } @@ -52,7 +51,6 @@ class PrivacySettingsSection extends StatelessWidget { SettingsToggleRow( label: 'Send anonymous usage data', value: prefs.analyticsOptIn, - onChanged: (value) => prefs.analyticsOptIn = value, ), Padding( padding: const EdgeInsets.symmetric(horizontal: Spacing.sm), @@ -70,15 +68,15 @@ class PrivacySettingsSection extends StatelessWidget { SettingsCard( title: 'Data management', children: [ - SettingsRow(label: 'Export all data', onTap: () {}), - SettingsRow(label: 'Import data', onTap: () {}), - SettingsRow(label: 'Clear local data', onTap: () {}), + const SettingsRow(label: 'Export all data', enabled: false), + const SettingsRow(label: 'Import data', enabled: false), + const SettingsRow(label: 'Clear local data', enabled: false), ], ), const SizedBox(height: Spacing.lg), SettingsCard( title: 'Legal', - children: [SettingsRow(label: 'Privacy policy', onTap: () {})], + children: [const SettingsRow(label: 'Privacy policy', enabled: false)], ), ], ); diff --git a/app/lib/widgets/profile/profile_header.dart b/app/lib/widgets/profile/profile_header.dart deleted file mode 100644 index 57c59821..00000000 --- a/app/lib/widgets/profile/profile_header.dart +++ /dev/null @@ -1,166 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:papyrus/themes/design_tokens.dart'; - -/// Header section for the profile page displaying user avatar, name, and email. -/// -/// Supports two display modes: -/// - **Mobile**: Centered vertical layout with rounded avatar -/// - **Desktop**: Horizontal layout with avatar alongside user info -/// -/// ## Features -/// -/// - Circular avatar with network image or initials fallback -/// - User display name and email -/// - Optional "Edit Profile" button -/// - Responsive sizing based on display mode -/// -/// ## Example -/// -/// ```dart -/// ProfileHeader( -/// displayName: 'John Doe', -/// email: 'john@email.com', -/// avatarUrl: user.photoURL, -/// onEditProfile: () => context.push('/profile/edit'), -/// ) -/// ``` -class ProfileHeader extends StatelessWidget { - /// User's display name. - final String displayName; - - /// User's email address. - final String email; - - /// URL for the user's avatar image. - final String? avatarUrl; - - /// Called when "Edit Profile" button is tapped. - final VoidCallback? onEditProfile; - - /// Whether to use desktop horizontal layout. - final bool isDesktopLayout; - - /// Creates a profile header widget. - const ProfileHeader({ - super.key, - required this.displayName, - required this.email, - this.avatarUrl, - this.onEditProfile, - this.isDesktopLayout = false, - }); - - /// Gets user initials from display name. - String get _initials { - final parts = displayName.split(' '); - - if (parts.length >= 2) { - return '${parts[0][0]}${parts[1][0]}'.toUpperCase(); - } - - return displayName.isNotEmpty ? displayName[0].toUpperCase() : '?'; - } - - @override - Widget build(BuildContext context) { - if (isDesktopLayout) { - return _buildDesktopHeader(context); - } - - return _buildMobileHeader(context); - } - - /// Mobile layout with centered vertical alignment. - Widget _buildMobileHeader(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - - return Column( - children: [ - _buildAvatar(context, size: 128, borderRadius: 64), - const SizedBox(height: Spacing.md), - Text(displayName, style: textTheme.headlineSmall, textAlign: TextAlign.center), - const SizedBox(height: Spacing.xs), - Text( - email, - style: textTheme.bodyMedium?.copyWith(color: colorScheme.onSurfaceVariant), - textAlign: TextAlign.center, - ), - const SizedBox(height: Spacing.md), - SizedBox( - width: 200, - height: 40, - child: OutlinedButton(onPressed: onEditProfile, child: const Text('Edit profile')), - ), - ], - ); - } - - /// Desktop layout with horizontal avatar and info alignment. - Widget _buildDesktopHeader(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - - return Container( - padding: const EdgeInsets.all(Spacing.lg), - decoration: BoxDecoration( - color: colorScheme.surfaceContainerLow, - borderRadius: BorderRadius.circular(AppRadius.lg), - ), - child: Row( - children: [ - _buildAvatar(context, size: 96, borderRadius: 48), - const SizedBox(width: Spacing.lg), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text(displayName, style: textTheme.headlineMedium), - const SizedBox(height: Spacing.xs), - Text(email, style: textTheme.bodyLarge?.copyWith(color: colorScheme.onSurfaceVariant)), - ], - ), - ), - const SizedBox(width: Spacing.md), - OutlinedButton( - // Override the theme's infinite-width minimumSize for Row usage. - style: OutlinedButton.styleFrom(minimumSize: Size.zero), - onPressed: onEditProfile, - child: const Text('Edit profile'), - ), - ], - ), - ); - } - - /// Builds circular avatar for standard modes. - Widget _buildAvatar(BuildContext context, {required double size, required double borderRadius}) { - final colorScheme = Theme.of(context).colorScheme; - final textTheme = Theme.of(context).textTheme; - - return Container( - width: size, - height: size, - decoration: BoxDecoration(borderRadius: BorderRadius.circular(borderRadius), color: colorScheme.primaryContainer), - clipBehavior: Clip.antiAlias, - child: avatarUrl != null && avatarUrl!.isNotEmpty - ? Image.network( - avatarUrl!, - fit: BoxFit.cover, - errorBuilder: (_, _, _) => _buildInitialsAvatar(context, colorScheme, textTheme, size), - ) - : _buildInitialsAvatar(context, colorScheme, textTheme, size), - ); - } - - /// Builds initials fallback for avatar. - Widget _buildInitialsAvatar(BuildContext context, ColorScheme colorScheme, TextTheme textTheme, double size) { - return Center( - child: Text( - _initials, - style: textTheme.headlineMedium?.copyWith(color: colorScheme.onPrimaryContainer, fontSize: size * 0.35), - ), - ); - } -} diff --git a/app/lib/widgets/profile/profile_picker_sheet.dart b/app/lib/widgets/profile/profile_picker_sheet.dart index bce7c100..675b8a37 100644 --- a/app/lib/widgets/profile/profile_picker_sheet.dart +++ b/app/lib/widgets/profile/profile_picker_sheet.dart @@ -14,6 +14,7 @@ void showProfilePickerSheet( sheetAnimationStyle: AppMotion.animationStyle(context), context: context, isScrollControlled: true, + useRootNavigator: true, useSafeArea: true, builder: (sheetContext) => AppBottomSheet( header: Text(title, style: Theme.of(sheetContext).textTheme.titleMedium), @@ -24,16 +25,20 @@ void showProfilePickerSheet( final colorScheme = Theme.of(sheetContext).colorScheme; final isSelected = selected == item.$2; - return ListTile( - title: Text(item.$1), - leading: Icon( - isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked, - color: isSelected ? colorScheme.primary : colorScheme.outline, + return Semantics( + checked: isSelected, + inMutuallyExclusiveGroup: true, + child: ListTile( + title: Text(item.$1), + leading: Icon( + isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked, + color: isSelected ? colorScheme.primary : colorScheme.outline, + ), + onTap: () { + onSelected(item.$2); + Navigator.pop(sheetContext); + }, ), - onTap: () { - onSelected(item.$2); - Navigator.pop(sheetContext); - }, ); }).toList(), ), diff --git a/app/lib/widgets/profile/storage_sync_settings_section.dart b/app/lib/widgets/profile/storage_sync_settings_section.dart index c9a65eae..0ccb8575 100644 --- a/app/lib/widgets/profile/storage_sync_settings_section.dart +++ b/app/lib/widgets/profile/storage_sync_settings_section.dart @@ -324,6 +324,7 @@ class StorageSyncSettingsSection extends StatelessWidget { showModalBottomSheet( sheetAnimationStyle: AppMotion.animationStyle(context), context: context, + useRootNavigator: true, isScrollControlled: true, useSafeArea: true, builder: (sheetContext) => AppBottomSheet( diff --git a/app/lib/widgets/settings/settings_row.dart b/app/lib/widgets/settings/settings_row.dart index 63fb99db..a740ad83 100644 --- a/app/lib/widgets/settings/settings_row.dart +++ b/app/lib/widgets/settings/settings_row.dart @@ -143,17 +143,51 @@ class SettingsToggleRow extends StatelessWidget { Widget build(BuildContext context) { final textTheme = Theme.of(context).textTheme; - return Padding( - padding: const EdgeInsets.symmetric(horizontal: Spacing.sm, vertical: Spacing.xs), - child: Row( - children: [ - Expanded(child: Text(label, style: textTheme.bodyLarge)), - AppMotionControl( - value: value, - enabled: onChanged != null, - builder: (focusNode) => Switch(focusNode: focusNode, value: value, onChanged: onChanged), + final enabled = onChanged != null; + final toggle = enabled ? () => onChanged!(!value) : null; + + return MergeSemantics( + child: Semantics( + toggled: value, + enabled: enabled, + onTap: toggle, + child: AppMotionControl( + value: value, + enabled: enabled, + builder: (focusNode) => InkWell( + hoverColor: Colors.transparent, + focusNode: focusNode, + canRequestFocus: enabled, + onTap: toggle, + excludeFromSemantics: true, + borderRadius: BorderRadius.circular(AppRadius.sm), + child: ConstrainedBox( + constraints: const BoxConstraints(minHeight: TouchTargets.mobileRecommended), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: Spacing.sm, vertical: Spacing.xs), + child: Row( + children: [ + Expanded( + child: Text( + label, + style: textTheme.bodyLarge?.copyWith( + color: enabled ? null : Theme.of(context).disabledColor, + ), + ), + ), + ExcludeSemantics( + child: ExcludeFocus( + child: IgnorePointer( + child: Switch(value: value, onChanged: onChanged), + ), + ), + ), + ], + ), + ), + ), ), - ], + ), ), ); } diff --git a/app/lib/widgets/settings/settings_section.dart b/app/lib/widgets/settings/settings_section.dart index 8d8394fa..85b54046 100644 --- a/app/lib/widgets/settings/settings_section.dart +++ b/app/lib/widgets/settings/settings_section.dart @@ -7,9 +7,14 @@ import 'package:papyrus/themes/design_tokens.dart'; class SettingsSectionHeader extends StatelessWidget { /// Section title text. final String title; + final EdgeInsetsGeometry padding; /// Creates a settings section header. - const SettingsSectionHeader({super.key, required this.title}); + const SettingsSectionHeader({ + super.key, + required this.title, + this.padding = const EdgeInsets.only(top: Spacing.lg, bottom: Spacing.md), + }); @override Widget build(BuildContext context) { @@ -17,13 +22,12 @@ class SettingsSectionHeader extends StatelessWidget { final textTheme = Theme.of(context).textTheme; return Padding( - padding: const EdgeInsets.only(top: Spacing.lg, bottom: Spacing.sm), - child: Text( - title, - style: textTheme.labelMedium?.copyWith( - color: colorScheme.onSurfaceVariant, - fontWeight: FontWeight.w500, - letterSpacing: 0.5, + padding: padding, + child: Semantics( + header: true, + child: Text( + title, + style: textTheme.titleLarge?.copyWith(color: colorScheme.onSurface, fontWeight: FontWeight.w600), ), ), ); diff --git a/app/lib/widgets/shared/app_bottom_sheet.dart b/app/lib/widgets/shared/app_bottom_sheet.dart index 5fe0d4fd..376888ba 100644 --- a/app/lib/widgets/shared/app_bottom_sheet.dart +++ b/app/lib/widgets/shared/app_bottom_sheet.dart @@ -64,29 +64,36 @@ class AppBottomSheet extends StatelessWidget { return Padding(padding: contentPadding, child: body); } - Widget buildFrame(ScrollController? controller, {required bool compact}) => SafeArea( - top: false, - bottom: footer == null, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - BottomSheetHeader( - key: headerKey ?? const Key('bottom-sheet-header'), - title: header == null ? title : null, - onDismiss: dismiss, - compact: compact, - child: header, - ), - const Divider(height: 1), - Flexible( - fit: expandBody ? FlexFit.tight : FlexFit.loose, - child: buildBody(controller), - ), - if (footer != null) BottomSheetFooter(key: footerKey, child: footer!), - ], - ), - ); + Widget buildFrame(ScrollController? controller, {required bool compact}) { + final sheetHeader = BottomSheetHeader( + key: headerKey ?? const Key('bottom-sheet-header'), + title: header == null ? title : null, + onDismiss: dismiss, + compact: compact, + child: header, + ); + + return SafeArea( + top: false, + bottom: footer == null, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (MediaQuery.textScalerOf(context).scale(16) > 32) + Flexible(child: SingleChildScrollView(primary: false, child: sheetHeader)) + else + sheetHeader, + const Divider(height: 1), + Flexible( + fit: expandBody ? FlexFit.tight : FlexFit.loose, + child: buildBody(controller), + ), + if (footer != null) BottomSheetFooter(key: footerKey, child: footer!), + ], + ), + ); + } return Padding( padding: EdgeInsets.only(bottom: avoidKeyboard ? MediaQuery.viewInsetsOf(context).bottom : 0), diff --git a/app/lib/widgets/shared/app_motion_control.dart b/app/lib/widgets/shared/app_motion_control.dart index 623171bc..60e25880 100644 --- a/app/lib/widgets/shared/app_motion_control.dart +++ b/app/lib/widgets/shared/app_motion_control.dart @@ -30,6 +30,10 @@ class _AppMotionControlState extends State { if (_previousKey != null && key != _previousKey && focusNode.hasFocus) { WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted && focusNode.canRequestFocus) { + // A replacement control can inherit an already-focused node without + // receiving the focus event that paints its native highlight. + focusNode.unfocus(disposition: UnfocusDisposition.previouslyFocusedChild); + FocusManager.instance.applyFocusChangesIfNeeded(); focusNode.requestFocus(); } }); diff --git a/app/lib/widgets/shell/adaptive_app_shell.dart b/app/lib/widgets/shell/adaptive_app_shell.dart index 943d82d8..6a6ec26e 100644 --- a/app/lib/widgets/shell/adaptive_app_shell.dart +++ b/app/lib/widgets/shell/adaptive_app_shell.dart @@ -107,7 +107,12 @@ class AdaptiveAppShell extends StatelessWidget { icon: Icons.bar_chart_outlined, selectedIcon: Icons.bar_chart, ), - const AppShellNavItem(path: '/profile', label: 'Profile', icon: Icons.person_outline, selectedIcon: Icons.person), + const AppShellNavItem( + path: '/profile', + label: 'Settings', + icon: Icons.settings_outlined, + selectedIcon: Icons.settings, + ), ]; } @@ -136,7 +141,7 @@ class AdaptiveAppShell extends StatelessWidget { currentPath: GoRouterState.of(context).uri.toString(), onNavigate: (path) => context.go(path), ), - Expanded(child: child), + Expanded(child: Semantics(container: true, child: child)), ], ), ); @@ -147,11 +152,14 @@ class AdaptiveAppShell extends StatelessWidget { final isInLibrary = currentPath.startsWith('/library'); return Scaffold( - body: isInLibrary - ? Builder( - builder: (context) => AppDrawerScope(scaffold: Scaffold.of(context), child: child), - ) - : child, + body: Semantics( + container: true, + child: isInLibrary + ? Builder( + builder: (context) => AppDrawerScope(scaffold: Scaffold.of(context), child: child), + ) + : child, + ), bottomNavigationBar: MobileBottomNav( items: navItems, currentPath: currentPath, diff --git a/app/lib/widgets/shell/desktop_sidebar.dart b/app/lib/widgets/shell/desktop_sidebar.dart index e426f441..03684648 100644 --- a/app/lib/widgets/shell/desktop_sidebar.dart +++ b/app/lib/widgets/shell/desktop_sidebar.dart @@ -36,7 +36,7 @@ class DesktopSidebar extends StatelessWidget { width: sidebarWidth, child: DecoratedBox( decoration: BoxDecoration( - color: colorScheme.surfaceContainerLow, + color: colorScheme.surface, border: Border(right: BorderSide(color: colorScheme.outlineVariant, width: 1)), ), child: Column( @@ -78,11 +78,15 @@ class DesktopSidebar extends StatelessWidget { child: Row( mainAxisAlignment: isCollapsed ? MainAxisAlignment.center : MainAxisAlignment.start, children: [ - // Logo icon from SVG - SvgPicture.asset( - isDark ? 'assets/images/logo-icon-dark.svg' : 'assets/images/logo-icon-light.svg', - width: 40, - height: 40, + SizedBox.square( + dimension: 40, + child: Center( + child: SvgPicture.asset( + isDark ? 'assets/images/logo-icon-dark.svg' : 'assets/images/logo-icon-light.svg', + width: 40, + height: 40, + ), + ), ), if (!isCollapsed) ...[ const SizedBox(width: Spacing.sm), @@ -114,54 +118,59 @@ class DesktopSidebar extends StatelessWidget { return _buildExpandableNavItem(context, item, isCollapsed); } - return Padding( - padding: const EdgeInsets.symmetric(horizontal: Spacing.sm, vertical: 2), - child: Material( - color: Colors.transparent, - borderRadius: BorderRadius.circular(AppRadius.md), - child: InkWell( + return Semantics( + label: isCollapsed ? item.label : null, + selected: isSelected, + button: true, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: Spacing.sm, vertical: 2), + child: Material( + color: Colors.transparent, borderRadius: BorderRadius.circular(AppRadius.md), - onTap: () { - if (hasChildren && isCollapsed) { - // When collapsed with children, expand sidebar and navigate - sidebarProvider.setCollapsed(false); - sidebarProvider.setLibraryExpanded(true); - } + child: InkWell( + borderRadius: BorderRadius.circular(AppRadius.md), + onTap: () { + if (hasChildren && isCollapsed) { + // When collapsed with children, expand sidebar and navigate + sidebarProvider.setCollapsed(false); + sidebarProvider.setLibraryExpanded(true); + } - onNavigate(item.path); - }, - child: Container( - height: 48, - padding: EdgeInsets.symmetric(horizontal: isCollapsed ? Spacing.md : Spacing.md), - decoration: BoxDecoration( - color: isSelected ? Theme.of(context).colorScheme.primaryContainer : Colors.transparent, - borderRadius: BorderRadius.circular(AppRadius.md), - ), - child: Row( - mainAxisAlignment: isCollapsed ? MainAxisAlignment.center : MainAxisAlignment.start, - children: [ - Icon( - isSelected ? item.selectedIcon ?? item.icon : item.icon, - color: isSelected - ? Theme.of(context).colorScheme.onPrimaryContainer - : Theme.of(context).colorScheme.onSurfaceVariant, - size: IconSizes.navigation, - ), - if (!isCollapsed) ...[ - const SizedBox(width: Spacing.md), - Expanded( - child: Text( - item.label, - style: Theme.of(context).textTheme.bodyLarge?.copyWith( - color: isSelected - ? Theme.of(context).colorScheme.onPrimaryContainer - : Theme.of(context).colorScheme.onSurfaceVariant, - fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, + onNavigate(item.path); + }, + child: Container( + constraints: const BoxConstraints(minHeight: TouchTargets.mobileRecommended), + padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm), + decoration: BoxDecoration( + color: isSelected ? Theme.of(context).colorScheme.primaryContainer : Colors.transparent, + borderRadius: BorderRadius.circular(AppRadius.md), + ), + child: Row( + mainAxisAlignment: isCollapsed ? MainAxisAlignment.center : MainAxisAlignment.start, + children: [ + Icon( + isSelected ? item.selectedIcon ?? item.icon : item.icon, + color: isSelected + ? Theme.of(context).colorScheme.onPrimaryContainer + : Theme.of(context).colorScheme.onSurfaceVariant, + size: IconSizes.navigation, + ), + if (!isCollapsed) ...[ + const SizedBox(width: Spacing.md), + Expanded( + child: Text( + item.label, + style: Theme.of(context).textTheme.bodyLarge?.copyWith( + color: isSelected + ? Theme.of(context).colorScheme.onPrimaryContainer + : Theme.of(context).colorScheme.onSurfaceVariant, + fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, + ), ), ), - ), + ], ], - ], + ), ), ), ), @@ -192,8 +201,8 @@ class DesktopSidebar extends StatelessWidget { } }, child: Container( - height: 48, - padding: const EdgeInsets.symmetric(horizontal: Spacing.md), + constraints: const BoxConstraints(minHeight: TouchTargets.mobileRecommended), + padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm), decoration: BoxDecoration( color: hasSelectedBackground ? Theme.of(context).colorScheme.primaryContainer : Colors.transparent, borderRadius: BorderRadius.circular(AppRadius.md), @@ -248,55 +257,57 @@ class DesktopSidebar extends StatelessWidget { Widget _buildChildNavItem(BuildContext context, AppShellNavItem item) { final isSelected = currentPath.startsWith(item.path); - return Padding( - padding: const EdgeInsets.only(left: Spacing.xl + Spacing.sm, right: Spacing.sm, top: 2, bottom: 2), - child: Material( - color: Colors.transparent, - borderRadius: BorderRadius.circular(AppRadius.md), - child: InkWell( + return Semantics( + selected: isSelected, + button: true, + child: Padding( + padding: const EdgeInsets.only(left: Spacing.xl + Spacing.sm, right: Spacing.sm, top: 2, bottom: 2), + child: Material( + color: Colors.transparent, borderRadius: BorderRadius.circular(AppRadius.md), - onTap: () => onNavigate(item.path), - child: Container( - height: 40, - padding: const EdgeInsets.symmetric(horizontal: Spacing.md), - decoration: BoxDecoration( - color: isSelected ? Theme.of(context).colorScheme.primaryContainer : Colors.transparent, - borderRadius: BorderRadius.circular(AppRadius.md), - ), - child: Row( - children: [ - Icon( - isSelected ? item.selectedIcon ?? item.icon : item.icon, - color: isSelected - ? Theme.of(context).colorScheme.onPrimaryContainer - : Theme.of(context).colorScheme.onSurfaceVariant, - size: IconSizes.small, - ), - const SizedBox(width: Spacing.sm), - Expanded( - child: Row( - children: [ - Expanded( - child: Text( - item.label, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - color: isSelected - ? Theme.of(context).colorScheme.onPrimaryContainer - : Theme.of(context).colorScheme.onSurfaceVariant, - fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, + child: InkWell( + borderRadius: BorderRadius.circular(AppRadius.md), + onTap: () => onNavigate(item.path), + child: Container( + constraints: const BoxConstraints(minHeight: TouchTargets.mobileRecommended), + padding: const EdgeInsets.symmetric(horizontal: Spacing.md, vertical: Spacing.sm), + decoration: BoxDecoration( + color: isSelected ? Theme.of(context).colorScheme.primaryContainer : Colors.transparent, + borderRadius: BorderRadius.circular(AppRadius.md), + ), + child: Row( + children: [ + Icon( + isSelected ? item.selectedIcon ?? item.icon : item.icon, + color: isSelected + ? Theme.of(context).colorScheme.onPrimaryContainer + : Theme.of(context).colorScheme.onSurfaceVariant, + size: IconSizes.small, + ), + const SizedBox(width: Spacing.sm), + Expanded( + child: Row( + children: [ + Expanded( + child: Text( + item.label, + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: isSelected + ? Theme.of(context).colorScheme.onPrimaryContainer + : Theme.of(context).colorScheme.onSurfaceVariant, + fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, + ), ), ), - ), - if ((item.count ?? 0) > 0) ...[ - const SizedBox(width: Spacing.xs), - NavItemCount(count: item.count!, selected: isSelected), + if ((item.count ?? 0) > 0) ...[ + const SizedBox(width: Spacing.xs), + NavItemCount(count: item.count!, selected: isSelected), + ], ], - ], + ), ), - ), - ], + ], + ), ), ), ), @@ -307,30 +318,34 @@ class DesktopSidebar extends StatelessWidget { Widget _buildCollapseToggle(BuildContext context, bool isCollapsed) { final sidebarProvider = context.read(); - return Material( - color: Colors.transparent, - child: InkWell( - onTap: () => sidebarProvider.toggleCollapsed(), - child: Container( - height: 56, - padding: const EdgeInsets.symmetric(horizontal: Spacing.md), - child: Row( - mainAxisAlignment: isCollapsed ? MainAxisAlignment.center : MainAxisAlignment.start, - children: [ - Icon( - isCollapsed ? Icons.chevron_right : Icons.chevron_left, - color: Theme.of(context).colorScheme.onSurfaceVariant, - ), - if (!isCollapsed) ...[ - const SizedBox(width: Spacing.md), - Text( - '', - style: Theme.of( - context, - ).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), + return Semantics( + label: isCollapsed ? 'Expand sidebar' : 'Collapse sidebar', + button: true, + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () => sidebarProvider.toggleCollapsed(), + child: Container( + height: 56, + padding: const EdgeInsets.symmetric(horizontal: Spacing.md), + child: Row( + mainAxisAlignment: isCollapsed ? MainAxisAlignment.center : MainAxisAlignment.start, + children: [ + Icon( + isCollapsed ? Icons.chevron_right : Icons.chevron_left, + color: Theme.of(context).colorScheme.onSurfaceVariant, ), + if (!isCollapsed) ...[ + const SizedBox(width: Spacing.md), + Text( + '', + style: Theme.of( + context, + ).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), + ), + ], ], - ], + ), ), ), ), diff --git a/app/lib/widgets/shell/mobile_bottom_nav.dart b/app/lib/widgets/shell/mobile_bottom_nav.dart index 01ba1d38..daa1cbc5 100644 --- a/app/lib/widgets/shell/mobile_bottom_nav.dart +++ b/app/lib/widgets/shell/mobile_bottom_nav.dart @@ -17,19 +17,54 @@ class MobileBottomNav extends StatelessWidget { final mainItems = items.where((item) => !isChildPath(item.path)).toList(); final currentIndex = _getCurrentIndex(mainItems); + void navigate(int index) { + final item = mainItems[index]; + onNavigate(item.path == '/library' ? '/library/books' : item.path); + } + + // Material's NavigationBar caps label scaling. Keep enlarged labels fully + // readable and keyboard reachable in a horizontally scrollable alternative. + if (MediaQuery.textScalerOf(context).scale(14) > 14 * 1.3) { + final colors = Theme.of(context).colorScheme; + + return Material( + color: colors.surface, + child: SafeArea( + top: false, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: List.generate(mainItems.length, (index) { + final item = mainItems[index]; + final selected = currentIndex == index; + + return Semantics( + selected: selected, + child: Padding( + padding: const EdgeInsets.all(4), + child: TextButton.icon( + style: TextButton.styleFrom( + minimumSize: const Size(48, 48), + backgroundColor: selected ? colors.primaryContainer : null, + foregroundColor: selected ? colors.onPrimaryContainer : colors.onSurface, + ), + onPressed: () => navigate(index), + icon: Icon(selected ? item.selectedIcon ?? item.icon : item.icon), + label: Text(item.label), + ), + ), + ); + }), + ), + ), + ), + ); + } + return NavigationBar( animationDuration: AppMotion.duration(context, const Duration(milliseconds: 500)), selectedIndex: currentIndex, - onDestinationSelected: (index) { - final item = mainItems[index]; - // For library, navigate to books subpage - - if (item.path == '/library') { - onNavigate('/library/books'); - } else { - onNavigate(item.path); - } - }, + onDestinationSelected: navigate, destinations: mainItems.map((item) { return NavigationDestination( icon: Icon(item.icon), diff --git a/app/lib/widgets/titled_divider.dart b/app/lib/widgets/titled_divider.dart index e4ef191a..df43a212 100644 --- a/app/lib/widgets/titled_divider.dart +++ b/app/lib/widgets/titled_divider.dart @@ -16,16 +16,31 @@ class TitledDivider extends StatelessWidget { final theme = Theme.of(context); final padding = verticalPadding ?? Spacing.lg; + Widget line(EdgeInsets padding) => ConstrainedBox( + constraints: const BoxConstraints(minWidth: Spacing.xl), + child: Padding( + padding: padding, + child: Divider(thickness: 1.5, color: theme.colorScheme.outlineVariant), + ), + ); + return Padding( padding: EdgeInsets.symmetric(vertical: padding), - child: Row( + child: Table( + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + columnWidths: const {0: FlexColumnWidth(), 1: IntrinsicColumnWidth(), 2: FlexColumnWidth()}, children: [ - Expanded(child: Divider(thickness: 1.5, color: theme.colorScheme.outlineVariant)), - Padding( - padding: const EdgeInsets.symmetric(horizontal: Spacing.md), - child: Text(title, style: theme.textTheme.titleSmall?.copyWith(color: theme.colorScheme.outline)), + TableRow( + children: [ + line(const EdgeInsets.only(right: Spacing.md)), + Text( + title, + textAlign: TextAlign.center, + style: theme.textTheme.titleSmall?.copyWith(color: theme.colorScheme.onSurfaceVariant), + ), + line(const EdgeInsets.only(left: Spacing.md)), + ], ), - Expanded(child: Divider(thickness: 1.5, color: theme.colorScheme.outlineVariant)), ], ), ); diff --git a/app/pubspec.yaml b/app/pubspec.yaml index e0ca4d2b..cea48162 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -76,8 +76,19 @@ flutter: - assets/images/book_placeholder.jpg - assets/images/auth-illustration.png - assets/images/welcome-illustration.png + - fonts/OpenDyslexic/OFL.txt fonts: - family: MadimiOne fonts: - asset: fonts/MadimiOne-Regular.ttf + - family: OpenDyslexic + fonts: + - asset: fonts/OpenDyslexic/OpenDyslexic-Regular.otf + - asset: fonts/OpenDyslexic/OpenDyslexic-Bold.otf + weight: 700 + - asset: fonts/OpenDyslexic/OpenDyslexic-Italic.otf + style: italic + - asset: fonts/OpenDyslexic/OpenDyslexic-BoldItalic.otf + weight: 700 + style: italic diff --git a/app/test/auth/auth_api_client_test.dart b/app/test/auth/auth_api_client_test.dart index d7999b3d..387e69df 100644 --- a/app/test/auth/auth_api_client_test.dart +++ b/app/test/auth/auth_api_client_test.dart @@ -26,6 +26,44 @@ const _authResponse = { }; void main() { + test('profile photos upload with the name and download only from the configured server', () async { + const avatarUrl = '/users/me/avatar/11111111-1111-1111-1111-111111111111'; + var calls = 0; + final client = AuthApiClient( + config: PapyrusApiConfig(serverBaseUri: Uri.parse('https://server.test'), apiPrefix: '/api/v2'), + httpClient: MockClient((request) async { + calls++; + expect(request.headers['Authorization'], 'Bearer access'); + expect(request.url.host, 'server.test'); + + if (request.method == 'POST') { + expect(request.url.path, '/api/v2/users/me/avatar'); + expect(request.headers['content-type'], startsWith('multipart/form-data')); + expect(request.body, contains('name="display_name"')); + expect(request.body, contains('Updated Reader')); + expect(request.body, contains('filename="avatar.jpg"')); + return http.Response(jsonEncode({..._authResponse['user']! as Map, 'avatar_url': avatarUrl}), 200); + } + + expect(request.url.path, '/api/v2$avatarUrl'); + return http.Response.bytes([1, 2, 3], 200); + }), + ); + + final user = await client.uploadProfilePhoto( + 'access', + Uint8List.fromList([1, 2, 3]), + displayName: 'Updated Reader', + ); + expect(user.avatarUrl, avatarUrl); + expect(await client.downloadProfilePhoto('access', avatarUrl), [1, 2, 3]); + await expectLater( + client.downloadProfilePhoto('access', 'https://other.test/photo.jpg'), + throwsA(isA()), + ); + expect(calls, 2); + }); + test('login maps Papyrus token response', () async { final client = AuthApiClient( config: PapyrusApiConfig(serverBaseUri: Uri.parse('http://server.test')), diff --git a/app/test/auth/profile_photo_contract_test.dart b/app/test/auth/profile_photo_contract_test.dart new file mode 100644 index 00000000..f7ff2788 --- /dev/null +++ b/app/test/auth/profile_photo_contract_test.dart @@ -0,0 +1,115 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:http/http.dart' as http; +import 'package:http/testing.dart'; +import 'package:papyrus/auth/auth_api_client.dart'; +import 'package:papyrus/auth/auth_models.dart'; +import 'package:papyrus/auth/auth_repository.dart'; +import 'package:papyrus/auth/papyrus_api_config.dart'; +import 'package:papyrus/auth/token_store.dart'; +import 'package:papyrus/providers/auth_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../providers/auth_provider_test.dart' show FakeAuthRepository, MemoryRefreshTokenStorage; + +const _avatarUrl = '/users/me/avatar/11111111-1111-1111-1111-111111111111'; +const _userJson = { + 'user_id': 'reader', + 'email': 'reader@example.com', + 'display_name': 'Reader', + 'avatar_url': _avatarUrl, + 'email_verified': true, + 'connected_providers': [], +}; + +class _DelayedRepository extends FakeAuthRepository { + final saved = Completer(); + + @override + Future uploadProfilePhoto(Uint8List bytes, {required String displayName}) => saved.future; +} + +void main() { + test('photo upload and download retry with refreshed credentials', () async { + for (final uploading in [true, false]) { + var attempts = 0; + var refreshes = 0; + final store = TokenStore(MemoryRefreshTokenStorage()); + await store.saveTokens(accessToken: 'expired-access', refreshToken: 'refresh'); + + final repository = AuthRepository( + tokenStore: store, + apiClient: AuthApiClient( + config: PapyrusApiConfig(serverBaseUri: Uri.parse('https://server.test')), + httpClient: MockClient((request) async { + if (request.url.path == '/v1/auth/refresh') { + refreshes++; + return http.Response( + jsonEncode({ + 'access_token': 'fresh-access', + 'refresh_token': 'fresh-refresh', + 'token_type': 'Bearer', + 'expires_in': 3600, + 'user': _userJson, + }), + 200, + ); + } + + attempts++; + + if (attempts == 1) { + return http.Response( + jsonEncode({ + 'error': {'message': 'Expired'}, + }), + 401, + ); + } + + expect(request.headers['Authorization'], 'Bearer fresh-access'); + return uploading ? http.Response(jsonEncode(_userJson), 200) : http.Response.bytes([1, 2, 3], 200); + }), + ), + ); + + if (uploading) { + expect((await repository.uploadProfilePhoto(Uint8List(3), displayName: 'Reader')).avatarUrl, _avatarUrl); + } else { + expect(await repository.downloadProfilePhoto(_avatarUrl), [1, 2, 3]); + } + + expect(attempts, 2); + expect(refreshes, 1); + } + }); + + test('an upload completing after a server switch does not replace the active profile', () async { + SharedPreferences.setMockInitialValues({}); + final tokens = AuthTokens( + accessToken: 'access', + refreshToken: 'refresh', + tokenType: 'Bearer', + expiresIn: 3600, + user: PapyrusUser.fromJson(_userJson), + ); + + final repository = _DelayedRepository()..bootstrapResult = tokens; + final provider = AuthProvider( + await SharedPreferences.getInstance(), + repository: repository, + bootstrapOnCreate: false, + ); + addTearDown(provider.dispose); + await provider.bootstrap(); + final saved = provider.updateProfile(displayName: 'New name', photoBytes: Uint8List(3)); + await provider.replaceRepository(FakeAuthRepository(), bootstrapNewRepository: false); + repository.saved.complete(tokens.user); + expect(await saved, isFalse); + expect(provider.user, isNull); + expect(provider.isSignedIn, isFalse); + }); +} diff --git a/app/test/opds/layout_test.dart b/app/test/opds/layout_test.dart index d51c4dbf..de600cf6 100644 --- a/app/test/opds/layout_test.dart +++ b/app/test/opds/layout_test.dart @@ -20,6 +20,7 @@ import 'package:papyrus/opds/opds_http_client.dart'; import 'package:papyrus/opds/opds_library.dart'; import 'package:papyrus/opds/opds_resource_cache.dart'; import 'package:papyrus/widgets/opds/opds_publication_details.dart'; +import 'package:papyrus/widgets/shell/mobile_bottom_nav.dart'; import 'package:papyrus/widgets/book_details/book_details_tab_rail.dart'; import 'package:papyrus/opds/opds_models.dart'; import 'package:papyrus/pages/catalog_book_page.dart'; @@ -406,7 +407,7 @@ void main() { expect( tester.getBottomRight(find.byType(FloatingActionButton)).dy, - lessThan(tester.getTopLeft(find.byType(NavigationBar)).dy), + lessThan(tester.getTopLeft(find.byType(MobileBottomNav)).dy), ); expect( diff --git a/app/test/pages/account_deletion_dialog_test.dart b/app/test/pages/account_deletion_dialog_test.dart index 4514f186..e3eb2906 100644 --- a/app/test/pages/account_deletion_dialog_test.dart +++ b/app/test/pages/account_deletion_dialog_test.dart @@ -14,6 +14,7 @@ import 'package:papyrus/pages/login_page.dart'; import 'package:papyrus/pages/auth/oauth_callback_page.dart'; import 'package:papyrus/themes/app_theme.dart'; import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/services/guest_account_deletion_service.dart'; import 'package:papyrus/widgets/profile/account_settings_section.dart'; import 'package:papyrus/widgets/settings/settings_row.dart'; import 'package:provider/provider.dart'; @@ -32,6 +33,24 @@ class _Storage implements RefreshTokenStorage { Future delete() async => value = null; } +class _GuestDeletion extends Fake implements GuestAccountDeletionService { + _GuestDeletion(this.auth); + + @override + final AuthProvider auth; + int calls = 0; + bool fail = false; + + @override + Future delete() => auth.deleteGuestAccount(() async { + calls++; + + if (fail) { + throw StateError('Storage unavailable'); + } + }); +} + class _Repository extends AuthRepository { _Repository({required super.apiClient, required super.tokenStore, required this.connected}); @@ -155,11 +174,17 @@ void main() { addTearDown(auth.dispose); } - Future showPage(WidgetTester tester, {bool desktop = false, bool login = false, String? callback}) async { + Future showPage( + WidgetTester tester, { + bool desktop = false, + bool login = false, + String? callback, + GuestAccountDeletionService? guestDeletion, + }) async { final router = GoRouter( initialLocation: callback ?? (login ? '/login' : '/profile'), refreshListenable: auth, - redirect: (_, state) => state.uri.path == '/profile' && !auth.isSignedIn ? '/login' : null, + redirect: (_, state) => state.uri.path == '/profile' && !auth.isSignedIn && !auth.isOfflineMode ? '/login' : null, routes: [ GoRoute( path: '/auth/callback', @@ -183,8 +208,11 @@ void main() { addTearDown(router.dispose); await tester.pumpWidget( - ChangeNotifierProvider.value( - value: auth, + MultiProvider( + providers: [ + ChangeNotifierProvider.value(value: auth), + if (guestDeletion != null) Provider.value(value: guestDeletion), + ], child: MaterialApp.router(theme: AppTheme.light, routerConfig: router), ), ); @@ -211,6 +239,30 @@ void main() { }); for (final desktop in [false, true]) { + testWidgets('guest deletion can cancel, retry, then return to login, desktop=$desktop', (tester) async { + await setup(signedIn: false); + auth.setOfflineMode(true); + final deletion = _GuestDeletion(auth); + await showPage(tester, desktop: desktop, guestDeletion: deletion); + await openDialog(tester); + expect(find.textContaining('This cannot be undone.'), findsOneWidget); + expect(find.textContaining('30 days'), findsNothing); + await tester.tap(find.widgetWithText(TextButton, 'Cancel')); + await tester.pumpAndSettle(); + expect(deletion.calls, 0); + expect(auth.isOfflineMode, isTrue); + await openDialog(tester); + deletion.fail = true; + await confirm(tester); + expect(find.text('Could not delete all local data. Please try again.'), findsOneWidget); + expect(auth.isOfflineMode, isTrue); + deletion.fail = false; + await confirm(tester); + expect(auth.isOfflineMode, isFalse); + expect(find.byType(LoginPage), findsOneWidget); + expect(requests, isEmpty); + }); + testWidgets('Google deletion completes in the existing session, desktop=$desktop', (tester) async { await setup(connected: true); final size = Size(desktop ? 1200 : 360, 800); @@ -232,7 +284,7 @@ void main() { expect(find.text('Delete account?'), findsOneWidget); expect(find.text('Confirm it’s you'), findsNothing); expect(find.text('Continue with Google'), findsNothing); - expect(find.byType(TextFormField), findsNothing); + expect(find.descendant(of: find.byType(AlertDialog), matching: find.byType(TextFormField)), findsNothing); expect(requests, isEmpty); await tester.tap(find.text('Cancel')); await tester.pumpAndSettle(); diff --git a/app/test/pages/account_profile_form_test.dart b/app/test/pages/account_profile_form_test.dart new file mode 100644 index 00000000..e863bad6 --- /dev/null +++ b/app/test/pages/account_profile_form_test.dart @@ -0,0 +1,198 @@ +import 'dart:typed_data'; + +import 'package:file_picker/file_picker.dart'; +import 'package:image/image.dart' as image; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/auth/auth_models.dart'; +import 'package:papyrus/widgets/profile/account_settings_section.dart'; +import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../providers/auth_provider_test.dart' show FakeAuthRepository; +import '../helpers/support_file_picker.dart'; + +class _Repository extends FakeAuthRepository { + String? savedName; + bool fail = false; + Uint8List? savedPhoto; + int photoDownloads = 0; + + @override + Future updateCurrentUser({String? displayName, String? avatarUrl}) async { + if (fail) { + throw StateError('Offline'); + } + + savedName = displayName; + return _user(displayName!); + } + + @override + Future uploadProfilePhoto(Uint8List bytes, {required String displayName}) async { + if (fail) { + throw StateError('Offline'); + } + + savedName = displayName; + savedPhoto = bytes; + return _user(displayName, avatarUrl: '/users/me/avatar/11111111-1111-1111-1111-111111111111'); + } + + @override + Future downloadProfilePhoto(String avatarUrl) async { + photoDownloads++; + return savedPhoto!; + } +} + +PapyrusUser _user(String name, {String? avatarUrl}) => PapyrusUser( + userId: 'reader', + email: 'reader@example.com', + displayName: name, + avatarUrl: avatarUrl, + emailVerified: true, + createdAt: null, + lastLoginAt: null, +); + +void main() { + for (final guest in [false, true]) { + for (final width in [320.0, 390.0, 1280.0]) { + for (final scale in [1.0, 2.0]) { + testWidgets('Account settings saves inline at $width, scale $scale, guest $guest', (tester) async { + tester.view.physicalSize = Size(width, 900); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + SharedPreferences.setMockInitialValues({'offline_mode': guest}); + + final repository = _Repository() + ..bootstrapResult = AuthTokens( + accessToken: 'access', + refreshToken: 'refresh', + tokenType: 'Bearer', + expiresIn: 3600, + user: _user('Reader'), + ); + + final auth = AuthProvider( + await SharedPreferences.getInstance(), + repository: repository, + bootstrapOnCreate: false, + ); + + await auth.bootstrap(); + addTearDown(auth.dispose); + + final app = ChangeNotifierProvider.value( + value: auth, + child: MaterialApp( + theme: AppTheme.dark.copyWith(visualDensity: VisualDensity.compact), + home: Scaffold( + body: SingleChildScrollView(child: AccountSettingsSection(isDesktop: width >= 840)), + ), + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.linear(scale)), + child: child!, + ), + ), + ); + await tester.pumpWidget(app); + + await tester.pumpAndSettle(); + expect(tester.widget(find.widgetWithText(FilledButton, 'Save')).onPressed, isNull); + expect(find.text('Change photo'), findsNothing); + expect(find.text('Email'), guest ? findsNothing : findsOneWidget); + expect(find.text('No email provided'), findsNothing); + final avatarCrop = find.descendant(of: find.byTooltip('Change photo'), matching: find.byType(ClipOval)); + final cropSize = tester.getSize(avatarCrop); + expect(cropSize.width, cropSize.height); + expect(tester.getCenter(avatarCrop), tester.getCenter(find.byTooltip('Change photo'))); + final name = find.widgetWithText(TextFormField, 'Display name'); + await tester.ensureVisible(name); + await tester.enterText(name, 'Updated Reader'); + await tester.pump(); + await tester.ensureVisible(find.widgetWithText(FilledButton, 'Save')); + expect(find.widgetWithText(FilledButton, 'Save').hitTestable(), findsOneWidget); + final picker = SupportFilePicker(); + FilePicker.platform = picker; + await tester.ensureVisible(find.byTooltip('Change photo')); + await tester.tap(find.byTooltip('Change photo')); + await tester.pumpAndSettle(); + expect(repository.savedPhoto, isNull); + final photo = image.encodePng(image.Image(width: 8, height: 8)); + picker.result = FilePickerResult([PlatformFile(name: 'photo.png', size: photo.length, bytes: photo)]); + + await tester.runAsync(() async { + await tester.tap(find.byTooltip('Change photo')); + await tester.pump(); + while (find.byTooltip('Opening photo…').evaluate().isNotEmpty) { + await Future.delayed(const Duration(milliseconds: 10)); + await tester.pump(); + } + }); + + await tester.pumpAndSettle(); + expect(repository.savedPhoto, isNull); + await tester.ensureVisible(find.widgetWithText(FilledButton, 'Save')); + if (!guest && width == 390 && scale == 1) { + repository.fail = true; + await tester.tap(find.widgetWithText(FilledButton, 'Save')); + await tester.pumpAndSettle(); + expect(repository.savedName, isNull); + expect(find.text('Updated Reader'), findsOneWidget); + expect(find.textContaining('Please try again.'), findsOneWidget); + repository.fail = false; + } + + final avatarImage = find.descendant(of: find.byTooltip('Change photo'), matching: find.byType(Image)); + final preview = tester.widget(avatarImage).image; + await tester.tap(find.widgetWithText(FilledButton, 'Save')); + await tester.pump(); + expect(tester.widget(avatarImage).image, preview); + await tester.pumpAndSettle(); + expect(tester.widget(avatarImage).image, preview); + if (guest) { + expect(repository.savedName, isNull); + expect(repository.savedPhoto, isNull); + expect(repository.photoDownloads, 0); + expect(auth.profileDisplayName, 'Updated Reader'); + expect(image.decodeJpg(auth.profilePhotoBytes!), isNotNull); + final prefs = await SharedPreferences.getInstance(); + await prefs.reload(); + final restarted = AuthProvider(prefs, repository: _Repository(), bootstrapOnCreate: false); + addTearDown(restarted.dispose); + expect(restarted.profileDisplayName, 'Updated Reader'); + expect(restarted.profilePhotoBytes, auth.profilePhotoBytes); + } else { + expect(repository.savedName, 'Updated Reader'); + expect(repository.savedPhoto, isNotNull); + expect(repository.photoDownloads, 0); + expect(image.decodeJpg(repository.savedPhoto!), isNotNull); + } + expect(find.byType(AccountSettingsSection), findsOneWidget); + expect(find.text('Profile saved.'), findsNothing); + expect(find.text('Edit profile'), findsNothing); + expect(tester.widget(find.widgetWithText(FilledButton, 'Save')).onPressed, isNull); + await tester.pumpWidget(const SizedBox()); + await tester.pumpWidget(app); + await tester.pumpAndSettle(); + expect(avatarImage, findsOneWidget); + final renderedAvatar = find.descendant(of: avatarImage, matching: find.byType(RawImage)); + + for (var attempt = 0; attempt < 100 && tester.widget(renderedAvatar).image == null; attempt++) { + await tester.runAsync(() => Future.delayed(const Duration(milliseconds: 10))); + await tester.pump(); + } + + expect(tester.widget(renderedAvatar).image, isNotNull); + expect(repository.photoDownloads, guest ? 0 : 1); + expect(tester.takeException(), isNull); + }); + } + } + } +} diff --git a/app/test/pages/book_edit_details_alignment_test.dart b/app/test/pages/book_edit_details_alignment_test.dart index ab49acfb..8807e023 100644 --- a/app/test/pages/book_edit_details_alignment_test.dart +++ b/app/test/pages/book_edit_details_alignment_test.dart @@ -1,5 +1,3 @@ -import 'dart:math' as math; - import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus/pages/book_details_page.dart'; @@ -14,7 +12,7 @@ import 'package:papyrus/widgets/book_edit/cover_image_picker.dart'; import '../helpers/test_helpers.dart'; void main() { - for (final theme in [AppTheme.dark, AppTheme.eink]) { + for (final theme in [AppTheme.dark, AppTheme.highContrastDark, AppTheme.highContrastLight, AppTheme.eink]) { for (final layout in [ (screen: const Size(3840, 2160), width: 3560.0, scale: 1.0), (screen: const Size(1800, 1200), width: 1520.0, scale: 1.0), @@ -95,13 +93,6 @@ void main() { expect(tester.getRect(search).left, detailsTitle.left); } - final formCard = find.ancestor(of: find.text('Basic information'), matching: find.byType(Card)).first; - - expect( - tester.getRect(formCard).right, - layout.screen.width - layout.width + math.min(layout.width, 1120) - Spacing.lg, - ); - final searchField = find.ancestor(of: find.text('Search'), matching: find.byType(TextFormField)).first; final saveButton = find.widgetWithText(FilledButton, 'Save'); expect(tester.getRect(saveButton).right, tester.getRect(searchField).right); @@ -112,7 +103,7 @@ void main() { } } - testWidgets('mobile edit retains its padded card and full-width bordered cover', (tester) async { + testWidgets('mobile edit retains its padding and full-width bordered cover', (tester) async { const screen = Size(400, 1100); tester.view.devicePixelRatio = 1; tester.view.physicalSize = screen; @@ -146,7 +137,6 @@ void main() { expect(preview.width, screen.width - Spacing.md * 4); expect(preview.height, preview.width / CoverImagePicker.coverAspectRatio); expect(image, preview.deflate(1)); - expect(find.ancestor(of: picker, matching: find.byType(Card)), findsOneWidget); expect(tester.takeException(), isNull); }); } diff --git a/app/test/pages/book_edit_page_layout_test.dart b/app/test/pages/book_edit_page_layout_test.dart index 76daa56f..66670a63 100644 --- a/app/test/pages/book_edit_page_layout_test.dart +++ b/app/test/pages/book_edit_page_layout_test.dart @@ -66,10 +66,7 @@ void main() { final formHeading = tester.getTopLeft(find.text('Basic information')); expect(metadataHeading.dx, greaterThan(cover.dx)); - expect( - tester.getTopLeft(find.ancestor(of: find.text('Fetch metadata'), matching: find.byType(Card)).first).dy, - cover.dy, - ); + expect(metadataHeading.dy, cover.dy); expect(formHeading.dx, closeTo(metadataHeading.dx, 1)); expect(formHeading.dy, greaterThan(metadataHeading.dy)); @@ -83,10 +80,7 @@ void main() { final language = tester.getTopLeft(find.text('Language')); expect(metadataHeading.dx, greaterThan(cover.dx)); - expect( - tester.getTopLeft(find.ancestor(of: find.text('Fetch metadata'), matching: find.byType(Card)).first).dy, - cover.dy, - ); + expect(metadataHeading.dy, cover.dy); expect(language.dy, greaterThan(publisher.dy)); expect(tester.takeException(), isNull); @@ -98,25 +92,20 @@ void main() { final metadataHeading = tester.getTopLeft(find.text('Fetch metadata')); final formHeading = tester.getTopLeft(find.text('Basic information')); final coverPreview = find.descendant(of: find.byType(CoverImagePicker), matching: find.byType(AspectRatio)); - final metadataCard = find.ancestor(of: find.text('Fetch metadata'), matching: find.byType(Card)).first; - final formCard = find.ancestor(of: find.text('Basic information'), matching: find.byType(Card)).first; expect(metadataHeading.dy, greaterThan(cover.dy)); expect(formHeading.dy, greaterThan(metadataHeading.dy)); expect(tester.getTopLeft(coverPreview).dx, Spacing.lg); - expect(tester.getCenter(metadataCard).dx, closeTo(320, 1)); - expect(tester.getSize(metadataCard).width, closeTo(tester.getSize(formCard).width, 1)); + expect(metadataHeading.dx, formHeading.dx); expect(tester.getSize(find.byType(AspectRatio).first).width, 240); expect(tester.takeException(), isNull); }); testWidgets('metadata search precedes a compact visible source selector', (tester) async { await pumpPage(tester, size: const Size(1000, 1200), contentWidth: 640); - final metadataCard = find.ancestor(of: find.text('Fetch metadata'), matching: find.byType(Card)).first; final searchField = find.ancestor(of: find.text('Search'), matching: find.byType(TextFormField)).first; final selector = find.byWidgetPredicate((widget) => widget is SegmentedButton); final sourceLabel = find.text('Source'); expect(sourceLabel, findsOneWidget); - expect(tester.getSize(searchField).width, closeTo(tester.getSize(metadataCard).width - (Spacing.md * 2), 1)); expect(tester.getTopLeft(sourceLabel).dy, greaterThan(tester.getTopLeft(searchField).dy)); expect((tester.getCenter(selector).dy - tester.getCenter(sourceLabel).dy).abs(), lessThan(1)); }); diff --git a/app/test/pages/profile_page_test.dart b/app/test/pages/profile_page_test.dart index 71a75e22..cb0390f1 100644 --- a/app/test/pages/profile_page_test.dart +++ b/app/test/pages/profile_page_test.dart @@ -1,4 +1,8 @@ +import 'dart:ui' show SemanticsAction, Tristate; + +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus/auth/auth_api_client.dart'; import 'package:papyrus/auth/auth_models.dart'; @@ -16,6 +20,7 @@ import 'package:papyrus/providers/preferences_provider.dart'; import 'package:papyrus/providers/sync_settings_provider.dart'; import 'package:papyrus/widgets/profile/profile_menu_item.dart'; import 'package:papyrus/widgets/settings/settings_section.dart'; +import 'package:papyrus/widgets/settings/settings_row.dart'; import 'package:powersync/powersync.dart' hide Column; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -111,7 +116,7 @@ void main() { availabilityProvider = AcquisitionAvailabilityProvider(authProvider: authProvider); }); - Widget buildApp({required Size screenSize}) { + Widget buildApp({required Size screenSize, TextScaler textScaler = TextScaler.noScaling}) { return MultiProvider( providers: [ ChangeNotifierProvider.value(value: authProvider), @@ -125,7 +130,7 @@ void main() { ], child: MaterialApp( home: MediaQuery( - data: MediaQueryData(size: screenSize), + data: MediaQueryData(size: screenSize, textScaler: textScaler), child: const ProfilePage(), ), ), @@ -137,28 +142,75 @@ void main() { addTearDown(() => tester.binding.setSurfaceSize(null)); await tester.pumpWidget(buildApp(screenSize: const Size(400, 900))); await tester.pumpAndSettle(); - expect(find.text('Profile'), findsOneWidget); + expect(find.text('Settings'), findsOneWidget); expect(find.text('Reader Profile'), findsOneWidget); expect(find.text('reader@example.com'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'Account'), 300); + await tester.scrollUntilVisible( + find.widgetWithText(SettingsSectionHeader, 'Account'), + 300, + scrollable: find.byType(Scrollable).first, + ); expect(find.text('Change password'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'Appearance'), 300); + await tester.scrollUntilVisible( + find.widgetWithText(SettingsSectionHeader, 'Appearance'), + 300, + scrollable: find.byType(Scrollable).first, + ); expect(find.text('Theme'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'Reading'), 300); - expect(find.text('Default font'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'Library'), 300); - expect(find.text('Default view'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'Notifications'), 300); + expect(find.text('Default font'), findsNothing); + expect(find.text('Default view'), findsNothing); + expect(find.text('Developer options'), findsNothing); + await tester.scrollUntilVisible( + find.widgetWithText(SettingsSectionHeader, 'Notifications'), + 300, + scrollable: find.byType(Scrollable).first, + ); expect(find.text('Goal reminders'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'Storage'), 300); + final reminders = find.widgetWithText(SettingsToggleRow, 'Goal reminders'); + final remindersValue = prefsProvider.goalReminders; + expect(tester.widget(reminders).onChanged, isNull); + await tester.tap(reminders); + expect(prefsProvider.goalReminders, remindersValue); + await tester.scrollUntilVisible( + find.widgetWithText(SettingsSectionHeader, 'Storage'), + 300, + scrollable: find.byType(Scrollable).first, + ); expect(find.text('Clear local library'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'Privacy & data'), 300); + await tester.scrollUntilVisible( + find.widgetWithText(SettingsSectionHeader, 'Privacy & data'), + 300, + scrollable: find.byType(Scrollable).first, + ); expect(find.text('Analytics'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'Accessibility'), 300); + final analytics = find.widgetWithText(SettingsToggleRow, 'Analytics'); + final analyticsValue = prefsProvider.analyticsOptIn; + expect(tester.widget(analytics).onChanged, isNull); + await tester.tap(analytics); + expect(prefsProvider.analyticsOptIn, analyticsValue); + + for (final label in ['Privacy policy', 'Export all data', 'Import data', 'Clear local data']) { + final row = tester.widget(find.widgetWithText(SettingsRow, label)); + expect(row.enabled, isFalse); + expect(row.onTap, isNull); + } + await tester.scrollUntilVisible( + find.widgetWithText(SettingsSectionHeader, 'Accessibility'), + 300, + scrollable: find.byType(Scrollable).first, + ); expect(find.text('Reduce animations'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(SettingsSectionHeader, 'About'), 300); + await tester.scrollUntilVisible( + find.widgetWithText(SettingsSectionHeader, 'About'), + 300, + scrollable: find.byType(Scrollable).first, + ); expect(find.text('Version'), findsOneWidget); - await tester.scrollUntilVisible(find.widgetWithText(ProfileMenuItem, 'Log out'), 300); + await tester.scrollUntilVisible( + find.widgetWithText(ProfileMenuItem, 'Log out'), + 300, + scrollable: find.byType(Scrollable).first, + ); await tester.tap(find.widgetWithText(ProfileMenuItem, 'Log out')); await tester.pumpAndSettle(); expect(find.text('Are you sure you want to log out?'), findsOneWidget); @@ -167,6 +219,89 @@ void main() { expect(find.text('Are you sure you want to log out?'), findsNothing); }); + testWidgets('desktop settings scrolls when the pointer is over empty space beside the form', (tester) async { + const screenSize = Size(1280, 600); + await tester.binding.setSurfaceSize(screenSize); + addTearDown(() => tester.binding.setSurfaceSize(null)); + await tester.pumpWidget(buildApp(screenSize: screenSize)); + await tester.pumpAndSettle(); + final name = find.widgetWithText(TextFormField, 'Display name'); + final initialTop = tester.getTopLeft(name).dy; + const pointerPosition = Offset(1240, 300); + expect(pointerPosition.dx, greaterThan(tester.getTopRight(name).dx)); + await tester.sendEventToBinding( + const PointerScrollEvent(position: pointerPosition, scrollDelta: Offset(0, 200)), + ); + await tester.pumpAndSettle(); + expect(tester.getTopLeft(name).dy, lessThan(initialTop)); + expect(tester.takeException(), isNull); + }); + + testWidgets('short desktop settings sections stay at the top of the content pane', (tester) async { + const screenSize = Size(1280, 900); + await tester.binding.setSurfaceSize(screenSize); + addTearDown(() => tester.binding.setSurfaceSize(null)); + await tester.pumpWidget(buildApp(screenSize: screenSize)); + await tester.pumpAndSettle(); + final initialHeadingTop = tester.getTopLeft(find.text('Account').last).dy; + await tester.tap(find.widgetWithText(InkWell, 'About')); + await tester.pumpAndSettle(); + expect(tester.getTopLeft(find.text('About').last).dy, initialHeadingTop); + expect(tester.takeException(), isNull); + }); + + for (final textScale in [1.0, 2.0]) { + testWidgets('desktop settings keeps keyboard traversal within each column at ${textScale}x text', (tester) async { + const screenSize = Size(1280, 900); + await tester.binding.setSurfaceSize(screenSize); + addTearDown(() => tester.binding.setSurfaceSize(null)); + await tester.pumpWidget(buildApp(screenSize: screenSize, textScaler: TextScaler.linear(textScale))); + await tester.pumpAndSettle(); + final accessibility = find.widgetWithText(InkWell, 'Accessibility'); + await tester.ensureVisible(accessibility); + await tester.tap(accessibility); + await tester.pumpAndSettle(); + + final labels = [ + 'Account', + 'Appearance', + 'Storage', + 'Accessibility', + 'About', + 'Log out', + 'Interface text enlargement', + 'Interface font', + 'Increase contrast', + 'Bold interface text', + 'Reduce animations', + ]; + + FocusNode focusFor(String label) => Focus.of(tester.element(find.text(label).first)); + + focusFor(labels.first).requestFocus(); + await tester.pumpAndSettle(); + + for (final label in labels) { + expect(focusFor(label).hasPrimaryFocus, isTrue, reason: 'Forward traversal should focus $label'); + + if (label != labels.last) { + await tester.sendKeyEvent(LogicalKeyboardKey.tab); + await tester.pumpAndSettle(); + } + } + + await tester.sendKeyDownEvent(LogicalKeyboardKey.shiftLeft); + + for (final label in labels.reversed.skip(1)) { + await tester.sendKeyEvent(LogicalKeyboardKey.tab); + await tester.pumpAndSettle(); + expect(focusFor(label).hasPrimaryFocus, isTrue, reason: 'Reverse traversal should focus $label'); + } + + await tester.sendKeyUpEvent(LogicalKeyboardKey.shiftLeft); + }); + } + testWidgets('desktop layout navigates across all sections correctly', (tester) async { await tester.binding.setSurfaceSize(const Size(1200, 900)); addTearDown(() => tester.binding.setSurfaceSize(null)); @@ -176,40 +311,42 @@ void main() { // Account section default expect(find.text('Account'), findsWidgets); expect(find.text('Reader Profile'), findsOneWidget); - expect(find.text('Edit profile'), findsOneWidget); + expect(find.text('Edit profile'), findsNothing); + expect(find.widgetWithText(TextFormField, 'Display name'), findsOneWidget); + expect(find.widgetWithText(FilledButton, 'Save'), findsOneWidget); // Navigate to Appearance await tester.tap(find.widgetWithText(InkWell, 'Appearance')); await tester.pumpAndSettle(); expect(find.text('System default'), findsOneWidget); - // Navigate to Reading - await tester.tap(find.widgetWithText(InkWell, 'Reading')); - await tester.pumpAndSettle(); - expect(find.text('Typography'), findsOneWidget); - expect(find.text('Behavior'), findsOneWidget); + for (final label in ['Reading', 'Library', 'Developer options']) { + expect(find.text(label), findsNothing); + } - // Navigate to Library - await tester.tap(find.widgetWithText(InkWell, 'Library')); - await tester.pumpAndSettle(); - expect(find.text('Display'), findsOneWidget); - expect(find.text('Default view mode'), findsOneWidget); + final semantics = tester.ensureSemantics(); - // Navigate to Notifications - await tester.tap(find.widgetWithText(InkWell, 'Notifications')); - await tester.pumpAndSettle(); - expect(find.text('Goal reminders'), findsOneWidget); + try { + await tester.pumpAndSettle(); + + for (final label in ['Notifications', 'Privacy']) { + final item = find.widgetWithText(InkWell, label); + final node = tester.getSemantics(find.bySemanticsLabel(label)); + expect(node.flagsCollection.isEnabled, Tristate.isFalse); + expect(node.getSemanticsData().hasAction(SemanticsAction.tap), isFalse); + await tester.tap(item); + await tester.pumpAndSettle(); + expect(find.text('System default'), findsOneWidget); + } + } finally { + semantics.dispose(); + } // Navigate to Storage await tester.tap(find.widgetWithText(InkWell, 'Storage')); await tester.pumpAndSettle(); expect(find.text('Library storage'), findsOneWidget); - // Navigate to Privacy - await tester.tap(find.widgetWithText(InkWell, 'Privacy')); - await tester.pumpAndSettle(); - expect(find.text('Send anonymous usage data'), findsOneWidget); - // Navigate to Accessibility await tester.tap(find.widgetWithText(InkWell, 'Accessibility')); await tester.pumpAndSettle(); diff --git a/app/test/pages/profile_storage_sync_test.dart b/app/test/pages/profile_storage_sync_test.dart index b49aa274..6627f37a 100644 --- a/app/test/pages/profile_storage_sync_test.dart +++ b/app/test/pages/profile_storage_sync_test.dart @@ -133,6 +133,7 @@ void main() { DataStore? dataStore, MediaUploadQueue? mediaUploadQueue, AcquisitionAvailabilityProvider? acquisitionAvailabilityProvider, + Widget Function(Widget page)? pageBuilder, }) async { final prefs = await SharedPreferences.getInstance(); @@ -170,7 +171,7 @@ void main() { child: MaterialApp( home: MediaQuery( data: MediaQueryData(size: screenSize), - child: const ProfilePage(), + child: pageBuilder?.call(const ProfilePage()) ?? const ProfilePage(), ), ), ); @@ -181,7 +182,7 @@ void main() { final service = _FakePowerSyncService(currentMode: LibraryDatabaseMode.guest, currentSyncState: const SyncState()); await tester.pumpWidget(await buildPage(authProvider: auth, powerSyncService: service)); await tester.pumpAndSettle(); - await tester.scrollUntilVisible(find.text('Storage'), 400); + await tester.scrollUntilVisible(find.text('Storage'), 400, scrollable: find.byType(Scrollable).first); await tester.pumpAndSettle(); expect(find.text('Stored on this device'), findsOneWidget); expect(find.text('Export or import a backup'), findsOneWidget); @@ -224,7 +225,11 @@ void main() { ); await tester.pumpAndSettle(); - await tester.scrollUntilVisible(find.byKey(const Key('profile-acquisition-section')), 400); + await tester.scrollUntilVisible( + find.byKey(const Key('profile-acquisition-section')), + 400, + scrollable: find.byType(Scrollable).first, + ); await tester.pumpAndSettle(); final acquisitionSection = find.byKey(const Key('profile-acquisition-section')); expect(find.descendant(of: acquisitionSection, matching: find.text('Data sync')), findsNothing); @@ -268,7 +273,11 @@ void main() { ); await tester.pump(); - await tester.scrollUntilVisible(find.byKey(const Key('profile-acquisition-section')), 400); + await tester.scrollUntilVisible( + find.byKey(const Key('profile-acquisition-section')), + 400, + scrollable: find.byType(Scrollable).first, + ); await tester.pump(); expect(find.text('Checking server support…'), findsOneWidget); completer.complete(_capabilities(enabled: true)); @@ -293,7 +302,7 @@ void main() { ); await tester.pumpAndSettle(); - await tester.scrollUntilVisible(find.text('Storage'), 400); + await tester.scrollUntilVisible(find.text('Storage'), 400, scrollable: find.byType(Scrollable).first); await tester.pumpAndSettle(); final acquisitionSection = find.byKey(const Key('profile-acquisition-section')); expect(acquisitionSection, findsOneWidget); @@ -456,7 +465,7 @@ void main() { ); await tester.pumpAndSettle(); - await tester.scrollUntilVisible(find.text('Storage'), 400); + await tester.scrollUntilVisible(find.text('Storage'), 400, scrollable: find.byType(Scrollable).first); await tester.pumpAndSettle(); await tester.tap(find.text('Manage servers')); await tester.pumpAndSettle(); @@ -466,6 +475,60 @@ void main() { expect(find.text('Add custom server'), findsOneWidget); }); + testWidgets('manage servers blocks the sidebar outside the settings navigator', (tester) async { + const size = Size(1440, 900); + await tester.binding.setSurfaceSize(size); + addTearDown(() => tester.binding.setSurfaceSize(null)); + final auth = await buildAuthProvider(signedIn: true); + final service = _FakePowerSyncService( + currentMode: LibraryDatabaseMode.authenticated, + currentSyncState: const SyncState(connected: true), + ); + var sidebarActivations = 0; + + await tester.pumpWidget( + await buildPage( + authProvider: auth, + powerSyncService: service, + screenSize: size, + pageBuilder: (page) => Scaffold( + body: Row( + children: [ + SizedBox( + width: 240, + child: TextButton( + onPressed: () => sidebarActivations++, + child: const Text('Main sidebar'), + ), + ), + Expanded( + child: Navigator(onGenerateRoute: (_) => MaterialPageRoute(builder: (_) => page)), + ), + ], + ), + ), + ), + ); + + await tester.pumpAndSettle(); + await tester.tap(find.widgetWithText(InkWell, 'Storage')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Manage servers')); + await tester.pumpAndSettle(); + final barrier = find.byType(ModalBarrier).last; + expect(tester.getRect(barrier), Offset.zero & size); + await tester.tapAt(tester.getCenter(find.text('Main sidebar'))); + await tester.pumpAndSettle(); + expect(sidebarActivations, 0); + expect(find.text('Sync servers'), findsNothing); + await tester.tap(find.text('Manage servers')); + await tester.pumpAndSettle(); + await tester.tap(find.widgetWithText(ListTile, 'Official server')); + await tester.pumpAndSettle(); + expect(find.text('Sync servers'), findsNothing); + expect(find.text('Manage servers'), findsOneWidget); + }); + testWidgets('storage sync UI shows pending writes and sync errors', (tester) async { final auth = await buildAuthProvider(signedIn: true); diff --git a/app/test/providers/accessibility_preferences_test.dart b/app/test/providers/accessibility_preferences_test.dart new file mode 100644 index 00000000..9ec8bd03 --- /dev/null +++ b/app/test/providers/accessibility_preferences_test.dart @@ -0,0 +1,40 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + test('accessibility defaults follow the system and changes survive reload', () async { + SharedPreferences.setMockInitialValues({}); + final storage = await SharedPreferences.getInstance(); + final preferences = PreferencesProvider(storage); + addTearDown(preferences.dispose); + expect(preferences.interfaceTextEnlargement, 1); + expect(preferences.increaseContrast, isFalse); + expect(preferences.boldInterfaceText, isFalse); + var notifications = 0; + preferences.addListener(() => notifications++); + preferences.interfaceTextEnlargement = 1.3; + preferences.increaseContrast = true; + preferences.boldInterfaceText = true; + expect(notifications, 3); + await storage.reload(); + final restored = PreferencesProvider(storage); + addTearDown(restored.dispose); + expect(restored.interfaceTextEnlargement, 1.3); + expect(restored.increaseContrast, isTrue); + expect(restored.boldInterfaceText, isTrue); + }); + + for (final value in [-1.0, 0.0, 1.2, 3.0, double.nan, double.infinity, 'large', 2]) { + test('invalid saved text enlargement $value uses the system default', () async { + SharedPreferences.setMockInitialValues({'interface_text_enlargement': value}); + final preferences = PreferencesProvider(await SharedPreferences.getInstance()); + addTearDown(preferences.dispose); + expect(preferences.interfaceTextEnlargement, 1); + preferences.interfaceTextEnlargement = 0.5; + expect(preferences.interfaceTextEnlargement, 1); + }); + } +} diff --git a/app/test/providers/auth_provider_test.dart b/app/test/providers/auth_provider_test.dart index e875a7f2..30a08794 100644 --- a/app/test/providers/auth_provider_test.dart +++ b/app/test/providers/auth_provider_test.dart @@ -89,6 +89,40 @@ void main() { SharedPreferences.setMockInitialValues({}); }); + test('guest deletion rejects duplicate submissions and preserves guest mode on failure', () async { + final prefs = await SharedPreferences.getInstance(); + final provider = AuthProvider(prefs, repository: FakeAuthRepository(), bootstrapOnCreate: false); + addTearDown(provider.dispose); + provider.setOfflineMode(true); + final cleanup = Completer(); + final deletion = provider.deleteGuestAccount(() => cleanup.future); + expect(provider.isDeletingGuestAccount, isTrue); + await expectLater(provider.deleteGuestAccount(() async => fail('Duplicate cleanup')), throwsStateError); + final failure = expectLater(deletion, throwsStateError); + cleanup.completeError(StateError('Storage failure')); + await failure; + expect(provider.isOfflineMode, isTrue); + expect(provider.isDeletingGuestAccount, isFalse); + }); + + test('guest deletion does not sign out an account selected during cleanup', () async { + final prefs = await SharedPreferences.getInstance(); + final provider = AuthProvider(prefs, repository: FakeAuthRepository(), bootstrapOnCreate: false); + addTearDown(provider.dispose); + provider.setOfflineMode(true); + final cleanup = Completer(); + final deletion = provider.deleteGuestAccount(() => cleanup.future); + provider.setOfflineMode(false); + final repository = FakeAuthRepository()..bootstrapResult = _tokens('new-user'); + await provider.replaceRepository(repository); + final failure = expectLater(deletion, throwsStateError); + cleanup.complete(); + await failure; + expect(provider.isSignedIn, isTrue); + expect(provider.user?.displayName, 'new-user'); + expect(repository.clearCalled, isFalse); + }); + test('deletion finishing after a server switch preserves the newly selected account', () async { final prefs = await SharedPreferences.getInstance(); diff --git a/app/test/providers/guest_profile_test.dart b/app/test/providers/guest_profile_test.dart new file mode 100644 index 00000000..4224fe72 --- /dev/null +++ b/app/test/providers/guest_profile_test.dart @@ -0,0 +1,135 @@ +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/auth/auth_models.dart'; +import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/services/guest_profile_store.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'auth_provider_test.dart' show FakeAuthRepository; + +class _Store extends GuestProfileStore { + _Store(super.prefs); + + bool fail = false; + Completer? saving; + + @override + Future save({required String displayName, Uint8List? photoBytes}) async { + await saving?.future; + + if (fail) { + throw StateError('Storage unavailable'); + } + + await super.save(displayName: displayName, photoBytes: photoBytes); + } +} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + late SharedPreferences prefs; + late AuthProvider auth; + late _Store store; + final photo = Uint8List.fromList([1, 2, 3]); + + setUp(() async { + SharedPreferences.setMockInitialValues({'offline_mode': true}); + prefs = await SharedPreferences.getInstance(); + store = _Store(prefs); + auth = AuthProvider(prefs, repository: FakeAuthRepository(), guestProfileStore: store, bootstrapOnCreate: false); + addTearDown(auth.dispose); + }); + + test('local name and photo persist together, including name-only updates', () async { + expect(auth.canEditProfile, isTrue); + expect(auth.profileDisplayName, 'Anonymous User'); + expect(await auth.updateProfile(displayName: 'Local Reader', photoBytes: photo), isTrue); + expect(await auth.updateProfile(displayName: 'New Name'), isTrue); + await prefs.reload(); + final restarted = AuthProvider(prefs, repository: FakeAuthRepository(), bootstrapOnCreate: false); + addTearDown(restarted.dispose); + await restarted.bootstrap(); + expect(restarted.profileDisplayName, 'New Name'); + expect(restarted.profilePhotoBytes, photo); + expect(restarted.user, isNull); + expect(restarted.isOfflineMode, isTrue); + }); + + test('signed-in profiles do not inherit or overwrite the local profile', () async { + await auth.updateProfile(displayName: 'Local Reader', photoBytes: photo); + auth.setOfflineMode(false); + final repository = FakeAuthRepository() + ..bootstrapResult = AuthTokens( + accessToken: 'access', + refreshToken: 'refresh', + tokenType: 'Bearer', + expiresIn: 3600, + user: const PapyrusUser( + userId: 'account', + email: 'reader@example.com', + displayName: 'Server Reader', + avatarUrl: null, + emailVerified: true, + createdAt: null, + lastLoginAt: null, + ), + ); + + await auth.replaceRepository(repository); + expect(auth.profileDisplayName, 'Server Reader'); + expect(auth.profilePhotoBytes, isNull); + auth.setOfflineMode(true); + expect(auth.profileDisplayName, 'Local Reader'); + expect(auth.profilePhotoBytes, photo); + }); + + test('failed local save keeps the previous profile and allows retry', () async { + await auth.updateProfile(displayName: 'Original', photoBytes: photo); + store.fail = true; + expect(await auth.updateProfile(displayName: 'Updated', photoBytes: Uint8List.fromList([4])), isFalse); + expect(auth.profileDisplayName, 'Original'); + expect(auth.profilePhotoBytes, photo); + expect(auth.error, contains('on this device')); + store.fail = false; + expect(await auth.updateProfile(displayName: 'Updated'), isTrue); + expect(auth.profileDisplayName, 'Updated'); + expect(auth.error, isNull); + }); + + test('deletion waits for a pending save and then removes the entire local profile', () async { + store.saving = Completer(); + final saved = auth.updateProfile(displayName: 'Local Reader', photoBytes: photo); + var cleared = false; + final deleted = auth.deleteGuestAccount(() async => cleared = true); + expect(auth.canEditProfile, isFalse); + expect(await auth.updateProfile(displayName: 'Too late'), isFalse); + expect(cleared, isFalse); + store.saving!.complete(); + await saved; + await deleted; + expect(cleared, isTrue); + await prefs.reload(); + expect(prefs.containsKey(GuestProfileStore.preferenceKey), isFalse); + auth.setOfflineMode(true); + expect(auth.profileDisplayName, 'Anonymous User'); + expect(auth.profilePhotoBytes, isNull); + }); + + test('failed account cleanup retains the local profile for retry', () async { + await auth.updateProfile(displayName: 'Local Reader', photoBytes: photo); + await expectLater(auth.deleteGuestAccount(() async => throw StateError('Disk unavailable')), throwsStateError); + expect(auth.profileDisplayName, 'Local Reader'); + expect(auth.profilePhotoBytes, photo); + expect(auth.canEditProfile, isTrue); + }); + + test('malformed stored profile falls back without preventing startup', () async { + await prefs.setString(GuestProfileStore.preferenceKey, '{"display_name":"Reader","photo":"bad base64"}'); + final restarted = AuthProvider(prefs, repository: FakeAuthRepository(), bootstrapOnCreate: false); + addTearDown(restarted.dispose); + expect(restarted.profileDisplayName, 'Anonymous User'); + expect(restarted.profilePhotoBytes, isNull); + }); +} diff --git a/app/test/services/book_import_session_test.dart b/app/test/services/book_import_session_test.dart index d3f09176..d17bf0db 100644 --- a/app/test/services/book_import_session_test.dart +++ b/app/test/services/book_import_session_test.dart @@ -23,19 +23,28 @@ class _DataStore extends Fake implements DataStore { } class _Auth extends Fake implements AuthProvider { + _Auth({this.guest = false}); + final bool guest; + + @override + bool isDeletingGuestAccount = false; + @override - bool get isSignedIn => true; + bool get isSignedIn => !guest; @override - bool get isOfflineMode => false; + bool get isOfflineMode => guest; @override - PapyrusUser get user => PapyrusUser.fromJson({'user_id': 'bob', 'connected_providers': []}); + PapyrusUser? get user => guest ? null : PapyrusUser.fromJson({'user_id': 'bob', 'connected_providers': []}); } class _Queue extends Fake implements MediaUploadQueue { + _Queue({this.guest = false}); + final bool guest; + @override - MediaStorageScope get activeScope => MediaStorageScope(profileKey: 'official', userId: 'alice'); + MediaStorageScope? get activeScope => guest ? null : MediaStorageScope(profileKey: 'official', userId: 'alice'); } class _Database extends Fake implements PapyrusPowerSyncService { @@ -48,6 +57,24 @@ class _Database extends Fake implements PapyrusPowerSyncService { class _Importer extends Fake implements BookImportService {} void main() { + test('guest deletion invalidates imports and prevents new sessions', () { + final auth = _Auth(guest: true); + + BookImportSession capture() => BookImportSession.capture( + dataStore: _DataStore(), + queue: _Queue(guest: true), + importService: _Importer(), + authProvider: auth, + powerSyncService: _Database(LibraryDatabaseMode.guest), + ); + + final session = capture(); + expect(session.isCurrent(), isTrue); + auth.isDeletingGuestAccount = true; + expect(session.isCurrent(), isFalse); + expect(capture, throwsStateError); + }); + test('cannot capture the previous account media scope during account activation', () { expect( () => BookImportSession.capture( diff --git a/app/test/services/guest_account_deletion_service_test.dart b/app/test/services/guest_account_deletion_service_test.dart new file mode 100644 index 00000000..aeac9c14 --- /dev/null +++ b/app/test/services/guest_account_deletion_service_test.dart @@ -0,0 +1,194 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/data/data_store.dart'; +import 'package:papyrus/media/media_storage_scope.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/models/bookmark.dart'; +import 'package:papyrus/opds/opds_catalog_store.dart'; +import 'package:papyrus/opds/opds_catalogs.dart'; +import 'package:papyrus/opds/opds_downloads.dart'; +import 'package:papyrus/opds/opds_http_client.dart'; +import 'package:papyrus/opds/opds_library.dart'; +import 'package:papyrus/opds/opds_models.dart'; +import 'package:papyrus/opds/opds_resource_cache.dart'; +import 'package:papyrus/powersync/powersync_service.dart'; +import 'package:papyrus/powersync/sync_state.dart'; +import 'package:papyrus/providers/auth_provider.dart'; +import 'package:papyrus/services/book_import_service_stub.dart'; +import 'package:papyrus/services/guest_account_deletion_service.dart'; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../opds/catalog_store_test.dart' show MemorySecrets; +import '../powersync/powersync_service_test.dart' show OfflineConnector; +import '../providers/auth_provider_test.dart' show FakeAuthRepository; + +class _Paths extends Fake with MockPlatformInterfaceMixin implements PathProviderPlatform { + _Paths(this.directory); + final Directory directory; + + @override + Future getApplicationDocumentsPath() async => directory.path; + + @override + Future getApplicationSupportPath() async => directory.path; +} + +class _Files extends BookImportService { + bool failDeletion = false; + + @override + Future deleteBookFile(String bookId) async { + if (failDeletion) { + throw const FileSystemException('Storage unavailable'); + } + + await super.deleteBookFile(bookId); + } +} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + late Directory directory; + late SharedPreferences prefs; + late AuthProvider auth; + late PapyrusPowerSyncService database; + late _Files files; + late OpdsCatalogs catalogs; + late OpdsCatalogStore catalogStore; + late MemorySecrets secrets; + late OpdsResourceCache cache; + late GuestAccountDeletionService deletion; + const guest = MediaStorageScope.localGuest; + final account = MediaStorageScope(profileKey: 'official', userId: 'reader'); + final catalog = OpdsCatalog(id: 'catalog', name: 'Books', uri: Uri.parse('https://catalog.test/feed')); + final bytes = Uint8List.fromList([1, 2, 3]); + + PapyrusPowerSyncService createDatabase() => PapyrusPowerSyncService( + connectorFactory: OfflineConnector.new, + connectAuthenticated: false, + pathResolver: (mode, profile, user) async => + '${directory.path}/${mode == LibraryDatabaseMode.guest ? 'guest' : '$profile-$user'}.db', + ); + + setUp(() async { + directory = await Directory.systemTemp.createTemp('papyrus-guest-delete-'); + final originalPaths = PathProviderPlatform.instance; + PathProviderPlatform.instance = _Paths(directory); + addTearDown(() => PathProviderPlatform.instance = originalPaths); + SharedPreferences.setMockInitialValues({'offline_mode': true, 'bold_interface_text': true}); + prefs = await SharedPreferences.getInstance(); + auth = AuthProvider(prefs, repository: FakeAuthRepository(), bootstrapOnCreate: false); + await auth.bootstrap(); + database = createDatabase(); + final store = DataStore(bookRepository: database); + secrets = MemorySecrets(); + catalogStore = OpdsCatalogStore(prefs, secrets: secrets); + cache = OpdsResourceCache(prefs); + final provenance = OpdsLibrary(prefs, dataStore: store); + catalogs = OpdsCatalogs(catalogStore, library: provenance, cache: cache)..setScope(guest.persistenceKey); + final downloads = OpdsDownloads(captureImport: () => throw StateError('No import expected'), library: provenance); + files = _Files(); + deletion = GuestAccountDeletionService( + auth: auth, + library: database, + files: files, + catalogs: catalogs, + downloads: downloads, + ); + + await database.activateAuthenticated('reader'); + await database.upsert(Book(id: 'account', title: 'Account book', author: 'Reader', addedAt: DateTime.now())); + await database.activateGuest(); + await database.upsert(Book(id: 'guest', title: 'Guest book', author: 'Reader', addedAt: DateTime.now())); + await database.bookmarks.upsert(Bookmark(id: 'bookmark', bookId: 'guest', position: .5, createdAt: DateTime.now())); + await Directory('${directory.path}/books').create(); + await File('${directory.path}/books/guest.epub').writeAsBytes(bytes); + await File('${directory.path}/books/account.epub').writeAsBytes(bytes); + await files.storeGuestCoverFile('guest', bytes); + await files.storeCoverFile(account, 'cover', bytes); + + for (final scope in [guest.persistenceKey, account.persistenceKey]) { + await catalogStore.save( + scope, + catalog, + credentials: const OpdsCredentials(username: 'user', password: 'secret'), + ); + cache.setScope(scope); + await cache.write( + cache.capture(catalog, catalog.uri)!, + OpdsResponse(uri: catalog.uri, headers: const {}, bytes: bytes), + ); + } + + cache.setScope(guest.persistenceKey); + catalogs.reload(); + await prefs.setString('papyrus.opds.imports.v1.${guest.persistenceKey}', '{}'); + + addTearDown(() async { + downloads.dispose(); + catalogs.dispose(); + provenance.dispose(); + cache.dispose(); + store.dispose(); + auth.dispose(); + await database.close(); + await directory.delete(recursive: true); + }); + }); + + test('deletes persistent guest data and files while preserving other accounts', () async { + final staleToken = cache.capture(catalog, catalog.uri)!; + await deletion.delete(); + expect(auth.isOfflineMode, isFalse); + expect(prefs.getBool('offline_mode'), isFalse); + expect(await files.getBookFile('guest'), isNull); + expect(await files.getGuestCoverFile('guest'), isNull); + expect(await files.getBookFile('account'), bytes); + expect(await files.getCoverFile(account, 'cover'), bytes); + expect(catalogStore.load(guest.persistenceKey), isEmpty); + expect(await catalogStore.credentials(guest.persistenceKey, catalog.id), isNull); + expect(await catalogStore.credentials(account.persistenceKey, catalog.id), isNotNull); + expect(prefs.containsKey('papyrus.opds.imports.v1.${guest.persistenceKey}'), isFalse); + expect(cache.isCurrent(staleToken), isFalse); + cache.setScope(account.persistenceKey); + expect(cache.read(cache.capture(catalog, catalog.uri)!), isNotNull); + final restoredCache = OpdsResourceCache(prefs)..setScope(guest.persistenceKey); + expect(restoredCache.read(restoredCache.capture(catalog, catalog.uri)!), isNull); + restoredCache.setScope(account.persistenceKey); + expect(restoredCache.read(restoredCache.capture(catalog, catalog.uri)!), isNotNull); + restoredCache.dispose(); + expect(prefs.getBool('bold_interface_text'), isTrue); + await database.close(); + database = createDatabase(); + await database.activateGuest(); + expect(await database.getById('guest'), isNull); + expect(await database.bookmarks.getById('bookmark'), isNull); + await database.activateAuthenticated('reader'); + expect(await database.getById('account'), isNotNull); + }); + + test('failed cleanup keeps guest mode and records available for retry', () async { + files.failDeletion = true; + await expectLater(deletion.delete(), throwsA(isA())); + expect(auth.isOfflineMode, isTrue); + expect(auth.isDeletingGuestAccount, isFalse); + expect(await database.getById('guest'), isNotNull); + expect(await files.getBookFile('guest'), bytes); + files.failDeletion = false; + await deletion.delete(); + expect(auth.isOfflineMode, isFalse); + expect(await database.getById('guest'), isNull); + }); + + test('rejects deleting an authenticated library even if guest auth state is stale', () async { + await database.activateAuthenticated('reader'); + await expectLater(deletion.delete(), throwsStateError); + expect(await database.getById('account'), isNotNull); + expect(await files.getBookFile('account'), bytes); + expect(auth.isOfflineMode, isTrue); + }); +} diff --git a/app/test/services/guest_profile_browser_test.dart b/app/test/services/guest_profile_browser_test.dart new file mode 100644 index 00000000..2094a211 --- /dev/null +++ b/app/test/services/guest_profile_browser_test.dart @@ -0,0 +1,42 @@ +@TestOn('browser') +library; + +import 'dart:ui' as ui; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:image/image.dart' as image; +import 'package:papyrus/services/guest_profile_store.dart'; +import 'package:papyrus/services/profile_photo.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +// ignore: depend_on_referenced_packages +import 'package:shared_preferences_web/shared_preferences_web.dart'; + +void main() { + test('saved guest photo decodes after real browser storage reload', () async { + SharedPreferencesPlugin.registerWith(null); + final prefs = await SharedPreferences.getInstance(); + final store = GuestProfileStore(prefs); + addTearDown(store.clear); + final original = prepareProfilePhoto(image.encodePng(image.Image(width: 80, height: 100))); + await store.save(displayName: 'Browser test', photoBytes: original); + await _expectDecodable(store); + await prefs.reload(); + final restored = GuestProfileStore(prefs); + expect(restored.displayName, 'Browser test'); + expect(restored.photoBytes, original); + await _expectDecodable(restored); + }); +} + +Future _expectDecodable(GuestProfileStore store) async { + final codec = await ui.instantiateImageCodec(store.photoBytes!); + + try { + final frame = await codec.getNextFrame(); + expect(frame.image.width, 80); + expect(frame.image.height, 100); + frame.image.dispose(); + } finally { + codec.dispose(); + } +} diff --git a/app/test/services/profile_photo_test.dart b/app/test/services/profile_photo_test.dart new file mode 100644 index 00000000..e9598f4b --- /dev/null +++ b/app/test/services/profile_photo_test.dart @@ -0,0 +1,23 @@ +import 'dart:typed_data'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:image/image.dart' as image; +import 'package:papyrus/services/profile_photo.dart'; + +void main() { + test('photo preparation resizes, removes metadata and produces a JPEG', () { + final source = image.Image(width: 1200, height: 600); + source.exif.imageIfd[0x010e] = image.IfdValueAscii('Private description'); + final prepared = prepareProfilePhoto(image.encodeJpg(source)); + final result = image.decodeJpg(prepared)!; + expect(result.width, 512); + expect(result.height, 256); + expect(result.exif.imageIfd[0x010e], isNull); + expect(prepared.length, lessThan(maxProfilePhotoBytes)); + }); + + test('invalid and oversized photos are rejected before upload', () { + expect(() => prepareProfilePhoto(Uint8List.fromList([1, 2, 3])), throwsFormatException); + expect(() => prepareProfilePhoto(Uint8List(maxProfilePhotoBytes + 1)), throwsFormatException); + }); +} diff --git a/app/test/themes/app_accessibility_test.dart b/app/test/themes/app_accessibility_test.dart new file mode 100644 index 00000000..0037ac13 --- /dev/null +++ b/app/test/themes/app_accessibility_test.dart @@ -0,0 +1,171 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/semantics.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:papyrus/themes/app_accessibility.dart'; +import 'package:papyrus/themes/app_motion.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/widgets/settings/settings_row.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class _NonlinearScaler extends TextScaler { + const _NonlinearScaler(); + @override + double scale(double fontSize) => fontSize < 20 ? fontSize * 2 : fontSize * 1.5; + @override + double get textScaleFactor => 2; +} + +void main() { + test('additional enlargement preserves the system curve', () { + const scaler = InterfaceTextScaler(_NonlinearScaler(), 1.5); + expect(scaler.scale(16), 48); + expect(scaler.scale(24), 54); + }); + + testWidgets('interface overrides and live system changes leave reader text independent', (tester) async { + SharedPreferences.setMockInitialValues({}); + final preferences = PreferencesProvider(await SharedPreferences.getInstance()); + addTearDown(preferences.dispose); + final system = ValueNotifier(const MediaQueryData(textScaler: _NonlinearScaler())); + addTearDown(system.dispose); + + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.light, + builder: (context, child) => ListenableBuilder( + listenable: Listenable.merge([preferences, system]), + builder: (context, _) => MediaQuery( + data: system.value, + child: AppAccessibilityScope(preferences: preferences, child: child!), + ), + ), + home: const Scaffold( + body: Column( + children: [ + TextField(decoration: InputDecoration(labelText: 'Interface input')), + ReaderSystemTextScope( + child: TextField(decoration: InputDecoration(labelText: 'Reader input')), + ), + ], + ), + ), + ), + ); + preferences.interfaceTextEnlargement = 2; + preferences.boldInterfaceText = true; + await tester.pumpAndSettle(); + final interface = tester.widget(find.byType(EditableText).first); + final reader = tester.widget(find.byType(EditableText).last); + expect(MediaQuery.textScalerOf(tester.element(find.byType(EditableText).first)).scale(16), 64); + expect(interface.style.fontWeight, FontWeight.bold); + expect(MediaQuery.textScalerOf(tester.element(find.byType(EditableText).last)).scale(16), 32); + expect(reader.style.fontWeight, isNot(FontWeight.bold)); + preferences.boldInterfaceText = false; + system.value = const MediaQueryData(textScaler: TextScaler.linear(1.5), boldText: true, disableAnimations: true); + await tester.pumpAndSettle(); + expect(MediaQuery.textScalerOf(tester.element(find.byType(EditableText).first)).scale(16), 48); + expect(MediaQuery.textScalerOf(tester.element(find.byType(EditableText).last)).scale(16), 24); + expect(tester.widget(find.byType(EditableText).last).style.fontWeight, FontWeight.bold); + expect(AppMotion.disabled(tester.element(find.byType(EditableText).first)), isTrue); + preferences.interfaceTextEnlargement = 1; + await tester.pumpAndSettle(); + expect(MediaQuery.textScalerOf(tester.element(find.byType(EditableText).first)).scale(16), 24); + }); + + testWidgets('disabled toggle exposes its state without an activation action', (tester) async { + final semantics = tester.ensureSemantics(); + try { + await tester.pumpWidget( + MaterialApp( + home: Scaffold(body: SettingsToggleRow(label: 'Increase contrast', value: true, onChanged: null)), + ), + ); + expect( + tester.getSemantics(find.bySemanticsLabel('Increase contrast')), + isSemantics( + hasEnabledState: true, + isEnabled: false, + hasToggledState: true, + isToggled: true, + hasTapAction: false, + isFocusable: false, + ), + ); + } finally { + semantics.dispose(); + } + }); + + for (final theme in [ + AppTheme.light, + AppTheme.dark, + AppTheme.eink, + AppTheme.highContrastLight, + AppTheme.highContrastDark, + ]) { + testWidgets( + 'toggle has one labeled state and supports pointer, keyboard and semantics in ${theme.brightness}, e-ink ${theme.extension() != null}', + ( + tester, + ) async { + final semantics = tester.ensureSemantics(); + + final value = ValueNotifier(false); + addTearDown(value.dispose); + var changes = 0; + await tester.pumpWidget( + MaterialApp( + theme: theme, + home: Scaffold( + body: ValueListenableBuilder( + valueListenable: value, + builder: (_, enabled, _) => SettingsToggleRow( + label: 'Bold interface text', + value: enabled, + onChanged: (next) { + changes++; + value.value = next; + }, + ), + ), + ), + ), + ); + expect(find.bySemanticsLabel('Bold interface text'), findsOneWidget); + expect( + tester.getSemantics(find.bySemanticsLabel('Bold interface text')), + matchesSemantics( + label: 'Bold interface text', + hasEnabledState: true, + isEnabled: true, + hasToggledState: true, + isToggled: false, + hasTapAction: true, + hasFocusAction: true, + isFocusable: true, + ), + ); + await tester.tap(find.text('Bold interface text')); + await tester.pumpAndSettle(); + expect(changes, 1); + await tester.sendKeyEvent(LogicalKeyboardKey.tab); + await tester.sendKeyEvent(LogicalKeyboardKey.space); + await tester.pumpAndSettle(); + expect(changes, 2); + expect(value.value, isFalse); + final node = tester.getSemantics(find.bySemanticsLabel('Bold interface text')); + node.owner!.performAction(node.id, SemanticsAction.tap); + await tester.pumpAndSettle(); + expect(changes, 3); + expect(value.value, isTrue); + await expectLater(tester, meetsGuideline(labeledTapTargetGuideline)); + await expectLater(tester, meetsGuideline(androidTapTargetGuideline)); + await expectLater(tester, meetsGuideline(iOSTapTargetGuideline)); + await expectLater(tester, meetsGuideline(textContrastGuideline)); + semantics.dispose(); + }, + ); + } +} diff --git a/app/test/widgets/accessibility_journeys_test.dart b/app/test/widgets/accessibility_journeys_test.dart new file mode 100644 index 00000000..f18afd6b --- /dev/null +++ b/app/test/widgets/accessibility_journeys_test.dart @@ -0,0 +1,203 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/models/book.dart'; +import 'package:papyrus/pages/login_page.dart'; +import 'package:papyrus/pages/register_page.dart'; +import 'package:papyrus/pages/forgot_password_page.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:papyrus/themes/app_accessibility.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/widgets/book_details/book_action_buttons.dart'; +import 'package:papyrus/widgets/input/email_input.dart'; +import 'package:papyrus/widgets/input/name_input.dart'; +import 'package:papyrus/widgets/input/password_input.dart'; +import 'package:papyrus/widgets/input/search_field.dart'; +import 'package:papyrus/widgets/shell/adaptive_app_shell.dart'; +import 'package:papyrus/widgets/shell/mobile_bottom_nav.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + setUpAll(() async { + final loader = FontLoader(AppTheme.dyslexiaFontFamily); + + for (final style in ['Regular', 'Bold', 'Italic', 'BoldItalic']) { + loader.addFont(rootBundle.load('fonts/OpenDyslexic/OpenDyslexic-$style.otf')); + } + + await loader.load(); + }); + + for (final (name, page) in [ + ('login', const LoginPage()), + ('registration', const RegisterPage()), + ('recovery', const ForgotPasswordPage()), + ]) { + for (final width in [320.0, 390.0, 1280.0]) { + testWidgets('$name retains reachable fields and submission at $width with combined enlargement', (tester) async { + tester.view.physicalSize = Size(width, 900); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + SharedPreferences.setMockInitialValues({}); + final preferences = PreferencesProvider(await SharedPreferences.getInstance()) + ..interfaceTextEnlargement = 2 + ..boldInterfaceText = true; + addTearDown(preferences.dispose); + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.withTypography(AppTheme.highContrastLight, dyslexiaFont: true), + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: const TextScaler.linear(2)), + child: AppAccessibilityScope(preferences: preferences, child: child!), + ), + home: page, + ), + ); + await tester.pumpAndSettle(); + if (name == 'registration') { + final displayName = find.descendant(of: find.byType(NameInput), matching: find.byType(TextFormField)); + await tester.ensureVisible(displayName); + await tester.enterText(displayName, 'Reader'); + } + + final email = find.byType(EmailInput); + await tester.ensureVisible(email); + await tester.enterText(find.descendant(of: email, matching: find.byType(TextFormField)), 'invalid'); + await tester.pump(); + // Opening the keyboard must not trap the submit action below the viewport. + tester.view.viewInsets = const FakeViewPadding(bottom: 250); + await tester.pumpAndSettle(); + final submit = find.byType(ElevatedButton).first; + await tester.ensureVisible(submit); + await tester.pumpAndSettle(); + expect(submit.hitTestable(), findsOneWidget); + await tester.tap(submit); + await tester.pumpAndSettle(); + expect(find.text('Not a valid email'), findsOneWidget); + final field = tester.widget(find.descendant(of: email, matching: find.byType(EditableText))); + expect(field.controller.text, 'invalid'); + expect(field.focusNode.hasFocus, isTrue); + expect(tester.takeException(), isNull); + }); + } + } + + testWidgets('email and password support autofill, paste, and labeled visibility controls', (tester) async { + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.light, + home: const Scaffold( + body: AutofillGroup( + child: Column( + children: [ + EmailInput(labelText: 'Email'), + PasswordInput(labelText: 'Password'), + ], + ), + ), + ), + ), + ); + final password = find.descendant(of: find.byType(PasswordInput), matching: find.byType(EditableText)); + final field = tester.widget(password); + expect(field.autofillHints, contains(AutofillHints.password)); + expect(tester.widget(find.byType(EditableText).first).autofillHints, contains(AutofillHints.email)); + tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(SystemChannels.platform, (call) async { + if (call.method == 'Clipboard.getData') { + return {'text': 'pasted-password'}; + } + return null; + }); + addTearDown(() => tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(SystemChannels.platform, null)); + await tester.enterText(password, ''); + await tester.pump(); + await tester.runAsync(() async { + await Clipboard.setData(const ClipboardData(text: 'pasted-password')); + await tester.state(password).pasteText(SelectionChangedCause.keyboard); + }); + await tester.pump(); + expect(field.controller.text, 'pasted-password'); + await tester.tap(find.byTooltip('Show password')); + await tester.pump(); + expect(tester.widget(password).obscureText, isFalse); + expect(find.byTooltip('Hide password'), findsOneWidget); + }); + + for (final (name, theme) in [ + ('light', AppTheme.light), + ('dark', AppTheme.dark), + ('eink', AppTheme.eink), + ('high contrast light', AppTheme.highContrastLight), + ('high contrast dark', AppTheme.highContrastDark), + ]) { + testWidgets('$name book actions and search pass label, touch-target and text contrast checks', (tester) async { + final semantics = tester.ensureSemantics(); + final search = TextEditingController(text: 'Book'); + addTearDown(search.dispose); + try { + await tester.pumpWidget( + MaterialApp( + theme: theme, + home: Scaffold( + body: Column( + children: [ + BookActionButtons( + book: Book(id: 'book', title: 'Book', author: 'Author', addedAt: DateTime(2026)), + onContinueReading: () {}, + onEdit: () {}, + onToggleFavorite: () {}, + ), + SearchField(controller: search, hintText: 'Search books'), + ], + ), + ), + ), + ); + await tester.pumpAndSettle(); + expect(find.byTooltip('Edit book'), findsOneWidget); + expect(find.byTooltip('Add to favorites'), findsOneWidget); + await expectLater(tester, meetsGuideline(labeledTapTargetGuideline)); + await expectLater(tester, meetsGuideline(androidTapTargetGuideline)); + await expectLater(tester, meetsGuideline(iOSTapTargetGuideline)); + await expectLater(tester, meetsGuideline(textContrastGuideline)); + } finally { + semantics.dispose(); + } + }); + } + + testWidgets('large-text navigation reaches Settings without clamping text', (tester) async { + tester.view.physicalSize = const Size(320, 720); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + String? destination; + await tester.pumpWidget( + MaterialApp( + home: MediaQuery( + data: const MediaQueryData(size: Size(320, 720), textScaler: TextScaler.linear(4)), + child: Scaffold( + bottomNavigationBar: MobileBottomNav( + currentPath: '/library/books', + items: const [ + AppShellNavItem(path: '/library', label: 'Library', icon: Icons.book), + AppShellNavItem(path: '/statistics', label: 'Statistics', icon: Icons.bar_chart), + AppShellNavItem(path: '/profile', label: 'Settings', icon: Icons.settings), + ], + onNavigate: (value) => destination = value, + ), + ), + ), + ), + ); + await tester.ensureVisible(find.text('Settings')); + await tester.tap(find.text('Settings')); + await tester.pumpAndSettle(); + expect(destination, '/profile'); + expect(MediaQuery.textScalerOf(tester.element(find.text('Settings'))).scale(14), 56); + expect(tester.takeException(), isNull); + }); +} diff --git a/app/test/widgets/accessibility_library_journeys_test.dart b/app/test/widgets/accessibility_library_journeys_test.dart new file mode 100644 index 00000000..bddd36bc --- /dev/null +++ b/app/test/widgets/accessibility_library_journeys_test.dart @@ -0,0 +1,110 @@ +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/pages/book_details_page.dart'; +import 'package:papyrus/pages/book_edit_page.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/widgets/add_book/book_import_sheet_sections.dart'; +import 'package:papyrus/widgets/add_book/book_import_batch_item.dart'; + +import '../helpers/test_helpers.dart'; + +void main() { + for (final width in [320.0, 390.0, 1280.0]) { + for (final scale in [2.0, 4.0]) { + for (final editing in [false, true]) { + testWidgets('${editing ? 'editing' : 'details'} actions remain reachable at $width and ${scale}x', ( + tester, + ) async { + final size = Size(width, 900); + tester.view.physicalSize = size; + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.reset); + final book = buildTestBook(id: 'book', title: 'A book with a longer title', author: 'An Author'); + await tester.pumpWidget( + createTestPage( + dataStore: createTestDataStore(books: [book]), + screenSize: size, + page: Theme( + data: AppTheme.light, + child: MediaQuery( + data: MediaQueryData(size: size, textScaler: TextScaler.linear(scale)), + child: Scaffold( + body: editing ? const BookEditPage(id: 'book') : const BookDetailsPage(id: 'book'), + ), + ), + ), + ), + ); + await tester.pumpAndSettle(); + + if (editing) { + final title = find.byWidgetPredicate( + (widget) => widget is TextFormField && widget.controller?.text == book.title, + ); + await tester.scrollUntilVisible(title, 300, scrollable: find.byType(Scrollable).first); + await tester.pumpAndSettle(); + await tester.enterText(title, 'Changed title'); + await tester.pumpAndSettle(); + final save = find.widgetWithText(FilledButton, 'Save'); + expect(save.hitTestable(), findsOneWidget); + } else { + final edit = find.byTooltip('Edit book'); + await tester.ensureVisible(edit); + await tester.pumpAndSettle(); + expect(edit.hitTestable(), findsOneWidget); + } + }); + } + testWidgets('file import can browse and remove at $width and ${scale}x', (tester) async { + tester.view.physicalSize = Size(width, 900); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.reset); + var browsed = false; + var removed = false; + final file = SelectedBookFile(name: 'An accessible book.epub', bytes: Uint8List.fromList([1])); + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.light, + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: TextScaler.linear(scale)), + child: child!, + ), + home: Scaffold( + body: BookImportSelectingSection( + files: [file], + readableFiles: [file], + isPicking: false, + onBrowse: () => browsed = true, + onDroppedFiles: (_, {feedback}) {}, + onRemoveFile: (_) => removed = true, + onClearSelection: () {}, + onStartImport: () {}, + onClose: () {}, + ), + ), + ), + ); + await tester.pumpAndSettle(); + + await tester.scrollUntilVisible( + find.text('Add files'), + 200, + scrollable: find.descendant(of: find.byType(ListView), matching: find.byType(Scrollable)), + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('Add files')); + expect(browsed, isTrue); + await tester.scrollUntilVisible( + find.byTooltip('Remove ${file.name}'), + 200, + scrollable: find.descendant(of: find.byType(ListView), matching: find.byType(Scrollable)), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byTooltip('Remove ${file.name}')); + expect(removed, isTrue); + }); + } + } +} diff --git a/app/test/widgets/app_motion_control_test.dart b/app/test/widgets/app_motion_control_test.dart index bab5049a..458a6413 100644 --- a/app/test/widgets/app_motion_control_test.dart +++ b/app/test/widgets/app_motion_control_test.dart @@ -1,7 +1,12 @@ +import 'dart:ui' as ui; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/themes/app_motion.dart'; import 'package:papyrus/widgets/settings/settings_row.dart'; import 'package:papyrus/widgets/shared/app_motion_control.dart'; @@ -9,6 +14,69 @@ void main() { final themes = {'light': AppTheme.light, 'dark': AppTheme.dark, 'eink': AppTheme.eink}; ToggleableStateMixin toggleState(WidgetTester tester) => tester.allStates.whereType().single; + testWidgets('changing reduced motion keeps settings focus visible and keyboard activation working', (tester) async { + final reducedMotion = ValueNotifier(false); + final key = GlobalKey(); + addTearDown(reducedMotion.dispose); + + await tester.pumpWidget( + MaterialApp( + theme: AppTheme.dark, + home: ValueListenableBuilder( + valueListenable: reducedMotion, + builder: (context, reduced, _) => AppMotionScope( + reduceAnimations: reduced, + child: Scaffold( + body: RepaintBoundary( + key: key, + child: Material( + child: SettingsToggleRow( + label: 'Reduce animations', + value: reduced, + onChanged: (value) => reducedMotion.value = value, + ), + ), + ), + ), + ), + ), + ), + ); + + Future pixels() async { + final boundary = key.currentContext!.findRenderObject()! as RenderRepaintBoundary; + + return (await tester.runAsync(() async { + final image = await boundary.toImage(); + final bytes = await image.toByteData(format: ui.ImageByteFormat.rawRgba); + image.dispose(); + return bytes!.buffer.asUint8List(); + }))!; + } + + await tester.sendKeyEvent(LogicalKeyboardKey.tab); + await tester.pumpAndSettle(); + final focus = Focus.of(tester.element(find.text('Reduce animations'))); + expect(focus.hasPrimaryFocus, isTrue); + + for (final expected in [true, false, true]) { + await tester.sendKeyEvent(LogicalKeyboardKey.space); + await tester.pumpAndSettle(); + expect(reducedMotion.value, expected); + expect(focus.hasPrimaryFocus, isTrue); + final focused = await pixels(); + focus.unfocus(); + await tester.pumpAndSettle(); + expect( + listEquals(focused, await pixels()), + isFalse, + reason: 'Focus must remain visible with reduced motion $expected', + ); + focus.requestFocus(); + await tester.pumpAndSettle(); + } + }); + testWidgets('chip motion refreshes across theme switches and retains keyboard focus', (tester) async { final theme = ValueNotifier(AppTheme.light); final selected = ValueNotifier(false); diff --git a/app/test/widgets/library/book_card_test.dart b/app/test/widgets/library/book_card_test.dart index ac006278..045145f8 100644 --- a/app/test/widgets/library/book_card_test.dart +++ b/app/test/widgets/library/book_card_test.dart @@ -1,6 +1,7 @@ import 'dart:ui' show PointerDeviceKind, SemanticsAction, Tristate; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus/acquisition/acquisition_models.dart'; import 'package:papyrus/models/book.dart'; @@ -386,13 +387,40 @@ void main() { } }); - testWidgets('shows a nonfavorite heart only while the mouse hovers over the book', (tester) async { + testWidgets('keyboard focus reveals the original hover controls and activates favorite', (tester) async { + final pointer = await tester.createGesture(kind: PointerDeviceKind.mouse); + await pointer.addPointer(location: const Offset(790, 590)); + addTearDown(pointer.removePointer); + var favoriteTaps = 0; + await tester.pumpWidget( + buildCard( + screenSize: const Size(1200, 800), + onTap: () {}, + onToggleFavorite: (_) => favoriteTaps++, + onEnterSelectionMode: () {}, + ), + ); + final favorite = find.byIcon(Icons.favorite_border); + final visibility = find.ancestor(of: favorite, matching: find.byType(AnimatedOpacity)); + expect(tester.widget(visibility).opacity, 0); + await tester.sendKeyEvent(LogicalKeyboardKey.tab); + await tester.pumpAndSettle(); + expect(tester.widget(visibility).opacity, 1); + await tester.sendKeyEvent(LogicalKeyboardKey.tab); + await tester.sendKeyEvent(LogicalKeyboardKey.space); + await tester.pumpAndSettle(); + expect(favoriteTaps, 1); + }); + + testWidgets('keeps the favorite action accessible while visually hidden without mouse hover', (tester) async { + final semantics = tester.ensureSemantics(); var favoriteTaps = 0; final pointer = await tester.createGesture(kind: PointerDeviceKind.mouse); await pointer.addPointer(location: const Offset(790, 590)); addTearDown(pointer.removePointer); await tester.pumpWidget(buildCard(onToggleFavorite: (_) => favoriteTaps++)); - expect(find.byIcon(Icons.favorite_border), findsNothing); + expect(find.semantics.byLabel('Add to favorites'), findsOne); + expect(find.byIcon(Icons.favorite_border), findsOneWidget); await pointer.moveTo(tester.getCenter(find.byType(BookCard))); await tester.pumpAndSettle(); expect(find.byIcon(Icons.favorite_border), findsOneWidget); @@ -400,7 +428,8 @@ void main() { expect(favoriteTaps, 1); await pointer.moveTo(const Offset(790, 590)); await tester.pumpAndSettle(); - expect(find.byIcon(Icons.favorite_border), findsNothing); + expect(find.byIcon(Icons.favorite_border), findsOneWidget); + semantics.dispose(); }); testWidgets('keeps a favorited heart visible after the mouse leaves', (tester) async { diff --git a/app/test/widgets/library/library_filter_chips_test.dart b/app/test/widgets/library/library_filter_chips_test.dart index e57ad1c9..18d769da 100644 --- a/app/test/widgets/library/library_filter_chips_test.dart +++ b/app/test/widgets/library/library_filter_chips_test.dart @@ -40,6 +40,44 @@ void main() { await tester.pumpWidget(buildChips()); } + testWidgets('filter launcher has one button role and scales its label', (tester) async { + final semantics = tester.ensureSemantics(); + try { + await tester.binding.setSurfaceSize(const Size(320, 720)); + addTearDown(() => tester.binding.setSurfaceSize(null)); + await tester.pumpWidget( + createTestApp( + libraryProvider: libraryProvider, + child: const MediaQuery( + data: MediaQueryData(size: Size(320, 720), textScaler: TextScaler.linear(4)), + child: LibraryFilterChips(), + ), + ), + ); + await tester.pumpAndSettle(); + final launcher = find.bySemanticsLabel('View mode: Grid'); + expect(launcher, findsOneWidget); + expect( + tester.getSemantics(launcher), + isSemantics( + isButton: true, + hasCheckedState: false, + hasTapAction: true, + isFocusable: true, + ), + ); + final label = find.text('Grid'); + expect(MediaQuery.textScalerOf(tester.element(label)).scale(14), 56); + expect(tester.getSize(find.byType(LibraryFilterChips)).height, greaterThan(48)); + await tester.tap(label); + await tester.pumpAndSettle(); + expect(find.text('View mode'), findsOneWidget); + expect(tester.takeException(), isNull); + } finally { + semantics.dispose(); + } + }); + testWidgets('renders the current filter, sort, and view categories', (tester) async { await pumpChips(tester); expect(find.text('Status'), findsOneWidget); diff --git a/app/test/widgets/profile/accessibility_settings_section_test.dart b/app/test/widgets/profile/accessibility_settings_section_test.dart new file mode 100644 index 00000000..a247ec17 --- /dev/null +++ b/app/test/widgets/profile/accessibility_settings_section_test.dart @@ -0,0 +1,122 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/providers/preferences_provider.dart'; +import 'package:papyrus/themes/app_accessibility.dart'; +import 'package:papyrus/themes/app_theme.dart'; +import 'package:papyrus/widgets/profile/accessibility_settings_section.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + setUpAll(() async { + final loader = FontLoader(AppTheme.dyslexiaFontFamily); + loader.addFont(rootBundle.load('fonts/OpenDyslexic/OpenDyslexic-Regular.otf')); + await loader.load(); + }); + + test('bundles regular, bold, italic and bold italic fonts with their license', () async { + final manifest = jsonDecode(await rootBundle.loadString('FontManifest.json')) as List; + final family = manifest.cast>().singleWhere( + (entry) => entry['family'] == AppTheme.dyslexiaFontFamily, + ); + final fonts = (family['fonts'] as List).cast>(); + expect(fonts.map((font) => (font['weight'] ?? 400, font['style'] ?? 'normal')).toSet(), { + (400, 'normal'), + (700, 'normal'), + (400, 'italic'), + (700, 'italic'), + }); + + for (final font in fonts) { + final data = await rootBundle.load(font['asset'] as String); + expect(ascii.decode(data.buffer.asUint8List(data.offsetInBytes, 4)), 'OTTO'); + } + + expect(await rootBundle.loadString('fonts/OpenDyslexic/OFL.txt'), contains('SIL OPEN FONT LICENSE')); + }); + + for (final (mode, theme) in [ + ('light', AppTheme.light), + ('dark', AppTheme.dark), + ('eink', AppTheme.eink), + ('high contrast light', AppTheme.highContrastLight), + ('high contrast dark', AppTheme.highContrastDark), + ]) { + for (final width in [320.0, 390.0, 1280.0]) { + testWidgets('$mode at $width changes preferences with large text and persists them', (tester) async { + tester.view.physicalSize = Size(width, 900); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + SharedPreferences.setMockInitialValues({'theme_mode': mode}); + final storage = await SharedPreferences.getInstance(); + final preferences = PreferencesProvider(storage); + addTearDown(preferences.dispose); + + await tester.pumpWidget( + ChangeNotifierProvider.value( + value: preferences, + child: Consumer( + builder: (context, preferences, child) => MaterialApp( + theme: AppTheme.withTypography(theme, dyslexiaFont: preferences.dyslexiaFont), + themeAnimationDuration: Duration.zero, + builder: (context, child) => MediaQuery( + data: MediaQuery.of(context).copyWith(textScaler: const TextScaler.linear(2)), + child: AppAccessibilityScope(preferences: preferences, child: child!), + ), + home: Scaffold( + body: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: AccessibilitySettingsSection(isDesktop: width >= 1024), + ), + ), + ), + ), + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('Interface font')); + await tester.pumpAndSettle(); + await tester.ensureVisible(find.text('OpenDyslexic').last); + await tester.tap(find.text('OpenDyslexic').last); + await tester.pumpAndSettle(); + expect(preferences.dyslexiaFont, isTrue); + final preview = find.text('The quick brown fox jumps over the lazy dog.'); + final paragraph = tester.renderObject( + find.descendant(of: preview, matching: find.byType(RichText)), + ); + expect(paragraph.text.style?.fontFamily, AppTheme.dyslexiaFontFamily); + + await tester.ensureVisible(find.text('Interface text enlargement')); + await tester.tap(find.text('Interface text enlargement')); + await tester.pumpAndSettle(); + await tester.ensureVisible(find.text('+100%')); + await tester.tap(find.text('+100%')); + await tester.pumpAndSettle(); + expect(preferences.interfaceTextEnlargement, 2); + expect(MediaQuery.textScalerOf(tester.element(preview)).scale(16), 64); + await tester.ensureVisible(find.text('Bold interface text')); + await tester.tap(find.text('Bold interface text')); + await tester.pumpAndSettle(); + expect(preferences.boldInterfaceText, isTrue); + await tester.ensureVisible(find.text('Increase contrast')); + await tester.tap(find.text('Increase contrast')); + await tester.pumpAndSettle(); + expect(preferences.increaseContrast, mode != 'eink'); + await storage.reload(); + final restored = PreferencesProvider(storage); + addTearDown(restored.dispose); + expect(restored.interfaceTextEnlargement, 2); + expect(restored.boldInterfaceText, isTrue); + expect(restored.dyslexiaFont, isTrue); + expect(restored.defaultFont, 'Georgia'); + }); + } + } +} diff --git a/app/test/widgets/shell/desktop_sidebar_test.dart b/app/test/widgets/shell/desktop_sidebar_test.dart new file mode 100644 index 00000000..c044fd10 --- /dev/null +++ b/app/test/widgets/shell/desktop_sidebar_test.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus/providers/sidebar_provider.dart'; +import 'package:papyrus/widgets/shell/desktop_sidebar.dart'; +import 'package:provider/provider.dart'; + +void main() { + testWidgets('logo stays centered in the collapsed rail without moving', (tester) async { + await tester.pumpWidget( + ChangeNotifierProvider( + create: (_) => SidebarProvider(), + child: MaterialApp( + home: Scaffold( + body: Row( + children: [DesktopSidebar(items: const [], currentPath: '/', onNavigate: (_) {})], + ), + ), + ), + ), + ); + + await tester.pumpAndSettle(); + final logo = find.byType(SvgPicture); + final expandedBounds = tester.getRect(logo); + await tester.tap(find.bySemanticsLabel('Collapse sidebar')); + await tester.pumpAndSettle(); + final collapsedBounds = tester.getRect(logo); + expect(collapsedBounds, expandedBounds); + expect(collapsedBounds.center.dx, tester.getRect(find.byType(DesktopSidebar)).center.dx); + await tester.tap(find.bySemanticsLabel('Expand sidebar')); + await tester.pumpAndSettle(); + expect(tester.getRect(logo), expandedBounds); + expect(tester.takeException(), isNull); + }); +} diff --git a/app/test/widgets/shell/navigation_counts_test.dart b/app/test/widgets/shell/navigation_counts_test.dart index 555b9f3d..12e1eac1 100644 --- a/app/test/widgets/shell/navigation_counts_test.dart +++ b/app/test/widgets/shell/navigation_counts_test.dart @@ -8,6 +8,7 @@ import 'package:papyrus/opds/opds_models.dart'; import 'package:papyrus/providers/sidebar_provider.dart'; import 'package:papyrus/widgets/shell/adaptive_app_shell.dart'; import 'package:papyrus/widgets/shell/nav_item_count.dart'; +import 'package:papyrus/widgets/profile/profile_picker_sheet.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -32,13 +33,31 @@ void main() { routes: [ ShellRoute( builder: (_, _, child) => AdaptiveAppShell(child: child), - routes: [GoRoute(path: '/library/catalogs', builder: (_, _) => const Text('Page content'))], + routes: [ + GoRoute( + path: '/library/catalogs', + builder: (context, _) => Center( + child: TextButton( + onPressed: () => showProfilePickerSheet( + context, + title: 'Interface font', + items: const [('System default', 'system'), ('OpenDyslexic', 'dyslexia')], + selected: 'system', + onSelected: (_) {}, + ), + child: const Text('Choose font'), + ), + ), + ), + ], ), ], ); addTearDown(router.dispose); + final semantics = tester.ensureSemantics(); + await tester.pumpWidget( MultiProvider( providers: [ @@ -52,6 +71,27 @@ void main() { await tester.pumpAndSettle(); + expect(find.semantics.byLabel(RegExp('Settings')), findsOneWidget); + final launcher = find.text('Choose font'); + final launcherFocus = Focus.of(tester.element(launcher)); + launcherFocus.requestFocus(); + await tester.pump(); + await tester.tap(launcher); + await tester.pumpAndSettle(); + expect(find.semantics.byLabel(RegExp('Settings')), findsNothing); + expect( + tester.getSemantics(find.bySemanticsLabel('System default')), + isSemantics( + hasCheckedState: true, + isChecked: true, + isInMutuallyExclusiveGroup: true, + ), + ); + await tester.tap(find.text('OpenDyslexic')); + await tester.pumpAndSettle(); + expect(find.semantics.byLabel(RegExp('Settings')), findsOneWidget); + expect(launcherFocus.hasFocus, isTrue); + if (width < 840) { tester.state(find.byType(Scaffold).first).openDrawer(); await tester.pumpAndSettle(); @@ -81,6 +121,7 @@ void main() { expect(find.byType(NavItemCount), findsNothing); expect(find.text('0'), findsNothing); expect(tester.takeException(), isNull); + semantics.dispose(); }); } } From ba2df7b88c65f55ba53d3337bde570e42373732d Mon Sep 17 00:00:00 2001 From: Karolis Strazdas Date: Sat, 24 Oct 2026 05:01:12 +0300 Subject: [PATCH 2/2] fix: remove guest files before clearing local library --- .../support/tracking_app.dart | 2 +- app/lib/powersync/powersync_service.dart | 22 +------ .../powersync/storage_sync_controller.dart | 1 - .../guest_account_deletion_service.dart | 2 +- .../storage_sync_settings_section.dart | 13 +++- app/test/pages/profile_storage_sync_test.dart | 66 ++++++++++++++++++- .../powersync/powersync_service_test.dart | 26 +++++++- 7 files changed, 105 insertions(+), 27 deletions(-) diff --git a/app/integration_test/support/tracking_app.dart b/app/integration_test/support/tracking_app.dart index d3455a39..d7a45a06 100644 --- a/app/integration_test/support/tracking_app.dart +++ b/app/integration_test/support/tracking_app.dart @@ -168,7 +168,7 @@ class TrackingValidationApp { store.dispose(); preferences.dispose(); fixtureAuth.dispose(); - await database.clearGuestLibrary(); + await database.clearGuestLibrary(deleteFiles: (_) async {}); await database.close(); } } diff --git a/app/lib/powersync/powersync_service.dart b/app/lib/powersync/powersync_service.dart index c2057663..0b15be97 100644 --- a/app/lib/powersync/powersync_service.dart +++ b/app/lib/powersync/powersync_service.dart @@ -187,28 +187,8 @@ class PapyrusPowerSyncService implements BookRepository, LibraryRepository, Trac await database.connect(connector: connectorFactory()); } - Future clearGuestLibrary() async { - await _modeOperation; - - if (_mode != LibraryDatabaseMode.guest) { - throw StateError('Only guest libraries can be cleared with clearGuestLibrary'); - } - - final database = _requireDatabase(); - - await database.writeTransaction((tx) async { - for (final table in libraryTableNames.reversed) { - await tx.execute('DELETE FROM $table'); - } - }); - - _booksController.add(const []); - _setSyncState(const SyncState()); - _setBookMetadataSyncState(const BookMetadataSyncState()); - } - /// Retains book records until their files are removed so failures can be retried. - Future deleteGuestLibrary({required Future Function(List) deleteFiles}) { + Future clearGuestLibrary({required Future Function(List) deleteFiles}) { final previousOperation = _modeOperation; final operation = (() async { diff --git a/app/lib/powersync/storage_sync_controller.dart b/app/lib/powersync/storage_sync_controller.dart index 84e30eaf..d2a8a49b 100644 --- a/app/lib/powersync/storage_sync_controller.dart +++ b/app/lib/powersync/storage_sync_controller.dart @@ -146,6 +146,5 @@ class StorageSyncController { } Future reconnect() => powerSyncService.reconnect(); - Future clearGuestLibrary() => powerSyncService.clearGuestLibrary(); Future clearAuthenticatedCache() => powerSyncService.clearAuthenticatedCache(); } diff --git a/app/lib/services/guest_account_deletion_service.dart b/app/lib/services/guest_account_deletion_service.dart index 74aa0d70..d393dcca 100644 --- a/app/lib/services/guest_account_deletion_service.dart +++ b/app/lib/services/guest_account_deletion_service.dart @@ -24,7 +24,7 @@ class GuestAccountDeletionService { Future delete() => auth.deleteGuestAccount(() async { await downloads.cancelAndWait(); - await library.deleteGuestLibrary( + await library.clearGuestLibrary( deleteFiles: (books) async { for (final book in books) { await files.deleteBookFile(book.id); diff --git a/app/lib/widgets/profile/storage_sync_settings_section.dart b/app/lib/widgets/profile/storage_sync_settings_section.dart index 0ccb8575..68735e8c 100644 --- a/app/lib/widgets/profile/storage_sync_settings_section.dart +++ b/app/lib/widgets/profile/storage_sync_settings_section.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:papyrus/data/data_store.dart'; import 'package:papyrus/media/media_upload_queue.dart'; +import 'package:papyrus/media/media_storage_scope.dart'; import 'package:papyrus/powersync/powersync_service.dart'; import 'package:papyrus/powersync/storage_sync_controller.dart'; import 'package:papyrus/powersync/sync_state.dart'; @@ -530,7 +531,17 @@ class StorageSyncSettingsSection extends StatelessWidget { final snackBarAnimationStyle = AppMotion.animationStyle(context); try { - await context.read().clearGuestLibrary(); + final files = context.read(); + + await context.read().clearGuestLibrary( + deleteFiles: (books) async { + for (final book in books) { + await files.deleteBookFile(book.id); + } + + await files.clearCoverFiles(MediaStorageScope.localGuest); + }, + ); messenger.showSnackBar( snackBarAnimationStyle: snackBarAnimationStyle, diff --git a/app/test/pages/profile_storage_sync_test.dart b/app/test/pages/profile_storage_sync_test.dart index 6627f37a..f564773f 100644 --- a/app/test/pages/profile_storage_sync_test.dart +++ b/app/test/pages/profile_storage_sync_test.dart @@ -12,6 +12,10 @@ import 'package:papyrus/auth/token_store.dart'; import 'package:papyrus/data/data_store.dart'; import 'package:papyrus/data/repositories/book_repository.dart'; import 'package:papyrus/media/media_upload_queue.dart'; +import 'package:papyrus/media/media_storage_scope.dart'; +import 'package:papyrus/services/book_import_service_stub.dart' + if (dart.library.js_interop) 'package:papyrus/services/book_import_service.dart'; +import 'package:papyrus/widgets/profile/storage_sync_settings_section.dart'; import 'package:papyrus/models/book.dart'; import 'package:papyrus/pages/profile_page.dart'; import 'package:papyrus/powersync/powersync_service.dart'; @@ -76,6 +80,7 @@ class _FakePowerSyncService extends PapyrusPowerSyncService { int reconnectCalls = 0; int clearGuestLibraryCalls = 0; int clearAuthenticatedCacheCalls = 0; + List guestBooks = []; @override LibraryDatabaseMode? get mode => currentMode; @@ -92,7 +97,9 @@ class _FakePowerSyncService extends PapyrusPowerSyncService { } @override - Future clearGuestLibrary() async { + Future clearGuestLibrary({required Future Function(List) deleteFiles}) async { + await deleteFiles(guestBooks); + guestBooks = []; clearGuestLibraryCalls += 1; } @@ -102,6 +109,26 @@ class _FakePowerSyncService extends PapyrusPowerSyncService { } } +class _Files extends BookImportService { + final deletedBooks = []; + final clearedScopes = []; + bool failDeletion = false; + + @override + Future deleteBookFile(String bookId) async { + if (failDeletion) { + throw StateError('Storage unavailable'); + } + + deletedBooks.add(bookId); + } + + @override + Future clearCoverFiles(MediaStorageScope scope) async { + clearedScopes.add(scope); + } +} + void main() { setUp(() { SharedPreferences.setMockInitialValues({}); @@ -134,6 +161,7 @@ void main() { MediaUploadQueue? mediaUploadQueue, AcquisitionAvailabilityProvider? acquisitionAvailabilityProvider, Widget Function(Widget page)? pageBuilder, + BookImportService? files, }) async { final prefs = await SharedPreferences.getInstance(); @@ -150,6 +178,7 @@ void main() { value: syncSettingsProvider ?? SyncSettingsProvider(prefs, officialConfig: config), ), Provider.value(value: powerSyncService), + if (files != null) Provider.value(value: files), StreamProvider.value(value: powerSyncService.syncStates, initialData: powerSyncService.syncState), ChangeNotifierProvider.value(value: authProvider), ChangeNotifierProvider.value( @@ -177,6 +206,41 @@ void main() { ); } + testWidgets('clearing the guest library removes its files and covers before discarding records', (tester) async { + final auth = await buildAuthProvider(guest: true); + final service = _FakePowerSyncService(currentMode: LibraryDatabaseMode.guest, currentSyncState: const SyncState()); + final files = _Files()..failDeletion = true; + service.guestBooks = [Book(id: 'guest-book', title: 'Guest book', author: 'Reader', addedAt: DateTime.now())]; + + await tester.pumpWidget( + await buildPage( + authProvider: auth, + powerSyncService: service, + files: files, + pageBuilder: (_) => const Scaffold(body: StorageSyncSettingsSection()), + ), + ); + + await tester.pumpAndSettle(); + await tester.tap(find.text('Clear local library')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Clear library')); + await tester.pumpAndSettle(); + expect(find.textContaining('Could not clear local library'), findsOneWidget); + expect(service.guestBooks.single.id, 'guest-book'); + expect(service.clearGuestLibraryCalls, 0); + files.failDeletion = false; + await tester.tap(find.text('Clear local library')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Clear library')); + await tester.pumpAndSettle(); + expect(files.deletedBooks, ['guest-book']); + expect(files.clearedScopes, [MediaStorageScope.localGuest]); + expect(service.guestBooks, isEmpty); + expect(service.clearGuestLibraryCalls, 1); + expect(auth.isOfflineMode, isTrue); + }); + testWidgets('offline storage sync UI is local-first and hides sync internals', (tester) async { final auth = await buildAuthProvider(guest: true); final service = _FakePowerSyncService(currentMode: LibraryDatabaseMode.guest, currentSyncState: const SyncState()); diff --git a/app/test/powersync/powersync_service_test.dart b/app/test/powersync/powersync_service_test.dart index 195fdfd4..bb275bb1 100644 --- a/app/test/powersync/powersync_service_test.dart +++ b/app/test/powersync/powersync_service_test.dart @@ -282,7 +282,31 @@ void main() { final first = service(); await first.activateGuest(); await first.upsert(_book('guest-book')); - await first.clearGuestLibrary(); + await first.clearGuestLibrary( + deleteFiles: (books) async { + expect(books.map((book) => book.id), ['guest-book']); + }, + ); + expect(await first.getById('guest-book'), isNull); + await first.close(); + }); + + test('clearGuestLibrary retains records when file cleanup fails and permits retry', () async { + final first = service(); + await first.activateGuest(); + await first.upsert(_book('guest-book')); + + await expectLater( + first.clearGuestLibrary(deleteFiles: (_) async => throw StateError('Storage unavailable')), + throwsStateError, + ); + + expect(await first.getById('guest-book'), isNotNull); + + await first.clearGuestLibrary( + deleteFiles: (books) async => expect(books.map((book) => book.id), ['guest-book']), + ); + expect(await first.getById('guest-book'), isNull); await first.close(); });